Skip to content

Recordings API

Every broadcast is recorded as one MP4. Collect it within 30 days — it is then deleted for good — by downloading it or by handing its link to another system. Downloads are free, resumable and fast on a single connection.

This page is generated from the OpenAPI specification; the same text is inMarkdown for tools and AI assistants.

Read a recording

GET/v1/streams/{playback_id}/recording

A stream’s recording and, once it is ready, a link to download it. The link is signed for this one file, minted fresh on every read, and lives an hour unless you ask for longer with link_ttl (up to 7 days, never past the recording’s deletion). Use a long link to hand the file to another system that imports it from a URL.

Downloads are free, support Range requests for resuming, and run at your connection’s speed on a single connection.

Path parameters

NameTypeDescription
playback_idrequiredstring

The stream’s playback_id.

Query parameters

NameTypeDescription
link_ttlinteger

Seconds each download link lives, 60 to 604800 (7 days). Default 3600. A link never outlives the recording.

Response 200

The recording.

Fields
NameTypeDescription
playback_idrequiredstring
staterequiredstring

none: nothing to collect yet. finalizing, exporting: being made (about a minute per hour of broadcast). ready: the file exists. failed: it could not be made. deleting, deleted: you deleted it. expired: its 30 days ran out.

One of "none", "finalizing", "exporting", "ready", "failed", "deleting", "deleted", "expired".

bytesrequiredinteger (int64) or null
duration_secondsrequirednumber or null
missing_secondsrequirednumber or null

How much of the broadcast is not in the file; 0 when complete.

ready_atrequiredstring (date-time) or null
retained_untilrequiredstring (date-time) or null

When the file will be deleted if you do not delete it first.

download_urlstring

Only when ready. A credential for this one file.

expires_atstring (date-time)

When download_url stops working.

failure_codestring

Only when failed: no_media, unreadable_media or export_failed.

delete_requested_atstring (date-time)
deleted_atstring (date-time)

Errors

StatusCodeMeaning
400invalid_link_ttl

link_ttl is not a whole number of seconds from 60 to 604800.

404not_found

No such stream in your organization.

Terminal window
curl "https://api.cardinalstreaming.com/v1/streams/1846bdac2d8c0ce0e846d4a3817012c9/recording?link_ttl=86400" \
-H "Authorization: Bearer $CARDINAL_API_KEY"
Response 200
{
"playback_id": "1846bdac2d8c0ce0e846d4a3817012c9",
"state": "ready",
"bytes": 2893012004,
"duration_seconds": 5412.48,
"missing_seconds": 0,
"ready_at": "2026-09-20T15:41:07Z",
"retained_until": "2026-10-20T15:41:07Z",
"download_url": "https://media.cardinal.stream/1846bdac2d8c0ce0e846d4a3817012c9/recording.mp4?t=v1.eyJw...",
"expires_at": "2026-09-20T16:43:12Z"
}

Delete a recording

DELETE/v1/streams/{playback_id}/recording

Deletes the MP4 and every segment of the broadcast, for good, once you have your copy. Only after the stream has ended. Answers 202 while the deletion runs and 200 once it is done; calling it again is safe.

Path parameters

NameTypeDescription
playback_idrequiredstring

The stream’s playback_id.

Response 200

Deleted (or there was nothing to delete).

Fields
NameTypeDescription
playback_idrequiredstring
staterequiredstring

none: nothing to collect yet. finalizing, exporting: being made (about a minute per hour of broadcast). ready: the file exists. failed: it could not be made. deleting, deleted: you deleted it. expired: its 30 days ran out.

One of "none", "finalizing", "exporting", "ready", "failed", "deleting", "deleted", "expired".

bytesrequiredinteger (int64) or null
duration_secondsrequirednumber or null
missing_secondsrequirednumber or null

How much of the broadcast is not in the file; 0 when complete.

ready_atrequiredstring (date-time) or null
retained_untilrequiredstring (date-time) or null

When the file will be deleted if you do not delete it first.

download_urlstring

Only when ready. A credential for this one file.

expires_atstring (date-time)

When download_url stops working.

failure_codestring

Only when failed: no_media, unreadable_media or export_failed.

delete_requested_atstring (date-time)
deleted_atstring (date-time)

Response 202

Deleting.

Fields
NameTypeDescription
playback_idrequiredstring
staterequiredstring

none: nothing to collect yet. finalizing, exporting: being made (about a minute per hour of broadcast). ready: the file exists. failed: it could not be made. deleting, deleted: you deleted it. expired: its 30 days ran out.

One of "none", "finalizing", "exporting", "ready", "failed", "deleting", "deleted", "expired".

bytesrequiredinteger (int64) or null
duration_secondsrequirednumber or null
missing_secondsrequirednumber or null

How much of the broadcast is not in the file; 0 when complete.

ready_atrequiredstring (date-time) or null
retained_untilrequiredstring (date-time) or null

When the file will be deleted if you do not delete it first.

download_urlstring

Only when ready. A credential for this one file.

expires_atstring (date-time)

When download_url stops working.

failure_codestring

Only when failed: no_media, unreadable_media or export_failed.

delete_requested_atstring (date-time)
deleted_atstring (date-time)

Errors

StatusCodeMeaning
404not_found

No such stream in your organization.

409stream_not_ended

End the stream before deleting its recording.

Terminal window
curl -X DELETE "https://api.cardinalstreaming.com/v1/streams/1846bdac2d8c0ce0e846d4a3817012c9/recording" \
-H "Authorization: Bearer $CARDINAL_API_KEY"

List recordings

GET/v1/recordings

Every recording you have, most recently ended first, each ready one with its own fresh download link — the one call for moving every customer’s recordings into your own storage. Page with cursor until next_cursor is absent. Only broadcasts that have a recording are listed.

Query parameters

NameTypeDescription
customer_refstring

Only this customer’s recordings.

statestring

Only recordings in this state. ready for those with a file to collect.

One of "finalizing", "exporting", "ready", "failed", "deleting", "deleted", "expired".

ended_afterstring (date-time)

Only broadcasts that ended at or after this time (RFC 3339).

ended_beforestring (date-time)

Only broadcasts that ended before this time (RFC 3339).

limitinteger

Page size, 1-200. Default 50; more than 200 is treated as 200.

cursorstring

The previous page’s next_cursor.

link_ttlinteger

Seconds each download link lives, 60 to 604800 (7 days). Default 3600. A link never outlives the recording.

Response 200

A page of recordings.

Fields
NameTypeDescription
recordingsrequiredarray of any
next_cursorstring

Present when there is another page. Pass it as cursor.

Errors

StatusCodeMeaning
400invalid_customer_ref

customer_ref is not a valid customer reference.

400invalid_state

state is not one of the recording states (other than none).

400invalid_ended_after

ended_after is not an RFC 3339 time.

400invalid_ended_before

ended_before is not an RFC 3339 time.

400invalid_limit

limit is not a positive whole number.

400invalid_cursor

cursor is not a next_cursor from a previous page.

400invalid_link_ttl

link_ttl is not a whole number of seconds from 60 to 604800.

Terminal window
curl "https://api.cardinalstreaming.com/v1/recordings?customer_ref=grace-chapel&state=ready&link_ttl=86400" \
-H "Authorization: Bearer $CARDINAL_API_KEY"
Response 200
{
"recordings": [
{
"customer_ref": "grace-chapel",
"title": "Sunday Service",
"tier": "standard_1080p",
"ended_at": "2026-09-20T15:39:58Z",
"playback_id": "1846bdac2d8c0ce0e846d4a3817012c9",
"state": "ready",
"bytes": 2893012004,
"duration_seconds": 5412.48,
"missing_seconds": 0,
"ready_at": "2026-09-20T15:41:07Z",
"retained_until": "2026-10-20T15:41:07Z",
"download_url": "https://media.cardinal.stream/1846bdac2d8c0ce0e846d4a3817012c9/recording.mp4?t=v1.eyJw...",
"expires_at": "2026-09-21T15:43:12Z"
}
],
"next_cursor": "cjE6MjAyNi0wOS0yMFQxNTozOTo1OFp8MTg0NmJkYWM"
}

List one customer's recordings

GET/v1/customers/{customer_ref}/recordings

The same as List recordings for one customer. A customer with no recordings, or one you never used, is an empty list.

Path parameters

NameTypeDescription
customer_refrequiredstring

Your identifier for the customer.

Query parameters

NameTypeDescription
statestring

Only recordings in this state. ready for those with a file to collect.

One of "finalizing", "exporting", "ready", "failed", "deleting", "deleted", "expired".

ended_afterstring (date-time)

Only broadcasts that ended at or after this time (RFC 3339).

ended_beforestring (date-time)

Only broadcasts that ended before this time (RFC 3339).

limitinteger

Page size, 1-200. Default 50; more than 200 is treated as 200.

cursorstring

The previous page’s next_cursor.

link_ttlinteger

Seconds each download link lives, 60 to 604800 (7 days). Default 3600. A link never outlives the recording.

Response 200

A page of the customer’s recordings.

Fields
NameTypeDescription
recordingsrequiredarray of any
next_cursorstring

Present when there is another page. Pass it as cursor.

Errors

StatusCodeMeaning
400invalid_customer_ref

The path’s customer reference is not valid.

400invalid_state

state is not one of the recording states (other than none).

400invalid_ended_after

ended_after is not an RFC 3339 time.

400invalid_ended_before

ended_before is not an RFC 3339 time.

400invalid_limit

limit is not a positive whole number.

400invalid_cursor

cursor is not a next_cursor from a previous page.

400invalid_link_ttl

link_ttl is not a whole number of seconds from 60 to 604800.

Terminal window
curl "https://api.cardinalstreaming.com/v1/customers/grace-chapel/recordings?state=ready&link_ttl=86400" \
-H "Authorization: Bearer $CARDINAL_API_KEY"
Response 200
{
"recordings": [
{
"customer_ref": "grace-chapel",
"title": "Sunday Service",
"tier": "standard_1080p",
"ended_at": "2026-09-20T15:39:58Z",
"playback_id": "1846bdac2d8c0ce0e846d4a3817012c9",
"state": "ready",
"bytes": 2893012004,
"duration_seconds": 5412.48,
"missing_seconds": 0,
"ready_at": "2026-09-20T15:41:07Z",
"retained_until": "2026-10-20T15:41:07Z",
"download_url": "https://media.cardinal.stream/1846bdac2d8c0ce0e846d4a3817012c9/recording.mp4?t=v1.eyJw...",
"expires_at": "2026-09-21T15:43:12Z"
}
],
"next_cursor": "cjE6MjAyNi0wOS0yMFQxNTozOTo1OFp8MTg0NmJkYWM"
}