---
title: "Fetch the session recording (signed URL, sign-on-read)"
method: GET
path: "/v1/streams/{id}/recording"
tags: ["streams"]
---

# Fetch the session recording (signed URL, sign-on-read)

`GET /v1/streams/{id}/recording`

## Request

- Base URL: `https://api.primateintelligence.ai`
- URL: `https://api.primateintelligence.ai/v1/streams/{id}/recording`
- Auth: HTTP bearer

PRI-496: returns a signed playback URL for the server-side session recording. Requires the stream to have been created with recording: true and to have ended with a stored recording. 404 resource_not_found when recording was not enabled; 409 resource_conflict while the stream is still active, when capture failed, or when no recording was stored. URL TTL 1h — re-fetch for a fresh one.

## Path parameters

- `id` string, required

## Response `200`

Signed recording URL.

- StreamRecording
  - `object` 'stream_recording', required
  - `stream_id` string, required: Stream resource id (prefixed ULID). P6 §4.8.
  - `url` string, uri, required: Signed playback URL — fresh on every GET, 1h TTL. Re-fetch for a new one.
  - `expires_at` string, required: RFC 3339 expiry of the signed URL.
  - `content_type` 'video/h264', required
  - `container` 'h264-annex-b', required: Raw H.264 Annex-B elementary stream. Lossless remux to MP4: ffmpeg -i in.h264 -c copy out.mp4.

## Other responses

- `400`: validation_failed / url_forbidden / prompt errors (§15)
- `401`: invalid_api_key / key_revoked / key_expired
- `404`: resource_not_found (account-scoped; no existence oracle)
- `409`: resource_conflict / idempotency_key_reused / idempotency_unavailable
- `429`: rate_limit_exceeded / concurrency_limit_exceeded / quota_exceeded (always with Retry-After)

---

[API](https://skmtc.dev/primateintelligence/apis/primate-vision-api.md) · [All operations](https://skmtc.dev/primateintelligence/apis/primate-vision-api/llms.txt) · [OpenAPI document](https://skmtc.dev/primateintelligence/apis/primate-vision-api/revisions/aa51b01dc8ad?raw)
