This moderates transcribed speech, not non-speech audio content. Music, sound effects, tone of
voice and other non-verbal audio are not screened. A clip with no speech in it passes.
Input
Submit amultipart/form-data request with:
The
audio field must be a public HTTP or HTTPS URL. URLs using another scheme, or resolving to a
private or internal network address, are rejected with 400 INVALID_REQUEST.Formats
mp3, m4a / mp4 audio, wav, flac, ogg (including Opus), webm and aac. The container is
verified server-side; a file whose contents don’t match a supported audio container is rejected
before transcription.
Limits
Both are hard limits. A clip over the duration cap fails after the initial probe, before any
transcription cost is incurred.
How it’s checked
The clip is transcribed, and the transcript is checked against the prohibited-content policy and every enabled custom category on your account. A prohibited transcript rejects the job, with areason explaining what tripped. When a custom
category caused the rejection, the reason names it by slug.
Output
reason field explains what tripped. See decision logic
for how the prohibition decision is determined.
Transcript privacy
The transcript is never stored and never returned. The rejection reason is model-generated text, scrubbed of verbatim quotation on a best-effort basis, and may paraphrase what was said. Concretely: a transcript exists only in short-lived, automatically-expiring storage for the duration of the job, and is deleted when the job finishes. No transcript is written to the job record, returned on the job response, or included in a webhook delivery. Thereason on a rejection is
checked server-side for verbatim excerpts of the transcript, which are replaced with a generic
category description. But a short excerpt or a paraphrase can still appear. If your content is
sensitive enough that even a paraphrase is unacceptable, surface only is_prohibited to your users
and discard reason.
Latency
Audio moderation is slower than the other modalities: transcription time scales with clip length. Register a webhook rather than polling tightly. The job reportsqueued for
the whole run and then flips straight to a terminal status, with no incremental progress to observe,
so frequent polling only burns rate limit.