---
title: "openvibe-sdk/views · OpenVibe.Services"
canonical: "https://openvibe.services/docs/sdk/views"
updated: null
---

# openvibe-sdk/views · OpenVibe.Services

HTML: [openvibe-sdk/views · OpenVibe.Services](https://openvibe.services/docs/sdk/views)

# `openvibe-sdk/views`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

From `types/views.d.ts` (browser build available). Declarations are shown verbatim.

## interface ViewRef

~~~~
export interface ViewRef {
    service: string;
    kind: string;
    id: string;
    /** The site the view happened on, when it differs from the owning service (the Feed counts a clip on network). */
    site?: string;
    /** The creator's canonical subject or channel username, for Report's per-creator numbers. */
    creator?: string;
}
~~~~

## interface ViewEvent

~~~~
export interface ViewEvent {
    ref: ViewRef;
    /** preview: a silent preview in the feed; watch: a watch page; live: a live stream being watched now. */
    how: 'preview' | 'watch' | 'live';
    /** Cumulative seconds watched in this session for this item. A retry sends the same number. */
    seconds: number;
    /** The item's length when known: engaged comes at min(30, of_seconds / 3) for a watch. */
    of_seconds?: number;
    /** The anonymous session id a signed-out viewer keeps (8–128 characters); a signed-in viewer sends a token instead. */
    session?: string;
}
~~~~

## interface ViewResult

~~~~
export interface ViewResult {
    accepted: boolean;
    counted: boolean;
    engaged: boolean;
    reason?: string;
}
~~~~

## interface ViewCounts

~~~~
export interface ViewCounts {
    views: number;
    engaged: number;
    previews: number;
    /** Preview views divided by all views, 0–1; null before the item has a view. */
    preview_share: number | null;
    /** The most live watchers seen at once (how = live); null when it was never watched live. */
    peak_concurrent: number | null;
}
~~~~

## interface ViewsClient

~~~~
export interface ViewsClient {
    /** Record one event or up to 20 at once (a signed-in viewer's token, or an anonymous session id). */
    record(events: ViewEvent | ViewEvent[], options?: { signal?: AbortSignal }): Promise<{ results: ViewResult[]; counts?: ViewCounts }>;
    /** One item's numbers. */
    counts(ref: ViewRef, options?: { signal?: AbortSignal }): Promise<{ ref: ViewRef; counts: ViewCounts }>;
}
~~~~

## export export function createViewsClient(client: OpenVibeClient, op

~~~~
export function createViewsClient(client: OpenVibeClient, options?: { baseUrl?: string }): ViewsClient;
~~~~

## export export const MEDIA\_URL: string;

~~~~
export const MEDIA_URL: string;
~~~~

## export export const MAX\_BATCH: number;

~~~~
export const MAX_BATCH: number;
~~~~

## export export const HOWS: Array<'preview' | 'watch' | 'live'>;

~~~~
export const HOWS: Array<'preview' | 'watch' | 'live'>;
~~~~

## export export function refOf(ref: ViewRef): ViewRef;

Validate and normalize one ref (throws a TypeError on a bad service, kind or id).

~~~~
export function refOf(ref: ViewRef): ViewRef;
~~~~

## export export function eventOf(event: ViewEvent): ViewEvent;

Validate and normalize one event (throws a TypeError on a bad how, seconds or session).

~~~~
export function eventOf(event: ViewEvent): ViewEvent;
~~~~
