Graine AI

Fetch a recording

The call recording.

The call recording.

Returns the URL by default so a client can hand it to a player, store it, or fetch it on its own schedule. Pass redirect=true to be sent straight to the audio with a 302 — useful for an <audio src> tag.

The audio itself is not served by this API; the URL points at the storage that holds it.

Two different 404s, deliberately distinguished: "Call not found." means no such execution in your organization, while "No recording is available for this execution." means the call is real but produced no audio — it was never answered, recording was disabled for it, or it has not finished yet.

Rate limit: 1200 requests per minute per organization, shared by the endpoints that read calls — lists, single calls, transcripts, recordings and timing — and usage. Exceeding it returns 429 with Retry-After; the X-RateLimit-* response headers report your remaining allowance on every call.

GET
/v2/calls/{execution_id}/recording
/v2/calls/dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3/recording?redirect=false

The Authorization access token

Authorization

Authorization
Required
Bearer <token>

Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.

In: header

Path Parameters

execution_id
Required
Execution Id

The call's id, as returned by POST /v2/calls or GET /v2/calls.

Query Parameters

redirectRedirect

Redirect (302) straight to the audio instead of returning its URL.

Default: false

organization_idOrganization Id

Optional. Must equal your key's organization.

Response Body

200

Where to fetch the audio.

execution_id
Required
Execution Id

The call this audio belongs to.

recording_url
Required
Recording Url

Fetch the audio here. The audio itself is not served by this API. When expires_at is set, this is a signed link that stops working at that time: fetch it again from this endpoint (with your key) for a new one, rather than storing it.

content_typeContent Type

Always "audio/wav". A fixed value kept for compatibility: it does NOT describe the file, and most recordings are MP3. Read media_type for the audio's real format.

Default: "audio/wav"

media_typeMedia Type | null

The audio's real MIME type, read from the recording's file extension: audio/mpeg (.mp3), audio/wav, audio/ogg, audio/mp4 (.m4a), audio/webm or audio/flac. Null when the extension is not one of those.

expires_atExpires At | null

When recording_url stops working (ISO-8601 UTC), for a link signed for a few minutes; null when the URL does not expire.

401

1100 — missing, unknown or inactive API key. 1101 — a browser session token was presented instead of an API key.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

403

1102 — the key is valid but lacks the scope this endpoint requires, or names another organization. GET /v2/scopes reports what a key holds.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

404

1200 — two distinct cases, told apart by the message: 'Call not found.' means no such execution in your organization, while 'No recording is available for this execution.' means the call is real but produced no audio.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

422

1001 — the body or query failed validation; the message names the first offending field.

error
Required
integer

Stable integer code from the error table. Branch on this, not on the message.

message
Required
string

One human-readable sentence. Wording may change; the code will not.

429

1300 — the per-organization request rate or concurrent-call limit was reached. Carries Retry-After.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

503

1501 — a service this endpoint depends on is unreachable or returned a 5xx.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

curl -X GET "https://api.graine.ai/v2/calls/dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3/recording?redirect=false&organization_id=string" \
  -H "Authorization: Bearer <token>"

Where to fetch the audio.

{
  "execution_id": "dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3",
  "recording_url": "https://storage.graine.ai/2026/08/26/0d76fa8c-ea49-4d78-9e5b-1a15ab7b3ac2.mp3",
  "content_type": "audio/wav",
  "media_type": "audio/mpeg",
  "expires_at": "string"
}