ODK API Portal
한국어
  • Overview
  • MediaIO
  • Continue Watching
  • Player Event
  • Deprecated
  • Recent changes
Information
Player Events v2 (ODK)
Telemetry
Player Events v2 (Amasian legacy)
Schemas
powered by Zudoku
Player Event API V2
Player Event API V2

Schemas


HTTPValidationError

​ValidationError[]

HeartbeatEvent

Every ~15 min on every platform, but gated differently: apps and CTV beat while the app is foregrounded, whether or not anything is playing — suppress on screensaver or display-off where the platform exposes it — and web beats only while a video is playing, starting on play and stopping when nothing is playing. A web playback shorter than the interval therefore emits no heartbeat at all, which is fine: the `view` events either side of it are already close enough together to keep that session whole. The beat exists for the long watch.
client_ts
​string · required

Client send time, ISO 8601 (UTC). Batched events carry their own. Server receive time is recorded separately and is authoritative for sessionization.

Example: 2026-09-04T17:18:00.421Z
event_id
​string · required

Client-generated UUID. Required: the pipeline dedupes retries and batch replays on it, which a server-generated id could not do.

Example: 0d9e2f61-4b3a-4f7e-8c25-71a6de930b18
event_type
​string · const · required
Const value: heartbeat
schema_version
​string · required

Semver of the event_type schema the client speaks.

Example: 1.0.0
​

No fields defined in v1; omit or send {}.

Default: null

PlaylistResponse

Response of the playlist routes: the server-issued stream session id.
stream_session_id
​string · required

Server-issued stream session id (ss). Carry it on firstplay and viewhour of the same session.

TelemetryEnvelope

app_version
​string · required

App or web build version.

Example: 3.2.1
did
​string · required

Client-generated persistent device id: in an app, stable across app restarts and app updates; on web, a first-party UUID in localStorage with a cookie fallback. Send on every event, and send the same value on player events and telemetry — it is the join key between the two surfaces, so two separately minted UUIDs break the join silently. (Audience counting lives on the telemetry surface, not on player events.)

Example: 3f2c1e4a-9b7d-4c11-a2f0-5e8d6b1c9a04
​array · minItems: 1 · required

1..N events, identity fields above sent once per request. Typed schemas exist for the v1 types only (visit, heartbeat, view). Allow-listed on this deployment: visit, heartbeat, view — any allow-listed type outside the three is accepted with the base fields (event_id, event_type, schema_version, client_ts, context) and routed to its own topic; unlisted types are routed to the unknown quarantine table.

platform
​string · required

Platform, keep granular: web, android, androidtv, ios, tvos, roku, tizen, webos, firetv, vizio, hoteltv, box, chromecast. Web sends plain web.

Example: firetv
service
​string · required

Service: odk, amasian. Required. A value outside this allow-list, or an omitted field, returns 400 and no row is produced — an unknown service would land rows under the wrong service. Case-sensitive, so ODK and odkr are rejected; the wire value for ODK is odk.

Example: odk
​

IAB GPP consent string from the CMP (__gpp). Mobile and web.

Example: DBABLA~BVVqAAEABgA.QA
Default: null
​

OS limit-ad-tracking flag as reported by the OS: 0 or 1. Apps and CTV. Same key on PEv2 (query string) and telemetry (JSON); both are stored as the string "0"/"1". JSON here, so send the integer.

Example: 0
Default: null
​

OS advertising identifier, raw, one kind per platform: idfa (ios/tvos), gaid (android/androidtv), rida (roku), afai (firetv), tifa (tizen), lgudid (webos), vida (vizio). Not applicable on web. Send the OS value as-is, never suppress; the pipeline honours islat. Same key as PEv2.

Example: a1b2c3d4-0000-1111-2222-333344445555
Default: null
​

IAB US Privacy (USP) string, e.g. 1YNN. Backward compatibility for any client that cannot produce a GPP string yet — chiefly CTV, whose platforms have no GPP CMP. Web CMPs emit GPP, so web sends gpp only. Send both when both are available; the two fields are independent and neither is derived from the other.

Example: 1YNN
Default: null
​

Logged-in account id. Null or omitted for guests.

Example: 72407
Default: null

UtmParams

​
Default: null
​
Default: null
​
Default: null
​
Default: null
​
Default: null

ValidationError

​array · required
msg
​string · required
type
​string · required

ViewContext

​

document.referrer or null.

Example: https://www.google.com/
Default: null
​

UTM query parameters of the landing URL, or null.

Default: null

ViewEvent

client_ts
​string · required

Client send time, ISO 8601 (UTC). Batched events carry their own. Server receive time is recorded separately and is authoritative for sessionization.

Example: 2026-09-04T17:18:00.421Z
event_id
​string · required

Client-generated UUID. Required: the pipeline dedupes retries and batch replays on it, which a server-generated id could not do.

Example: 0d9e2f61-4b3a-4f7e-8c25-71a6de930b18
event_type
​string · const · required
Const value: view
schema_version
​string · required

Semver of the event_type schema the client speaks.

Example: 1.0.0
target_id
​string · required

Page path, e.g. /shorts. SPA route changes count as page views.

Example: /shorts
target_type
​string · const · required

v1 defines page only.

Const value: page
​
Default: null

VisitContext

trigger
​string · enum · required

launch on app start; resume on foreground-resume after ≥ 30 min in background (client persists its last telemetry time and compares on foreground). A pure OS-lifecycle fact, independent of why the user came back. The 30-minute suppression is overridden in two cases, which always emit: the first foreground of a new UTC day, and any deeplink entry.

Enum values:
launch
resume
​

The deeplink URI as received, minus any parameter carrying a credential — auth tokens, one-time codes, session ids, signed URLs, and any nested URL such as the url parameter of an external deeplink. Only the client knows which of its own links carry these, so the stripping is client-side. Route parameters and utm_* are sent as received and parsed in the warehouse.

Example: odk://ondemandkorea.com/series/1234?utm_source=newsletter
Default: null
​

How the user got in — orthogonal to trigger, which records only what the OS did. A deeplink can arrive on either a cold launch or a warm resume. A QR scan cannot identify itself: the camera app hands over a universal link, so QR attribution has to come from utm_source inside that link.

Example: deeplink
Default: null
​

Who handed over the launch, where the OS exposes it: Android Activity.getReferrer() (android-app://<package>, or an http referrer), iOS sourceApplication or the universal-link referrer. The same question context.referrer answers on view, asked of the OS instead of the browser.

Example: android-app://com.google.android.gm
Default: null
​

Milliseconds since this client's last telemetry send — the value it already computes to apply the 30-minute rule. Sent so the session threshold can be re-cut in the warehouse rather than by a client release on every platform.

Example: 1920000
Default: null
​

In-app route the entry landed on. Same field, and same vocabulary, as target_id on view.

Example: /series/1234
Default: null

VisitEvent

client_ts
​string · required

Client send time, ISO 8601 (UTC). Batched events carry their own. Server receive time is recorded separately and is authoritative for sessionization.

Example: 2026-09-04T17:18:00.421Z
​VisitContext · required
event_id
​string · required

Client-generated UUID. Required: the pipeline dedupes retries and batch replays on it, which a server-generated id could not do.

Example: 0d9e2f61-4b3a-4f7e-8c25-71a6de930b18
event_type
​string · const · required
Const value: visit
schema_version
​string · required

Semver of the event_type schema the client speaks.

Example: 1.0.0
On this page
  • HTTPValidationError
  • HeartbeatEvent
  • PlaylistResponse
  • TelemetryEnvelope
  • UtmParams
  • ValidationError
  • ViewContext
  • ViewEvent
  • VisitContext
  • VisitEvent