curl --request POST \
--url https://api.aircaps.com/v1/transcripts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "a5s-async-v1",
"audio_url": "https://example.com/meeting.mp3",
"language_code": "en",
"webhook_url": "https://example.com/hooks/aircaps",
"metadata": {
"meeting_id": 42
}
}
'import requests
url = "https://api.aircaps.com/v1/transcripts"
payload = {
"model": "a5s-async-v1",
"audio_url": "https://example.com/meeting.mp3",
"language_code": "en",
"webhook_url": "https://example.com/hooks/aircaps",
"metadata": { "meeting_id": 42 }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'a5s-async-v1',
audio_url: 'https://example.com/meeting.mp3',
language_code: 'en',
webhook_url: 'https://example.com/hooks/aircaps',
metadata: {meeting_id: 42}
})
};
fetch('https://api.aircaps.com/v1/transcripts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "tr_01k6z3m4q8w7e5r2t1y0u9i8o7",
"object": "transcript",
"status": "queued",
"created_at": "2026-10-06T18:01:02.123Z",
"started_at": null,
"completed_at": null,
"audio_url": null,
"file_id": "file_01k6z3m4q8w7e5r2t1y0u9i8o7",
"language_code": "en",
"model": "a5s-async-v1",
"audio_duration": null,
"metadata": {
"meeting_id": 42
},
"webhook_url": "https://example.com/hooks/aircaps",
"webhook_status_code": null,
"error": null
}{
"error": {
"type": "invalid_request_error",
"code": "unsupported_language",
"message": "language 'de' is not supported; only English (\"en\", \"en-US\", ...) is available today. Multilingual support is planned.",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "authentication_error",
"code": "unauthorized",
"message": "invalid API key",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "permission_error",
"code": "model_access_denied",
"message": "This account does not have access to A5S Async v1. To get access, talk to sales at https://research.aircaps.com/contact.",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "invalid_request_error",
"code": "idempotency_conflict",
"message": "Idempotency-Key was used with a different request",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "too many requests; retry after the Retry-After interval",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "internal error",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}Create a transcript
Start transcribing audio with A5S Async v1. The job runs asynchronously: poll Get a transcript or pass webhook_url.
curl --request POST \
--url https://api.aircaps.com/v1/transcripts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "a5s-async-v1",
"audio_url": "https://example.com/meeting.mp3",
"language_code": "en",
"webhook_url": "https://example.com/hooks/aircaps",
"metadata": {
"meeting_id": 42
}
}
'import requests
url = "https://api.aircaps.com/v1/transcripts"
payload = {
"model": "a5s-async-v1",
"audio_url": "https://example.com/meeting.mp3",
"language_code": "en",
"webhook_url": "https://example.com/hooks/aircaps",
"metadata": { "meeting_id": 42 }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'a5s-async-v1',
audio_url: 'https://example.com/meeting.mp3',
language_code: 'en',
webhook_url: 'https://example.com/hooks/aircaps',
metadata: {meeting_id: 42}
})
};
fetch('https://api.aircaps.com/v1/transcripts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "tr_01k6z3m4q8w7e5r2t1y0u9i8o7",
"object": "transcript",
"status": "queued",
"created_at": "2026-10-06T18:01:02.123Z",
"started_at": null,
"completed_at": null,
"audio_url": null,
"file_id": "file_01k6z3m4q8w7e5r2t1y0u9i8o7",
"language_code": "en",
"model": "a5s-async-v1",
"audio_duration": null,
"metadata": {
"meeting_id": 42
},
"webhook_url": "https://example.com/hooks/aircaps",
"webhook_status_code": null,
"error": null
}{
"error": {
"type": "invalid_request_error",
"code": "unsupported_language",
"message": "language 'de' is not supported; only English (\"en\", \"en-US\", ...) is available today. Multilingual support is planned.",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "authentication_error",
"code": "unauthorized",
"message": "invalid API key",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "permission_error",
"code": "model_access_denied",
"message": "This account does not have access to A5S Async v1. To get access, talk to sales at https://research.aircaps.com/contact.",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "invalid_request_error",
"code": "idempotency_conflict",
"message": "Idempotency-Key was used with a different request",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "too many requests; retry after the Retry-After interval",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "internal error",
"param": null,
"request_id": "req_01k6z3m4q8w7e5r2t1y0u9i8o7"
}
}Authorizations
Your API key: Authorization: Bearer aircaps_sk_...
Headers
Up to 255 characters. Makes retries safe: the same key and body return the original job.
255Body
Provide exactly one of audio_url or file_id.
The model. Any other value returns 400 unsupported_model.
a5s-async-v1 An http(s) URL to download the audio from (public or presigned), up to 5 GB, resolving to a public address.
8192"https://example.com/meeting.mp3"
ID from Create an upload URL or Upload a file.
64Language of the audio. English only today: en or a regional variant (en-US, en-GB, en-AU, en-CA, en-IN, en-IE, en-NZ, en-ZA; case-insensitive, - or _). Any other value returns 400 unsupported_language. Multilingual support is planned.
16"en-US"
Called with a webhook event when the job finishes.
2048Name of a header to add to webhook requests. Requires webhook_url.
256"Authorization"
Value of that header.
4096Any JSON object up to 16 KB; echoed on the transcript and in webhooks.
{ "meeting_id": 42 }
Response
Created. A retried request with the same Idempotency-Key returns the original transcript with 200.
Transcript ID.
"tr_01k6z3m4q8w7e5r2t1y0u9i8o7"
transcript "transcript"
queued: waiting for a processing slot. processing: being transcribed. completed: result fields present. error: see error.
queued, processing, completed, error When the transcript was created (UTC).
When processing started.
When the job finished (completed or error).
The submitted audio_url, if any.
The submitted file_id, if any.
Language of the transcript (normalised).
en a5s-async-v1 Audio duration in seconds, once known.
3600.512
Your metadata, echoed back.
Webhook target, if any.
HTTP status of the last webhook delivery.
Set when status is error.
Show child attributes
Show child attributes
Completed only. Full transcript: verbatim, lowercase, no punctuation.
Completed only.
Show child attributes
Show child attributes
Completed only. Speaker turns, in time order; overlapping speech overlaps.
Show child attributes
Show child attributes
Completed only. Every word, in time order.
Show child attributes
Show child attributes