Stream Music Schedule
Replace music schedule
https://api.tunio.ai/ v1/ stream-music-schedule/ {stream_id}Replaces every music slot of the stream with the given set, atomically. Every playlist and jingle bundle must belong to the caller's library, and no two slots of the set may overlap on the same day (the rule of the single-slot endpoint, applied to the whole set). With dry_run=true nothing is written: the response says whether the set is valid, lists the conflicts and the diff against the current schedule. With dry_run=false a conflicting set is refused with 409 and nothing is written. A valid set is applied after the stream's current schedule (music and content) is saved as a private schedule profile, returned as snapshot_profile_id; apply it with POST /v1/schedule-profiles/{profile_id}/apply to roll back. The last 20 automatic snapshots per stream are kept. Slots that do not change keep their slot_id.
Path parameters
| Name | Type | Description |
|---|---|---|
| stream_idRequired | string | Stream ID |
Request body
Complete new schedule
| Name | Type | Description |
|---|---|---|
| dry_run | boolean | DryRun validates and reports the diff without writing anything. |
| slots | array | Slots is the complete new schedule; an empty array clears it. |
| [item]Required | object | - |
01{02 "dry_run": true,03 "slots": [04 {05 "day_of_week": 1,06 "duration_min": 180,07 "end_time": "12:00",08 "jingle_playlist_id": "string",09 "jingles_tracks_interval": 2,10 "let_static_finish": false,11 "playlist_id": "6f1d1d4c-8c47-4b9f-a1f4-7c1f0b2f9a11",12 "start_at": "2026-10-12T09:00:00+03:00",13 "start_time": "09:00",14 "transition": "string",15 "volume": 116 }17 ]18}
Responses
| Name | Type | Description |
|---|---|---|
| conflicts | array | Conflicts lists every overlapping pair of requested slots. |
| [item]Required | object | - |
| diff | object | Diff compares the request with the current schedule. |
| added | array | Added lists the slots that are not in the current schedule. |
| removed | array | Removed lists the current slots that the request does not keep. |
| unchanged_count | integer | UnchangedCount is how many current slots stay as they are (and keep their slot_id). |
| dry_run | boolean | DryRun echoes the request. |
| message | string | Message is schedule_conflict on a 409. |
| snapshot_profile_id | string | SnapshotProfileID is the private schedule profile holding the stream's schedule (music and content) as it was
before this write; apply it with POST /v1/schedule-profiles/{profile_id}/apply to roll back. Null on dry runs. |
| success | boolean | - |
| valid | boolean | Valid is false when slots of the request overlap each other. |
| Name | Type | Description |
|---|---|---|
| message | string | Message contains human readable error details. |
| success | boolean | Success is always false for error payloads. |
| Name | Type | Description |
|---|---|---|
| message | string | Message contains human readable error details. |
| success | boolean | Success is always false for error payloads. |
| Name | Type | Description |
|---|---|---|
| message | string | Message contains human readable error details. |
| success | boolean | Success is always false for error payloads. |
| Name | Type | Description |
|---|---|---|
| message | string | Message contains human readable error details. |
| success | boolean | Success is always false for error payloads. |
| Name | Type | Description |
|---|---|---|
| conflicts | array | Conflicts lists every overlapping pair of requested slots. |
| [item]Required | object | - |
| diff | object | Diff compares the request with the current schedule. |
| added | array | Added lists the slots that are not in the current schedule. |
| removed | array | Removed lists the current slots that the request does not keep. |
| unchanged_count | integer | UnchangedCount is how many current slots stay as they are (and keep their slot_id). |
| dry_run | boolean | DryRun echoes the request. |
| message | string | Message is schedule_conflict on a 409. |
| snapshot_profile_id | string | SnapshotProfileID is the private schedule profile holding the stream's schedule (music and content) as it was
before this write; apply it with POST /v1/schedule-profiles/{profile_id}/apply to roll back. Null on dry runs. |
| success | boolean | - |
| valid | boolean | Valid is false when slots of the request overlap each other. |
| Name | Type | Description |
|---|---|---|
| message | string | Message contains human readable error details. |
| success | boolean | Success is always false for error payloads. |