playback:write scope.
Supported actions
Send these actions to:startpauseresumestopprogress
Minimum payload shape
At a minimum, send enough identity to resolve the title reliably.Supported payload fields
| Field | Type | Notes |
|---|---|---|
event_id | string | Stable event identifier for dedupe |
media_type | movie or episode | Required |
title | string | Required in practice for reliable identification |
year | number | Helpful for movie disambiguation |
imdb_id | string | Optional external identifier |
tmdb_id | number | Preferred metadata identifier |
tvdb_id | number | Optional external identifier |
punchplay_id | string | PunchPlay-native identifier when available |
season | number | Episode season number |
episode | number | Episode number |
episode_end | number | End episode for multi-episode playback |
absolute_episode | number | Absolute numbering for anime-like episode data |
episode_title | string | Optional episode title |
multi_episode | boolean | Indicates multi-episode playback |
anime | boolean | Helps anime resolution |
progress | number | Fractional progress between 0 and 1 |
duration_seconds | number | Total runtime |
position_seconds | number | Current playback position |
device_id | string | Client or device identity |
playback_session_id | string | Critical for ordering and session lifecycle |
event_created_at | number | Millisecond timestamp from the client |
client_version | string | Integration version for diagnostics |
watched | boolean | Explicit watch completion override on stop |
watched_threshold | number | Completion threshold when using progress-derived stops |
raw_filename | string | Helps fallback matching |
Movie example
Episode example
Event ordering behavior
PunchPlay applies session-aware event handling so clients can send real playback events without manually reconstructing user state. Important behaviors:- Duplicate
event_idvalues are deduped. - A
stopmay create a completed watch or only save progress, depending on completion state. - Older events that arrive after a stop are ignored.
- Newer progress after a stopped session can reopen the session.
pauseupdates state without creating a watch.
Best practices
- Always send a stable
playback_session_id. - Send
event_created_atfrom the client, not the server, when possible. - Send
tmdb_idwhenever available. - Include
position_secondsandduration_secondsfor accurate progress. - Treat
event_idas required if your client can generate one.
Completion rules
Astop event is treated as watched when one of these is true:
watchedis explicitlytrueprogressor derived progress meetswatched_threshold
Failure handling
Platform playback errors include:request_idin the JSON bodyX-PunchPlay-Request-Idin the response headers