Submit audio for batch transcription. Provide exactly one source:
either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage)
a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), orgpt_live: {session_id} for a connected project (gated availability).
GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service.
GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission.
Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback.
Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.
Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both.
Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots.
Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT.
Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint.
Requires the transcribe:jobs scope.
Opt-in safe retry (JSON body path). Reusing the key with an identical body replays the original 202 response; reusing it with a different body returns 409. GPT-Live sources use connection/session deduplication instead and ignore this header.
Dual-channel (stereo) separation. Channel 0 is labelled speaker_1, channel 1 speaker_2; labels are neutral and do not infer agent/customer roles. Do not combine with diarize.
Model-derived speaker separation for mono audio. Labels identify turns within this result, not stable people across separate jobs. Use channel instead for stereo recordings.
Tri-state inverse-text normalization for English final transcripts (never interim partials). true renders spoken numbers as digits (phones, currency, dates, ordinals). false keeps those spans in spoken form. Omitted keeps the live engine default: number formatting is ON for finals. Independent of smart_format.
Opt-in English punctuation and sentence capitalization on final transcripts only. Interim partials are never formatted. May change only case and punctuation; any failure returns the unformatted final. Default false. Independent of numerals. Non-English requests are unchanged.
Opt-in spoken punctuation commands on English final transcripts only: period, comma, new paragraph, and question mark. Separate from smart_format and off by default. Interim partials are never rewritten.
Opt-in stripping of filled pauses (um, uh, umm, uhh, er) on English final transcripts. Off by default. Do not enable on legal or compliance audio by default. Interim partials are never rewritten.
Optional per-job terms for known names, brands, products, and other distinctive phrases. PyAI trims entries, removes case-insensitive duplicates, and keeps the first spelling and order. Entries shorter than 4 characters, longer than 64 characters, sentence-shaped input, non-string entries, and conservative common words are ignored. At most the first 5 valid terms are used. Invalid entries do not reject the job. When stored vocabulary is enabled for batch, request terms come first and stored suggestions fill any remaining slots. The effective list applies only to this job and does not select transcription language.
HTTPS URL for transcription.job.completed or transcription.job.failed. PyAI POSTs {type, created, data} and signs the exact body in X-PyAI-Signature: t=<unix_seconds>,v1=<hex>, where v1 is HMAC-SHA256 over <t>.<rawBody>.
Trace compliance add-on: deterministic PII scan + redaction over the final transcript (SSN, card numbers, CVV-in-context, email, US phone — the pii_v0 entity set). The result carries the redacted transcript plus a trace summary (verdict, PII count). Patterns run on the formatted transcript, so pair with the default numerals (digits) for full effect. Requires the org's Trace entitlement on this surface (else 402); bills one Trace call. Not supported together with diarize/channel.
Optional Trace rule pack (only used when trace is true). entities (or redact) narrows the scan to a subset of: ssn, credit_card, cvv, email, us_phone; unknown names are ignored and an empty selection means the full set.
Optional Recap summarization language. It does not affect transcription: async jobs transcribe all eight Hear languages (en/es/fr/de/hi/it/pt/nl) and the spoken language is auto-detected per call.
Human-readable normalized failure message on failed jobs. This field is not a stable machine-readable failure code.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"PyAI Developers","description":"Build voice agents through the console or API, powered by Omni. Agents, Hear, Speak, Clone, Cast, and Dub documentation.","colors":{"primary":"#5B5BD6","light":"#8E8EF0","dark":"#3A3AB0"},"logo":{"light":"https://mintcdn.com/pyai/WdY9MU3V1Ll4Gm-R/logo/light.svg?fit=max\u0026auto=format\u0026n=WdY9MU3V1Ll4Gm-R\u0026q=85\u0026s=c47abcf1c2ebb1a5b3d736c8048fe048","dark":"https://mintcdn.com/pyai/WdY9MU3V1Ll4Gm-R/logo/dark.svg?fit=max\u0026auto=format\u0026n=WdY9MU3V1Ll4Gm-R\u0026q=85\u0026s=27b4f2ab467e5a0d91c0f24c4d191765"},"favicon":"https://mintcdn.com/pyai/G4w3mSmcZ1PP4hMU/favicon.svg?fit=max\u0026auto=format\u0026n=G4w3mSmcZ1PP4hMU\u0026q=85\u0026s=b2a603e1ab6b02d3ea6fcc051f224e1c","appearance":{"default":"system"},"navbar":{"links":[{"href":"https://api.pyai.com/openapi.json","label":"OpenAPI spec"},{"href":"https://status.pyai.com","label":"Status"}],"primary":{"type":"button","label":"Choose a path","href":"/choose-your-path"}},"footer":{"socials":{"website":"https://pyai.com","x":"https://x.com/getpyai"}},"search":{"prompt":"Search the PyAI docs"},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude","download-spec","grok","cursor","aistudio","perplexity","vscode"],"display":"header"},"interaction":{"drilldown":true},"markdown":{"schema":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"pyai","hasAudioNarration":false,"actualSubdomain":"pyai","customDomains":["docs.pyai.com"],"gitSource":{"type":"github","owner":"atomsai","repo":"pyai-platform-backend","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"12a4fb84-aa68-4edc-9901-c01777ec7393","liveDeploymentHistoryId":"6ae19fa19297755be19eb616","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae19fa19297755be19eb616"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae1c523661bff0c6e728f57","clientVersion":"0.0.4071","searchFilterCounts":[{"language":"default","tag":"API reference","count":199},{"language":"default","tag":"Documentation","count":82},{"language":"default","tag":"Telephony","count":38},{"language":"default","tag":"Agents","count":33},{"language":"default","tag":"Integrations","count":27},{"language":"default","tag":"Knowledge Bases","count":14},{"language":"default","tag":"Get started","count":13},{"language":"default","tag":"Trace","count":12},{"language":"default","tag":"WhatsApp","count":12},{"language":"default","tag":"Dub","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/transcription-jobs/create-an-async-transcription-job","slug":"/api-reference/transcription-jobs/create-an-async-transcription-job","pageMetadata":{"title":"Create an async transcription job","description":"Submit audio for batch transcription. Provide **exactly one** source:\neither `audio_url` (an https URL we fetch; the input is processed transiently and never written to durable input storage)\na multipart upload (`multipart/form-data` with an `audio` file part and the same fields as form fields), **or** `gpt_live: {session_id}` for a connected project (gated availability).\nGPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with `hear:transcribe` and `transcribe:jobs`. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with `store: true`. This is a post-call import, not an account-wide discovery service.\nGPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission.\n\nReturns `202` immediately with a `queued` job; poll `GET /v1/transcription/jobs/{id}` or supply a `webhook_url` for a signed completion callback.\nCompleted JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.\nSet `channel: true` for stereo (dual-channel) recordings to get exact speaker separation per channel. Use `diarize: true` for model-derived speaker labels on mono audio; do not set both.\nSet `vocabulary` only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill remaining slots.\n\n**Input limits:** multipart uploads are limited to 1 GiB; `audio_url` downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT.\n\n**Retention:** URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no `store: false` mode. `DELETE /v1/transcription/jobs/{id}` cancels queued/running work; it is not an erasure endpoint.\nRequires the `transcribe:jobs` scope.","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/transcription/jobs","href":"/api-reference/transcription-jobs/create-an-async-transcription-job","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Submit audio for batch transcription. Provide \", _jsx(_components.strong, {\n children: \"exactly one\"\n }), \" source:\\neither \", _jsx(_components.code, {\n children: \"audio_url\"\n }), \" (an https URL we fetch; the input is processed transiently and never written to durable input storage)\\na multipart upload (\", _jsx(_components.code, {\n children: \"multipart/form-data\"\n }), \" with an \", _jsx(_components.code, {\n children: \"audio\"\n }), \" file part and the same fields as form fields), \", _jsx(_components.strong, {\n children: \"or\"\n }), \" \", _jsx(_components.code, {\n children: \"gpt_live: {session_id}\"\n }), \" for a connected project (gated availability).\\nGPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with \", _jsx(_components.code, {\n children: \"hear:transcribe\"\n }), \" and \", _jsx(_components.code, {\n children: \"transcribe:jobs\"\n }), \". No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with \", _jsx(_components.code, {\n children: \"store: true\"\n }), \". This is a post-call import, not an account-wide discovery service.\\nGPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Returns \", _jsx(_components.code, {\n children: \"202\"\n }), \" immediately with a \", _jsx(_components.code, {\n children: \"queued\"\n }), \" job; poll \", _jsx(_components.code, {\n children: \"GET /v1/transcription/jobs/{id}\"\n }), \" or supply a \", _jsx(_components.code, {\n children: \"webhook_url\"\n }), \" for a signed completion callback.\\nCompleted JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.\\nSet \", _jsx(_components.code, {\n children: \"channel: true\"\n }), \" for stereo (dual-channel) recordings to get exact speaker separation per channel. Use \", _jsx(_components.code, {\n children: \"diarize: true\"\n }), \" for model-derived speaker labels on mono audio; do not set both.\\nSet \", _jsx(_components.code, {\n children: \"vocabulary\"\n }), \" only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for \", _jsx(_components.code, {\n children: \"batch\"\n }), \", request terms come first and stored suggestions fill remaining slots.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Input limits:\"\n }), \" multipart uploads are limited to 1 GiB; \", _jsx(_components.code, {\n children: \"audio_url\"\n }), \" downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Retention:\"\n }), \" URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no \", _jsx(_components.code, {\n children: \"store: false\"\n }), \" mode. \", _jsx(_components.code, {\n children: \"DELETE /v1/transcription/jobs/{id}\"\n }), \" cancels queued/running work; it is not an erasure endpoint.\\nRequires the \", _jsx(_components.code, {\n children: \"transcribe:jobs\"\n }), \" scope.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create an async transcription job","description":"Submit audio for batch transcription. Provide **exactly one** source:\neither `audio_url` (an https URL we fetch; the input is processed transiently and never written to durable input storage)\na multipart upload (`multipart/form-data` with an `audio` file part and the same fields as form fields), **or** `gpt_live: {session_id}` for a connected project (gated availability).\nGPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with `hear:transcribe` and `transcribe:jobs`. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with `store: true`. This is a post-call import, not an account-wide discovery service.\nGPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission.\n\nReturns `202` immediately with a `queued` job; poll `GET /v1/transcription/jobs/{id}` or supply a `webhook_url` for a signed completion callback.\nCompleted JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.\nSet `channel: true` for stereo (dual-channel) recordings to get exact speaker separation per channel. Use `diarize: true` for model-derived speaker labels on mono audio; do not set both.\nSet `vocabulary` only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill remaining slots.\n\n**Input limits:** multipart uploads are limited to 1 GiB; `audio_url` downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT.\n\n**Retention:** URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no `store: false` mode. `DELETE /v1/transcription/jobs/{id}` cancels queued/running work; it is not an erasure endpoint.\nRequires the `transcribe:jobs` scope.","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/transcription/jobs","href":"/api-reference/transcription-jobs/create-an-async-transcription-job","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Transcription Jobs"],"summary":"Create an async transcription job","description":"Submit audio for batch transcription. Provide **exactly one** source:\neither `audio_url` (an https URL we fetch; the input is processed transiently and never written to durable input storage)\na multipart upload (`multipart/form-data` with an `audio` file part and the same fields as form fields), **or** `gpt_live: {session_id}` for a connected project (gated availability).\nGPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with `hear:transcribe` and `transcribe:jobs`. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with `store: true`. This is a post-call import, not an account-wide discovery service.\nGPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission.\n\nReturns `202` immediately with a `queued` job; poll `GET /v1/transcription/jobs/{id}` or supply a `webhook_url` for a signed completion callback.\nCompleted JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.\nSet `channel: true` for stereo (dual-channel) recordings to get exact speaker separation per channel. Use `diarize: true` for model-derived speaker labels on mono audio; do not set both.\nSet `vocabulary` only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill remaining slots.\n\n**Input limits:** multipart uploads are limited to 1 GiB; `audio_url` downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT.\n\n**Retention:** URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no `store: false` mode. `DELETE /v1/transcription/jobs/{id}` cancels queued/running work; it is not an erasure endpoint.\nRequires the `transcribe:jobs` scope.","operationId":"createTranscriptionJob","parameters":["b2085e47-06a2-4e34-aced-e0dba22f3aa8"],"requestBody":"0f3a7cb1-46ae-41c3-ae2f-51ddf5ad1b11","responses":{"202":"96cedde0-a0e0-47ae-b0a1-7f168bbfa486","400":"2d67fc54-1127-4f08-98ed-5db7e9824b9b","401":"45d99d86-b5e8-496e-bb4c-74268e1c768b","402":"9675844b-0251-4b10-9981-8b656b28ce48","403":"73093a87-d83b-4709-b2c5-05503c6c21f9","409":"596a38c4-ab16-4b19-a045-2b0c51303634","429":"88f11341-1e04-4c2d-905f-5a9d755c3527"},"method":"post","type":"path","servers":["0ec3a5f5-8471-4041-8e01-12cfeb17ea9d"],"security":["8fef4c78-11e3-47d3-85f4-d66b250b7ccf","ba0f4d3b-c001-406b-aa6e-8db0d6eba5f5"],"path":"/v1/transcription/jobs","baseUrlOptions":["https://api.pyai.com"],"title":"Create an async transcription job","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"b2085e47-06a2-4e34-aced-e0dba22f3aa8":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255,"isRequired":false,"description":"Opt-in safe retry (JSON body path). Reusing the key with an identical body replays the original 202 response; reusing it with a different body returns 409. GPT-Live sources use connection/session deduplication instead and ignore this header.","uniqueKey":"","typeLabel":"string"},"description":"Opt-in safe retry (JSON body path). Reusing the key with an identical body replays the original 202 response; reusing it with a different body returns 409. GPT-Live sources use connection/session deduplication instead and ignore this header."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["audio_url"],"properties":{"audio_url":{"type":"string","format":"uri","description":"HTTPS URL of the audio to transcribe. PyAI fetches the input transiently without writing it to durable input storage. Maximum response body: 512 MiB.","isRequired":true,"uniqueKey":"oneOf.0.audio_url","typeLabel":"string\u003curi>"},"gpt_live":{"type":"object","additionalProperties":false,"required":["session_id"],"properties":{"session_id":{"type":"string","minLength":1,"maxLength":256,"description":"Opaque completed GPT-Live session ID belonging to the connected OpenAI project.","isRequired":true,"uniqueKey":"oneOf.0.gpt_live.session_id","typeLabel":"string"}},"uniqueKey":"oneOf.0.gpt_live","typeLabel":"object"},"model":{"type":"string","default":"pyai-hear-telephony","uniqueKey":"oneOf.0.model","typeLabel":"string"},"channel":{"type":"boolean","default":false,"description":"Dual-channel (stereo) separation. Channel 0 is labelled `speaker_1`, channel 1 `speaker_2`; labels are neutral and do not infer agent/customer roles. Do not combine with `diarize`.","uniqueKey":"oneOf.0.channel","typeLabel":"boolean"},"diarize":{"type":"boolean","default":false,"description":"Model-derived speaker separation for mono audio. Labels identify turns within this result, not stable people across separate jobs. Use `channel` instead for stereo recordings.","uniqueKey":"oneOf.0.diarize","typeLabel":"boolean"},"numerals":{"type":"boolean","description":"Tri-state inverse-text normalization for English **final** transcripts (never interim partials). `true` renders spoken numbers as digits (phones, currency, dates, ordinals). `false` keeps those spans in spoken form. Omitted keeps the live engine default: number formatting is ON for finals. Independent of `smart_format`.","uniqueKey":"oneOf.0.numerals","typeLabel":"boolean"},"smart_format":{"type":"boolean","default":false,"description":"Opt-in English punctuation and sentence capitalization on **final** transcripts only. Interim partials are never formatted. May change only case and punctuation; any failure returns the unformatted final. Default `false`. Independent of `numerals`. Non-English requests are unchanged.","uniqueKey":"oneOf.0.smart_format","typeLabel":"boolean"},"dictation":{"type":"boolean","default":false,"description":"Opt-in spoken punctuation commands on English **final** transcripts only: `period`, `comma`, `new paragraph`, and `question mark`. Separate from `smart_format` and off by default. Interim partials are never rewritten.","uniqueKey":"oneOf.0.dictation","typeLabel":"boolean"},"drop_fillers":{"type":"boolean","default":false,"description":"Opt-in stripping of filled pauses (`um`, `uh`, `umm`, `uhh`, `er`) on English **final** transcripts. Off by default. Do not enable on legal or compliance audio by default. Interim partials are never rewritten.","uniqueKey":"oneOf.0.drop_fillers","typeLabel":"boolean"},"vocabulary":{"type":"array","items":{"type":"string","minLength":4,"maxLength":64,"uniqueKey":"oneOf.0.vocabulary.items.[INDEX]","typeLabel":"string"},"maxItems":5,"description":"Optional per-job terms for known names, brands, products, and other distinctive phrases. PyAI trims entries, removes case-insensitive duplicates, and keeps the first spelling and order. Entries shorter than 4 characters, longer than 64 characters, sentence-shaped input, non-string entries, and conservative common words are ignored. At most the first 5 valid terms are used. Invalid entries do not reject the job. When stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill any remaining slots. The effective list applies only to this job and does not select transcription language.","uniqueKey":"oneOf.0.vocabulary","typeLabel":"string[]"},"output_formats":{"type":"array","items":{"type":"string","enum":["json","srt","vtt"],"uniqueKey":"oneOf.0.output_formats.items.[INDEX]","typeLabel":"enum\u003cstring>"},"default":["json"],"uniqueKey":"oneOf.0.output_formats","typeLabel":"enum\u003cstring>[]"},"webhook_url":{"type":"string","format":"uri","description":"HTTPS URL for `transcription.job.completed` or `transcription.job.failed`. PyAI POSTs `{type, created, data}` and signs the exact body in `X-PyAI-Signature: t=\u003cunix_seconds>,v1=\u003chex>`, where `v1` is HMAC-SHA256 over `\u003ct>.\u003crawBody>`.","uniqueKey":"oneOf.0.webhook_url","typeLabel":"string\u003curi>"},"trace":{"type":"boolean","default":false,"description":"Trace compliance add-on: deterministic PII scan + redaction over the final transcript (SSN, card numbers, CVV-in-context, email, US phone — the pii_v0 entity set). The result carries the redacted transcript plus a `trace` summary (verdict, PII count). Patterns run on the formatted transcript, so pair with the default `numerals` (digits) for full effect. Requires the org's Trace entitlement on this surface (else `402`); bills one Trace call. Not supported together with `diarize`/`channel`.","uniqueKey":"oneOf.0.trace","typeLabel":"boolean"},"rule_pack":{"type":"object","additionalProperties":true,"description":"Optional Trace rule pack (only used when `trace` is true). `entities` (or `redact`) narrows the scan to a subset of: ssn, credit_card, cvv, email, us_phone; unknown names are ignored and an empty selection means the full set.","uniqueKey":"oneOf.0.rule_pack","typeLabel":"object"},"call_id":{"type":"string","description":"Optional stable call identifier for Recap; defaults to the transcription job id.","uniqueKey":"oneOf.0.call_id","typeLabel":"string"},"pack_id":{"type":"string","pattern":"^[a-z0-9_]+$","description":"Optional Recap pack id.","uniqueKey":"oneOf.0.pack_id","typeLabel":"string"},"call_direction":{"type":"string","enum":["inbound","outbound"],"description":"Optional Recap call direction.","uniqueKey":"oneOf.0.call_direction","typeLabel":"enum\u003cstring>"},"customer_name":{"type":"string","description":"Optional Recap customer label.","uniqueKey":"oneOf.0.customer_name","typeLabel":"string"},"language":{"type":"string","enum":["en","fr","es","de","hi"],"description":"Optional Recap summarization language. It does not affect transcription: async jobs transcribe all eight Hear languages (`en`/`es`/`fr`/`de`/`hi`/`it`/`pt`/`nl`) and the spoken language is auto-detected per call.","uniqueKey":"oneOf.0.language","typeLabel":"enum\u003cstring>"},"crm_fields":{"type":"object","additionalProperties":true,"description":"Optional CRM metadata delivered durably with the Recap trigger.","uniqueKey":"oneOf.0.crm_fields","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["gpt_live"],"properties":{"gpt_live":{"type":"object","additionalProperties":false,"required":["session_id"],"properties":{"session_id":{"type":"string","minLength":1,"maxLength":256,"description":"Opaque completed GPT-Live session ID belonging to the connected OpenAI project.","isRequired":true,"uniqueKey":"oneOf.1.gpt_live.session_id","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.gpt_live","typeLabel":"object"},"audio_url":{"type":"string","format":"uri","description":"HTTPS URL of the audio to transcribe. PyAI fetches the input transiently without writing it to durable input storage. Maximum response body: 512 MiB.","uniqueKey":"oneOf.1.audio_url","typeLabel":"string\u003curi>"},"model":{"type":"string","default":"pyai-hear-telephony","uniqueKey":"oneOf.1.model","typeLabel":"string"},"channel":{"type":"boolean","default":false,"description":"Dual-channel (stereo) separation. Channel 0 is labelled `speaker_1`, channel 1 `speaker_2`; labels are neutral and do not infer agent/customer roles. Do not combine with `diarize`.","uniqueKey":"oneOf.1.channel","typeLabel":"boolean"},"diarize":{"type":"boolean","default":false,"description":"Model-derived speaker separation for mono audio. Labels identify turns within this result, not stable people across separate jobs. Use `channel` instead for stereo recordings.","uniqueKey":"oneOf.1.diarize","typeLabel":"boolean"},"numerals":{"type":"boolean","description":"Tri-state inverse-text normalization for English **final** transcripts (never interim partials). `true` renders spoken numbers as digits (phones, currency, dates, ordinals). `false` keeps those spans in spoken form. Omitted keeps the live engine default: number formatting is ON for finals. Independent of `smart_format`.","uniqueKey":"oneOf.1.numerals","typeLabel":"boolean"},"smart_format":{"type":"boolean","default":false,"description":"Opt-in English punctuation and sentence capitalization on **final** transcripts only. Interim partials are never formatted. May change only case and punctuation; any failure returns the unformatted final. Default `false`. Independent of `numerals`. Non-English requests are unchanged.","uniqueKey":"oneOf.1.smart_format","typeLabel":"boolean"},"dictation":{"type":"boolean","default":false,"description":"Opt-in spoken punctuation commands on English **final** transcripts only: `period`, `comma`, `new paragraph`, and `question mark`. Separate from `smart_format` and off by default. Interim partials are never rewritten.","uniqueKey":"oneOf.1.dictation","typeLabel":"boolean"},"drop_fillers":{"type":"boolean","default":false,"description":"Opt-in stripping of filled pauses (`um`, `uh`, `umm`, `uhh`, `er`) on English **final** transcripts. Off by default. Do not enable on legal or compliance audio by default. Interim partials are never rewritten.","uniqueKey":"oneOf.1.drop_fillers","typeLabel":"boolean"},"vocabulary":{"type":"array","items":{"type":"string","minLength":4,"maxLength":64,"uniqueKey":"oneOf.1.vocabulary.items.[INDEX]","typeLabel":"string"},"maxItems":5,"description":"Optional per-job terms for known names, brands, products, and other distinctive phrases. PyAI trims entries, removes case-insensitive duplicates, and keeps the first spelling and order. Entries shorter than 4 characters, longer than 64 characters, sentence-shaped input, non-string entries, and conservative common words are ignored. At most the first 5 valid terms are used. Invalid entries do not reject the job. When stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill any remaining slots. The effective list applies only to this job and does not select transcription language.","uniqueKey":"oneOf.1.vocabulary","typeLabel":"string[]"},"output_formats":{"type":"array","items":{"type":"string","enum":["json","srt","vtt"],"uniqueKey":"oneOf.1.output_formats.items.[INDEX]","typeLabel":"enum\u003cstring>"},"default":["json"],"uniqueKey":"oneOf.1.output_formats","typeLabel":"enum\u003cstring>[]"},"webhook_url":{"type":"string","format":"uri","description":"HTTPS URL for `transcription.job.completed` or `transcription.job.failed`. PyAI POSTs `{type, created, data}` and signs the exact body in `X-PyAI-Signature: t=\u003cunix_seconds>,v1=\u003chex>`, where `v1` is HMAC-SHA256 over `\u003ct>.\u003crawBody>`.","uniqueKey":"oneOf.1.webhook_url","typeLabel":"string\u003curi>"},"trace":{"type":"boolean","default":false,"description":"Trace compliance add-on: deterministic PII scan + redaction over the final transcript (SSN, card numbers, CVV-in-context, email, US phone — the pii_v0 entity set). The result carries the redacted transcript plus a `trace` summary (verdict, PII count). Patterns run on the formatted transcript, so pair with the default `numerals` (digits) for full effect. Requires the org's Trace entitlement on this surface (else `402`); bills one Trace call. Not supported together with `diarize`/`channel`.","uniqueKey":"oneOf.1.trace","typeLabel":"boolean"},"rule_pack":{"type":"object","additionalProperties":true,"description":"Optional Trace rule pack (only used when `trace` is true). `entities` (or `redact`) narrows the scan to a subset of: ssn, credit_card, cvv, email, us_phone; unknown names are ignored and an empty selection means the full set.","uniqueKey":"oneOf.1.rule_pack","typeLabel":"object"},"call_id":{"type":"string","description":"Optional stable call identifier for Recap; defaults to the transcription job id.","uniqueKey":"oneOf.1.call_id","typeLabel":"string"},"pack_id":{"type":"string","pattern":"^[a-z0-9_]+$","description":"Optional Recap pack id.","uniqueKey":"oneOf.1.pack_id","typeLabel":"string"},"call_direction":{"type":"string","enum":["inbound","outbound"],"description":"Optional Recap call direction.","uniqueKey":"oneOf.1.call_direction","typeLabel":"enum\u003cstring>"},"customer_name":{"type":"string","description":"Optional Recap customer label.","uniqueKey":"oneOf.1.customer_name","typeLabel":"string"},"language":{"type":"string","enum":["en","fr","es","de","hi"],"description":"Optional Recap summarization language. It does not affect transcription: async jobs transcribe all eight Hear languages (`en`/`es`/`fr`/`de`/`hi`/`it`/`pt`/`nl`) and the spoken language is auto-detected per call.","uniqueKey":"oneOf.1.language","typeLabel":"enum\u003cstring>"},"crm_fields":{"type":"object","additionalProperties":true,"description":"Optional CRM metadata delivered durably with the Recap trigger.","uniqueKey":"oneOf.1.crm_fields","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"audio_url":"\u003cstring>","model":"pyai-hear-telephony","channel":false,"diarize":false,"numerals":true,"smart_format":false,"dictation":false,"drop_fillers":false,"vocabulary":["\u003cstring>"],"output_formats":["json"],"webhook_url":"\u003cstring>","trace":false,"rule_pack":{},"call_id":"\u003cstring>","pack_id":"\u003cstring>","customer_name":"\u003cstring>","crm_fields":{}}}},"exampleType":"generated"},"multipart/form-data":{"schema":{"type":"object","required":["audio"],"properties":{"audio":{"type":"string","format":"binary","description":"Audio file, maximum 1 GiB. Must contain a decodable audio stream.","isRequired":true,"uniqueKey":"audio","typeLabel":"file"},"model":{"type":"string","uniqueKey":"model","typeLabel":"string"},"channel":{"type":"string","enum":["true","false","stereo"],"uniqueKey":"channel","typeLabel":"enum\u003cstring>"},"diarize":{"type":"string","enum":["true","false"],"uniqueKey":"diarize","typeLabel":"enum\u003cstring>"},"numerals":{"type":"string","enum":["true","false"],"description":"Tri-state inverse-text normalization for English **final** transcripts (never interim partials). `true` renders spoken numbers as digits (phones, currency, dates, ordinals). `false` keeps those spans in spoken form. Omitted keeps the live engine default: number formatting is ON for finals. Independent of `smart_format`.","uniqueKey":"numerals","typeLabel":"enum\u003cstring>"},"smart_format":{"type":"string","enum":["true","false"],"description":"Opt-in English punctuation and sentence capitalization on **final** transcripts only. Interim partials are never formatted. May change only case and punctuation; any failure returns the unformatted final. Default `false`. Independent of `numerals`. Non-English requests are unchanged.","uniqueKey":"smart_format","typeLabel":"enum\u003cstring>"},"dictation":{"type":"string","enum":["true","false"],"description":"Opt-in spoken punctuation commands on English **final** transcripts only: `period`, `comma`, `new paragraph`, and `question mark`. Separate from `smart_format` and off by default. Interim partials are never rewritten.","uniqueKey":"dictation","typeLabel":"enum\u003cstring>"},"drop_fillers":{"type":"string","enum":["true","false"],"description":"Opt-in stripping of filled pauses (`um`, `uh`, `umm`, `uhh`, `er`) on English **final** transcripts. Off by default. Do not enable on legal or compliance audio by default. Interim partials are never rewritten.","uniqueKey":"drop_fillers","typeLabel":"enum\u003cstring>"},"vocabulary":{"type":"string","maxLength":1024,"description":"Optional per-job terms for known names, brands, products, and other distinctive phrases. PyAI trims entries, removes case-insensitive duplicates, and keeps the first spelling and order. Entries shorter than 4 characters, longer than 64 characters, sentence-shaped input, non-string entries, and conservative common words are ignored. At most the first 5 valid terms are used. Invalid entries do not reject the job. When stored vocabulary is enabled for `batch`, request terms come first and stored suggestions fill any remaining slots. The effective list applies only to this job and does not select transcription language. Send a comma-separated list or a JSON array string.","uniqueKey":"vocabulary","typeLabel":"string"},"output_formats":{"type":"string","description":"Comma-separated, e.g. `json,srt`.","uniqueKey":"output_formats","typeLabel":"string"},"webhook_url":{"type":"string","format":"uri","description":"HTTPS completion/failure webhook. Signed as documented on the JSON request.","uniqueKey":"webhook_url","typeLabel":"string\u003curi>"},"trace":{"type":"string","enum":["true","false"],"description":"Trace compliance add-on (see JSON body). Requires the Trace entitlement; not supported with diarize/channel.","uniqueKey":"trace","typeLabel":"enum\u003cstring>"},"rule_pack":{"type":"string","description":"JSON-encoded Trace rule pack (only used when trace=true).","uniqueKey":"rule_pack","typeLabel":"string"},"call_id":{"type":"string","uniqueKey":"call_id","typeLabel":"string"},"pack_id":{"type":"string","pattern":"^[a-z0-9_]+$","uniqueKey":"pack_id","typeLabel":"string"},"call_direction":{"type":"string","enum":["inbound","outbound"],"uniqueKey":"call_direction","typeLabel":"enum\u003cstring>"},"customer_name":{"type":"string","uniqueKey":"customer_name","typeLabel":"string"},"language":{"type":"string","enum":["en","fr","es","de","hi"],"uniqueKey":"language","typeLabel":"enum\u003cstring>"},"crm_fields":{"type":"string","description":"JSON-encoded CRM metadata delivered with the Recap trigger.","uniqueKey":"crm_fields","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"audio":"\u003cstring>","model":"\u003cstring>","vocabulary":"\u003cstring>","output_formats":"\u003cstring>","webhook_url":"\u003cstring>","rule_pack":"\u003cstring>","call_id":"\u003cstring>","pack_id":"\u003cstring>","customer_name":"\u003cstring>","crm_fields":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"96cedde0-a0e0-47ae-b0a1-7f168bbfa486":{"description":"Job accepted","content":{"application/json":{"schema":{"type":"object","required":["job_id","status","created_at","updated_at"],"properties":{"job_id":{"type":"string","example":"job_aZ09...","isRequired":true,"uniqueKey":"job_id","typeLabel":"string"},"status":{"type":"string","enum":["queued","running","completed","failed","cancelled"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"integer","description":"Unix ms.","isRequired":true,"uniqueKey":"created_at","typeLabel":"integer"},"updated_at":{"type":"integer","description":"Unix ms.","isRequired":true,"uniqueKey":"updated_at","typeLabel":"integer"},"result":{"type":"object","required":["text","speakers","audio_seconds","segments","words"],"description":"Present on completed jobs (inline). Large results are offloaded to result_url instead.","properties":{"text":{"type":"string","description":"Complete transcript. Diarized results prefix segments with neutral speaker labels.","isRequired":true,"uniqueKey":"result.text","typeLabel":"string"},"speakers":{"type":"integer","minimum":1,"description":"Number of distinct speaker labels in this result.","isRequired":true,"uniqueKey":"result.speakers","typeLabel":"integer"},"audio_seconds":{"type":"number","minimum":0,"description":"Decoded source duration in decimal seconds, including silence.","example":120,"isRequired":true,"uniqueKey":"result.audio_seconds","typeLabel":"number"},"segments":{"type":"array","items":{"type":"object","required":["id","start","end","text"],"properties":{"id":{"type":"integer","minimum":0,"description":"Zero-based segment index.","example":0,"isRequired":true,"uniqueKey":"result.segments.items.[INDEX].id","typeLabel":"integer"},"start":{"type":"number","minimum":0,"description":"Offset in decimal seconds from the start of the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.","example":0.42,"isRequired":true,"uniqueKey":"result.segments.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","minimum":0,"description":"Offset in decimal seconds from the start of the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.","example":1.8,"isRequired":true,"uniqueKey":"result.segments.items.[INDEX].end","typeLabel":"number"},"text":{"type":"string","example":"Hello everyone.","isRequired":true,"uniqueKey":"result.segments.items.[INDEX].text","typeLabel":"string"},"speaker":{"type":"string","description":"Neutral speaker label. With `channel: true`, `speaker_1` maps to channel 0 and `speaker_2` to channel 1; this is exact channel separation, not an inferred agent/customer role. With mono `diarize: true`, labels are model-derived and must not be treated as stable identities across separate jobs.","example":"speaker_1","uniqueKey":"result.segments.items.[INDEX].speaker","typeLabel":"string"},"channel":{"type":"integer","minimum":0,"description":"Zero-based source channel. Present on `channel: true` results.","example":0,"uniqueKey":"result.segments.items.[INDEX].channel","typeLabel":"integer"}},"uniqueKey":"result.segments.items.[INDEX]","typeLabel":"object"},"description":"Timestamped subtitle-ready spans. Segment boundaries may change when speaker assignment or the one-second readable-cue gap changes.","isRequired":true,"uniqueKey":"result.segments","typeLabel":"object[]"},"words":{"type":"array","items":{"type":"object","required":["word","start","end"],"description":"Word-level timestamps when alignment is available. `smart_format` may attach case or punctuation without moving timestamps. Options that add or remove tokens (`dictation` and `drop_fillers`) clear this array when the rewritten words cannot be safely realigned.","properties":{"word":{"type":"string","description":"Recognized token. Punctuation may be attached when final-transcript formatting is enabled.","example":"Hello","isRequired":true,"uniqueKey":"result.words.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"description":"Offset in decimal seconds from the start of the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.","example":0.42,"isRequired":true,"uniqueKey":"result.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","minimum":0,"description":"Offset in decimal seconds from the start of the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets.","example":0.81,"isRequired":true,"uniqueKey":"result.words.items.[INDEX].end","typeLabel":"number"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Recognition confidence when supplied by the active Hear model. Omitted when unavailable.","example":0.98,"uniqueKey":"result.words.items.[INDEX].confidence","typeLabel":"number"},"speaker":{"type":"string","description":"Neutral speaker label. With `channel: true`, `speaker_1` maps to channel 0 and `speaker_2` to channel 1; this is exact channel separation, not an inferred agent/customer role. With mono `diarize: true`, labels are model-derived and must not be treated as stable identities across separate jobs.","example":"speaker_1","uniqueKey":"result.words.items.[INDEX].speaker","typeLabel":"string"},"channel":{"type":"integer","minimum":0,"description":"Zero-based source channel. Present on `channel: true` results.","example":0,"uniqueKey":"result.words.items.[INDEX].channel","typeLabel":"integer"},"entity":{"type":"string","description":"Normalized entity category when supplied, such as `phone_number`, `account_id`, or `date`.","uniqueKey":"result.words.items.[INDEX].entity","typeLabel":"string"}},"uniqueKey":"result.words.items.[INDEX]","typeLabel":"object"},"description":"Word-level timestamps when alignment is available. `smart_format` may attach case or punctuation without moving timestamps. Options that add or remove tokens (`dictation` and `drop_fillers`) clear this array when the rewritten words cannot be safely realigned.","isRequired":true,"uniqueKey":"result.words","typeLabel":"object[]"},"formats":{"type":"object","additionalProperties":{"type":"string","format":"uri","uniqueKey":"result.formats.additionalProperties","typeLabel":"string\u003curi>"},"description":"Requested SRT/VTT format names mapped to short-lived signed GET URLs. JSON is the result object itself.","uniqueKey":"result.formats","typeLabel":"object"},"trace":{"type":"object","description":"Present when the Trace add-on was requested.","properties":{"verdict":{"type":"string","uniqueKey":"result.trace.verdict","typeLabel":"string"},"n_pii":{"type":"integer","minimum":0,"uniqueKey":"result.trace.n_pii","typeLabel":"integer"},"redacted":{"type":"boolean","uniqueKey":"result.trace.redacted","typeLabel":"boolean"}},"uniqueKey":"result.trace","typeLabel":"object"}},"example":{"text":"[speaker_1] Hello everyone.","audio_seconds":120,"speakers":1,"words":[{"word":"Hello","start":0.42,"end":0.81,"confidence":0.98,"speaker":"speaker_1","channel":0}],"segments":[{"id":0,"text":"Hello everyone.","start":0.42,"end":1.8,"speaker":"speaker_1","channel":0}]},"uniqueKey":"result","typeLabel":"object"},"result_url":{"type":"string","format":"uri","description":"Signed GET URL for an offloaded large result.","uniqueKey":"result_url","typeLabel":"string\u003curi>"},"error":{"type":"string","description":"Human-readable normalized failure message on failed jobs. This field is not a stable machine-readable failure code.","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"job_id":"job_aZ09...","status":"queued","created_at":123,"updated_at":123,"result":{"text":"[speaker_1] Hello everyone.","audio_seconds":120,"speakers":1,"words":[{"word":"Hello","start":0.42,"end":0.81,"confidence":0.98,"speaker":"speaker_1","channel":0}],"segments":[{"id":0,"text":"Hello everyone.","start":0.42,"end":1.8,"speaker":"speaker_1","channel":0}]},"result_url":"\u003cstring>","error":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"2d67fc54-1127-4f08-98ed-5db7e9824b9b":{"description":"Invalid request (bad field, unsupported value)","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 7807 problem+json returned by the control plane (request-validation and resource errors such as 400/404/409). The stable code is the last path segment of `type`.","required":["title","status"],"properties":{"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"type":{"type":"string","description":"Problem type URI; ends with the stable code.","uniqueKey":"type","typeLabel":"string"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"},"request_id":{"type":"string","uniqueKey":"request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"title":"\u003cstring>","status":123,"type":"\u003cstring>","detail":"\u003cstring>","request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"45d99d86-b5e8-496e-bb4c-74268e1c768b":{"description":"Missing or invalid API key (`code: unauthorized`)","content":{"application/json":{"schema":{"type":"object","description":"OpenAI-compatible error envelope returned by the gateway data plane (401/402/403/429). Control-plane request/resource errors use Problem (application/problem+json) instead.","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Error category, e.g. rate_limit_error.","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this rather than the human `message`.","enum":["invalid_request_error","invalid_session_label","unauthorized","forbidden","origin_not_allowed","credit_exhausted","key_budget_exceeded","insufficient_quota","rate_limit_exceeded","concurrency_limit_exceeded","daily_cap_exceeded"],"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"param":{"oneOf":[{"type":"string","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"\u003cstring>","type":"\u003cstring>","code":"invalid_request_error","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"9675844b-0251-4b10-9981-8b656b28ce48":{"description":"Billing gate: org out of prepaid credit, per-key budget hit, or plan quota exhausted (`code: credit_exhausted | key_budget_exceeded | insufficient_quota`). Do not retry; add credit or raise the limit. A brand-new key may see this on its first call until the account is funded.","content":{"application/json":{"schema":{"type":"object","description":"OpenAI-compatible error envelope returned by the gateway data plane (401/402/403/429). Control-plane request/resource errors use Problem (application/problem+json) instead.","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Error category, e.g. rate_limit_error.","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this rather than the human `message`.","enum":["invalid_request_error","invalid_session_label","unauthorized","forbidden","origin_not_allowed","credit_exhausted","key_budget_exceeded","insufficient_quota","rate_limit_exceeded","concurrency_limit_exceeded","daily_cap_exceeded"],"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"param":{"oneOf":[{"type":"string","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"\u003cstring>","type":"\u003cstring>","code":"invalid_request_error","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"73093a87-d83b-4709-b2c5-05503c6c21f9":{"description":"Key lacks the required scope or the origin is not allow-listed (`code: forbidden | origin_not_allowed`)","content":{"application/json":{"schema":{"type":"object","description":"OpenAI-compatible error envelope returned by the gateway data plane (401/402/403/429). Control-plane request/resource errors use Problem (application/problem+json) instead.","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Error category, e.g. rate_limit_error.","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this rather than the human `message`.","enum":["invalid_request_error","invalid_session_label","unauthorized","forbidden","origin_not_allowed","credit_exhausted","key_budget_exceeded","insufficient_quota","rate_limit_exceeded","concurrency_limit_exceeded","daily_cap_exceeded"],"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"param":{"oneOf":[{"type":"string","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"\u003cstring>","type":"\u003cstring>","code":"invalid_request_error","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"596a38c4-ab16-4b19-a045-2b0c51303634":{"description":"Idempotency-Key reused with a different body (`code: idempotency_conflict`)","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 7807 problem+json returned by the control plane (request-validation and resource errors such as 400/404/409). The stable code is the last path segment of `type`.","required":["title","status"],"properties":{"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"type":{"type":"string","description":"Problem type URI; ends with the stable code.","uniqueKey":"type","typeLabel":"string"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"},"request_id":{"type":"string","uniqueKey":"request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"title":"\u003cstring>","status":123,"type":"\u003cstring>","detail":"\u003cstring>","request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"88f11341-1e04-4c2d-905f-5a9d755c3527":{"description":"Too many requests or too many concurrent realtime sessions; see Retry-After header (`code: rate_limit_exceeded | concurrency_limit_exceeded | daily_cap_exceeded`)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"schema":{"type":"object","description":"OpenAI-compatible error envelope returned by the gateway data plane (401/402/403/429). Control-plane request/resource errors use Problem (application/problem+json) instead.","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Error category, e.g. rate_limit_error.","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this rather than the human `message`.","enum":["invalid_request_error","invalid_session_label","unauthorized","forbidden","origin_not_allowed","credit_exhausted","key_budget_exceeded","insufficient_quota","rate_limit_exceeded","concurrency_limit_exceeded","daily_cap_exceeded"],"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"param":{"oneOf":[{"type":"string","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"Offending parameter when applicable, else null.","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"\u003cstring>","type":"\u003cstring>","code":"invalid_request_error","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"8fef4c78-11e3-47d3-85f4-d66b250b7ccf":{"apiKey":{"type":"http","scheme":"bearer","description":"Use `Authorization: Bearer pyai_live_...` (or `pyai_test_...`).","scopes":[],"schemeName":"apiKey"}},"ba0f4d3b-c001-406b-aa6e-8db0d6eba5f5":{"xApiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Header alias for bearer auth on HTTP endpoints. WebSocket auth uses the subprotocol pair `pyai.v1, pyai-key.\u003cAPI_KEY>`.","scopes":[],"schemeName":"xApiKey"}}},"servers":{"0ec3a5f5-8471-4041-8e01-12cfeb17ea9d":{"url":"https://api.pyai.com","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Use `Authorization: Bearer pyai_live_...` (or `pyai_test_...`).","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Use `Authorization: Bearer pyai_live_...` (or `pyai_test_...`).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","description":"Header alias for bearer auth on HTTP endpoints. WebSocket auth uses the subprotocol pair `pyai.v1, pyai-key.\u003cAPI_KEY>`.","scopes":[],"schemeName":"xApiKey"},"schema":{"title":"x-api-key","type":"string","description":"Header alias for bearer auth on HTTP endpoints. WebSocket auth uses the subprotocol pair `pyai.v1, pyai-key.\u003cAPI_KEY>`.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"xApiKey","name":"x-api-key"}],"title":"xApiKey"}]},"originalFileLocation":"https://api.pyai.com/openapi.json"},"subdomain":"pyai","siteName":"PyAI Developers","title":"Create an async transcription job - PyAI Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T07:09:29.495Z","originalFileLocation":"api-reference/transcription-jobs/create-an-async-transcription-job.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Submit audio for batch transcription. Provide exactly one source: either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage) a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), or gpt_live: {session_id} for a connected project (gated availability). GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service. GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission. Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback. Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets. Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both. Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots. Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT. Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint. Requires the transcribe:jobs scope.\">\u003cmeta data-mint-head name=\"application-name\" content=\"PyAI Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create an async transcription job - PyAI Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Submit audio for batch transcription. Provide exactly one source: either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage) a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), or gpt_live: {session_id} for a connected project (gated availability). GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service. GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission. Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback. Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets. Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both. Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots. Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT. Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint. Requires the transcribe:jobs scope.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"PyAI Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://pyai.mintlify.app/_mintlify/api/og/v2?division=Transcription+Jobs\u0026amp;title=Create+an+async+transcription+job\u0026amp;description=Submit+audio+for+batch+transcription.+Provide+**exactly+one**+source%3A%0Aeither+%60audio_url%60+%28an+https+URL+we+fetch%3B+the+input+is+processed+transiently+and+never+wr\u0026amp;theme=345b4136ed2cb0b69fa46bb0\u0026amp;signature=db3bcc6265e8350e49345f86bf25d9355bebb8d6648a62eef07a51272b5bae8d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create an async transcription job - PyAI Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Submit audio for batch transcription. Provide exactly one source: either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage) a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), or gpt_live: {session_id} for a connected project (gated availability). GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service. GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission. Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback. Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets. Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both. Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots. Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT. Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint. Requires the transcribe:jobs scope.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://pyai.mintlify.app/_mintlify/api/og/v2?division=Transcription+Jobs\u0026amp;title=Create+an+async+transcription+job\u0026amp;description=Submit+audio+for+batch+transcription.+Provide+**exactly+one**+source%3A%0Aeither+%60audio_url%60+%28an+https+URL+we+fetch%3B+the+input+is+processed+transiently+and+never+wr\u0026amp;theme=345b4136ed2cb0b69fa46bb0\u0026amp;signature=db3bcc6265e8350e49345f86bf25d9355bebb8d6648a62eef07a51272b5bae8d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/pyai/TcdC0S0vFDaCWV2B/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"PyAI Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5B5BD6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/transcription-jobs/create-an-async-transcription-job.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.pyai.com/#organization\",\"name\":\"PyAI Developers\",\"url\":\"https://docs.pyai.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/pyai/WdY9MU3V1Ll4Gm-R/logo/light.svg?fit=max\u0026auto=format\u0026n=WdY9MU3V1Ll4Gm-R\u0026q=85\u0026s=c47abcf1c2ebb1a5b3d736c8048fe048\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.pyai.com#website\",\"name\":\"PyAI Developers\",\"url\":\"https://docs.pyai.com\",\"publisher\":{\"@id\":\"https://docs.pyai.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job#webpage\",\"url\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job\",\"name\":\"Create an async transcription job\",\"description\":\"Submit audio for batch transcription. Provide exactly one source: either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage) a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), or gpt_live: {session_id} for a connected project (gated availability). GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service. GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission. Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback. Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets. Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both. Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots. Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT. Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint. Requires the transcribe:jobs scope.\",\"dateModified\":\"2026-10-28T07:09:29.495Z\",\"isPartOf\":{\"@id\":\"https://docs.pyai.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Transcription Jobs\",\"item\":\"https://docs.pyai.com/api-reference/transcription-jobs/list-transcription-jobs\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create an async transcription job\",\"item\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job#apireference\",\"headline\":\"Create an async transcription job\",\"name\":\"Create an async transcription job\",\"description\":\"Submit audio for batch transcription. Provide exactly one source: either audio_url (an https URL we fetch; the input is processed transiently and never written to durable input storage) a multipart upload (multipart/form-data with an audio file part and the same fields as form fields), or gpt_live: {session_id} for a connected project (gated availability). GPT-Live: an organization owner/admin first configures the project connection through the management API. Uses a finalized stored OpenAI recording, downloaded transiently with a 100 MiB limit. Requires an active secret key with hear:transcribe and transcribe:jobs. No source audio is retained by this connector; normal result retention applies. OpenAI storage must be enabled and the session created with store: true. This is a post-call import, not an account-wide discovery service. GPT-Live imports deduplicate by PyAI project, connection and session ID even without Idempotency-Key. Repeated submissions return the existing job; different normalized processing options return 409. Credential rotation retains the connection identity. Disconnect/reconnect creates a new identity. Failed jobs remain terminal; there is no automatic new billed job on resubmission. Returns 202 immediately with a queued job; poll GET /v1/transcription/jobs/{id} or supply a webhook_url for a signed completion callback. Completed JSON results include word- and segment-level offsets in decimal seconds from the decoded source-media timeline. Silence is not removed or compacted; resampling and internal chunking do not shift later offsets. Set channel: true for stereo (dual-channel) recordings to get exact speaker separation per channel. Use diarize: true for model-derived speaker labels on mono audio; do not set both. Set vocabulary only when this job has known names, brands, products, or distinctive terms. PyAI uses up to five sanitized terms. If stored vocabulary is enabled for batch, request terms come first and stored suggestions fill remaining slots. Input limits: multipart uploads are limited to 1 GiB; audio_url downloads are limited to 512 MiB. There is no separate media-duration ceiling. Inputs must contain a decodable audio stream; the stable output formats are JSON, SRT, and VTT. Retention: URL-fetched input bytes are not persisted. Uploaded input audio is retained for up to 7 days and result artifacts for up to 30 days. This endpoint has no store: false mode. DELETE /v1/transcription/jobs/{id} cancels queued/running work; it is not an erasure endpoint. Requires the transcribe:jobs scope.\",\"url\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job\",\"mainEntityOfPage\":{\"@id\":\"https://docs.pyai.com/api-reference/transcription-jobs/create-an-async-transcription-job#webpage\"},\"dateModified\":\"2026-10-28T07:09:29.495Z\",\"publisher\":{\"@id\":\"https://docs.pyai.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.pyai.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"PyAI Developers\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"PyAI Developers","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/quickstart"}]},{"tab":"API reference","href":"/api-reference","groups":[{"group":"Omni","pages":[{"title":"Read the machine-readable Omni frame contract","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /omni-frames.json","href":"/api-reference/omni/read-the-machine-readable-omni-frame-contract"},{"title":"List Omni call records","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni/calls","href":"/api-reference/omni/list-omni-call-records"},{"title":"Get an Omni call record","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni/calls/{call_id}","href":"/api-reference/omni/get-an-omni-call-record"},{"title":"Download an Omni call recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni/calls/{call_id}/recording","href":"/api-reference/omni/download-an-omni-call-recording"},{"title":"Get an Omni call summary","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni/calls/{call_id}/summary","href":"/api-reference/omni/get-an-omni-call-summary"},{"title":"Get an Omni call transcript","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni/calls/{call_id}/transcript","href":"/api-reference/omni/get-an-omni-call-transcript"},{"title":"Mint an ephemeral Omni session token","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/omni/sessions","href":"/api-reference/omni/mint-an-ephemeral-omni-session-token"},{"title":"Open an Omni voice-agent session (WebSocket)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/omni","href":"/api-reference/omni/open-an-omni-voice-agent-session-websocket"}]},{"group":"MCP","pages":[{"title":"Discover PyAI MCP authorization","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /.well-known/oauth-protected-resource","href":"/api-reference/mcp/discover-pyai-mcp-authorization"},{"title":"Discover authorization for the MCP endpoint","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /.well-known/oauth-protected-resource/mcp","href":"/api-reference/mcp/discover-authorization-for-the-mcp-endpoint"},{"title":"Discover transcription and call-records connector authorization","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /.well-known/oauth-protected-resource/mcp/transcription","href":"/api-reference/mcp/discover-transcription-and-call-records-connector-authorization"},{"title":"Discover OAuth endpoints and S256 PKCE support","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /.well-known/oauth-authorization-server","href":"/api-reference/mcp/discover-oauth-endpoints-and-s256-pkce-support"},{"title":"Register an MCP OAuth public client","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/mcp/register","href":"/api-reference/mcp/register-an-mcp-oauth-public-client"},{"title":"Start browser OAuth consent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /auth/mcp/authorize","href":"/api-reference/mcp/start-browser-oauth-consent"},{"title":"Exchange an authorization code or rotate a refresh token","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/mcp/token","href":"/api-reference/mcp/exchange-an-authorization-code-or-rotate-a-refresh-token"},{"title":"Revoke an MCP OAuth connection using a token","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/mcp/revoke","href":"/api-reference/mcp/revoke-an-mcp-oauth-connection-using-a-token"},{"title":"Transcription and existing call-records MCP endpoint","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /mcp/transcription","href":"/api-reference/mcp/transcription-and-existing-call-records-mcp-endpoint"},{"title":"PyAI MCP Streamable HTTP endpoint","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /mcp","href":"/api-reference/mcp/pyai-mcp-streamable-http-endpoint"}]},{"group":"Cast","pages":[{"title":"Poll a Cast narration render","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/cast/render_jobs/{job_id}","href":"/api-reference/cast/poll-a-cast-narration-render"},{"title":"Download completed Cast narration","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/cast/render_jobs/{job_id}/audio","href":"/api-reference/cast/download-completed-cast-narration"},{"title":"Get live Cast capabilities","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/cast/capabilities","href":"/api-reference/cast/get-live-cast-capabilities"},{"title":"Auto-direct a script","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/cast/direct","href":"/api-reference/cast/auto-direct-a-script"},{"title":"Preview one directed line","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/cast/speech","href":"/api-reference/cast/preview-one-directed-line"},{"title":"Create an asynchronous Cast render","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/cast/render_jobs","href":"/api-reference/cast/create-an-asynchronous-cast-render"}]},{"group":"Integrations","pages":[{"title":"Start a Vercel connection","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/vercel/start","href":"/api-reference/integrations/start-a-vercel-connection"},{"title":"Verify the Vercel authorization callback","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/vercel/exchange","href":"/api-reference/integrations/verify-the-vercel-authorization-callback"},{"title":"Read your existing Vercel connection","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /auth/vercel/configuration/{configurationId}","href":"/api-reference/integrations/read-your-existing-vercel-connection"},{"title":"Read Vercel connection status","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /auth/vercel/requests/{id}","href":"/api-reference/integrations/read-vercel-connection-status"},{"title":"List authorized Vercel projects","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /auth/vercel/requests/{id}/projects","href":"/api-reference/integrations/list-authorized-vercel-projects"},{"title":"Create and install a scoped PyAI project key","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/vercel/requests/{id}/connect","href":"/api-reference/integrations/create-and-install-a-scoped-pyai-project-key"},{"title":"Revoke this integration key and remove its environment variable","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/vercel/requests/{id}/disconnect","href":"/api-reference/integrations/revoke-this-integration-key-and-remove-its-environment-variable"},{"title":"Receive a signed Vercel lifecycle event","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/vercel/webhook","href":"/api-reference/integrations/receive-a-signed-vercel-lifecycle-event"},{"title":"List integration events","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/integrations/events","href":"/api-reference/integrations/list-integration-events"},{"title":"Subscribe a Zapier REST hook","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/integrations/zapier/hooks","href":"/api-reference/integrations/subscribe-a-zapier-rest-hook"},{"title":"Unsubscribe a Zapier REST hook","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/integrations/zapier/hooks/{id}","href":"/api-reference/integrations/unsubscribe-a-zapier-rest-hook"}]},{"group":"Dub","pages":[{"title":"Read editable dubbing passages","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}/editor","href":"/api-reference/dub/read-editable-dubbing-passages"},{"title":"Save transcript, translation and pronunciation edits","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json patch /v1/dub/jobs/{job_id}/editor","href":"/api-reference/dub/save-transcript-translation-and-pronunciation-edits"},{"title":"Regenerate selected passages as a new dub","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/dub/jobs/{job_id}/revisions","href":"/api-reference/dub/regenerate-selected-passages-as-a-new-dub"},{"title":"Export original or translated subtitles","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}/subtitles.{format}","href":"/api-reference/dub/export-original-or-translated-subtitles"},{"title":"Load the original audio for comparison","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}/source","href":"/api-reference/dub/load-the-original-audio-for-comparison"},{"title":"Dubbing availability and languages","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /healthz/dub","href":"/api-reference/dub/dubbing-availability-and-languages"},{"title":"Create a dubbing job","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/dub","href":"/api-reference/dub/create-a-dubbing-job"},{"title":"Get dubbing job status","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}","href":"/api-reference/dub/get-dubbing-job-status"},{"title":"Download dubbed audio","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}/audio","href":"/api-reference/dub/download-dubbed-audio"},{"title":"Download a dubbed video output","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/dub/jobs/{job_id}/video","href":"/api-reference/dub/download-a-dubbed-video-output"}]},{"group":"Trace","pages":[{"title":"Review an uploaded or pasted transcript","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /orgs/{orgId}/trace/uploads/{id}","href":"/api-reference/trace/review-an-uploaded-or-pasted-transcript"},{"title":"Get Trace config for an agent (or the org default)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/config","href":"/api-reference/trace/get-trace-config-for-an-agent-or-the-org-default"},{"title":"Set Trace config for an agent (or the org default)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/trace/config","href":"/api-reference/trace/set-trace-config-for-an-agent-or-the-org-default"},{"title":"List rule packs","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/rule-packs","href":"/api-reference/trace/list-rule-packs"},{"title":"Upload a custom rule pack","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/trace/rule-packs","href":"/api-reference/trace/upload-a-custom-rule-pack"},{"title":"Get a rule pack","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/rule-packs/{id}","href":"/api-reference/trace/get-a-rule-pack"},{"title":"List scanned interactions (scorecards)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/interactions","href":"/api-reference/trace/list-scanned-interactions-scorecards"},{"title":"Get an interaction (the evidence view)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/interactions/{id}","href":"/api-reference/trace/get-an-interaction-the-evidence-view"},{"title":"List violations (findings)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/violations","href":"/api-reference/trace/list-violations-findings"},{"title":"List Tier-2 semantic findings","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/findings","href":"/api-reference/trace/list-tier-2-semantic-findings"},{"title":"Compliance exposure summary","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/exposure","href":"/api-reference/trace/compliance-exposure-summary"},{"title":"Export a privacy-minimized evidence snapshot","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/trace/evidence-snapshot","href":"/api-reference/trace/export-a-privacy-minimized-evidence-snapshot"}]},{"group":"Console creations","pages":[{"title":"Preview current creation rates","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /projects/{projectId}/studio/pricing/{product}","href":"/api-reference/console-creations/preview-current-creation-rates"},{"title":"Get background creation progress","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /projects/{projectId}/creation-jobs/{id}","href":"/api-reference/console-creations/get-background-creation-progress"},{"title":"Start a durable Speech or Transcription job","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /projects/{projectId}/creation-jobs/{id}","href":"/api-reference/console-creations/start-a-durable-speech-or-transcription-job"},{"title":"Restore a background transcription's original recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /projects/{projectId}/creation-jobs/{id}/input","href":"/api-reference/console-creations/restore-a-background-transcriptions-original-recording"},{"title":"Regenerate Dubbing passages and save the revision to My work","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /projects/{projectId}/dub/library/{id}/revisions","href":"/api-reference/console-creations/regenerate-dubbing-passages-and-save-the-revision-to-my-work"}]},{"group":"Identity","pages":[{"title":"Review a CLI login request","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /auth/cli/device","href":"/api-reference/identity/review-a-cli-login-request"},{"title":"Start browser login for the CLI","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/cli/device","href":"/api-reference/identity/start-browser-login-for-the-cli"},{"title":"Approve CLI access to a project","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/cli/device/approve","href":"/api-reference/identity/approve-cli-access-to-a-project"},{"title":"Deny a CLI login request","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/cli/device/deny","href":"/api-reference/identity/deny-a-cli-login-request"},{"title":"Poll and exchange an approved CLI login","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/cli/device/token","href":"/api-reference/identity/poll-and-exchange-an-approved-cli-login"},{"title":"Create an account and organization","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/signup","href":"/api-reference/identity/create-an-account-and-organization"},{"title":"Introspect the calling key (whoami)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/me","href":"/api-reference/identity/introspect-the-calling-key-whoami"}]},{"group":"Call Integrations","pages":[{"title":"Receive Aircall call events","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /public/integrations/calls/aircall/events","href":"/api-reference/call-integrations/receive-aircall-call-events"},{"title":"Receive Dialpad call events","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /public/integrations/calls/dialpad/events","href":"/api-reference/call-integrations/receive-dialpad-call-events"},{"title":"Receive JustCall completed-call events","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /public/integrations/calls/justcall/events","href":"/api-reference/call-integrations/receive-justcall-completed-call-events"}]},{"group":"Sandbox","pages":[{"title":"Mint a sandbox key (no auth)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/sandbox/keys","href":"/api-reference/sandbox/mint-a-sandbox-key-no-auth"}]},{"group":"Startup Program","pages":[{"title":"Apply to PyAI for Startups (no auth)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/startup-program/applications","href":"/api-reference/startup-program/apply-to-pyai-for-startups-no-auth"}]},{"group":"Models","pages":[{"title":"List available models","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/models","href":"/api-reference/models/list-available-models"}]},{"group":"Speech To Text (Hear)","pages":[{"title":"Transcribe audio","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/audio/transcriptions","href":"/api-reference/speech-to-text-hear/transcribe-audio"},{"title":"Stream transcription (WebSocket)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/transcriptions/stream","href":"/api-reference/speech-to-text-hear/stream-transcription-websocket"},{"title":"Get stored Hear vocabulary","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/hear/vocabulary","href":"/api-reference/speech-to-text-hear/get-stored-hear-vocabulary"},{"title":"Set stored Hear vocabulary","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/hear/vocabulary","href":"/api-reference/speech-to-text-hear/set-stored-hear-vocabulary"}]},{"group":"Text To Speech (Speak)","pages":[{"title":"Synthesize speech","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/audio/speech","href":"/api-reference/text-to-speech-speak/synthesize-speech"},{"title":"List voices","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/voices","href":"/api-reference/text-to-speech-speak/list-voices"},{"title":"Get a stock voice","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/voices/{id}","href":"/api-reference/text-to-speech-speak/get-a-stock-voice"},{"title":"Delete a designed voice","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/voices/{id}","href":"/api-reference/text-to-speech-speak/delete-a-designed-voice"},{"title":"Design a voice from a prompt","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/voice/design","href":"/api-reference/text-to-speech-speak/design-a-voice-from-a-prompt"},{"title":"Get design candidates","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/voice/design/{id}","href":"/api-reference/text-to-speech-speak/get-design-candidates"},{"title":"Preview a designed-voice candidate","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/voice/design/{id}/preview/{candidate_id}","href":"/api-reference/text-to-speech-speak/preview-a-designed-voice-candidate"},{"title":"Save a designed voice","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/voice/design/{id}/save","href":"/api-reference/text-to-speech-speak/save-a-designed-voice"}]},{"group":"Agents","pages":[{"title":"List agent profiles","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/agents","href":"/api-reference/agents/list-agent-profiles"},{"title":"Create an agent profile","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/agents","href":"/api-reference/agents/create-an-agent-profile"},{"title":"Get an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/agents/{id}","href":"/api-reference/agents/get-an-agent"},{"title":"Update an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/agents/{id}","href":"/api-reference/agents/update-an-agent"},{"title":"Delete an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/agents/{id}","href":"/api-reference/agents/delete-an-agent"},{"title":"Bind tools to an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/agents/{id}/tools","href":"/api-reference/agents/bind-tools-to-an-agent"},{"title":"List tools","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/tools","href":"/api-reference/agents/list-tools"},{"title":"Create or update a custom tool","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/tools","href":"/api-reference/agents/create-or-update-a-custom-tool"},{"title":"Get a tool","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/tools/{id}","href":"/api-reference/agents/get-a-tool"},{"title":"Update a tool","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/tools/{id}","href":"/api-reference/agents/update-a-tool"},{"title":"Delete a custom tool","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/tools/{id}","href":"/api-reference/agents/delete-a-custom-tool"},{"title":"Test a tool configuration","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/tools/{id}/test","href":"/api-reference/agents/test-a-tool-configuration"},{"title":"List recent tool calls","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/tools/calls","href":"/api-reference/agents/list-recent-tool-calls"},{"title":"Get webhook signing secret status","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/webhooks/signing-secret","href":"/api-reference/agents/get-webhook-signing-secret-status"},{"title":"Mint or rotate the webhook signing secret","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/webhooks/signing-secret","href":"/api-reference/agents/mint-or-rotate-the-webhook-signing-secret"},{"title":"Bind knowledge bases to an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/agents/{id}/knowledgebases","href":"/api-reference/agents/bind-knowledge-bases-to-an-agent"},{"title":"Resolve a hosted website widget","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /public/widgets/{publicId}","href":"/api-reference/agents/resolve-a-hosted-website-widget"},{"title":"Mint a hosted widget voice session","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /public/widgets/{publicId}/session","href":"/api-reference/agents/mint-a-hosted-widget-voice-session"}]},{"group":"Clone","pages":[{"title":"List cloned voices","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/voice/clones","href":"/api-reference/clone/list-cloned-voices"},{"title":"Create a cloned voice","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/voice/clones","href":"/api-reference/clone/create-a-cloned-voice"},{"title":"Delete a cloned voice","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/voice/clones/{id}","href":"/api-reference/clone/delete-a-cloned-voice"}]},{"group":"Transcription Jobs","pages":[{"title":"List transcription jobs","description":"Cursor-paginated, newest first. Pass `limit` (1-100, default 20) and the `next_cursor` from the previous page as `cursor` to continue. `next_cursor` is null on the last page.","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/transcription/jobs","href":"/api-reference/transcription-jobs/list-transcription-jobs"},{"title":"Create an async transcription job","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/transcription/jobs","href":"/api-reference/transcription-jobs/create-an-async-transcription-job"},{"title":"Get a transcription job","description":null,"deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/transcription/jobs/{id}","href":"/api-reference/transcription-jobs/get-a-transcription-job"},{"title":"Cancel a transcription job","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/transcription/jobs/{id}","href":"/api-reference/transcription-jobs/cancel-a-transcription-job"}]},{"group":"Recap","pages":[{"title":"Get Recap config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/recap/config","href":"/api-reference/recap/get-recap-config"},{"title":"Update Recap config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/recap/config","href":"/api-reference/recap/update-recap-config"},{"title":"Get Recap CRM config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/recap/crm-config","href":"/api-reference/recap/get-recap-crm-config"},{"title":"Update Recap CRM config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/recap/crm-config","href":"/api-reference/recap/update-recap-crm-config"},{"title":"List recap records","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/recap/calls","href":"/api-reference/recap/list-recap-records"},{"title":"Get a recap record","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/recap/calls/{call_id}","href":"/api-reference/recap/get-a-recap-record"},{"title":"Manually trigger recap for a call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/recap/calls/{call_id}","href":"/api-reference/recap/manually-trigger-recap-for-a-call"},{"title":"Correct transcript speaker roles","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/recap/calls/{call_id}/transcript/roles","href":"/api-reference/recap/correct-transcript-speaker-roles"}]},{"group":"AMD","pages":[{"title":"Answering-machine detection (WebSocket)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/amd/stream","href":"/api-reference/amd/answering-machine-detection-websocket"},{"title":"Get AMD config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/amd/config","href":"/api-reference/amd/get-amd-config"},{"title":"Set AMD config","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/amd/config","href":"/api-reference/amd/set-amd-config"},{"title":"List AMD decisions","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/amd/calls","href":"/api-reference/amd/list-amd-decisions"},{"title":"Get an AMD decision","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/amd/calls/{call_id}","href":"/api-reference/amd/get-an-amd-decision"}]},{"group":"Interpretation","pages":[{"title":"Open a two-person live interpretation session","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/stream","href":"/api-reference/interpretation/open-a-two-person-live-interpretation-session"},{"title":"Mint a browser interpretation token","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/audio/interpretations/sessions","href":"/api-reference/interpretation/mint-a-browser-interpretation-token"},{"title":"Create a customer call archive","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/audio/interpretations/recordings","href":"/api-reference/interpretation/create-a-customer-call-archive"},{"title":"Upload one party recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/interpretation-recordings/{recording_id}/audio","href":"/api-reference/interpretation/upload-one-party-recording"},{"title":"Save transcripts and finalize a call archive","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /auth/interpretation-recordings/{recording_id}/complete","href":"/api-reference/interpretation/save-transcripts-and-finalize-a-call-archive"},{"title":"List saved Translation calls","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/calls","href":"/api-reference/interpretation/list-saved-translation-calls"},{"title":"Read a saved Translation call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/calls/{call_id}","href":"/api-reference/interpretation/read-a-saved-translation-call"},{"title":"Read original and translated transcripts","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/calls/{call_id}/transcript","href":"/api-reference/interpretation/read-original-and-translated-transcripts"},{"title":"Read Translation call and transfer events","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/calls/{call_id}/events","href":"/api-reference/interpretation/read-translation-call-and-transfer-events"},{"title":"Play or download a Translation recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/audio/interpretations/calls/{call_id}/recording","href":"/api-reference/interpretation/play-or-download-a-translation-recording"}]},{"group":"Knowledge Bases","pages":[{"title":"List knowledge bases","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/knowledgebases","href":"/api-reference/knowledge-bases/list-knowledge-bases"},{"title":"Create a knowledge base","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/knowledgebases","href":"/api-reference/knowledge-bases/create-a-knowledge-base"},{"title":"List org-default KB bindings","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/knowledgebases/default","href":"/api-reference/knowledge-bases/list-org-default-kb-bindings"},{"title":"Set org-default KB bindings","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/knowledgebases/default","href":"/api-reference/knowledge-bases/set-org-default-kb-bindings"},{"title":"Get a knowledge base (with documents)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/knowledgebases/{id}","href":"/api-reference/knowledge-bases/get-a-knowledge-base-with-documents"},{"title":"Delete a knowledge base","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/knowledgebases/{id}","href":"/api-reference/knowledge-bases/delete-a-knowledge-base"},{"title":"Rename a knowledge base","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json patch /v1/knowledgebases/{id}","href":"/api-reference/knowledge-bases/rename-a-knowledge-base"},{"title":"List documents in a knowledge base","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/knowledgebases/{id}/documents","href":"/api-reference/knowledge-bases/list-documents-in-a-knowledge-base"},{"title":"Add a document (file, URL, or text)","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/knowledgebases/{id}/documents","href":"/api-reference/knowledge-bases/add-a-document-file-url-or-text"},{"title":"Crawl a public website into a knowledge base","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/knowledgebases/{id}/crawls","href":"/api-reference/knowledge-bases/crawl-a-public-website-into-a-knowledge-base"},{"title":"Remove a document","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/knowledgebases/{id}/documents/{docId}","href":"/api-reference/knowledge-bases/remove-a-document"},{"title":"Edit a pasted-text document","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json patch /v1/knowledgebases/{id}/documents/{docId}","href":"/api-reference/knowledge-bases/edit-a-pasted-text-document"},{"title":"Inspect a document's extracted content","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/knowledgebases/{id}/documents/{docId}/content","href":"/api-reference/knowledge-bases/inspect-a-documents-extracted-content"},{"title":"Retry document ingestion","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/knowledgebases/{id}/documents/{docId}/retry","href":"/api-reference/knowledge-bases/retry-document-ingestion"}]},{"group":"Telephony","pages":[{"title":"List number compliance cases","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/compliance-cases","href":"/api-reference/telephony/list-number-compliance-cases"},{"title":"Start a number compliance or porting case","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases","href":"/api-reference/telephony/start-a-number-compliance-or-porting-case"},{"title":"Get a number compliance case","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/compliance-cases/{id}","href":"/api-reference/telephony/get-a-number-compliance-case"},{"title":"Compute the current blocking checklist","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/checklist","href":"/api-reference/telephony/compute-the-current-blocking-checklist"},{"title":"Create a short-lived document upload grant","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/uploads:grant","href":"/api-reference/telephony/create-a-short-lived-document-upload-grant"},{"title":"Register document upload metadata","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/uploads","href":"/api-reference/telephony/register-document-upload-metadata"},{"title":"Create a short-lived clean-document download grant","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/uploads/{uploadId}/download:grant","href":"/api-reference/telephony/create-a-short-lived-clean-document-download-grant"},{"title":"Run document extraction","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/extractions","href":"/api-reference/telephony/run-document-extraction"},{"title":"Correct an extracted field","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/corrections","href":"/api-reference/telephony/correct-an-extracted-field"},{"title":"Sign a required attestation","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/attestations","href":"/api-reference/telephony/sign-a-required-attestation"},{"title":"Human-approve and submit for network review","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/submit","href":"/api-reference/telephony/human-approve-and-submit-for-network-review"},{"title":"Cancel a number compliance case","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance-cases/{id}/cancel","href":"/api-reference/telephony/cancel-a-number-compliance-case"},{"title":"List normalized network status","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/compliance-cases/{id}/network-operations","href":"/api-reference/telephony/list-normalized-network-status"},{"title":"Search available numbers","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/available","href":"/api-reference/telephony/search-available-numbers"},{"title":"List your numbers","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/numbers","href":"/api-reference/telephony/list-your-numbers"},{"title":"Provision (buy) a number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/numbers","href":"/api-reference/telephony/provision-buy-a-number"},{"title":"Read a saved number order","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/number-orders/{id}","href":"/api-reference/telephony/read-a-saved-number-order"},{"title":"Confirm a saved number order","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/number-orders/{id}/reconcile","href":"/api-reference/telephony/confirm-a-saved-number-order"},{"title":"Read an explicit managed inbound binding","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/numbers/{id}/inbound-binding","href":"/api-reference/telephony/read-an-explicit-managed-inbound-binding"},{"title":"Set an explicit managed inbound binding","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/telephony/numbers/{id}/inbound-binding","href":"/api-reference/telephony/set-an-explicit-managed-inbound-binding"},{"title":"Route a number to an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/numbers/{id}/assign","href":"/api-reference/telephony/route-a-number-to-an-agent"},{"title":"Release a number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/telephony/numbers/{id}","href":"/api-reference/telephony/release-a-number"},{"title":"Get outbound compliance policy","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/compliance/policy","href":"/api-reference/telephony/get-outbound-compliance-policy"},{"title":"Configure outbound compliance policy","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json put /v1/telephony/compliance/policy","href":"/api-reference/telephony/configure-outbound-compliance-policy"},{"title":"Record destination consent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance/consents","href":"/api-reference/telephony/record-destination-consent"},{"title":"Suppress an outbound destination","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/compliance/suppressions","href":"/api-reference/telephony/suppress-an-outbound-destination"},{"title":"List caller identity readiness","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/compliance/caller-identities","href":"/api-reference/telephony/list-caller-identity-readiness"},{"title":"Create a managed human calling session","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/browser-sessions","href":"/api-reference/telephony/create-a-managed-human-calling-session"},{"title":"Start a human call transfer","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls/{id}/transfers","href":"/api-reference/telephony/start-a-human-call-transfer"},{"title":"Complete a connected warm transfer","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls/{id}/transfers/{transfer_id}/complete","href":"/api-reference/telephony/complete-a-connected-warm-transfer"},{"title":"Cancel a warm transfer","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls/{id}/transfers/{transfer_id}/cancel","href":"/api-reference/telephony/cancel-a-warm-transfer"},{"title":"Read a private human-call recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/calls/{id}/recording","href":"/api-reference/telephony/read-a-private-human-call-recording"},{"title":"Erase a human-call recording","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/telephony/calls/{id}/recording","href":"/api-reference/telephony/erase-a-human-call-recording"},{"title":"List telephony calls","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/calls","href":"/api-reference/telephony/list-telephony-calls"},{"title":"Start an outbound agent call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls","href":"/api-reference/telephony/start-an-outbound-agent-call"},{"title":"Decide a pending inbound admission","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls/{id}/admission","href":"/api-reference/telephony/decide-a-pending-inbound-admission"},{"title":"Request call termination","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/telephony/calls/{id}/hangup","href":"/api-reference/telephony/request-call-termination"},{"title":"Get an outbound call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/telephony/calls/{id}","href":"/api-reference/telephony/get-an-outbound-call"}]},{"group":"WhatsApp","pages":[{"title":"List your WhatsApp numbers","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/whatsapp/numbers","href":"/api-reference/whatsapp/list-your-whatsapp-numbers"},{"title":"Register a WhatsApp Business number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/numbers","href":"/api-reference/whatsapp/register-a-whatsapp-business-number"},{"title":"Get a WhatsApp number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/whatsapp/numbers/{id}","href":"/api-reference/whatsapp/get-a-whatsapp-number"},{"title":"Release a WhatsApp number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json delete /v1/whatsapp/numbers/{id}","href":"/api-reference/whatsapp/release-a-whatsapp-number"},{"title":"Route a WhatsApp number to an agent","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/numbers/{id}/assign","href":"/api-reference/whatsapp/route-a-whatsapp-number-to-an-agent"},{"title":"Enable or disable calling on a WhatsApp number","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/numbers/{id}/calling","href":"/api-reference/whatsapp/enable-or-disable-calling-on-a-whatsapp-number"},{"title":"Check call permission for a user","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/whatsapp/call-permissions","href":"/api-reference/whatsapp/check-call-permission-for-a-user"},{"title":"Ask a user for permission to call them","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/call-permissions","href":"/api-reference/whatsapp/ask-a-user-for-permission-to-call-them"},{"title":"List WhatsApp calls","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/whatsapp/calls","href":"/api-reference/whatsapp/list-whatsapp-calls"},{"title":"Place a WhatsApp call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/calls","href":"/api-reference/whatsapp/place-a-whatsapp-call"},{"title":"Get a WhatsApp call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json get /v1/whatsapp/calls/{id}","href":"/api-reference/whatsapp/get-a-whatsapp-call"},{"title":"Hang up a WhatsApp call","deprecated":null,"version":null,"openapi":"https://api.pyai.com/openapi.json post /v1/whatsapp/calls/{id}/terminate","href":"/api-reference/whatsapp/hang-up-a-whatsapp-call"}]}]}]},"basePath":"","title":"Create an async transcription job - PyAI Developers","buildId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","deploymentId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-B5zPa4Vr.js","utils-CVjrr8Yd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DTgURWzl.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DxTHtkdZ.js","snippetPresets-Cx47o5Vx.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-4Fr6y9N_.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Dq2ElbEk.js","shallow-BfYl9r69.js","getApiPlaygroundDisplay-Ch3xc7i1.js","CodeSnippet-BsBxuJ1v.js","CodeSnippets-CetzeDL8.js","Page-CYZot51e.js","getPastedJson-BxPKFSJx.js","icon-o0J1Ochb.js","MethodPill-Du3usO5m.js","DuplicateIcon-DJypyMzl.js","createIcon-YMA6N8KJ.js","DynamicMarkdown-CWvhfcZc.js","SectionHeading-BdLVaXCd.js","axios-vUo_bRtp.js","Markdown-C4Ez6OeV.js","clsx-DptzKFCt.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Dt1IougW.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CZ6Wt2Vb.js"]}