Platform
Local-first capture, from your own product.
Create capture requests and recording sessions over a REST API, get told when a recording lands, and download the original file — with a record of exactly what was captured.
The thing to understand first
Capture is local, so it is asynchronous. When a session ends, the media is still on someone's laptop — and it may never arrive. That is not an edge case to code around; it is the shape of the API.
Tracks arrive independently
A recording with two of four tracks present is a correct response, not a partial failure. They land over minutes to hours.
Orphaned is a real state
A take can strand when a client vanishes mid-upload. It is recoverable: ending a session again re-attempts promotion, and the response says whether the tracks are still waiting.
Webhooks are not optional
A client polling for “is my recording ready” has no bounded answer. Subscribe to the events below instead.
Events
Signed with your endpoint secret, retried with backoff for about a day, and logged so you can answer “did that fire?”.
| capture.buffered | A live recording finished and is durable, but the user has not saved it yet. |
| capture.completed | A recording finished uploading and is in the library. |
| capture.failed | A recording could not be delivered. |
| capture_request.submission_received | Someone submitted a take to a capture request. |
| capture_request.closed | A capture request hit its deadline or was closed. |
Scopes
A key grants exactly what you check, and nothing implies anything else — reading a recording is not permission to download it.
| recordings:read | List recordings and read their capture manifests. |
| recordings:download | Mint short-lived download URLs for recording files. |
| usage:read | Read this organization’s capture usage. |
| capture_requests:read | List capture requests, their rosters, and submitted takes. |
| capture_requests:write | Create, edit, and close capture requests, and add contacts. |
| sessions:read | List recording sessions and see who joined. |
| sessions:write | Create recording sessions, mint invites, and end them. |
Test-mode keys read everything and change nothing that reaches the outside world — no download URLs, no emails to real people, no sessions drawing on your allowance.
Record inside your own product
@capturly/capture-sdk puts the recorder in your app. Your backend creates a capture request and mints a per-person link; the SDK records against it in the browser, holds the take locally so someone can watch it back, then uploads it. Your secret key never leaves your server.
npm install @capturly/capture-sdk
const client = new CaptureClient({ access: { mode: 'contact', contactId, key } });
videoEl.srcObject = await client.preview();
await client.start();
const take = await client.stop(); // still in the browser
await client.submit({ releaseAccepted: true });One person at a time. Rooms where several people record at once are the sessions API and the hosted recorder.
Start with a test key
The API is included with Team and Platform. Keys are created from your account and shown once.
Create an API key