The list you see is the index. The bytes are never streamed through the
console — the console mints a link to the object store instead and opens
it in a new tab.
How a recording gets into the store
A recording appears because a client uploaded it. The screen has no start, stop, or record control, and neither the list query nor the playback mutation writes bytes. Until a client uploads something, the list is empty and the screen renders the “No recordings yet” state. Each upload produces one index row plus one object. The row’sstorage_key is the only handle that ties them together — it is the
value the console passes back when you press Play.
The recording index and its fields
adminQuickdesk.recordings.list returns { recordings, total }. Each
entry in recordings carries the fields below. The right-hand column is
how the console renders them.
total is the count of rows in the index, independent of the page you
requested. The console prints it in the page subtitle.
Playback links and how long they last
Pressing Play callsadminQuickdesk.recordings.playbackUrl with the
row’s storage_key. The mutation returns { url } — a presigned
object-store URL — and the console opens it with
window.open(url, '_blank', 'noopener').
Three consequences follow from this being a presigned URL:
- It is short-lived. The link expires. Its lifetime is set by the deployment’s object-store presigning configuration; neither the procedure’s response nor the screen surfaces an expiry value, so do not assume one.
- It is minted on demand, per click. Nothing caches it and nothing stores it on the index row. If a link has expired, press Play again to mint a fresh one.
- It carries its own authorization. Anyone holding the URL can fetch
the object until it expires, with no further login. Do not paste
playback links into tickets, chat, or bug reports — share the
storage_keyinstead and let the recipient mint their own link.
playback.isPending), so only one link is minted at a time.
Retention and deletion
The index row and the stored object are deleted independently, and this screen does not delete either one.list is a read, and playbackUrl
only mints a link — no procedure reachable from the Recordings screen
removes a recording, and the table has no delete control.
Because the two artifacts are separate, they can drift: an index row can
outlive its object. When that happens the row still lists normally, and
the failure only shows up when you try to play it.
Listing and fetching over the API
Both procedures live underadminQuickdesk.recordings on the
control-plane API and authenticate the same way as the rest of the
control plane — see Authentication.
List a page of recordings. The console requests limit: 100, offset: 0;
page through by advancing offset:
When a playback link fails
IfplaybackUrl rejects, the console renders the message under the
table:
storage_key is still present in the bucket; the
index row and the object are stored separately and one can be missing
while the other remains.
Related
- Authentication — API keys for control-plane procedures
- Telemetry — where call-side recording URLs surface in CDRs

