Planned production integration guide. The current sandbox has fictional voice fixtures, but no
provider voices, material downloads, live sessions, revocation feed or media evaluation.
Start with the runnable quickstart and sandbox support matrix.
Find the voice
A talent’s voice is a facet withtype: "voice". A talent can have more than one, such as a
speaking voice and a singing voice, so name the one you use with facet on the check or session.
When the voice exists at a model provider, the facet lists where in provider_bindings. Bindings
are shown only to that provider and to licensees whose license includes material_access.
external_id. Subscribe to facet.updated: when a binding’s
status becomes deleted or the facet’s status becomes withdrawn, stop using that voice.
If your license includes material_access for the voice, you can download its samples with
GET /v1/facets/{facet_id}/material and create
the voice at your own provider. That copy is yours to delete: the material comes with a
delete_material obligation, and every download is recorded on the talent’s record.
Rendered speech
Send the words as an input withrole: "script", and use.modality: "speech". Speech in the
talent’s voice is kind: "impersonation".
- Interactive products pass
on_escalate: "deny". A request that would wait for a reviewer returnsdenywithreview_requiredat once. - Many lines for one user ask for
reuse, up to 1,000 generations andPT15M. Each line is still submitted as its own generation and checked on its own audio and words. - Talent rules arrive as
generation_instructions. Apply them to the words before they are spoken; if a model writes the script, put them in its system prompt.
status: "checking" and the decision arrives as generation.allowed or
generation.denied. Send the words in transcript when you have them; Reflections transcribes
the audio either way. Rules on speech fail with reasons such as prohibited_speech,
narration_mismatch and voice_rule. The voice integration design describes the target path.
Voice samples from users
If your users can upload a voice to clone, send the sample as an input withrole: "voice_sample". The check matches it against talent who opted into protection, and a
match appears in talent with matched_by: "voice_sample". No match means the sample matched no
protected talent. It does not license the voice.
Live sessions
A session runs one check at the start, then keeps a token that expires 5 minutes after issue.
Pass the current session token to your realtime voice provider so it can verify the session
offline. Stay connected to
stream_url: it pushes session.terminated the moment it happens,
and the p95 target from a revocation to that message is 2 seconds.
Sessions never escalate, because nobody can review a live call. Anything that would escalate is
deny. A license that holds every output for release cannot start a session; the session returns
status: "denied" with session_not_permitted.
Two bounds follow from the design. Up to 15 seconds of speech between samples is unchecked, and a
revoked license leaves the current token valid until it expires. Stopping on the stream message
keeps the second bound to seconds. See Real-time sessions.
Platform licenses for your users
A fan voice product usually runs under a platform license held by your platform, not a brand’s. Its scope says whether your end users may make personal, non-commercial speech (sublicense: "end_users_personal") and sets monthly_limits in seconds or characters.
Send a stable end_user.id on every check and session so use is counted per end user. A check
past a monthly limit denies with monthly_limit_reached.
Delete provider copies on revocation
When a talent revokes a license or withdraws a voice,revocation.created lists what you must do
in required_actions. For a voice held at a provider, that includes delete_provider_copies, and
provider_copies names each copy by provider and external_id. Delete each one, then
acknowledge before acknowledge_by, 24 hours after effective_at. Derive the
Idempotency-Key from the revocation ID, so a retry after a crash cannot acknowledge twice.
required_actions. The acknowledgement is shown on the talent’s record;
an unacknowledged revocation becomes revocation.overdue. See
Handling revocations.
Report usage
Voice licenses usually priceseconds or characters. Report each generation and each session
with a usage record that names it, within the usage_report obligation’s within. See
Reporting usage.
What can go wrong
Related
Voice integration design
Proposed speech-line and live-session workflows.
Session stream
Every message on the WebSocket.
Talent and facets
What a facet is and which identity each one covers.
Model providers
How your provider verifies authorization and session tokens.