curl --request POST \
--url https://radiotools.rivi.software/api/v1/integrations/playback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventId": "automation-rivier-20261005-080000",
"observedAt": 1791187200000,
"artist": "The Riverlights",
"title": "Morning Sun",
"album": "Open Water",
"sourceTrackId": "library-track-4821",
"durationSeconds": 210,
"isPlaying": true
}
'{
"accepted": true,
"outcome": "recorded"
}Report now playing
Requires exactly one of ?stationId= or ?stationSlug= (public station slug, same as /api/v1/stations/{stationSlug}) plus an integration credential (integration playback, scope ingest:write) for that same station. Body is at most 8 KiB. Send artist and title, or a single encoder streamTitle (Artist - Title; without a separator the whole string is stored as title). Legacy duration (seconds) is accepted as an alias of durationSeconds but both must match when present. Valid observations are persisted before rundown following; eventId deduplicates provider retries and legacy payloads without ids may collapse within a short adjacent window. Rundown following still requires a live broadcast at observedAt. When the station has artwork lookup on and the body omits artworkUrl, a provider lookup may fill the stored track after this response; the response does not wait for it. Errors on this compatibility-sensitive endpoint are { error: string }.
curl --request POST \
--url https://radiotools.rivi.software/api/v1/integrations/playback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventId": "automation-rivier-20261005-080000",
"observedAt": 1791187200000,
"artist": "The Riverlights",
"title": "Morning Sun",
"album": "Open Water",
"sourceTrackId": "library-track-4821",
"durationSeconds": 210,
"isPlaying": true
}
'{
"accepted": true,
"outcome": "recorded"
}Authorizations
Integration credential (playback) with ingest:write. Send Authorization: Bearer <token>. Sending the rtm_ token alone without Bearer returns 401. In an API client's Bearer token field, enter only the raw rtm_ token; the client adds the prefix.
Query Parameters
Station ID associated with your credential. Send this or stationSlug, not both.
1 - 80Public station slug from the station settings; distinct from the internal station ID.
3 - 63Body
Stable source event identifier for deduplicating retries of the same observation.
1 - 100"automation-rivier-20261005-080000"
Source observation time as Unix milliseconds (not seconds). Omit when the encoder cannot supply it.
0 <= x <= 86400000000000001791187200000
Artist reported by external automation.
1 - 500"The Riverlights"
Human-readable title. Track titles come from external automation.
1 - 500"Morning Sun"
Encoder stream title, usually Artist - Title. Without a separator, the whole string is stored as the title.
1 - 1001Reported album; null when unknown in listener responses.
1 - 500"Open Water"
Optional track identifier in the automation library. Omitted from listener responses.
1 - 120"library-track-4821"
Artwork URL when available. May be omitted; do not assume every track has artwork.
1 - 2048Reported track duration in seconds; null when unknown.
0 <= x <= 86400210
Legacy alias of durationSeconds. If both are provided, their values must match.
0 <= x <= 86400Whether the automation observation reports the track as playing.
true
Response
Observation outcome
Whether the ingest/follow result was accepted. Inspect outcome for the detailed result.
true
Ingest or rundown-follow result. Observations do not control audio playback.
no-live-broadcast, on-air-not-following-rundown, not-playing, rejected, recorded, matched, uncertain, ignored "recorded"
Was this page helpful?