Get a session audio recording
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Requires read:transcriptions scope (legacy tokens with empty scopes pass).
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}', { method: 'GET', headers: { "x-access-token": "<api-token>" },});
const data = await response.json();console.log(data);import requests
response = requests.request( "GET", "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}", headers={ "x-access-token": "<api-token>" },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http")
func main() { req, _ := http.NewRequest("GET", "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}", nil) req.Header.Add("x-access-token", "<api-token>")
res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/recordings/{recordingId}")) .header("x-access-token", "<api-token>") .method("GET", HttpRequest.BodyPublishers.noBody()) .build();
HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Try it
Response headers
Authorizations
x-access-tokenstringheaderOrganization API token. Generate from Organization Settings → API Tokens.
AuthorizationBearer <token>headerorOAuth 2.1 access token. Obtained via the OAuth PKCE flow at
/oauth/token.
Send one of these. See Authentication.
Path parameters
eventIdintegerpathrequiredEvent ID
sessionIdstring<uuid>pathrequiredSession UUID
recordingIdstring<uuid>pathrequired
Responses
200application/json
OK
dataRecordingShow child attributes
idstring<uuid>typestring- Example
"recording"
session_idstring<uuid>s3_bucketstrings3_keystringAfter complete, non-PCM uploads are stored as
.pcmkeys.encodingstring- Example
"linear16"
sample_rateinteger- Example
16000
channelsinteger- Example
1
statusstring- Allowed values
"recording", "completed"
duration_secondsnumberfile_size_bytesintegerstarted_atstring<date-time>completed_atstring<date-time>created_atstring<date-time>updated_atstring<date-time>mp3_urlstring<uri> | null6-hour presigned HTTPS URL for an MP3 sibling of the original PCM take. Null while the recording is in progress or if transcode has not succeeded yet. Download and store this file — do not hotlink it as a permanent CDN URL. Session PDFs and user-uploaded files stay on
/contentand/files.mp3_expires_atstring<date-time> | nullWhen
mp3_urlstops working. Request the recording again to refresh the URL.
403
Missing read:transcriptions scope
404
Not found
Response examples
{ "data": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "type": "recording", "session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "s3_bucket": "<string>", "s3_key": "<string>", "encoding": "linear16", "sample_rate": 16000, "channels": 1, "status": "recording", "duration_seconds": 123.45, "file_size_bytes": 123, "started_at": "2026-01-15T09:30:00Z", "completed_at": "2026-01-15T09:30:00Z", "created_at": "2026-01-15T09:30:00Z", "updated_at": "2026-01-15T09:30:00Z", "mp3_url": "https://example.com", "mp3_expires_at": "2026-01-15T09:30:00Z" }}