API reference
Documents and speakers API
Every section has a versioned document of narration and dialogue blocks attributed to speakers. Read the document before editing it or generating audio, and list the project's speakers and casting.
BetaUpdated
- Base URL
- https://lyricwinter.com/api/v1
- Authentication
- Authorization: Bearer lw_…
- Contract
- openapi.json
Get a section document
GET/studio/sections/{sectionId}/document
studio:readReturns the section's current document: its document_version, blocks, the project's speakers and speaker_registry_version, and whether section sound effects are enabled. Read it before editing the section or generating audio.
Path parameters
sectionIdstringrequireduuid
Response 200
Canonical Studio document and optional recovery draft. Fields below are inside data.
actor_user_idstringrequireduuidAuthenticated caller; clients partition local recovery state by this ID.
project_idstringrequireduuiddocumentobjectrequiredThe canonical structured script of one section (studio-ast-2): its versions, speakers, and ordered blocks.
10 child attributes
blocksarray of objectrequiredmax 100000 itemsOne of 6 shapes:
kind: "speech"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"speech"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "narration"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"narration"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "unparsed"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"unparsed"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "excluded"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"excluded"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "note"block_versionintegerrequired> 0contentobjectrequired3 child attributes
schema_version"studio-ast-2"requiredtextstringrequiredmax 20000 charstype"note"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"note"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "sfx"block_versionintegerrequired> 0contentobjectrequired6 child attributes
duration_msintegerrequired100–3900000Generated sound effects (no source) allow up to 300000 ms; a pinned project sound allows up to 3900000 ms.
promptstringrequired1–4000 charsschema_version"studio-ast-2"requiredseedinteger | nullrequired≥ -9007199254740991type"sfx"requiredsourceobjectPresent only when the SFX block plays an uploaded project sound; seed is then null.
3 child attributes
kind"project_sound"requiredsound_effect_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$sound_effect_revision_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"sfx"requiredplacementobjectrequired5 child attributes
anchorobjectrequiredOne of 3 shapes:
kind: "block"block_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$fractionnumber | nullrequired0–1kind"block"requiredpositionstringrequiredOne of
startfractionendafter
kind: "section"kind"section"requiredpositionstringrequiredOne of
startend
kind: "unplaced"kind"unplaced"required
fade_in_msintegerrequired0–300000fade_out_msintegerrequired0–300000gain_dbnumberrequired-60–24offset_msintegerrequired-300000–300000
speaker_idany | nullrequired
different_speaker_gap_msintegerrequired0–1000Silence in milliseconds inserted between adjacent spoken blocks with different speakers.
document_versionintegerrequired> 0sfx_enabledbooleanrequiredWhether authored section sound effects are audible in playback and included in rendered exports. Legacy sections without a stored value report true.
same_speaker_gap_msintegerrequired0–1000Silence in milliseconds inserted between adjacent spoken blocks with the same speaker.
schema_version"studio-ast-2"requiredsection_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Canonical lowercase UUID of the section.
speaker_registry_versionintegerrequired> 0Project-wide speaker registry version the speakers list was read at.
speakersarray of objectrequiredEvery active speaker in the project registry, not only speakers referenced by this section.
5 item attributes
generation_profileobject | nullrequiredSaved profile read shape, including historical options. For new full-profile requests use StudioGenerationProfileRequest; its provider/model branches list accepted option keys. Generation eligibility and actual audio readiness are separate reads.
5 child attributes
providerstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$modelstringrequired1–200 charsfallbackstringrequiredOne of
strictbest_effortcontrolsstringrequiredOne of
strictbest_effortoptionsobjectrequired
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$namestringrequired1–200 charsspeaker_versionintegerrequired> 0voice_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
titlestringrequiredmax 500 chars
source_draftobject | nullrequiredThe caller's saved, uncommitted Advanced Source draft for this section, or null.
6 child attributes
source_textstringrequiredbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1base_speaker_versionsmap of integerrequiredSpeaker versions keyed by speaker ID when the draft began.
diagnosticsarray of objectrequiredmax 1000 items2 item attributes
codestringrequiredOne of
INVALID_SOURCESTALE_SOURCEmessagestringrequired1–2000 chars
updated_atstringrequireddate-time
Errors 400, 401, 403, 404, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/studio/sections/$SECTION_ID/document" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const sectionId = "<sectionId>";
const response = await fetch(`https://lyricwinter.com/api/v1/studio/sections/${sectionId}/document`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
section_id = "<sectionId>"
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/studio/sections/{section_id}/document",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"actor_user_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"project_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"document": {
"blocks": [
{
"block_version": 1,
"content": {
"annotations": [
{
"end_utf16": null,
"id": null,
"kind": "exclusion",
"reason": "speaker_label",
"start_utf16": null
}
],
"delivery_control_sets": [
{
"capability_revision": null,
"directives": [],
"format": "eleven-v4-1",
"id": null,
"model": null,
"provider": null,
"provider_text_override": null,
"schema_version": "studio-delivery-control-set-1",
"settings": [],
"source_fingerprint": null,
"source_utf16_length": null
}
],
"points": [
{
"duration_ms": null,
"id": null,
"kind": "timed_silence",
"offset_utf16": null
}
],
"schema_version": "studio-ast-2",
"text": "A bell rang. \"Who is there?\" Mira asked.",
"type": "text"
},
"generation_profile_override": {
"controls": "strict",
"fallback": "strict",
"model": "string",
"options": {},
"provider": "string"
},
"id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"kind": "speech",
"placement": null,
"speaker_id": "d3d94468-02a4-4c5e-b6f7-0a1b2c3d4e40"
}
],
"different_speaker_gap_ms": 1,
"document_version": 1,
"sfx_enabled": true,
"same_speaker_gap_ms": 1,
"schema_version": "studio-ast-2",
"section_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"speaker_registry_version": 1,
"speakers": [
{
"generation_profile": {
"provider": "string",
"model": "string",
"fallback": "strict",
"controls": "strict",
"options": {}
},
"id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"name": "My integration",
"speaker_version": 1,
"voice_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30"
}
],
"title": "Chapter One"
},
"source_draft": {
"source_text": "string",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"base_speaker_versions": {},
"diagnostics": [
{
"code": "INVALID_SOURCE",
"message": "string"
}
],
"updated_at": "2026-09-30T17:00:00.000Z"
}
},
"request_id": "req_01J9Z3K8QF4"
}Edit a section document
PATCH/studio/sections/{sectionId}/document
studio:writeRetry with the same client_mutation_idApplies a batch of document commands against the versions you last read. The whole batch commits atomically; if any targeted version changed, the request fails with 409 and nothing is applied. For an existing pinned project-sound block, content.duration_ms must equal its immutable source revision's duration; changing it returns 400 STUDIO_PROJECT_SOUND_DURATION_MISMATCH with expected_duration_ms and requested_duration_ms. Placement gain/fades do not trim the source or shorten the timeline. To change only the gaps between passages, send set_section_pacing with integer same_speaker_gap_ms and different_speaker_gap_ms from 0 through 1000; use empty target-version maps for this section-only command. This preserves the script and existing takes.
Path parameters
sectionIdstringrequireduuid
Request body application/json
schema_version1requiredactor_session_idstringrequireduuidclient_mutation_idstringrequireduuidbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1target_block_versionsmap of integerrequiredtarget_speaker_versionsmap of integerrequiredcommandsarray of objectrequired1–1000 itemsOne of 24 shapes:
kind: "set_title"kind"set_title"requiredtitlestringrequiredmax 500 chars
kind: "set_section_pacing"Set silence between consecutive audible passages without replacing the script. Both gaps are required; normal document and cast version checks apply.
kind"set_section_pacing"requiredsame_speaker_gap_msintegerrequired0–1000different_speaker_gap_msintegerrequired0–1000
kind: "set_section_sfx_enabled"kind"set_section_sfx_enabled"requiredsfx_enabledbooleanrequiredWhether authored section sound effects are audible in playback and included in rendered exports. Disabling preserves authored SFX blocks and renditions.
kind: "replace_text"Offsets are UTF-16 indices. Runtime also verifies the expected text hash and range against the current block.
kind"replace_text"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$start_utf16integerrequired≥ 0end_utf16integerrequired≥ 0expected_text_hashstringrequiredpattern ^[0-9a-f]{64}$textstringrequired
kind: "insert_block"kind"insert_block"requiredindexintegerrequired≥ 0blockobjectrequiredOne of 6 shapes:
kind: "speech"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"speech"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "narration"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"narration"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "unparsed"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"unparsed"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "excluded"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of objectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadobject | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
delivery_control_setsarray of objectrequiredmax 32 items11 item attributes
capability_revisionstringrequired1–200 charsdirectivesarray of StudioAstDeliveryDirectiverequiredmax 256 itemsformatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of StudioAstDeliverySettingrequiredmax 32 itemssource_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
pointsarray of objectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadobject | nullrequiredversionintegerrequired> 0
schema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"excluded"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "note"block_versionintegerrequired> 0contentobjectrequired3 child attributes
schema_version"studio-ast-2"requiredtextstringrequiredmax 20000 charstype"note"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"note"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "sfx"block_versionintegerrequired> 0contentobjectrequired6 child attributes
duration_msintegerrequired100–3900000Generated sound effects (no source) allow up to 300000 ms; a pinned project sound allows up to 3900000 ms.
promptstringrequired1–4000 charsschema_version"studio-ast-2"requiredseedinteger | nullrequired≥ -9007199254740991type"sfx"requiredsourceobjectPresent only when the SFX block plays an uploaded project sound; seed is then null.
3 child attributes
kind"project_sound"requiredsound_effect_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$sound_effect_revision_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"sfx"requiredplacementobjectrequired5 child attributes
anchorobjectrequiredOne of 3 shapes:
kind: "block"block_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$fractionnumber | nullrequired0–1kind"block"requiredpositionstringrequiredOne of
startfractionendafter
kind: "section"kind"section"requiredpositionstringrequiredOne of
startend
kind: "unplaced"kind"unplaced"required
fade_in_msintegerrequired0–300000fade_out_msintegerrequired0–300000gain_dbnumberrequired-60–24offset_msintegerrequired-300000–300000
speaker_idany | nullrequired
kind: "delete_block"kind"delete_block"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
kind: "move_block"kind"move_block"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$to_indexintegerrequired≥ 0
kind: "create_sfx"For an uploaded project sound, use content.source.kind=project_sound, seed=null, and a section or block placement anchor.
kind"create_sfx"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$contentobjectrequired6 child attributes
duration_msintegerrequired100–3900000Generated sound effects (no source) allow up to 300000 ms; a pinned project sound allows up to 3900000 ms.
promptstringrequired1–4000 charsschema_version"studio-ast-2"requiredseedinteger | nullrequired≥ -9007199254740991type"sfx"requiredsourceobjectPresent only when the SFX block plays an uploaded project sound; seed is then null.
3 child attributes
kind"project_sound"requiredsound_effect_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$sound_effect_revision_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
placementobjectrequired5 child attributes
anchorobjectrequiredOne of 3 shapes:
kind: "block"block_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$fractionnumber | nullrequired0–1kind"block"requiredpositionstringrequiredOne of
startfractionendafter
kind: "section"kind"section"requiredpositionstringrequiredOne of
startend
kind: "unplaced"kind"unplaced"required
fade_in_msintegerrequired0–300000fade_out_msintegerrequired0–300000gain_dbnumberrequired-60–24offset_msintegerrequired-300000–300000
kind: "update_sfx"kind"update_sfx"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$contentobjectrequired6 child attributes
duration_msintegerrequired100–3900000Generated sound effects (no source) allow up to 300000 ms; a pinned project sound allows up to 3900000 ms.
promptstringrequired1–4000 charsschema_version"studio-ast-2"requiredseedinteger | nullrequired≥ -9007199254740991type"sfx"requiredsourceobjectPresent only when the SFX block plays an uploaded project sound; seed is then null.
3 child attributes
kind"project_sound"requiredsound_effect_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$sound_effect_revision_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
placementobjectrequired5 child attributes
anchorobjectrequiredOne of 3 shapes:
kind: "block"block_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$fractionnumber | nullrequired0–1kind"block"requiredpositionstringrequiredOne of
startfractionendafter
kind: "section"kind"section"requiredpositionstringrequiredOne of
startend
kind: "unplaced"kind"unplaced"required
fade_in_msintegerrequired0–300000fade_out_msintegerrequired0–300000gain_dbnumberrequired-60–24offset_msintegerrequired-300000–300000
kind: "split_blocks"kind"split_blocks"requiredtargetsarray of objectrequired1–2 items4 item attributes
block_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$split_offsets_utf16array of integerrequired1–2 itemsnew_block_idsarray of stringrequired1–2 itemsannotation_fragment_idsmap of array of stringrequired
kind: "merge_blocks"Left and right block IDs must differ.
kind"merge_blocks"requiredleft_block_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$right_block_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$expected_left_text_length_utf16integerrequired≥ 0
kind: "upsert_annotation"kind"upsert_annotation"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$annotationobjectrequiredOne of 3 shapes:
kind: "exclusion"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"exclusion"requiredreasonstringrequiredOne of
speaker_labelstage_directionmetadatauserstart_utf16integerrequired≥ 0
kind: "pronunciation"alphabetstringrequiredOne of
ipax-sampacmualiasend_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"pronunciation"requiredstart_utf16integerrequired≥ 0valuestringrequired1–500 chars
kind: "extension"end_utf16integerrequired≥ 0idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$payloadboolean | string | integer | number | array of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | null | map of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | null | nullrequiredstart_utf16integerrequired≥ 0versionintegerrequired> 0
kind: "remove_annotation"kind"remove_annotation"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$annotation_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
kind: "upsert_point"kind"upsert_point"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$pointobjectrequiredOne of 2 shapes:
kind: "timed_silence"duration_msintegerrequired1–300000idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"timed_silence"requiredoffset_utf16integerrequired≥ 0
kind: "extension"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"extension"requirednamestringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$namespacestringrequiredpattern ^[a-z][a-z0-9_.-]{0,63}$offset_utf16integerrequired≥ 0payloadboolean | string | integer | number | array of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | null | map of boolean | string | integer | number | array of StudioAstJsonValue | map of StudioAstJsonValue | null | nullrequiredversionintegerrequired> 0
kind: "remove_point"kind"remove_point"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$point_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
kind: "upsert_delivery_control_set"kind"upsert_delivery_control_set"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$setobjectrequiredProvider-specific delivery controls for one provider/model. The format fixes the provider, model, and which setting and directive kinds are allowed (StudioDeliveryControlSetSchema in libs/studio/ast/v2/delivery-controls.ts). source_fingerprint and source_utf16_length are non-null exactly when directives or provider_text_override are present.
11 child attributes
capability_revisionstringrequired1–200 charsdirectivesarray of objectrequiredmax 256 itemsOne of 8 shapes:
kind: "inworld.turn_instruction"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$instructionstringrequired1–4000 charskind"inworld.turn_instruction"requiredscopeobjectOne of 2 shapes:
kind: "block"kind"block"required
kind: "point"kind"point"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255
kind: "inworld.nonverbal"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"inworld.nonverbal"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255valuestringrequiredOne of
laughbreatheclear_throatsighcoughyawn
kind: "fish.inline_instruction"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$instructionstringrequired1–4000 charskind"fish.inline_instruction"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255
kind: "elevenlabs.audio_tag"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"elevenlabs.audio_tag"requiredinstructionstringrequired1–200 charsTrimmed audio-tag text without square brackets or control characters.
scopeobjectrequiredOne of 2 shapes:
kind: "block"kind"block"required
kind: "point"kind"point"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255
kind: "cartesia.emotion"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"cartesia.emotion"requiredscopeobjectrequiredOne of 2 shapes:
kind: "block"kind"block"required
kind: "point"kind"point"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255
valuestringrequiredOne of
neutralhappyexcitedenthusiasticelatedeuphorictriumphantamazedsurprisedflirtatiouscuriouscontentpeacefulserenecalmgratefulaffectionatetrustsympatheticanticipationmysteriousangrymadoutragedfrustratedagitatedthreateneddisgustedcontemptenvioussarcasticironicsaddejectedmelancholicdisappointedhurtguiltyboredtiredrejectednostalgicwistfulapologetichesitantinsecureconfusedresignedanxiouspanickedalarmedscaredproudconfidentdistantskepticalcontemplativedetermined
kind: "cartesia.laughter"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"cartesia.laughter"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255
kind: "openai.instructions"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$instructionstringrequired1–4000 charskind"openai.instructions"required
kind: "chatterbox.nonverbal"idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"chatterbox.nonverbal"requiredoffset_utf16integerrequired≥ 0ordinalintegerrequired0–255valuestringrequiredOne of
laughchucklesighcoughsnifflegroanyawngasp
formatstringrequiredOne of
eleven-v4-1inworld-tts2-1inworld-tts2-experimental-1inworld-tts15-max-1inworld-tts15-mini-1fish-s2-inline-1fish-s2.1-inline-1fish-drama-3-inline-1cartesia-sonic36-1cartesia-sonic35-1openai-gpt4o-mini-tts-1openai-tts1-hd-1openai-tts1-1smallest-lightning31-1chatterbox-classic-1zyphra-zonos2-cloud-1f5tts-v1-1misotts-8b-1idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$modelstringrequired1–200 charsproviderstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$provider_text_overridestring1–65536 charspattern [\s\S]*\S[\s\S]*schema_versionstringrequiredOne of
studio-delivery-control-set-1studio-delivery-control-set-2settingsarray of objectrequiredmax 32 itemsOne of 11 shapes:
kind: "inworld.speaking_rate"kind"inworld.speaking_rate"requiredvaluenumberrequired0.5–1.5
kind: "inworld.delivery_mode"kind"inworld.delivery_mode"requiredvaluestringrequiredOne of
stablebalancedcreative
kind: "fish.speed"kind"fish.speed"requiredvaluenumberrequired0.5–2
kind: "fish.volume"kind"fish.volume"requiredvaluenumberrequired-20–20
kind: "openai.speed"kind"openai.speed"requiredvaluenumberrequired0.25–4
kind: "smallest.speed"kind"smallest.speed"requiredvaluenumberrequired0.5–2
kind: "chatterbox.exaggeration"kind"chatterbox.exaggeration"requiredvaluenumberrequired0–1
kind: "chatterbox.cfg"kind"chatterbox.cfg"requiredvaluenumberrequired0–1
kind: "zyphra.mode"kind"zyphra.mode"requiredvaluestringrequiredOne of
stableexpressive
kind: "zyphra.speaking_rate_bucket"kind"zyphra.speaking_rate_bucket"requiredvalueintegerrequired0–7
kind: "f5tts.speed"kind"f5tts.speed"requiredvaluenumberrequired0.3–2
source_fingerprintstring | nullrequiredpattern ^[0-9a-f]{64}$source_utf16_lengthinteger | nullrequired≥ 0
kind: "remove_delivery_control_set"kind"remove_delivery_control_set"requiredblock_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$providerstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$modelstringrequired1–200 chars
kind: "set_block_attribution"Target block IDs must be unique.
kind"set_block_attribution"requiredtargetsarray of objectrequired1–1000 items3 item attributes
block_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$block_kindstringrequiredOne of
speechnarrationunparsedexcludedspeaker_idstring | nullrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
kind: "create_speaker"The speaker name must be trimmed. speaker_version is 1 for a new speaker, or restore_from_speaker_version+1. A non-null casting_default_key must equal the normalized speaker name and requires voice_id.
kind"create_speaker"requiredspeakerobjectrequiredA speaker written by a document command. New full profiles use the strict provider/model request contract; saved-document reads retain their historical profile shape.
5 child attributes
generation_profileobject | nullrequiredSaved profile read shape, including historical options. For new full-profile requests use StudioGenerationProfileRequest; its provider/model branches list accepted option keys. Generation eligibility and actual audio readiness are separate reads.
5 child attributes
providerstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$modelstringrequired1–200 charsfallbackstringrequiredOne of
strictbest_effortcontrolsstringrequiredOne of
strictbest_effortoptionsobjectrequired
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$namestringrequired1–200 charsspeaker_versionintegerrequired> 0voice_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
restore_from_speaker_versioninteger | nullrequired≥ 1casting_default_keystring | nullrequired1–200 chars
kind: "update_speaker"The name must be trimmed.
kind"update_speaker"requiredspeaker_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$namestringrequired1–200 chars
kind: "delete_speaker"kind"delete_speaker"requiredspeaker_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
kind: "set_speaker_casting"A non-null casting_default_key requires a voice_id. The effective profile is validated in speaker context.
kind"set_speaker_casting"requiredspeaker_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$voice_idstring | nullrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$generation_profileobject | nullrequiredRequest-only provider/model-specific options for new full profiles. Catalog-only compatibility models can be saved but are unavailable for generation; check generation-availability. Historical document profiles remain permissive. Partial overrides are validated after inheriting their effective provider, model, and options. Stable Audio is for generated SFX, not speaker casting.
casting_default_keystring | nullrequired1–200 chars
kind: "set_generation_profile_override"Target block IDs must be unique; effective options are validated against the inherited provider/model.
kind"set_generation_profile_override"requiredtargetsarray of objectrequired1–1000 items2 item attributes
block_idstringrequiredpattern ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of object | nullproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
kind: "apply_source_document"Replaces the source document under the save request's version fences.
kind"apply_source_document"requireddocumentobjectrequiredA replacement source document written by a command. Speaker profiles use the strict new-write request contract.
10 child attributes
blocksarray of objectrequiredmax 100000 itemsOne of 6 shapes:
kind: "speech"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of StudioAstTextAnnotationrequireddelivery_control_setsarray of StudioAstDeliveryControlSetrequiredmax 32 itemspointsarray of StudioAstPointNoderequiredschema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"speech"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "narration"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of StudioAstTextAnnotationrequireddelivery_control_setsarray of StudioAstDeliveryControlSetrequiredmax 32 itemspointsarray of StudioAstPointNoderequiredschema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"narration"requiredplacementany | nullrequiredspeaker_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
kind: "unparsed"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of StudioAstTextAnnotationrequireddelivery_control_setsarray of StudioAstDeliveryControlSetrequiredmax 32 itemspointsarray of StudioAstPointNoderequiredschema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"unparsed"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "excluded"block_versionintegerrequired> 0contentobjectrequired6 child attributes
annotationsarray of StudioAstTextAnnotationrequireddelivery_control_setsarray of StudioAstDeliveryControlSetrequiredmax 32 itemspointsarray of StudioAstPointNoderequiredschema_version"studio-ast-2"requiredtextstringrequiredmax 65536 charsExact block text; at most 65,536 UTF-16 code units. Annotation, point, and delivery offsets are UTF-16 offsets into this string.
type"text"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"excluded"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "note"block_versionintegerrequired> 0contentobjectrequired3 child attributes
schema_version"studio-ast-2"requiredtextstringrequiredmax 20000 charstype"note"required
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"note"requiredplacementany | nullrequiredspeaker_idany | nullrequired
kind: "sfx"block_versionintegerrequired> 0contentobjectrequired6 child attributes
duration_msintegerrequired100–3900000Generated sound effects (no source) allow up to 300000 ms; a pinned project sound allows up to 3900000 ms.
promptstringrequired1–4000 charsschema_version"studio-ast-2"requiredseedinteger | nullrequired≥ -9007199254740991type"sfx"requiredsourceobjectPresent only when the SFX block plays an uploaded project sound; seed is then null.
3 child attributes
kindobjectrequiredsound_effect_idobjectrequiredsound_effect_revision_idobjectrequired
generation_profile_overrideobject | nullrequiredPartial saved profile. New document mutations validate the effective inherited provider/model and options against StudioGenerationProfileRequest. The read schema stays permissive for historical profiles. Join options with speaker context; an override is not a standalone full profile.
5 child attributes
controlsstringOne of
strictbest_effortfallbackstringOne of
strictbest_effortmodelstring1–200 charsoptionsmap of StudioAstJsonValueproviderstringpattern ^[a-z][a-z0-9_-]{0,63}$
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$kind"sfx"requiredplacementobjectrequired5 child attributes
anchorobjectrequiredOne of 3 shapes:
kind: "block"block_idobjectrequiredfractionobjectrequiredkindobjectrequiredpositionobjectrequired
kind: "section"kindobjectrequiredpositionobjectrequired
kind: "unplaced"kindobjectrequired
fade_in_msintegerrequired0–300000fade_out_msintegerrequired0–300000gain_dbnumberrequired-60–24offset_msintegerrequired-300000–300000
speaker_idany | nullrequired
different_speaker_gap_msintegerrequired0–1000Silence in milliseconds inserted between adjacent spoken blocks with different speakers.
document_versionintegerrequired> 0sfx_enabledbooleanrequiredWhether authored section sound effects are audible in playback and included in rendered exports. Legacy sections without a stored value report true.
same_speaker_gap_msintegerrequired0–1000Silence in milliseconds inserted between adjacent spoken blocks with the same speaker.
schema_version"studio-ast-2"requiredsection_idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Canonical lowercase UUID of the section.
speaker_registry_versionintegerrequired> 0Project-wide speaker registry version the speakers list was read at.
speakersarray of objectrequiredEvery active speaker in the project registry, not only speakers referenced by this section.
5 item attributes
generation_profileobject | nullrequiredSaved profile read shape, including historical options. For new full-profile requests use StudioGenerationProfileRequest; its provider/model branches list accepted option keys. Generation eligibility and actual audio readiness are separate reads.
5 child attributes
providerstringrequiredpattern ^[a-z][a-z0-9_-]{0,63}$modelstringrequired1–200 charsfallbackstringrequiredOne of
strictbest_effortcontrolsstringrequiredOne of
strictbest_effortoptionsobjectrequired
idstringrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$namestringrequired1–200 charsspeaker_versionintegerrequired> 0voice_idstring | nullrequiredpattern ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
titlestringrequiredmax 500 chars
Response 200
Authoritative document after commit or idempotent replay. Fields below are inside data.
actor_user_idstringrequireduuidAuthenticated caller; clients partition local recovery state by this ID.
project_idstringrequireduuiddocumentobjectrequiredThe canonical structured script of one section (studio-ast-2): its versions, speakers, and ordered blocks.
Full shape: Get a section document
source_draftobject | nullrequiredThe caller's saved, uncommitted Advanced Source draft for this section, or null.
6 child attributes
source_textstringrequiredbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1base_speaker_versionsmap of integerrequiredSpeaker versions keyed by speaker ID when the draft began.
diagnosticsarray of objectrequiredmax 1000 items2 item attributes
codestringrequiredOne of
INVALID_SOURCESTALE_SOURCEmessagestringrequired1–2000 chars
updated_atstringrequireddate-time
Errors 400, 401, 403, 404, 409, 500 use the standard error envelope.
curl -X PATCH "https://lyricwinter.com/api/v1/studio/sections/$SECTION_ID/document" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"target_block_versions": {},
"target_speaker_versions": {},
"commands": [
{
"kind": "set_title",
"title": "Chapter One"
}
]
}'const sectionId = "<sectionId>";
const response = await fetch(`https://lyricwinter.com/api/v1/studio/sections/${sectionId}/document`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"target_block_versions": {},
"target_speaker_versions": {},
"commands": [
{
"kind": "set_title",
"title": "Chapter One"
}
]
}),
});
const { data, error, request_id } = await response.json();import os
import requests
section_id = "<sectionId>"
response = requests.request(
"PATCH",
f"https://lyricwinter.com/api/v1/studio/sections/{section_id}/document",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
json={
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"target_block_versions": {},
"target_speaker_versions": {},
"commands": [
{
"kind": "set_title",
"title": "Chapter One"
}
]
},
)
payload = response.json(){
"data": {
"actor_user_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"project_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"document": {
"blocks": [],
"different_speaker_gap_ms": 1,
"document_version": 1,
"sfx_enabled": true,
"same_speaker_gap_ms": 1,
"schema_version": "studio-ast-2",
"section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"speaker_registry_version": 1,
"speakers": [],
"title": "Chapter One"
},
"source_draft": {
"source_text": "string",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"base_speaker_versions": {},
"diagnostics": [
{
"code": "INVALID_SOURCE",
"message": "string"
}
],
"updated_at": "2026-09-30T17:00:00.000Z"
}
},
"request_id": "req_01J9Z3K8QF4"
}Import a speaker-labeled script
POST/studio/sections/{sectionId}/script
studio:writeRetry with the same client_mutation_idTurn SPEAKER: [optional direction] spoken text lines into a Studio document without building an AST. Map each speaker label to a voice and generation profile. A separate (silence 4s) line adds exact silence after the preceding spoken line. Unsupported lines or directions fail rather than disappearing. This replaces the section script; it does not generate audio. Send the current document and speaker-registry versions. Reusing an existing speaker name updates that project-wide speaker's voice and profile. Retry uncertain responses with the same mutation ID and body; a receipt that cannot be verified returns 409 without importing again.
Path parameters
sectionIdstringrequireduuid
Request body application/json
schema_version1requiredactor_session_idstringrequireduuidclient_mutation_idstringrequireduuidbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1scriptstringrequiredmin 1 charsOne SPEAKER: [optional direction] spoken text per nonblank line. A separate (silence 4s) or (silence 4000ms) line adds 1-300 seconds of silence after the preceding spoken line. Labels match speaker-map keys exactly. Unsupported lines are rejected.
speakersmap of objectrequiredExact speaker-label keys used in the script, each with an explicit voice and generation profile. Existing project speakers with the same name are reused.
2 child attributes
voice_idstring | nullrequireduuidgeneration_profileobjectrequiredRequest-only provider/model-specific options for new full profiles. Catalog-only compatibility models can be saved but are unavailable for generation; check generation-availability. Historical document profiles remain permissive. Partial overrides are validated after inheriting their effective provider, model, and options. Stable Audio is for generated SFX, not speaker casting.
Response 200
Canonical Studio document after the import. Fields below are inside data.
actor_user_idstringrequireduuidAuthenticated caller; clients partition local recovery state by this ID.
project_idstringrequireduuiddocumentobjectrequiredThe canonical structured script of one section (studio-ast-2): its versions, speakers, and ordered blocks.
Full shape: Get a section document
source_draftobject | nullrequiredThe caller's saved, uncommitted Advanced Source draft for this section, or null.
6 child attributes
source_textstringrequiredbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1base_speaker_versionsmap of integerrequiredSpeaker versions keyed by speaker ID when the draft began.
diagnosticsarray of objectrequiredmax 1000 items2 item attributes
codestringrequiredOne of
INVALID_SOURCESTALE_SOURCEmessagestringrequired1–2000 chars
updated_atstringrequireddate-time
Errors 400, 401, 403, 404, 409, 500 use the standard error envelope.
curl -X POST "https://lyricwinter.com/api/v1/studio/sections/$SECTION_ID/script" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"script": "string",
"speakers": {}
}'const sectionId = "<sectionId>";
const response = await fetch(`https://lyricwinter.com/api/v1/studio/sections/${sectionId}/script`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"script": "string",
"speakers": {}
}),
});
const { data, error, request_id } = await response.json();import os
import requests
section_id = "<sectionId>"
response = requests.request(
"POST",
f"https://lyricwinter.com/api/v1/studio/sections/{section_id}/script",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
json={
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"script": "string",
"speakers": {}
},
)
payload = response.json(){
"data": {
"actor_user_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"project_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"document": {
"blocks": [],
"different_speaker_gap_ms": 1,
"document_version": 1,
"sfx_enabled": true,
"same_speaker_gap_ms": 1,
"schema_version": "studio-ast-2",
"section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"speaker_registry_version": 1,
"speakers": [],
"title": "Chapter One"
},
"source_draft": {
"source_text": "string",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"base_speaker_versions": {},
"diagnostics": [
{
"code": "INVALID_SOURCE",
"message": "string"
}
],
"updated_at": "2026-09-30T17:00:00.000Z"
}
},
"request_id": "req_01J9Z3K8QF4"
}List project speakers
GET/studio/projects/{projectId}/speakers
studio:readReturns the project's speakers with how many lines and sections each one appears in, plus the current speaker_registry_version.
Path parameters
projectIdstringrequireduuid
Response 200
Project-wide character usage and current character registry authority. Fields below are inside data.
project_idstringrequireduuidspeaker_registry_versionintegerrequired≥ 1speakersarray of objectrequiredmax 10000 itemsEvery active project speaker, including unused speakers with zero counts.
4 item attributes
speaker_idstringrequireduuidline_countintegerrequired≥ 0Active speech and narration blocks assigned to the speaker across active sections.
block_override_countintegerrequired≥ 0Of those blocks, how many carry a block-level generation profile override.
section_countintegerrequired≥ 0Active sections containing at least one of those blocks.
Errors 400, 401, 403, 404, 500 use the standard error envelope.
curl "https://lyricwinter.com/api/v1/studio/projects/$PROJECT_ID/speakers" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY"const projectId = "<projectId>";
const response = await fetch(`https://lyricwinter.com/api/v1/studio/projects/${projectId}/speakers`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
},
});
const { data, error, request_id } = await response.json();import os
import requests
project_id = "<projectId>"
response = requests.request(
"GET",
f"https://lyricwinter.com/api/v1/studio/projects/{project_id}/speakers",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
)
payload = response.json(){
"data": {
"project_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"speaker_registry_version": 1,
"speakers": [
{
"speaker_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"line_count": 1,
"block_override_count": 1,
"section_count": 1
}
]
},
"request_id": "req_01J9Z3K8QF4"
}Assign a speaker's voice and model
PATCH/studio/projects/{projectId}/speakers/{speakerId}/casting
studio:writeRetry with the same client_mutation_idUpdates one speaker across its project with a voice and full generation profile, or clears both together. Send current speaker and speaker-registry versions plus session/mutation IDs and a current section ID; the result contains the casting mutation and the current section document. Selecting ElevenLabs v4 requires an active paid plan; otherwise the request returns 403 VOICE_MODEL_SUBSCRIPTION_REQUIRED. Provider options are typed by provider/model. ElevenLabs v4 accepts optional stability (0-1) and integer seed (1-4294967295); empty options retain defaults. Seed is best-effort, not guaranteed deterministic. Speed and similarity_boost are not exposed by the connected transport. Unsupported keys fail before saving or generation. Author delivery directions through control sets. Partial block overrides inherit speaker settings and are checked against the resulting effective profile.
Path parameters
projectIdstringrequireduuidspeakerIdstringrequireduuid
Request body application/json
schema_version1requiredactor_session_idstringrequireduuidclient_mutation_idstringrequireduuidcurrent_section_idstringrequireduuidbase_speaker_registry_versionintegerrequired≥ 1speaker_versionintegerrequired≥ 1voice_idstring | nullrequireduuidgeneration_profileobject | nullrequiredRequest-only provider/model-specific options for new full profiles. Catalog-only compatibility models can be saved but are unavailable for generation; check generation-availability. Historical document profiles remain permissive. Partial overrides are validated after inheriting their effective provider, model, and options. Stable Audio is for generated SFX, not speaker casting.
casting_default_keystring | nullrequired1–200 chars
Response 200
Project casting changed and the current section returned at the committed speaker authority. Fields below are inside data.
mutationobjectrequired9 child attributes
mutation_idstringrequireduuidreverted_mutation_idstring | nullrequireduuidproject_idstringrequireduuidspeaker_idstringrequireduuidspeaker_registry_versionintegerrequired≥ 1speaker_versionintegerrequired≥ 1affected_block_countintegerrequired≥ 0affected_section_countintegerrequired≥ 0idempotent_replaybooleanrequired
documentobjectrequired4 child attributes
actor_user_idstringrequireduuidAuthenticated caller; clients partition local recovery state by this ID.
project_idstringrequireduuiddocumentobjectrequiredThe canonical structured script of one section (studio-ast-2): its versions, speakers, and ordered blocks.
Full shape: Get a section document
source_draftobject | nullrequiredThe caller's saved, uncommitted Advanced Source draft for this section, or null.
6 child attributes
source_textstringrequiredbase_document_versionintegerrequired≥ 1base_speaker_registry_versionintegerrequired≥ 1base_speaker_versionsmap of integerrequiredSpeaker versions keyed by speaker ID when the draft began.
diagnosticsarray of objectrequiredmax 1000 items2 item attributes
codestringrequiredOne of
INVALID_SOURCESTALE_SOURCEmessagestringrequired1–2000 chars
updated_atstringrequireddate-time
Errors 400, 401, 403, 404, 409, 500 use the standard error envelope.
curl -X PATCH "https://lyricwinter.com/api/v1/studio/projects/$PROJECT_ID/speakers/$SPEAKER_ID/casting" \
-H "Authorization: Bearer $LYRICWINTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"current_section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"base_speaker_registry_version": 1,
"speaker_version": 1,
"voice_id": "d3d94468-02a4-4c5e-b6f7-0a1b2c3d4e40",
"generation_profile": {},
"casting_default_key": "string"
}'const projectId = "<projectId>";
const speakerId = "<speakerId>";
const response = await fetch(`https://lyricwinter.com/api/v1/studio/projects/${projectId}/speakers/${speakerId}/casting`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.LYRICWINTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"current_section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"base_speaker_registry_version": 1,
"speaker_version": 1,
"voice_id": "d3d94468-02a4-4c5e-b6f7-0a1b2c3d4e40",
"generation_profile": {},
"casting_default_key": "string"
}),
});
const { data, error, request_id } = await response.json();import os
import requests
project_id = "<projectId>"
speaker_id = "<speakerId>"
response = requests.request(
"PATCH",
f"https://lyricwinter.com/api/v1/studio/projects/{project_id}/speakers/{speaker_id}/casting",
headers={
"Authorization": f"Bearer {os.environ['LYRICWINTER_API_KEY']}",
},
json={
"schema_version": 1,
"actor_session_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"client_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"current_section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"base_speaker_registry_version": 1,
"speaker_version": 1,
"voice_id": "d3d94468-02a4-4c5e-b6f7-0a1b2c3d4e40",
"generation_profile": {},
"casting_default_key": "string"
},
)
payload = response.json(){
"data": {
"mutation": {
"mutation_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"reverted_mutation_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"project_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"speaker_id": "d3d94468-02a4-4c5e-b6f7-0a1b2c3d4e40",
"speaker_registry_version": 1,
"speaker_version": 1,
"affected_block_count": 1,
"affected_section_count": 1,
"idempotent_replay": true
},
"document": {
"actor_user_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
"project_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
"document": {
"blocks": [],
"different_speaker_gap_ms": 1,
"document_version": 1,
"sfx_enabled": true,
"same_speaker_gap_ms": 1,
"schema_version": "studio-ast-2",
"section_id": "45c48cce-2e2d-4fbd-8a1c-5e6f7a8b9c30",
"speaker_registry_version": 1,
"speakers": [],
"title": "Chapter One"
},
"source_draft": {
"source_text": "string",
"base_document_version": 1,
"base_speaker_registry_version": 1,
"base_speaker_versions": {},
"diagnostics": [
{
"code": "INVALID_SOURCE",
"message": "string"
}
],
"updated_at": "2026-09-30T17:00:00.000Z"
}
}
},
"request_id": "req_01J9Z3K8QF4"
}