Transport
These endpoints do what the transport buttons in the Controller do. Unless you name a timer, they act on the active timer of the cued stage.
The playback status object
Most transport endpoints return this object. All its times are in milliseconds since the Unix epoch.
- Name
_model- Type
- string
- Description
The type of this object. Always
playback_status.
- Name
_updated_at- Type
- timestamp
- Description
When it last changed.
- Name
timer_id- Type
- string
- Description
Empty string when no timer is active.
- Name
running- Type
- boolean
- Description
Whether the timer is running.
falsewhen it's paused, or when no timer is active.
- Name
start- Type
- integer
- Description
The start of the current run, moved forward by any pauses, so
startplus the duration gives the finish. 0 if no timer is active.
- Name
first_started- Type
- integer
- Description
When the run was first started. Pausing, resuming and jumping don't change it. 0 if no timer is active.
- Name
finish- Type
- integer
- Description
Epoch ms when the current run will finish. 0 if inactive.
- Name
pause- Type
- integer
- Description
Epoch ms when paused. 0 if not paused.
- Name
server_time- Type
- integer
- Description
The server's clock when it answered. Compare it with your own clock to correct for any difference.
Get playback status
Returns a stage's playback: which timer is on stage, whether it's running and when it finishes.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Query parameters
- Name
stage_id- Type
- string
- Description
Which stage (
stage-1,stage-2); Stage #1 when omitted. One ofstage-1,stage-2.
Request
curl https://app.kloksi.com/api/v1/rooms/ROOM_ID/playback_status \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Playback status loaded",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Start a timer
Starts the active timer of the cued stage, or the timer in timer_id. A paused timer resumes.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
timer_id- Type
- string
- Description
The timer to act on.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/start_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Timer started at 0:05:00",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Pause a timer
Pauses the running timer and keeps its elapsed time.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/stop_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Timer stopped at 0:04:12",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Start or pause a timer
Pauses the timer if it's running, and starts it if it's paused or idle. Acts on the active timer of the cued stage, or the timer in timer_id.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
timer_id- Type
- string
- Description
The timer to act on.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/toggle_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Timer started at 0:05:00",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Reset a timer
Puts the timer back to its full duration. Acts on the active timer of the cued stage, or the timer in timer_id.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
timer_id- Type
- string
- Description
The timer to act on.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/reset_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Timer reset to 0:05:00",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Go to the next timer
Moves to the next timer that isn't skipped. If the stage is running, that timer starts right away. Otherwise it's only selected.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/next_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Next timer _Panel discussion_ started (0:30:00)",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Go to the previous timer
Moves to the previous timer that isn't skipped. If the stage is running, that timer starts right away. Otherwise it's only selected.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/previous_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Previous timer _Opening keynote_ started (0:20:00)",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Add time
Adds time to the active timer of the cued stage.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
seconds- Type
- integer
- Required
- Description
The seconds part of the duration.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/add_time \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"seconds":60}'
Response 200
{
"ok": true,
"message": "Added 60s to timer. New countdown: 0:06:00",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Subtract time
Takes time off the active timer of the cued stage. It stops at zero.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
seconds- Type
- integer
- Required
- Description
The seconds part of the duration.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/subtract_time \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"seconds":60}'
Response 200
{
"ok": true,
"message": "Subtracted 60s from timer. New countdown: 0:04:00",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Jump within a timer
Moves the timer on stage forward or back without changing its duration. Positive values jump forward.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
milliseconds- Type
- integer
- Required
- Description
How far to jump. Positive goes forward, leaving less time. Negative goes back. It can't be zero, and it stops at the timer's start and end.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/jump \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"milliseconds":30000}'
Response 200
{
"ok": true,
"message": "Jumped forward 30s. New countdown: 0:04:30",
"data": {
"_model": "playback_status",
"_updated_at": "2026-11-05T09:30:00.000Z",
"timer_id": "V1StGXR8Z5jd",
"running": true,
"start": 1793871000000,
"first_started": 1793871000000,
"finish": 1793871300000,
"pause": 0,
"server_time": 1793871060000
}
}
Set the active timer
Makes a timer the active one on its stage without starting it. Transport endpoints then act on it.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
timer_id- Type
- string
- Required
- Description
The timer to act on.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/highlight_timer \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"timer_id":"TIMER_ID"}'
Response 200
{
"ok": true,
"message": "Timer highlighted",
"data": {
"_id": "x7kp2mqa",
"_model": "room",
"_updated_at": "2026-11-05T09:30:00.000Z",
"name": "Annual Conference",
"date": "2026-11-05",
"blackout": false,
"dim": 0,
"focus_message": false,
"on_air": false,
"logo": "",
"timezone": "Europe/Berlin",
"language": "en",
"team_id": "6f2c1e9ab04d7c3e8a5b1d20",
"accepting_questions": false,
"questionnaire": {
"logo": {
"mode": "kloksi"
},
"title": "",
"subtitle": "",
"question_label": "",
"name_label": "",
"hide_name": false
},
"protected_outputs": [
"controller"
],
"archived": false,
"cue_stage_id": "stage-1",
"stages": [
{
"_id": "x7kp2mqa",
"name": "Annual Conference",
"active_timer_id": "V1StGXR8Z5jd",
"timers_count": 1,
"end_of_show": null,
"end_of_show_trigger": "MANUAL",
"end_of_show_loops": 2,
"end_of_show_new_day": false,
"show_run": null
}
]
}
}
Clear the active timer
Clears the active timer of the cued stage.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/unhighlight_timer \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Timer unhighlighted",
"data": {
"_id": "x7kp2mqa",
"_model": "room",
"_updated_at": "2026-11-05T09:30:00.000Z",
"name": "Annual Conference",
"date": "2026-11-05",
"blackout": false,
"dim": 0,
"focus_message": false,
"on_air": false,
"logo": "",
"timezone": "Europe/Berlin",
"language": "en",
"team_id": "6f2c1e9ab04d7c3e8a5b1d20",
"accepting_questions": false,
"questionnaire": {
"logo": {
"mode": "kloksi"
},
"title": "",
"subtitle": "",
"question_label": "",
"name_label": "",
"hide_name": false
},
"protected_outputs": [
"controller"
],
"archived": false,
"cue_stage_id": "stage-1",
"stages": [
{
"_id": "x7kp2mqa",
"name": "Annual Conference",
"active_timer_id": "V1StGXR8Z5jd",
"timers_count": 1,
"end_of_show": null,
"end_of_show_trigger": "MANUAL",
"end_of_show_loops": 2,
"end_of_show_new_day": false,
"show_run": null
}
]
}
}
Cue a stage
Gives a stage the room's cue, so transport endpoints act on it. A stage needs at least one timer to take the cue.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Body
- Name
stage_id- Type
- string
- Required
- Description
The stage. One of
stage-1,stage-2.
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/cue_stage \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"stage_id":"stage-2"}'
Response 200
{
"ok": true,
"message": "Stage cued",
"data": {
"_id": "x7kp2mqa",
"_model": "room",
"_updated_at": "2026-11-05T09:30:00.000Z",
"name": "Annual Conference",
"date": "2026-11-05",
"blackout": false,
"dim": 0,
"focus_message": false,
"on_air": false,
"logo": "",
"timezone": "Europe/Berlin",
"language": "en",
"team_id": "6f2c1e9ab04d7c3e8a5b1d20",
"accepting_questions": false,
"questionnaire": {
"logo": {
"mode": "kloksi"
},
"title": "",
"subtitle": "",
"question_label": "",
"name_label": "",
"hide_name": false
},
"protected_outputs": [
"controller"
],
"archived": false,
"cue_stage_id": "stage-1",
"stages": [
{
"_id": "x7kp2mqa",
"name": "Annual Conference",
"active_timer_id": "V1StGXR8Z5jd",
"timers_count": 1,
"end_of_show": null,
"end_of_show_trigger": "MANUAL",
"end_of_show_loops": 2,
"end_of_show_new_day": false,
"show_run": null
}
]
}
}
Start fresh
Resets the timer on the cued stage, clears the recorded run and makes the first timer active.
Path parameters
- Name
room_id- Type
- string
- Required
- Description
The room's id, from its address:
/o/ROOM_ID/….
Request
curl -X POST https://app.kloksi.com/api/v1/rooms/ROOM_ID/start_fresh \
-H "Authorization: Bearer YOUR_API_KEY"
Response 200
{
"ok": true,
"message": "Started fresh",
"data": {
"_id": "x7kp2mqa",
"_model": "room",
"_updated_at": "2026-11-05T09:30:00.000Z",
"name": "Annual Conference",
"date": "2026-11-05",
"blackout": false,
"dim": 0,
"focus_message": false,
"on_air": false,
"logo": "",
"timezone": "Europe/Berlin",
"language": "en",
"team_id": "6f2c1e9ab04d7c3e8a5b1d20",
"accepting_questions": false,
"questionnaire": {
"logo": {
"mode": "kloksi"
},
"title": "",
"subtitle": "",
"question_label": "",
"name_label": "",
"hide_name": false
},
"protected_outputs": [
"controller"
],
"archived": false,
"cue_stage_id": "stage-1",
"stages": [
{
"_id": "x7kp2mqa",
"name": "Annual Conference",
"active_timer_id": "V1StGXR8Z5jd",
"timers_count": 1,
"end_of_show": null,
"end_of_show_trigger": "MANUAL",
"end_of_show_loops": 2,
"end_of_show_new_day": false,
"show_run": null
}
]
}
}