Core API
Clip Extraction
Slice any completed recording into a re-encoded clip with a single API call. The clip is uploaded to your S3 bucket alongside the original recording.
Create a clip
/v1/recordings/:recording_id/clipsQueues a clip extraction job. The clip is processed asynchronously — subscribe to the clip.readywebhook to know when it's available.
Request body
labelstringrequiredA human-readable name for this clip, e.g. "product-highlight". Used in the S3 path.
start_secondsnumberrequiredStart offset from the beginning of the recording, in seconds. Supports decimals.
end_secondsnumberrequiredEnd offset from the beginning of the recording, in seconds. Must be greater than start_seconds.
curl -X POST \
https://api.relay.dev/v1/recordings/rec_01j9x2.../clips \
-H "Authorization: Bearer relay_live_..." \
-H "Content-Type: application/json" \
-d '{
"label": "key-moment",
"start_seconds": 120.0,
"end_seconds": 150.0
}'Response
{
"clip_id": "clip_01j9xz...",
"recording_id": "rec_01j9x2...",
"label": "key-moment",
"start_seconds": 120.0,
"end_seconds": 150.0,
"status": "processing",
"bucket_path": null,
"created_at": "2025-04-05T11:00:00.000Z",
"completed_at": null
}clip.ready webhook rather than polling.Clip lifecycle
processingClip extraction job is queued or running.
completeClip re-encoded and uploaded to your S3 at bucket_path.
failedExtraction failed. Check that the time range is valid.
The clip object
clip_idstringUnique clip identifier.
recording_idstringThe source recording.
labelstringDeveloper-assigned label.
start_secondsnumberStart offset in seconds.
end_secondsnumberEnd offset in seconds.
statusstringCurrent lifecycle status.
bucket_pathstring | nullS3 key where the clip was written once complete.
created_atdatetimeWhen the clip job was created.
completed_atdatetime | nullWhen the clip was uploaded to S3.