{
"error": "reloading — the server is applying a config reload; retry shortly",
"reloading": true
}
conversations
Deliver a structured event to a conversation thread as a turn
Run a structured event as a turn on an EXISTING thread of route_name.
The thread must already exist: an event enters a conversation as a turn and never mints a
thread. Address it by the address its listing shows or by its thread_id (exactly
one). The turn runs the route’s TOOL target AS the route’s execution key — an
agent-target route is refused (409) since an event carries no rendered text. The
event is IDEMPOTENT on event_id: a redelivery returns the original turn’s
message_id (202) and runs no second turn.
The answer is delivered by the TARGET route’s door — a channel route texts the thread’s
address, an api route POSTs the route’s signed callback (a wait_seconds body field,
clamped to sync_wait_max_seconds, returns a finished turn’s answer inline in the
200 and suppresses the callback, but only while the client is still connected — a
hung-up caller’s answer falls to the callback or its terminal poll record). Default is
202 {message_id, thread_id}.
This is a TRUSTED-integration door: an authorized writer may address ANY existing thread
of the route by thread_id (a channel participant’s included), so a deployment grants its
write action to service principals, not to low-trust API keys.
POST
/
api
/
conversations
/
{route_name}
/
events
Deliver a structured event to a conversation thread as a turn
The inbound body of the event door POST /api/conversations/{route_name}/events.
An :class:ConversationEvent addressed to an EXISTING thread by EXACTLY ONE (non-blank)
of address (the thread's client address) or thread_id (the id the monitoring
listing exposes). wait_seconds bounds a sync-wait window exactly as
:attr:ConversationMessage.wait_seconds. There is NO callback field — an event's answer
is delivered against the target thread's route. Frozen.
A structured event delivered to an existing thread as a turn.
event_id (non-blank after trim, ≤ EVENT_ID_MAX_CHARS) is the idempotency key;
kind is an identifier-like label matching EVENT_KIND_RE; payload is opaque,
untrusted data bounded as pure transport by :func:validate_bounded_object. Frozen.
The ack a message/event submission returns: the accepted turn's message_id and thread_id.
answer is present on every inline-waited turn that finished in time (a 200) — including a silent one,
which carries the silent marker (status silent, no answer text, dumped exclude_none); it is
absent only on the default deferred 202, whose turn produced no outcome yet.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TAI42","description":"tai is an open-source runtime for MCP tools, agents, and workflows — the server that hosts tools, agents, extensions, connectors, hooks, and storage for the TAI42 ecosystem.","colors":{"primary":"#DC143C","light":"#F4718A","dark":"#A01030"},"logo":{"light":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/light.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=2140f77615492c689d62fcb3a5df2d31","dark":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/dark.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=22db5fbcb0ff42b44dd8057f0edbb842"},"favicon":{"light":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/icon.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=93b0ca22f7b4a2c0a6a18f49aedbfd73","dark":"https://mintcdn.com/tai42/6-OGKPd0gfVyDs4N/logo/icon-dark.png?fit=max\u0026auto=format\u0026n=6-OGKPd0gfVyDs4N\u0026q=85\u0026s=e1630da05506747fe41cf300761cf3cf"},"appearance":{"default":"light"},"navbar":{"links":[{"icon":"github","href":"https://github.com/tai42ai/tai42","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/getting-started/installation"}},"footer":{"socials":{"github":"https://github.com/tai42ai","website":"https://tai42.ai"},"links":[{"header":"Project","items":[{"label":"Contributing","href":"/contributing"}]}]},"search":{"prompt":"Search the TAI42 docs"},"seo":{"metatags":{"og:title":"TAI42 — the OS for AI tools","og:description":"An open-source runtime for MCP tools, agents, and workflows.","og:image":"/images/og-image.svg","og:type":"website","twitter:card":"summary_large_image","twitter:title":"TAI42 — the OS for AI tools","twitter:image":"/images/og-image.svg"},"indexing":"navigable"},"fonts":{"heading":{"family":"Geist"},"body":{"family":"Inter"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tai42","hasAudioNarration":false,"actualSubdomain":"tai42","customDomains":["docs.tai42.ai"],"gitSource":{"type":"github","owner":"tai42ai","repo":"tai-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"70c7974a-74c7-4ee5-8636-97a098b8bbe6","liveDeploymentHistoryId":"6aeca718754501e0c6b68d06","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeca718754501e0c6b68d06"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aecafc07e5e99a1eb7058ad","clientVersion":"0.0.4071","searchFilterCounts":[{"language":"default","tag":"Reference","count":356},{"language":"default","tag":"HTTP API","count":260},{"language":"default","tag":"Docs","count":124},{"language":"default","tag":"CLI","count":46},{"language":"default","tag":"Python SDK","count":38},{"language":"default","tag":"Concepts","count":35},{"language":"default","tag":"access-control","count":35},{"language":"default","tag":"states","count":33},{"language":"default","tag":"Plugins","count":30},{"language":"default","tag":"conversations","count":22}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn","slug":"/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn","pageMetadata":{"title":"Deliver a structured event to a conversation thread as a turn","description":"Run a structured event as a turn on an EXISTING thread of ``route_name``.\n\nThe thread must already exist: an event enters a conversation as a turn and never mints a\nthread. Address it by the ``address`` its listing shows or by its ``thread_id`` (exactly\none). The turn runs the route's TOOL target AS the route's execution key — an\nagent-target route is refused (``409``) since an event carries no rendered text. The\nevent is IDEMPOTENT on ``event_id``: a redelivery returns the original turn's\n``message_id`` (``202``) and runs no second turn.\n\nThe answer is delivered by the TARGET route's door — a channel route texts the thread's\naddress, an api route POSTs the route's signed callback (a ``wait_seconds`` body field,\nclamped to ``sync_wait_max_seconds``, returns a finished turn's answer inline in the\n``200`` and suppresses the callback, but only while the client is still connected — a\nhung-up caller's answer falls to the callback or its terminal poll record). Default is\n``202 {message_id, thread_id}``.\n\nThis is a TRUSTED-integration door: an authorized writer may address ANY existing thread\nof the route by ``thread_id`` (a channel participant's included), so a deployment grants its\nwrite action to service principals, not to low-trust API keys.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}/events","href":"/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Run a structured event as a turn on an EXISTING thread of \", _jsx(_components.code, {\n children: \"route_name\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The thread must already exist: an event enters a conversation as a turn and never mints a\\nthread. Address it by the \", _jsx(_components.code, {\n children: \"address\"\n }), \" its listing shows or by its \", _jsx(_components.code, {\n children: \"thread_id\"\n }), \" (exactly\\none). The turn runs the route’s TOOL target AS the route’s execution key — an\\nagent-target route is refused (\", _jsx(_components.code, {\n children: \"409\"\n }), \") since an event carries no rendered text. The\\nevent is IDEMPOTENT on \", _jsx(_components.code, {\n children: \"event_id\"\n }), \": a redelivery returns the original turn’s\\n\", _jsx(_components.code, {\n children: \"message_id\"\n }), \" (\", _jsx(_components.code, {\n children: \"202\"\n }), \") and runs no second turn.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The answer is delivered by the TARGET route’s door — a channel route texts the thread’s\\naddress, an api route POSTs the route’s signed callback (a \", _jsx(_components.code, {\n children: \"wait_seconds\"\n }), \" body field,\\nclamped to \", _jsx(_components.code, {\n children: \"sync_wait_max_seconds\"\n }), \", returns a finished turn’s answer inline in the\\n\", _jsx(_components.code, {\n children: \"200\"\n }), \" and suppresses the callback, but only while the client is still connected — a\\nhung-up caller’s answer falls to the callback or its terminal poll record). Default is\\n\", _jsx(_components.code, {\n children: \"202 {message_id, thread_id}\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This is a TRUSTED-integration door: an authorized writer may address ANY existing thread\\nof the route by \", _jsx(_components.code, {\n children: \"thread_id\"\n }), \" (a channel participant’s included), so a deployment grants its\\nwrite action to service principals, not to low-trust API keys.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Deliver a structured event to a conversation thread as a turn","description":"Run a structured event as a turn on an EXISTING thread of ``route_name``.\n\nThe thread must already exist: an event enters a conversation as a turn and never mints a\nthread. Address it by the ``address`` its listing shows or by its ``thread_id`` (exactly\none). The turn runs the route's TOOL target AS the route's execution key — an\nagent-target route is refused (``409``) since an event carries no rendered text. The\nevent is IDEMPOTENT on ``event_id``: a redelivery returns the original turn's\n``message_id`` (``202``) and runs no second turn.\n\nThe answer is delivered by the TARGET route's door — a channel route texts the thread's\naddress, an api route POSTs the route's signed callback (a ``wait_seconds`` body field,\nclamped to ``sync_wait_max_seconds``, returns a finished turn's answer inline in the\n``200`` and suppresses the callback, but only while the client is still connected — a\nhung-up caller's answer falls to the callback or its terminal poll record). Default is\n``202 {message_id, thread_id}``.\n\nThis is a TRUSTED-integration door: an authorized writer may address ANY existing thread\nof the route by ``thread_id`` (a channel participant's included), so a deployment grants its\nwrite action to service principals, not to low-trust API keys.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}/events","href":"/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Run a structured event as a turn on an EXISTING thread of ``route_name``.\n\nThe thread must already exist: an event enters a conversation as a turn and never mints a\nthread. Address it by the ``address`` its listing shows or by its ``thread_id`` (exactly\none). The turn runs the route's TOOL target AS the route's execution key — an\nagent-target route is refused (``409``) since an event carries no rendered text. The\nevent is IDEMPOTENT on ``event_id``: a redelivery returns the original turn's\n``message_id`` (``202``) and runs no second turn.\n\nThe answer is delivered by the TARGET route's door — a channel route texts the thread's\naddress, an api route POSTs the route's signed callback (a ``wait_seconds`` body field,\nclamped to ``sync_wait_max_seconds``, returns a finished turn's answer inline in the\n``200`` and suppresses the callback, but only while the client is still connected — a\nhung-up caller's answer falls to the callback or its terminal poll record). Default is\n``202 {message_id, thread_id}``.\n\nThis is a TRUSTED-integration door: an authorized writer may address ANY existing thread\nof the route by ``thread_id`` (a channel participant's included), so a deployment grants its\nwrite action to service principals, not to low-trust API keys.","operationId":"post_api_conversations_route_name_events","parameters":["82683663-3daf-4ef8-a742-08845f3424ec"],"requestBody":"63f88b9e-9f4e-4899-9a21-389ddaabf81a","responses":{"200":"e019df17-7860-493d-99f7-7cbeeff105fb","202":"a3de0fe1-4b3f-4998-b9b0-c40fe2ad64c7","400":"47dadf55-0b65-46ca-842a-3943eb9eff7e","401":"365ce35b-402f-4d09-9a5c-7a00d9af7b64","404":"5c6110df-9bda-40d8-87ee-cb226308d8a6","409":"27aaeee5-844b-4b4e-b122-381ff4ebc913","429":"93336699-f948-4235-b26a-546c520331fd","501":"aaed1f20-eb39-4bc4-b9a7-c3e43798e55d","503":"003edc8f-156b-4aa0-aa6c-1cd821000ef7"},"security":["73b9d05b-21e5-4ac5-ae4b-4aea3ab7b7b8"],"summary":"Deliver a structured event to a conversation thread as a turn","tags":["conversations"],"method":"post","type":"path","servers":[],"path":"/api/conversations/{route_name}/events","baseUrlOptions":[],"title":"Deliver a structured event to a conversation thread as a turn","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"82683663-3daf-4ef8-a742-08845f3424ec":{"in":"path","name":"route_name","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"The inbound body of the event door ``POST /api/conversations/{route_name}/events``.\n\nAn :class:`ConversationEvent` addressed to an EXISTING thread by EXACTLY ONE (non-blank)\nof ``address`` (the thread's client address) or ``thread_id`` (the id the monitoring\nlisting exposes). ``wait_seconds`` bounds a sync-wait window exactly as\n:attr:`ConversationMessage.wait_seconds`. There is NO callback field — an event's answer\nis delivered against the target thread's route. Frozen.","properties":{"event":{"additionalProperties":false,"description":"A structured event delivered to an existing thread as a turn.\n\n``event_id`` (non-blank after trim, ≤ ``EVENT_ID_MAX_CHARS``) is the idempotency key;\n``kind`` is an identifier-like label matching ``EVENT_KIND_RE``; ``payload`` is opaque,\nuntrusted data bounded as pure transport by :func:`validate_bounded_object`. Frozen.","properties":{"event_id":{"title":"Event Id","type":"string","isRequired":true,"uniqueKey":"event.event_id","typeLabel":"string"},"kind":{"title":"Kind","type":"string","isRequired":true,"uniqueKey":"event.kind","typeLabel":"string"},"payload":{"additionalProperties":true,"title":"Payload","type":"object","uniqueKey":"event.payload","typeLabel":"Payload · object"}},"required":["event_id","kind"],"title":"ConversationEvent","type":"object","isRequired":true,"uniqueKey":"event","typeLabel":"ConversationEvent · object"},"address":{"oneOf":[{"type":"string","title":"Address","uniqueKey":"address.oneOf.0","typeLabel":"string"},{"type":"null","title":"Address","uniqueKey":"address.oneOf.1","typeLabel":"null"}],"uniqueKey":"address","typeLabel":"string | null"},"thread_id":{"oneOf":[{"type":"string","title":"Thread Id","uniqueKey":"thread_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Thread Id","uniqueKey":"thread_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"thread_id","typeLabel":"string | null"},"wait_seconds":{"default":0,"description":"Bounded sync-wait window (seconds); 0 = async 202. The door clamps to its runtime cap.","minimum":0,"title":"Wait Seconds","type":"integer","uniqueKey":"wait_seconds","typeLabel":"integer"}},"required":["event"],"title":"ConversationEventSubmission","type":"object","uniqueKey":"","typeLabel":"ConversationEventSubmission · object"},"examples":{"Example":{"title":"Example","value":{"event":{"event_id":"\u003cstring>","kind":"\u003cstring>","payload":{}},"address":"\u003cstring>","thread_id":"\u003cstring>","wait_seconds":0}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"e019df17-7860-493d-99f7-7cbeeff105fb":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"The ack a message/event submission returns: the accepted turn's ``message_id`` and ``thread_id``.\n\n``answer`` is present on every inline-waited turn that finished in time (a 200) — including a silent one,\nwhich carries the silent marker (status ``silent``, no answer text, dumped ``exclude_none``); it is\nabsent only on the default deferred 202, whose turn produced no outcome yet.","properties":{"message_id":{"title":"Message Id","type":"string","isRequired":true,"uniqueKey":"data.message_id","typeLabel":"string"},"thread_id":{"title":"Thread Id","type":"string","isRequired":true,"uniqueKey":"data.thread_id","typeLabel":"string"},"answer":{"oneOf":[{"type":"object","title":"ConversationAnswer","description":"The outcome of one conversation turn.\n\nThe body POSTed (HMAC-signed) to a ``door=api`` row's ``callback_url`` AND the bounded\nsync-wait payload.\n\n``message_id`` correlates it to the ``202``/``200`` the door returned. On\n``status=\"error\"`` the ``answer`` is generic client-safe text, never an internal\ndetail. On ``status=\"silent\"`` the turn produced no reply and ``answer`` is absent.\n\n``parts`` is the ordered list of :class:`AnswerPart` messages the turn produced when a\nsingle joined string would lose something — more than one message, or one message\ncarrying media/options/a template. It is order-significant; when it is present ``answer``\nequals the parts' NON-BLANK MESSAGE texts joined with ``\"\\n\\n\"`` (:func:`joined_answer_text`).\n``answer`` is the whole text, read by the consumers that take one string (api-door callbacks,\nsync waits, transcripts); ``parts`` is read by a consumer that delivers each part as its own\nmessage (with its media/options). A single PLAIN-TEXT answer carries\n``parts=None`` (the joined ``answer`` says everything); a richer or multi-message answer\ncarries the parts. An ALL-MEDIA answer (every part media-only) joins to the EMPTY string, so\non ``answered``/``error`` a blank ``answer`` is admissible ONLY when ``parts`` carry the\ncontent — the media rides ``parts``.\n\n``status=\"merged\"`` / ``status=\"superseded\"`` are ANSWERLESS overlap outcomes (no ``answer``,\nno ``parts``) that carry a ``successor_id``: the ``message_id`` of the turn that took this\nmessage's place — the turn that carried this message's text (``merged``) or the newer turn it\nwas dropped in favour of (``superseded``). ``successor_id`` is set EXACTLY on those two\noutcomes and ``None`` on every other. Frozen.","required":["message_id","thread_id","status"],"properties":{"message_id":{"minLength":1,"title":"Message Id","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.message_id","typeLabel":"string"},"status":{"enum":["answered","error","silent","merged","superseded"],"title":"Status","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.status","typeLabel":"enum\u003cstring>"},"thread_id":{"minLength":1,"title":"Thread Id","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.thread_id","typeLabel":"string"},"answer":{"oneOf":[{"type":"string","title":"Answer","uniqueKey":"data.answer.oneOf.0.answer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answer","uniqueKey":"data.answer.oneOf.0.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.answer","typeLabel":"string | null"},"parts":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One message of an ordered multi-message answer — the platform's rich part shape.\n\nIt mirrors :class:`ChannelNotification`'s CONTENT surface exactly (``message`` plus the\noptional ``media`` / ``location`` / ``template`` / ``options`` / ``sections`` / ``header``\n/ ``footer`` / ``schema`` richer-send forms and their validators), MINUS the per-delivery\nrouting fields (``recipient`` / ``sender_identity``) — those stay on the single delivery,\nnever per part. The delivery machine sends each part as its own ``ChannelNotification``,\nin order, chunking the ``message`` text at the channel width and carrying the part's\nricher forms alongside it, exactly as a single notification does today. Every\ncross-field rule (content-only blank message, ``options`` XOR ``sections``, ``schema``\nexcludes both, ``header``/``footer`` require a choice surface, ``template`` standalone) is\nthe SHARED :func:`~tai42_contract.channels.check_interactive_composition`, so an authored\npart and a delivered notification can never diverge.\n\nA part is a NEW authoring surface, so it is STRICT FROM BIRTH: unknown keys are refused\n(``extra=\"forbid\"``) rather than silently dropped. A tool route authors parts as a JSON\narray whose elements are each EITHER a plain string (shorthand for a text-only part) or a\npart object — both normalize to THIS one model. Frozen.\n\n``message`` mirrors :class:`ChannelNotification.message`'s blank-vs-media RULE: non-blank BY\nDEFAULT, EXCEPT it may be blank for a MEDIA-ONLY part — a caption-less image with no text\ncarrier. The admissible states are \"``message`` non-blank\" OR \"blank ``message`` WITH non-empty\n``media``\"; a blank ``message`` and no media has nothing to deliver and is refused. ``options``\nREQUIRE a non-blank ``message`` (a tappable choice needs a prompt), and a ``template`` rides a\nnon-blank ``message`` too — so a media-only part carries only ``media``. Unlike\n``ChannelNotification`` (always constructed in code), a part is authored as JSON where the\n``message`` key may be ABSENT, so it defaults to ``\"\"`` — a media-only part is just ``{\"media\": …}``.","properties":{"data":{"oneOf":[{"type":"object","title":"FormData","description":"Per-send data layered over a form's published schema for ONE send.\n\n``values`` prefills top-level properties — each entry keyed by property name,\nits value shown filled in and validated against that property's schema.\n``options`` supplies a per-send choice list for a property whose schema is a\nstring (or an array of strings), keyed by property name: the list REPLACES that\nproperty's ``enum`` for this send only (labels shown, values submitted). The\nmodel holds only the shape; the cross-check against the schema (unknown\nproperty, a value that fails its schema, options on a non-string property, an\nempty list) is done once by the interaction request. Frozen.","properties":{"options":{"additionalProperties":{"items":{"additionalProperties":false,"description":"One per-send choice for a form field. Frozen.\n\n``value`` is the string submitted as the answer, ``label`` (when set) is shown\nto the human in its place, and ``description`` (when set) is an OPTIONAL secondary\nline shown under ``label`` — a surface keeps a short label and moves the rest (a\ntime, a price) onto the second line. A per-send option list REPLACES a property's\nschema ``enum`` for ONE send — the published form is unchanged, so a variant needs\nno re-publish. The ``description`` carries content, so a surface whose control has\nno native second-line affordance draws it by that surface's own documented rule —\nnever silently drops it; a per-medium length cap is each channel's own.","properties":{"value":{"title":"Value","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].value","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label","typeLabel":"string | null"}},"required":["value"],"title":"FormOption","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX]","typeLabel":"FormOption · object"},"type":"array","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties","typeLabel":"FormOption · object[]"},"default":{},"title":"Options","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options","typeLabel":"Options · object"},"values":{"additionalProperties":true,"default":{},"title":"Values","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.values","typeLabel":"Values · object"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0","typeLabel":"FormData · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data","typeLabel":"FormData · object | null"},"footer":{"oneOf":[{"type":"string","title":"Footer","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Footer","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer","typeLabel":"string | null"},"form_tag":{"oneOf":[{"type":"string","title":"Form Tag","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag.oneOf.0","typeLabel":"string"},{"type":"null","title":"Form Tag","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag","typeLabel":"string | null"},"header":{"oneOf":[{"type":"object","title":"MediaItem","description":"One media item shown WITH a message — a display element, and inbound a participant's sent media.\n\n``kind`` selects how it renders: an ``image`` inline, a ``document``/``video``/``audio`` as\nthe matching file bubble, a ``link`` as a labelled anchor. ``url`` is the source. A file\nkind (``image``/``document``/``video``/``audio``) must be an absolute ``https`` URL, a\nsame-origin ``{MEDIA_ROUTE_PREFIX}{id}`` reference to media the skeleton serves by id, or an\nabsolute ``http(s)`` served reference of that same ``{MEDIA_ROUTE_PREFIX}{id}`` path a\nchannel send mints from ``public_base_url`` (remote file media is https-only: the inbox CSP\n``img-src`` admits ``https:``/``data:`` and same-origin but not ``http:``, so an ``http:``\nremote source would be an unrenderable record); ``image`` ADDITIONALLY admits an inline\n``data:image/*`` URI — that inline form is image-only, a ``data:`` URI on any other file\nkind is refused. A ``link`` must be an absolute ``http(s)`` URL (anchors are not governed by\n``img-src``; the human clicks through). A remote url names a host directly — an ASCII DNS\nname, dotted-quad IPv4, or bracketed IPv6 (IDN callers supply punycode); an embedded\n``user@`` credential form is rejected as it spoofs the authority — and is always a single\nline — raw whitespace and control/format characters are rejected. ``caption`` is the\naccessibility text — the image's alt text, a file's label, or the link's display label.\n``filename`` is the document's suggested display name; it is meaningful ONLY for a\n``document`` item and is refused on every other kind.","required":["kind","url"],"properties":{"kind":{"description":"How a media item renders: an inline image, a file bubble, or a labelled link.","enum":["image","link","document","video","audio"],"title":"MediaKind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0","typeLabel":"MediaItem · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header","typeLabel":"MediaItem · object | null"},"location":{"oneOf":[{"type":"object","title":"LocationElement","description":"A geographic point shared on a message — the one shape used BOTH ways.\n\nIt is an outbound place the sender shares and the inbound location a participant sent.\n``latitude``/``longitude`` are WGS84 decimal degrees, bounded to their valid ranges\n(latitude -90..90, longitude -180..180). ``name`` is an optional place label and ``address``\nan optional street address, each a single-line non-blank string within its cap when present\n(raw whitespace and control/format characters are rejected, as on a media url — an embedded\nnewline or bidi spoof would corrupt the rendered pin label). A channel that cannot render a\nmap renders the coordinates (and any name/address) as text. Frozen.","required":["latitude","longitude"],"properties":{"latitude":{"title":"Latitude","type":"number","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.latitude","typeLabel":"number"},"longitude":{"title":"Longitude","type":"number","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.longitude","typeLabel":"number"},"address":{"oneOf":[{"type":"string","title":"Address","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","title":"Address","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"LocationElement · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location","typeLabel":"LocationElement · object | null"},"media":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One media item shown WITH a message — a display element, and inbound a participant's sent media.\n\n``kind`` selects how it renders: an ``image`` inline, a ``document``/``video``/``audio`` as\nthe matching file bubble, a ``link`` as a labelled anchor. ``url`` is the source. A file\nkind (``image``/``document``/``video``/``audio``) must be an absolute ``https`` URL, a\nsame-origin ``{MEDIA_ROUTE_PREFIX}{id}`` reference to media the skeleton serves by id, or an\nabsolute ``http(s)`` served reference of that same ``{MEDIA_ROUTE_PREFIX}{id}`` path a\nchannel send mints from ``public_base_url`` (remote file media is https-only: the inbox CSP\n``img-src`` admits ``https:``/``data:`` and same-origin but not ``http:``, so an ``http:``\nremote source would be an unrenderable record); ``image`` ADDITIONALLY admits an inline\n``data:image/*`` URI — that inline form is image-only, a ``data:`` URI on any other file\nkind is refused. A ``link`` must be an absolute ``http(s)`` URL (anchors are not governed by\n``img-src``; the human clicks through). A remote url names a host directly — an ASCII DNS\nname, dotted-quad IPv4, or bracketed IPv6 (IDN callers supply punycode); an embedded\n``user@`` credential form is rejected as it spoofs the authority — and is always a single\nline — raw whitespace and control/format characters are rejected. ``caption`` is the\naccessibility text — the image's alt text, a file's label, or the link's display label.\n``filename`` is the document's suggested display name; it is meaningful ONLY for a\n``document`` item and is refused on every other kind.","properties":{"kind":{"description":"How a media item renders: an inline image, a file bubble, or a labelled link.","enum":["image","link","document","video","audio"],"title":"MediaKind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename","typeLabel":"string | null"}},"required":["kind","url"],"title":"MediaItem","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX]","typeLabel":"MediaItem · object"},"title":"Media","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0","typeLabel":"MediaItem · object[]"},{"type":"null","title":"Media","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media","typeLabel":"MediaItem · object[] | null"},"message":{"default":"","title":"Message","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].message","typeLabel":"string"},"options":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","title":"ReplyOption","description":"A tappable suggested reply.\n\nTapping SUBMITS ``text`` as the participant's next inbound message —\nthe quick-reply / list-row case, where the option's own text becomes the turn. ``description``\nis an OPTIONAL secondary line a sectioned-list row renders under its ``text``; a channel that\nrenders flat buttons (no descriptions) ignores it.\n\n``id`` is an OPTIONAL author-set stable identifier for the button/list row. When set, a channel\nsends it verbatim on the wire and the participant's tap echoes it back (a channel surfaces the echoed\nid to the inbound turn as opaque enrichment — e.g. Slack forwards it as ``params.reply_id``);\nwhen ``None`` the channel mints its own id. Bounded by the platform abuse bound\n``OPTION_ID_MAX_CHARS`` and a single-line non-blank label; a channel with a tighter id cap\nenforces it in its own code. Frozen.","required":["text"],"properties":{"text":{"title":"Text","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"ReplyOption · object"},{"type":"object","title":"LinkOption","description":"A tappable link action.\n\nTapping OPENS ``url`` (an absolute ``http(s)`` URL) in the human's\nbrowser — NO message is submitted, distinct from a :class:`ReplyOption`. ``label`` is the\nbutton text. The URL-button / call-to-action case. Frozen.","required":["label","url"],"properties":{"label":{"title":"Label","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.url","typeLabel":"string"},"kind":{"const":"link","default":"link","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"LinkOption · object"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX]","typeLabel":"ReplyOption · object | LinkOption · object"},"title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0","typeLabel":"(ReplyOption · object | LinkOption · object)[]"},{"type":"null","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options","typeLabel":"(ReplyOption · object | LinkOption · object)[] | null"},"pages":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One step of a stepped form. Frozen.\n\n``title`` heads the step. ``fields`` names the top-level properties collected on an\nINPUT page (``kind == \"input\"``, the default); a REVIEW page (``kind == \"review\"``)\ncarries NO input fields (a terminal/summary step) and so has an empty ``fields``.\n``display`` is the ordered list of :class:`DisplayBlock` shown on the page. Across a\nform's ``pages`` every property appears exactly once on the INPUT pages (the\ninteraction request enforces the coverage); absent ``pages`` means one page.\n\n``button_label`` is the text of the page's primary button — the one that advances from\nan input page or submits from the last — in the sender's own words and the end-user's\nlanguage; absent, the surface shows its own generic word. A page's primary button is\nlabelled HERE, on the page; the texts that are not a page's — the one that opens the form,\nthe one that cancels it, and every other platform-drawn word of the send — are the wording\ncatalogue's (``wording.form`` and its sibling chapters). The platform's word is the default\non every one of them.","properties":{"fields":{"items":{"type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].fields.items.[INDEX]","typeLabel":"string"},"title":"Fields","type":"array","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].fields","typeLabel":"string[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].title","typeLabel":"string"},"button_label":{"oneOf":[{"type":"string","title":"Button Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Button Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label","typeLabel":"string | null"},"display":{"default":[],"items":{"additionalProperties":false,"description":"One ordered display element shown on a form page beside its input fields. Frozen.\n\n``kind`` chooses the element: ``heading`` and ``body`` carry ``text``; ``image``\ncarries a ``src`` (its reference) and an optional ``alt`` (the text a surface that\ncannot draw the image shows instead). A block is either STATIC — its ``text``/``src``\nis given here — or declares a ``slot``: a name a form reaction's ``display`` update\nfills while the form is open (a computed total is a display slot). A static block\nrequires its content; a slotted block may omit it (the reaction supplies it). A\nblock carries only the content its ``kind`` allows (no ``src``/``alt`` on text, no\n``text`` on an image). Raises ``ValueError`` on any ill-formed combination.","properties":{"kind":{"enum":["heading","body","image"],"title":"Kind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"alt":{"oneOf":[{"type":"string","title":"Alt","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.0","typeLabel":"string"},{"type":"null","title":"Alt","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt","typeLabel":"string | null"},"slot":{"oneOf":[{"type":"string","title":"Slot","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.0","typeLabel":"string"},{"type":"null","title":"Slot","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot","typeLabel":"string | null"},"src":{"oneOf":[{"type":"string","title":"Src","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.0","typeLabel":"string"},{"type":"null","title":"Src","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text","typeLabel":"string | null"}},"required":["kind"],"title":"DisplayBlock","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX]","typeLabel":"DisplayBlock · object"},"title":"Display","type":"array","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display","typeLabel":"DisplayBlock · object[]"},"kind":{"default":"input","enum":["input","review"],"title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"}},"required":["title","fields"],"title":"FormPage","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX]","typeLabel":"FormPage · object"},"title":"Pages","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0","typeLabel":"FormPage · object[]"},{"type":"null","title":"Pages","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages","typeLabel":"FormPage · object[] | null"},"schema":{"oneOf":[{"type":"object","title":"Schema","additionalProperties":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema.oneOf.0","typeLabel":"Schema · object"},{"type":"null","title":"Schema","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema","typeLabel":"Schema · object | null"},"sections":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One titled section of a sectioned option list.\n\n``title`` is the section header; ``rows`` are\nits entries — a sectioned list holds :class:`ReplyOption` rows ONLY (a tapped row submits its\ntext; a link action is a button, never a list row). A present ``rows`` is non-empty. Frozen.","properties":{"rows":{"items":{"additionalProperties":false,"description":"A tappable suggested reply.\n\nTapping SUBMITS ``text`` as the participant's next inbound message —\nthe quick-reply / list-row case, where the option's own text becomes the turn. ``description``\nis an OPTIONAL secondary line a sectioned-list row renders under its ``text``; a channel that\nrenders flat buttons (no descriptions) ignores it.\n\n``id`` is an OPTIONAL author-set stable identifier for the button/list row. When set, a channel\nsends it verbatim on the wire and the participant's tap echoes it back (a channel surfaces the echoed\nid to the inbound turn as opaque enrichment — e.g. Slack forwards it as ``params.reply_id``);\nwhen ``None`` the channel mints its own id. Bounded by the platform abuse bound\n``OPTION_ID_MAX_CHARS`` and a single-line non-blank label; a channel with a tighter id cap\nenforces it in its own code. Frozen.","properties":{"text":{"title":"Text","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].kind","typeLabel":"string"}},"required":["text"],"title":"ReplyOption","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX]","typeLabel":"ReplyOption · object"},"title":"Rows","type":"array","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows","typeLabel":"ReplyOption · object[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].title","typeLabel":"string"}},"required":["title","rows"],"title":"OptionSection","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX]","typeLabel":"OptionSection · object"},"title":"Sections","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0","typeLabel":"OptionSection · object[]"},{"type":"null","title":"Sections","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections","typeLabel":"OptionSection · object[] | null"},"template":{"oneOf":[{"type":"object","title":"ChannelTemplate","description":"A pre-approved, named template a channel sends outside its freeform window.\n\nSome media only accept arbitrary text inside a bounded conversation window (a provider's\ncustomer-service window); outside it, the sole accepted send is an operator-authored,\npre-approved template referenced by ``name`` in an approved ``language`` locale — both\nrequired and non-blank.\n\n``parameters`` is the template's runtime arguments as an OPAQUE object: the platform\nthreads it UNOPENED (never looking inside it), and the channel that declares the\n``supports_template_notifications`` capability owns its shape — it validates ``parameters``\nagainst its OWN template-parameter schema through its OPTIONAL ``validate_template`` hook\n(see :class:`~tai42_contract.channels.Channel`) and maps it to its own send API in its own\ncode. A template with no runtime arguments carries no ``parameters``; a present\n``parameters`` is a non-empty dict.","required":["name","language"],"properties":{"language":{"title":"Language","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.language","typeLabel":"string"},"name":{"title":"Name","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.name","typeLabel":"string"},"parameters":{"oneOf":[{"type":"object","title":"Parameters","additionalProperties":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters.oneOf.0","typeLabel":"Parameters · object"},{"type":"null","title":"Parameters","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters","typeLabel":"Parameters · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0","typeLabel":"ChannelTemplate · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template","typeLabel":"ChannelTemplate · object | null"},"wording":{"oneOf":[{"type":"object","title":"Wording","description":"The one catalogue of a send's platform-drawn texts, for ONE send. Frozen, strict keys.\n\nEvery platform-drawn text of a question or a notification — a button, a heading, an input hint,\na line of the message, a sentence of an answer page, a screen-reader label, the sentence that\ntells the end user their answer was refused, a settled card's badge — carries the caller's\nwords, the platform's word as the default. ``wording`` is the catalogue of those words for ONE\nsend, in the end-user's language, grouped by what each word decorates: the form (``form``), the\nchoice list (``choice``), a question's answer controls and refusal sentences (``answer``), the\nlines of the delivery message (``lines``), the pages a question's link opens (``answer_page``),\nand in-flight and settled status (``status``). A page's primary button is the one text not here:\nit is on the page (``pages[].button_label``). Each member is drawn where a surface has that\ncontrol or sentence and is admitted only on a send that draws it (:data:`ADMISSION`); a surface\nwith no such control draws nothing for it. A set value is non-blank; an empty chapter names\nnothing and is refused; an unknown key is refused.","properties":{"answer":{"oneOf":[{"type":"object","title":"AnswerWording","description":"The caller's words for a non-form question's answer controls and refusal sentences. Frozen, strict keys.\n\n``open`` labels the control that opens the question's answer page; ``confirm`` labels its\naffirmative control; ``decline`` labels its negative control; ``submit`` labels the button that\nsends a typed or picked answer; ``reply_hint`` is the hint shown in an empty reply input.\n``rejected`` is the sentence drawn when an answer is refused and may be given again; its\nOPTIONAL ``{reason}`` token takes the door's reason by a plain substitution and is empty when\nthe door gave no reason it may show. ``rejected_final`` is the sentence drawn when a refused\nanswer also closes the question; it too takes an OPTIONAL ``{reason}``. Each is the sender's own\nwords, in the end-user's language; absent, the surface shows its own generic word. A set value\nis non-blank; ``rejected`` / ``rejected_final`` are bounded by\n:data:`REJECTION_NOTICE_MAX_CHARS`; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"confirm":{"oneOf":[{"type":"string","title":"Confirm","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm.oneOf.0","typeLabel":"string"},{"type":"null","title":"Confirm","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm","typeLabel":"string | null"},"decline":{"oneOf":[{"type":"string","title":"Decline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Decline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline","typeLabel":"string | null"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open","typeLabel":"string | null"},"rejected":{"oneOf":[{"type":"string","title":"Rejected","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected","typeLabel":"string | null"},"rejected_final":{"oneOf":[{"type":"string","title":"Rejected Final","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected Final","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0","typeLabel":"AnswerWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer","typeLabel":"AnswerWording · object | null"},"answer_page":{"oneOf":[{"type":"object","title":"AnswerPageWording","description":"The caller's words for the pages a question's link opens, for ONE send. Frozen, strict keys.\n\n``confirm`` is the confirm page's copy; ``done`` the already-answered page's; ``awaiting`` the\nreply-on-the-channel page's; ``submitted`` the form page's post-submit copy; ``form`` carries the\nform page's own validation/error sentences. Each is drawn where a surface has that page or\nsentence. An empty object names nothing and is refused; an unknown key is refused.","properties":{"awaiting":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting","typeLabel":"PageCopy · object | null"},"confirm":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm","typeLabel":"PageCopy · object | null"},"done":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done","typeLabel":"PageCopy · object | null"},"form":{"oneOf":[{"type":"object","title":"FormPageWording","description":"The caller's words for the form page's own sentences, for ONE send. Frozen, strict keys.\n\n``failed`` is the line when the send did not land; ``network_error`` is the line when the\nbrowser could not reach the server; ``choose_one`` is the validation line for a required\nmulti-choice left empty; ``date_unavailable`` is the validation line for a blocked date. Each\nis the sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"choose_one":{"oneOf":[{"type":"string","title":"Choose One","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choose One","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one","typeLabel":"string | null"},"date_unavailable":{"oneOf":[{"type":"string","title":"Date Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Date Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable","typeLabel":"string | null"},"failed":{"oneOf":[{"type":"string","title":"Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed","typeLabel":"string | null"},"network_error":{"oneOf":[{"type":"string","title":"Network Error","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.0","typeLabel":"string"},{"type":"null","title":"Network Error","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0","typeLabel":"FormPageWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form","typeLabel":"FormPageWording · object | null"},"submitted":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted","typeLabel":"PageCopy · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0","typeLabel":"AnswerPageWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page","typeLabel":"AnswerPageWording · object | null"},"choice":{"oneOf":[{"type":"object","title":"ChoiceWording","description":"The caller's words for a choice list, for ONE send. Frozen, strict keys.\n\n``label`` is the word on the control that presents the list (the button or control that opens\nit); ``reply_hint`` is the line under a list rendered as numbered text telling the end user how\nto reply; ``group_label`` is the accessible name of a flat group of option buttons. Each text\nis the sender's own words, in the end-user's language; absent, the surface shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"group_label":{"oneOf":[{"type":"string","title":"Group Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Group Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0","typeLabel":"ChoiceWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice","typeLabel":"ChoiceWording · object | null"},"form":{"oneOf":[{"type":"object","title":"FormWording","description":"The caller's words for a form's platform-drawn chrome and sentences, for ONE send. Frozen, strict keys.\n\n``title`` heads the form surface; ``open`` labels the button that opens the form; ``cancel``\nlabels its cancel/close; ``back`` labels the button that returns to the previous step of a\nstepped form; ``submit`` labels the terminal button of a form with no pages; ``review_empty``\nis the line the review step shows before anything is filled; ``error_line`` is the one line a\nsurface shows above a form it refused, in place of its own per-field summary; ``update_failed``\nis the sentence a surface shows when it could not update the form (a reaction failed or\nreturned something the surface cannot draw) and takes an OPTIONAL ``{reason}`` token, filled\nwith the reaction door's reason (``FormReactionError.reason``) and empty when the surface has\nnone; ``step_progress`` is the progress line a stepped form shows above its current step; it\nMUST contain ``{step}`` (the current step's number) and ``{steps}`` (the step count), each filled\nby a plain substitution; ``fields`` carries per-field words keyed by property name. Each text is\nthe sender's own words, in the end-user's language; absent, the surface shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"back":{"oneOf":[{"type":"string","title":"Back","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back.oneOf.0","typeLabel":"string"},{"type":"null","title":"Back","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back","typeLabel":"string | null"},"cancel":{"oneOf":[{"type":"string","title":"Cancel","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel.oneOf.0","typeLabel":"string"},{"type":"null","title":"Cancel","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel","typeLabel":"string | null"},"error_line":{"oneOf":[{"type":"string","title":"Error Line","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line.oneOf.0","typeLabel":"string"},{"type":"null","title":"Error Line","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line","typeLabel":"string | null"},"fields":{"additionalProperties":{"additionalProperties":false,"description":"The caller's words for one form field's platform-drawn controls. Frozen, strict keys.\n\n``choice_label`` is the placeholder of the field's picker (its empty-state prompt); ``invalid``\nis the sentence shown when the field's value does not have its declared shape (never a missing\nrequired value: that is ``required``); ``required`` is the sentence a surface shows when this\nfield's required value is missing (at the field or anywhere inside it). ``true_label`` /\n``false_label`` are the words a surface shows for a boolean field's true and false values, on\nits control and in its readback. ``length_hint`` is the hint drawn under a text control that has\na maximum length; it MUST contain ``{max}`` (the maximum, filled by a plain substitution).\n``add_item`` / ``remove_item`` / ``item_label`` / ``no_items`` are the words of a free-text list\nfield: ``add_item`` its add button, ``remove_item`` each item's remove button, ``item_label``\neach item's label, which MUST contain ``{n}`` (the item's number, a plain substitution), and\n``no_items`` the line shown while the list is empty. Each is the sender's own words, in the\nend-user's language; absent, the surface shows its own generic word (for ``invalid``, its own\nword for the failing shape). A set value is non-blank; an empty object names nothing and is\nrefused; an unknown key is refused.","properties":{"add_item":{"oneOf":[{"type":"string","title":"Add Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Add Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item","typeLabel":"string | null"},"choice_label":{"oneOf":[{"type":"string","title":"Choice Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choice Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label","typeLabel":"string | null"},"false_label":{"oneOf":[{"type":"string","title":"False Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"False Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label","typeLabel":"string | null"},"invalid":{"oneOf":[{"type":"string","title":"Invalid","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.0","typeLabel":"string"},{"type":"null","title":"Invalid","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid","typeLabel":"string | null"},"item_label":{"oneOf":[{"type":"string","title":"Item Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Item Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label","typeLabel":"string | null"},"length_hint":{"oneOf":[{"type":"string","title":"Length Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Length Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint","typeLabel":"string | null"},"no_items":{"oneOf":[{"type":"string","title":"No Items","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.0","typeLabel":"string"},{"type":"null","title":"No Items","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items","typeLabel":"string | null"},"remove_item":{"oneOf":[{"type":"string","title":"Remove Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Remove Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item","typeLabel":"string | null"},"required":{"oneOf":[{"type":"string","title":"Required","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.0","typeLabel":"string"},{"type":"null","title":"Required","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required","typeLabel":"string | null"},"true_label":{"oneOf":[{"type":"string","title":"True Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"True Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label","typeLabel":"string | null"}},"title":"FieldWording","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties","typeLabel":"FieldWording · object"},"default":{},"title":"Fields","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields","typeLabel":"Fields · object"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open","typeLabel":"string | null"},"review_empty":{"oneOf":[{"type":"string","title":"Review Empty","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty.oneOf.0","typeLabel":"string"},{"type":"null","title":"Review Empty","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty","typeLabel":"string | null"},"step_progress":{"oneOf":[{"type":"string","title":"Step Progress","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress.oneOf.0","typeLabel":"string"},{"type":"null","title":"Step Progress","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","title":"Title","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title.oneOf.0","typeLabel":"string"},{"type":"null","title":"Title","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title","typeLabel":"string | null"},"update_failed":{"oneOf":[{"type":"string","title":"Update Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Update Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0","typeLabel":"FormWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form","typeLabel":"FormWording · object | null"},"lines":{"oneOf":[{"type":"object","title":"LineWording","description":"The caller's words for the lines of a delivery message, for ONE send. Frozen, strict keys.\n\n``answer_link`` is the sentence carrying the tappable answer link and MUST contain the ``{url}``\ntoken (the channel fills it by a plain substitution); ``deadline`` names the deadline and MUST\ncontain ``{deadline}`` (the channel fills it with its own formatted instant); ``reply`` tells\nthe end user how to reply and carries no token; ``options`` lists the choices and MUST contain\n``{options}`` (the channel fills it with its own joined list). Each is the sender's own words,\nin the end-user's language; absent, the surface shows its own generic word. A set value is\nnon-blank; an empty object names nothing and is refused; an unknown key is refused.","properties":{"answer_link":{"oneOf":[{"type":"string","title":"Answer Link","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answer Link","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link","typeLabel":"string | null"},"deadline":{"oneOf":[{"type":"string","title":"Deadline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Deadline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline","typeLabel":"string | null"},"options":{"oneOf":[{"type":"string","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options.oneOf.0","typeLabel":"string"},{"type":"null","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options","typeLabel":"string | null"},"reply":{"oneOf":[{"type":"string","title":"Reply","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0","typeLabel":"LineWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines","typeLabel":"LineWording · object | null"},"status":{"oneOf":[{"type":"object","title":"StatusWording","description":"The caller's words for in-flight and settled status copy, for ONE send. Frozen, strict keys.\n\n``sending`` is the screen-reader label while a send is in flight; ``answered`` / ``expired`` /\n``closed`` are the badges once a question settles; ``sent`` is the badge after an ask-less form\nis submitted; ``unavailable`` is the line when a form's door no longer resolves; ``countdown``\ncarries the live-countdown words. Each is the sender's own words, in the end-user's language;\nabsent, the surface shows its own generic word. A set value is non-blank; an empty object names\nnothing and is refused; an unknown key is refused.","properties":{"answered":{"oneOf":[{"type":"string","title":"Answered","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answered","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered","typeLabel":"string | null"},"closed":{"oneOf":[{"type":"string","title":"Closed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Closed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed","typeLabel":"string | null"},"countdown":{"oneOf":[{"type":"object","title":"CountdownWording","description":"The caller's words for a live question card's countdown, for ONE send. Frozen, strict keys.\n\n``seconds_left`` is the visible plural line and MUST contain the ``{seconds}`` token (the card\nfills it with the number remaining); ``one_second_left`` is the visible singular line;\n``under_minute`` / ``under_half_minute`` / ``under_ten_seconds`` are the spoken lines at the\nthree thresholds. Each is the sender's own words, in the end-user's language; absent, the card\nshows its own generic word. A set value is non-blank; an empty object names nothing and is\nrefused; an unknown key is refused.","properties":{"one_second_left":{"oneOf":[{"type":"string","title":"One Second Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"One Second Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left","typeLabel":"string | null"},"seconds_left":{"oneOf":[{"type":"string","title":"Seconds Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"Seconds Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left","typeLabel":"string | null"},"under_half_minute":{"oneOf":[{"type":"string","title":"Under Half Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Half Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute","typeLabel":"string | null"},"under_minute":{"oneOf":[{"type":"string","title":"Under Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute","typeLabel":"string | null"},"under_ten_seconds":{"oneOf":[{"type":"string","title":"Under Ten Seconds","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Ten Seconds","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0","typeLabel":"CountdownWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown","typeLabel":"CountdownWording · object | null"},"expired":{"oneOf":[{"type":"string","title":"Expired","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired.oneOf.0","typeLabel":"string"},{"type":"null","title":"Expired","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired","typeLabel":"string | null"},"sending":{"oneOf":[{"type":"string","title":"Sending","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sending","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending","typeLabel":"string | null"},"sent":{"oneOf":[{"type":"string","title":"Sent","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sent","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent","typeLabel":"string | null"},"unavailable":{"oneOf":[{"type":"string","title":"Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0","typeLabel":"StatusWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status","typeLabel":"StatusWording · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0","typeLabel":"Wording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording","typeLabel":"Wording · object | null"}},"title":"AnswerPart","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX]","typeLabel":"AnswerPart · object"},"title":"Parts","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0","typeLabel":"AnswerPart · object[]"},{"type":"null","title":"Parts","uniqueKey":"data.answer.oneOf.0.parts.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts","typeLabel":"AnswerPart · object[] | null"},"successor_id":{"oneOf":[{"type":"string","title":"Successor Id","uniqueKey":"data.answer.oneOf.0.successor_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Successor Id","uniqueKey":"data.answer.oneOf.0.successor_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.successor_id","typeLabel":"string | null"}},"uniqueKey":"data.answer.oneOf.0","typeLabel":"ConversationAnswer · object"},{"type":"null","uniqueKey":"data.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer","typeLabel":"ConversationAnswer · object | null"}},"required":["message_id","thread_id"],"title":"ConversationTurnAck","type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"ConversationTurnAck · object"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"message_id":"\u003cstring>","thread_id":"\u003cstring>","answer":{"message_id":"\u003cstring>","status":"answered","thread_id":"\u003cstring>","answer":"\u003cstring>","parts":[{"data":{"options":{},"values":{}},"footer":"\u003cstring>","form_tag":"\u003cstring>","header":{"kind":"image","url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"},"location":{"latitude":123,"longitude":123,"address":"\u003cstring>","name":"\u003cstring>"},"media":[{"kind":"image","url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"}],"message":"","options":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"pages":[{"fields":["\u003cstring>"],"title":"\u003cstring>","button_label":"\u003cstring>","display":[],"kind":"input"}],"schema":{},"sections":[{"rows":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"title":"\u003cstring>"}],"template":{"language":"\u003cstring>","name":"\u003cstring>","parameters":{}},"wording":{"answer":{"confirm":"\u003cstring>","decline":"\u003cstring>","open":"\u003cstring>","rejected":"\u003cstring>","rejected_final":"\u003cstring>","reply_hint":"\u003cstring>","submit":"\u003cstring>"},"answer_page":{"awaiting":{"heading":"\u003cstring>","text":"\u003cstring>"},"confirm":{"heading":"\u003cstring>","text":"\u003cstring>"},"done":{"heading":"\u003cstring>","text":"\u003cstring>"},"form":{"choose_one":"\u003cstring>","date_unavailable":"\u003cstring>","failed":"\u003cstring>","network_error":"\u003cstring>"},"submitted":{"heading":"\u003cstring>","text":"\u003cstring>"}},"choice":{"group_label":"\u003cstring>","label":"\u003cstring>","reply_hint":"\u003cstring>"},"form":{"back":"\u003cstring>","cancel":"\u003cstring>","error_line":"\u003cstring>","fields":{},"open":"\u003cstring>","review_empty":"\u003cstring>","step_progress":"\u003cstring>","submit":"\u003cstring>","title":"\u003cstring>","update_failed":"\u003cstring>"},"lines":{"answer_link":"\u003cstring>","deadline":"\u003cstring>","options":"\u003cstring>","reply":"\u003cstring>"},"status":{"answered":"\u003cstring>","closed":"\u003cstring>","countdown":{"one_second_left":"\u003cstring>","seconds_left":"\u003cstring>","under_half_minute":"\u003cstring>","under_minute":"\u003cstring>","under_ten_seconds":"\u003cstring>"},"expired":"\u003cstring>","sending":"\u003cstring>","sent":"\u003cstring>","unavailable":"\u003cstring>"}}}],"successor_id":"\u003cstring>"}}}}},"exampleType":"generated"}},"description":"Success.","exampleType":"generated"},"a3de0fe1-4b3f-4998-b9b0-c40fe2ad64c7":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"The ack a message/event submission returns: the accepted turn's ``message_id`` and ``thread_id``.\n\n``answer`` is present on every inline-waited turn that finished in time (a 200) — including a silent one,\nwhich carries the silent marker (status ``silent``, no answer text, dumped ``exclude_none``); it is\nabsent only on the default deferred 202, whose turn produced no outcome yet.","properties":{"message_id":{"title":"Message Id","type":"string","isRequired":true,"uniqueKey":"data.message_id","typeLabel":"string"},"thread_id":{"title":"Thread Id","type":"string","isRequired":true,"uniqueKey":"data.thread_id","typeLabel":"string"},"answer":{"oneOf":[{"type":"object","title":"ConversationAnswer","description":"The outcome of one conversation turn.\n\nThe body POSTed (HMAC-signed) to a ``door=api`` row's ``callback_url`` AND the bounded\nsync-wait payload.\n\n``message_id`` correlates it to the ``202``/``200`` the door returned. On\n``status=\"error\"`` the ``answer`` is generic client-safe text, never an internal\ndetail. On ``status=\"silent\"`` the turn produced no reply and ``answer`` is absent.\n\n``parts`` is the ordered list of :class:`AnswerPart` messages the turn produced when a\nsingle joined string would lose something — more than one message, or one message\ncarrying media/options/a template. It is order-significant; when it is present ``answer``\nequals the parts' NON-BLANK MESSAGE texts joined with ``\"\\n\\n\"`` (:func:`joined_answer_text`).\n``answer`` is the whole text, read by the consumers that take one string (api-door callbacks,\nsync waits, transcripts); ``parts`` is read by a consumer that delivers each part as its own\nmessage (with its media/options). A single PLAIN-TEXT answer carries\n``parts=None`` (the joined ``answer`` says everything); a richer or multi-message answer\ncarries the parts. An ALL-MEDIA answer (every part media-only) joins to the EMPTY string, so\non ``answered``/``error`` a blank ``answer`` is admissible ONLY when ``parts`` carry the\ncontent — the media rides ``parts``.\n\n``status=\"merged\"`` / ``status=\"superseded\"`` are ANSWERLESS overlap outcomes (no ``answer``,\nno ``parts``) that carry a ``successor_id``: the ``message_id`` of the turn that took this\nmessage's place — the turn that carried this message's text (``merged``) or the newer turn it\nwas dropped in favour of (``superseded``). ``successor_id`` is set EXACTLY on those two\noutcomes and ``None`` on every other. Frozen.","required":["message_id","thread_id","status"],"properties":{"message_id":{"minLength":1,"title":"Message Id","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.message_id","typeLabel":"string"},"status":{"enum":["answered","error","silent","merged","superseded"],"title":"Status","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.status","typeLabel":"enum\u003cstring>"},"thread_id":{"minLength":1,"title":"Thread Id","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.thread_id","typeLabel":"string"},"answer":{"oneOf":[{"type":"string","title":"Answer","uniqueKey":"data.answer.oneOf.0.answer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answer","uniqueKey":"data.answer.oneOf.0.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.answer","typeLabel":"string | null"},"parts":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One message of an ordered multi-message answer — the platform's rich part shape.\n\nIt mirrors :class:`ChannelNotification`'s CONTENT surface exactly (``message`` plus the\noptional ``media`` / ``location`` / ``template`` / ``options`` / ``sections`` / ``header``\n/ ``footer`` / ``schema`` richer-send forms and their validators), MINUS the per-delivery\nrouting fields (``recipient`` / ``sender_identity``) — those stay on the single delivery,\nnever per part. The delivery machine sends each part as its own ``ChannelNotification``,\nin order, chunking the ``message`` text at the channel width and carrying the part's\nricher forms alongside it, exactly as a single notification does today. Every\ncross-field rule (content-only blank message, ``options`` XOR ``sections``, ``schema``\nexcludes both, ``header``/``footer`` require a choice surface, ``template`` standalone) is\nthe SHARED :func:`~tai42_contract.channels.check_interactive_composition`, so an authored\npart and a delivered notification can never diverge.\n\nA part is a NEW authoring surface, so it is STRICT FROM BIRTH: unknown keys are refused\n(``extra=\"forbid\"``) rather than silently dropped. A tool route authors parts as a JSON\narray whose elements are each EITHER a plain string (shorthand for a text-only part) or a\npart object — both normalize to THIS one model. Frozen.\n\n``message`` mirrors :class:`ChannelNotification.message`'s blank-vs-media RULE: non-blank BY\nDEFAULT, EXCEPT it may be blank for a MEDIA-ONLY part — a caption-less image with no text\ncarrier. The admissible states are \"``message`` non-blank\" OR \"blank ``message`` WITH non-empty\n``media``\"; a blank ``message`` and no media has nothing to deliver and is refused. ``options``\nREQUIRE a non-blank ``message`` (a tappable choice needs a prompt), and a ``template`` rides a\nnon-blank ``message`` too — so a media-only part carries only ``media``. Unlike\n``ChannelNotification`` (always constructed in code), a part is authored as JSON where the\n``message`` key may be ABSENT, so it defaults to ``\"\"`` — a media-only part is just ``{\"media\": …}``.","properties":{"data":{"oneOf":[{"type":"object","title":"FormData","description":"Per-send data layered over a form's published schema for ONE send.\n\n``values`` prefills top-level properties — each entry keyed by property name,\nits value shown filled in and validated against that property's schema.\n``options`` supplies a per-send choice list for a property whose schema is a\nstring (or an array of strings), keyed by property name: the list REPLACES that\nproperty's ``enum`` for this send only (labels shown, values submitted). The\nmodel holds only the shape; the cross-check against the schema (unknown\nproperty, a value that fails its schema, options on a non-string property, an\nempty list) is done once by the interaction request. Frozen.","properties":{"options":{"additionalProperties":{"items":{"additionalProperties":false,"description":"One per-send choice for a form field. Frozen.\n\n``value`` is the string submitted as the answer, ``label`` (when set) is shown\nto the human in its place, and ``description`` (when set) is an OPTIONAL secondary\nline shown under ``label`` — a surface keeps a short label and moves the rest (a\ntime, a price) onto the second line. A per-send option list REPLACES a property's\nschema ``enum`` for ONE send — the published form is unchanged, so a variant needs\nno re-publish. The ``description`` carries content, so a surface whose control has\nno native second-line affordance draws it by that surface's own documented rule —\nnever silently drops it; a per-medium length cap is each channel's own.","properties":{"value":{"title":"Value","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].value","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].description","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX].label","typeLabel":"string | null"}},"required":["value"],"title":"FormOption","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties.items.[INDEX]","typeLabel":"FormOption · object"},"type":"array","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options.additionalProperties","typeLabel":"FormOption · object[]"},"default":{},"title":"Options","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.options","typeLabel":"Options · object"},"values":{"additionalProperties":true,"default":{},"title":"Values","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0.values","typeLabel":"Values · object"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.0","typeLabel":"FormData · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].data","typeLabel":"FormData · object | null"},"footer":{"oneOf":[{"type":"string","title":"Footer","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Footer","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].footer","typeLabel":"string | null"},"form_tag":{"oneOf":[{"type":"string","title":"Form Tag","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag.oneOf.0","typeLabel":"string"},{"type":"null","title":"Form Tag","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].form_tag","typeLabel":"string | null"},"header":{"oneOf":[{"type":"object","title":"MediaItem","description":"One media item shown WITH a message — a display element, and inbound a participant's sent media.\n\n``kind`` selects how it renders: an ``image`` inline, a ``document``/``video``/``audio`` as\nthe matching file bubble, a ``link`` as a labelled anchor. ``url`` is the source. A file\nkind (``image``/``document``/``video``/``audio``) must be an absolute ``https`` URL, a\nsame-origin ``{MEDIA_ROUTE_PREFIX}{id}`` reference to media the skeleton serves by id, or an\nabsolute ``http(s)`` served reference of that same ``{MEDIA_ROUTE_PREFIX}{id}`` path a\nchannel send mints from ``public_base_url`` (remote file media is https-only: the inbox CSP\n``img-src`` admits ``https:``/``data:`` and same-origin but not ``http:``, so an ``http:``\nremote source would be an unrenderable record); ``image`` ADDITIONALLY admits an inline\n``data:image/*`` URI — that inline form is image-only, a ``data:`` URI on any other file\nkind is refused. A ``link`` must be an absolute ``http(s)`` URL (anchors are not governed by\n``img-src``; the human clicks through). A remote url names a host directly — an ASCII DNS\nname, dotted-quad IPv4, or bracketed IPv6 (IDN callers supply punycode); an embedded\n``user@`` credential form is rejected as it spoofs the authority — and is always a single\nline — raw whitespace and control/format characters are rejected. ``caption`` is the\naccessibility text — the image's alt text, a file's label, or the link's display label.\n``filename`` is the document's suggested display name; it is meaningful ONLY for a\n``document`` item and is refused on every other kind.","required":["kind","url"],"properties":{"kind":{"description":"How a media item renders: an inline image, a file bubble, or a labelled link.","enum":["image","link","document","video","audio"],"title":"MediaKind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0.filename","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.0","typeLabel":"MediaItem · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].header","typeLabel":"MediaItem · object | null"},"location":{"oneOf":[{"type":"object","title":"LocationElement","description":"A geographic point shared on a message — the one shape used BOTH ways.\n\nIt is an outbound place the sender shares and the inbound location a participant sent.\n``latitude``/``longitude`` are WGS84 decimal degrees, bounded to their valid ranges\n(latitude -90..90, longitude -180..180). ``name`` is an optional place label and ``address``\nan optional street address, each a single-line non-blank string within its cap when present\n(raw whitespace and control/format characters are rejected, as on a media url — an embedded\nnewline or bidi spoof would corrupt the rendered pin label). A channel that cannot render a\nmap renders the coordinates (and any name/address) as text. Frozen.","required":["latitude","longitude"],"properties":{"latitude":{"title":"Latitude","type":"number","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.latitude","typeLabel":"number"},"longitude":{"title":"Longitude","type":"number","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.longitude","typeLabel":"number"},"address":{"oneOf":[{"type":"string","title":"Address","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","title":"Address","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.address","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0.name","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"LocationElement · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].location","typeLabel":"LocationElement · object | null"},"media":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One media item shown WITH a message — a display element, and inbound a participant's sent media.\n\n``kind`` selects how it renders: an ``image`` inline, a ``document``/``video``/``audio`` as\nthe matching file bubble, a ``link`` as a labelled anchor. ``url`` is the source. A file\nkind (``image``/``document``/``video``/``audio``) must be an absolute ``https`` URL, a\nsame-origin ``{MEDIA_ROUTE_PREFIX}{id}`` reference to media the skeleton serves by id, or an\nabsolute ``http(s)`` served reference of that same ``{MEDIA_ROUTE_PREFIX}{id}`` path a\nchannel send mints from ``public_base_url`` (remote file media is https-only: the inbox CSP\n``img-src`` admits ``https:``/``data:`` and same-origin but not ``http:``, so an ``http:``\nremote source would be an unrenderable record); ``image`` ADDITIONALLY admits an inline\n``data:image/*`` URI — that inline form is image-only, a ``data:`` URI on any other file\nkind is refused. A ``link`` must be an absolute ``http(s)`` URL (anchors are not governed by\n``img-src``; the human clicks through). A remote url names a host directly — an ASCII DNS\nname, dotted-quad IPv4, or bracketed IPv6 (IDN callers supply punycode); an embedded\n``user@`` credential form is rejected as it spoofs the authority — and is always a single\nline — raw whitespace and control/format characters are rejected. ``caption`` is the\naccessibility text — the image's alt text, a file's label, or the link's display label.\n``filename`` is the document's suggested display name; it is meaningful ONLY for a\n``document`` item and is refused on every other kind.","properties":{"kind":{"description":"How a media item renders: an inline image, a file bubble, or a labelled link.","enum":["image","link","document","video","audio"],"title":"MediaKind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX].filename","typeLabel":"string | null"}},"required":["kind","url"],"title":"MediaItem","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0.items.[INDEX]","typeLabel":"MediaItem · object"},"title":"Media","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.0","typeLabel":"MediaItem · object[]"},{"type":"null","title":"Media","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].media","typeLabel":"MediaItem · object[] | null"},"message":{"default":"","title":"Message","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].message","typeLabel":"string"},"options":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","title":"ReplyOption","description":"A tappable suggested reply.\n\nTapping SUBMITS ``text`` as the participant's next inbound message —\nthe quick-reply / list-row case, where the option's own text becomes the turn. ``description``\nis an OPTIONAL secondary line a sectioned-list row renders under its ``text``; a channel that\nrenders flat buttons (no descriptions) ignores it.\n\n``id`` is an OPTIONAL author-set stable identifier for the button/list row. When set, a channel\nsends it verbatim on the wire and the participant's tap echoes it back (a channel surfaces the echoed\nid to the inbound turn as opaque enrichment — e.g. Slack forwards it as ``params.reply_id``);\nwhen ``None`` the channel mints its own id. Bounded by the platform abuse bound\n``OPTION_ID_MAX_CHARS`` and a single-line non-blank label; a channel with a tighter id cap\nenforces it in its own code. Frozen.","required":["text"],"properties":{"text":{"title":"Text","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"ReplyOption · object"},{"type":"object","title":"LinkOption","description":"A tappable link action.\n\nTapping OPENS ``url`` (an absolute ``http(s)`` URL) in the human's\nbrowser — NO message is submitted, distinct from a :class:`ReplyOption`. ``label`` is the\nbutton text. The URL-button / call-to-action case. Frozen.","required":["label","url"],"properties":{"label":{"title":"Label","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.url","typeLabel":"string"},"kind":{"const":"link","default":"link","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"LinkOption · object"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0.items.[INDEX]","typeLabel":"ReplyOption · object | LinkOption · object"},"title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.0","typeLabel":"(ReplyOption · object | LinkOption · object)[]"},{"type":"null","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].options","typeLabel":"(ReplyOption · object | LinkOption · object)[] | null"},"pages":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One step of a stepped form. Frozen.\n\n``title`` heads the step. ``fields`` names the top-level properties collected on an\nINPUT page (``kind == \"input\"``, the default); a REVIEW page (``kind == \"review\"``)\ncarries NO input fields (a terminal/summary step) and so has an empty ``fields``.\n``display`` is the ordered list of :class:`DisplayBlock` shown on the page. Across a\nform's ``pages`` every property appears exactly once on the INPUT pages (the\ninteraction request enforces the coverage); absent ``pages`` means one page.\n\n``button_label`` is the text of the page's primary button — the one that advances from\nan input page or submits from the last — in the sender's own words and the end-user's\nlanguage; absent, the surface shows its own generic word. A page's primary button is\nlabelled HERE, on the page; the texts that are not a page's — the one that opens the form,\nthe one that cancels it, and every other platform-drawn word of the send — are the wording\ncatalogue's (``wording.form`` and its sibling chapters). The platform's word is the default\non every one of them.","properties":{"fields":{"items":{"type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].fields.items.[INDEX]","typeLabel":"string"},"title":"Fields","type":"array","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].fields","typeLabel":"string[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].title","typeLabel":"string"},"button_label":{"oneOf":[{"type":"string","title":"Button Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Button Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].button_label","typeLabel":"string | null"},"display":{"default":[],"items":{"additionalProperties":false,"description":"One ordered display element shown on a form page beside its input fields. Frozen.\n\n``kind`` chooses the element: ``heading`` and ``body`` carry ``text``; ``image``\ncarries a ``src`` (its reference) and an optional ``alt`` (the text a surface that\ncannot draw the image shows instead). A block is either STATIC — its ``text``/``src``\nis given here — or declares a ``slot``: a name a form reaction's ``display`` update\nfills while the form is open (a computed total is a display slot). A static block\nrequires its content; a slotted block may omit it (the reaction supplies it). A\nblock carries only the content its ``kind`` allows (no ``src``/``alt`` on text, no\n``text`` on an image). Raises ``ValueError`` on any ill-formed combination.","properties":{"kind":{"enum":["heading","body","image"],"title":"Kind","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"alt":{"oneOf":[{"type":"string","title":"Alt","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.0","typeLabel":"string"},{"type":"null","title":"Alt","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt","typeLabel":"string | null"},"slot":{"oneOf":[{"type":"string","title":"Slot","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.0","typeLabel":"string"},{"type":"null","title":"Slot","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot","typeLabel":"string | null"},"src":{"oneOf":[{"type":"string","title":"Src","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.0","typeLabel":"string"},{"type":"null","title":"Src","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].src","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX].text","typeLabel":"string | null"}},"required":["kind"],"title":"DisplayBlock","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display.items.[INDEX]","typeLabel":"DisplayBlock · object"},"title":"Display","type":"array","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].display","typeLabel":"DisplayBlock · object[]"},"kind":{"default":"input","enum":["input","review"],"title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"}},"required":["title","fields"],"title":"FormPage","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0.items.[INDEX]","typeLabel":"FormPage · object"},"title":"Pages","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.0","typeLabel":"FormPage · object[]"},{"type":"null","title":"Pages","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].pages","typeLabel":"FormPage · object[] | null"},"schema":{"oneOf":[{"type":"object","title":"Schema","additionalProperties":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema.oneOf.0","typeLabel":"Schema · object"},{"type":"null","title":"Schema","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].schema","typeLabel":"Schema · object | null"},"sections":{"oneOf":[{"type":"array","items":{"additionalProperties":false,"description":"One titled section of a sectioned option list.\n\n``title`` is the section header; ``rows`` are\nits entries — a sectioned list holds :class:`ReplyOption` rows ONLY (a tapped row submits its\ntext; a link action is a button, never a list row). A present ``rows`` is non-empty. Frozen.","properties":{"rows":{"items":{"additionalProperties":false,"description":"A tappable suggested reply.\n\nTapping SUBMITS ``text`` as the participant's next inbound message —\nthe quick-reply / list-row case, where the option's own text becomes the turn. ``description``\nis an OPTIONAL secondary line a sectioned-list row renders under its ``text``; a channel that\nrenders flat buttons (no descriptions) ignores it.\n\n``id`` is an OPTIONAL author-set stable identifier for the button/list row. When set, a channel\nsends it verbatim on the wire and the participant's tap echoes it back (a channel surfaces the echoed\nid to the inbound turn as opaque enrichment — e.g. Slack forwards it as ``params.reply_id``);\nwhen ``None`` the channel mints its own id. Bounded by the platform abuse bound\n``OPTION_ID_MAX_CHARS`` and a single-line non-blank label; a channel with a tighter id cap\nenforces it in its own code. Frozen.","properties":{"text":{"title":"Text","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX].kind","typeLabel":"string"}},"required":["text"],"title":"ReplyOption","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows.items.[INDEX]","typeLabel":"ReplyOption · object"},"title":"Rows","type":"array","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].rows","typeLabel":"ReplyOption · object[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX].title","typeLabel":"string"}},"required":["title","rows"],"title":"OptionSection","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0.items.[INDEX]","typeLabel":"OptionSection · object"},"title":"Sections","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.0","typeLabel":"OptionSection · object[]"},{"type":"null","title":"Sections","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].sections","typeLabel":"OptionSection · object[] | null"},"template":{"oneOf":[{"type":"object","title":"ChannelTemplate","description":"A pre-approved, named template a channel sends outside its freeform window.\n\nSome media only accept arbitrary text inside a bounded conversation window (a provider's\ncustomer-service window); outside it, the sole accepted send is an operator-authored,\npre-approved template referenced by ``name`` in an approved ``language`` locale — both\nrequired and non-blank.\n\n``parameters`` is the template's runtime arguments as an OPAQUE object: the platform\nthreads it UNOPENED (never looking inside it), and the channel that declares the\n``supports_template_notifications`` capability owns its shape — it validates ``parameters``\nagainst its OWN template-parameter schema through its OPTIONAL ``validate_template`` hook\n(see :class:`~tai42_contract.channels.Channel`) and maps it to its own send API in its own\ncode. A template with no runtime arguments carries no ``parameters``; a present\n``parameters`` is a non-empty dict.","required":["name","language"],"properties":{"language":{"title":"Language","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.language","typeLabel":"string"},"name":{"title":"Name","type":"string","isRequired":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.name","typeLabel":"string"},"parameters":{"oneOf":[{"type":"object","title":"Parameters","additionalProperties":true,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters.oneOf.0","typeLabel":"Parameters · object"},{"type":"null","title":"Parameters","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0.parameters","typeLabel":"Parameters · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.0","typeLabel":"ChannelTemplate · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].template","typeLabel":"ChannelTemplate · object | null"},"wording":{"oneOf":[{"type":"object","title":"Wording","description":"The one catalogue of a send's platform-drawn texts, for ONE send. Frozen, strict keys.\n\nEvery platform-drawn text of a question or a notification — a button, a heading, an input hint,\na line of the message, a sentence of an answer page, a screen-reader label, the sentence that\ntells the end user their answer was refused, a settled card's badge — carries the caller's\nwords, the platform's word as the default. ``wording`` is the catalogue of those words for ONE\nsend, in the end-user's language, grouped by what each word decorates: the form (``form``), the\nchoice list (``choice``), a question's answer controls and refusal sentences (``answer``), the\nlines of the delivery message (``lines``), the pages a question's link opens (``answer_page``),\nand in-flight and settled status (``status``). A page's primary button is the one text not here:\nit is on the page (``pages[].button_label``). Each member is drawn where a surface has that\ncontrol or sentence and is admitted only on a send that draws it (:data:`ADMISSION`); a surface\nwith no such control draws nothing for it. A set value is non-blank; an empty chapter names\nnothing and is refused; an unknown key is refused.","properties":{"answer":{"oneOf":[{"type":"object","title":"AnswerWording","description":"The caller's words for a non-form question's answer controls and refusal sentences. Frozen, strict keys.\n\n``open`` labels the control that opens the question's answer page; ``confirm`` labels its\naffirmative control; ``decline`` labels its negative control; ``submit`` labels the button that\nsends a typed or picked answer; ``reply_hint`` is the hint shown in an empty reply input.\n``rejected`` is the sentence drawn when an answer is refused and may be given again; its\nOPTIONAL ``{reason}`` token takes the door's reason by a plain substitution and is empty when\nthe door gave no reason it may show. ``rejected_final`` is the sentence drawn when a refused\nanswer also closes the question; it too takes an OPTIONAL ``{reason}``. Each is the sender's own\nwords, in the end-user's language; absent, the surface shows its own generic word. A set value\nis non-blank; ``rejected`` / ``rejected_final`` are bounded by\n:data:`REJECTION_NOTICE_MAX_CHARS`; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"confirm":{"oneOf":[{"type":"string","title":"Confirm","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm.oneOf.0","typeLabel":"string"},{"type":"null","title":"Confirm","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.confirm","typeLabel":"string | null"},"decline":{"oneOf":[{"type":"string","title":"Decline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Decline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.decline","typeLabel":"string | null"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.open","typeLabel":"string | null"},"rejected":{"oneOf":[{"type":"string","title":"Rejected","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected","typeLabel":"string | null"},"rejected_final":{"oneOf":[{"type":"string","title":"Rejected Final","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected Final","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.rejected_final","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.reply_hint","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0.submit","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.0","typeLabel":"AnswerWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer","typeLabel":"AnswerWording · object | null"},"answer_page":{"oneOf":[{"type":"object","title":"AnswerPageWording","description":"The caller's words for the pages a question's link opens, for ONE send. Frozen, strict keys.\n\n``confirm`` is the confirm page's copy; ``done`` the already-answered page's; ``awaiting`` the\nreply-on-the-channel page's; ``submitted`` the form page's post-submit copy; ``form`` carries the\nform page's own validation/error sentences. Each is drawn where a surface has that page or\nsentence. An empty object names nothing and is refused; an unknown key is refused.","properties":{"awaiting":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.awaiting","typeLabel":"PageCopy · object | null"},"confirm":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.confirm","typeLabel":"PageCopy · object | null"},"done":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.done","typeLabel":"PageCopy · object | null"},"form":{"oneOf":[{"type":"object","title":"FormPageWording","description":"The caller's words for the form page's own sentences, for ONE send. Frozen, strict keys.\n\n``failed`` is the line when the send did not land; ``network_error`` is the line when the\nbrowser could not reach the server; ``choose_one`` is the validation line for a required\nmulti-choice left empty; ``date_unavailable`` is the validation line for a blocked date. Each\nis the sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"choose_one":{"oneOf":[{"type":"string","title":"Choose One","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choose One","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one","typeLabel":"string | null"},"date_unavailable":{"oneOf":[{"type":"string","title":"Date Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Date Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable","typeLabel":"string | null"},"failed":{"oneOf":[{"type":"string","title":"Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed","typeLabel":"string | null"},"network_error":{"oneOf":[{"type":"string","title":"Network Error","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.0","typeLabel":"string"},{"type":"null","title":"Network Error","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0","typeLabel":"FormPageWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.form","typeLabel":"FormPageWording · object | null"},"submitted":{"oneOf":[{"type":"object","title":"PageCopy","description":"The heading and sentence of one platform-drawn answer page. Frozen, strict keys.\n\n``heading`` is the page's ``\u003ctitle>`` and ``\u003ch1>``; ``text`` is its one sentence. Each is\nthe sender's own words, in the end-user's language; absent, the page shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key\nis refused.","properties":{"heading":{"oneOf":[{"type":"string","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0.submitted","typeLabel":"PageCopy · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.0","typeLabel":"AnswerPageWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.answer_page","typeLabel":"AnswerPageWording · object | null"},"choice":{"oneOf":[{"type":"object","title":"ChoiceWording","description":"The caller's words for a choice list, for ONE send. Frozen, strict keys.\n\n``label`` is the word on the control that presents the list (the button or control that opens\nit); ``reply_hint`` is the line under a list rendered as numbered text telling the end user how\nto reply; ``group_label`` is the accessible name of a flat group of option buttons. Each text\nis the sender's own words, in the end-user's language; absent, the surface shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"group_label":{"oneOf":[{"type":"string","title":"Group Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Group Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.group_label","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.label","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0.reply_hint","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.0","typeLabel":"ChoiceWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.choice","typeLabel":"ChoiceWording · object | null"},"form":{"oneOf":[{"type":"object","title":"FormWording","description":"The caller's words for a form's platform-drawn chrome and sentences, for ONE send. Frozen, strict keys.\n\n``title`` heads the form surface; ``open`` labels the button that opens the form; ``cancel``\nlabels its cancel/close; ``back`` labels the button that returns to the previous step of a\nstepped form; ``submit`` labels the terminal button of a form with no pages; ``review_empty``\nis the line the review step shows before anything is filled; ``error_line`` is the one line a\nsurface shows above a form it refused, in place of its own per-field summary; ``update_failed``\nis the sentence a surface shows when it could not update the form (a reaction failed or\nreturned something the surface cannot draw) and takes an OPTIONAL ``{reason}`` token, filled\nwith the reaction door's reason (``FormReactionError.reason``) and empty when the surface has\nnone; ``step_progress`` is the progress line a stepped form shows above its current step; it\nMUST contain ``{step}`` (the current step's number) and ``{steps}`` (the step count), each filled\nby a plain substitution; ``fields`` carries per-field words keyed by property name. Each text is\nthe sender's own words, in the end-user's language; absent, the surface shows its own generic\nword. A set value is non-blank; an empty object names nothing and is refused; an unknown key is\nrefused.","properties":{"back":{"oneOf":[{"type":"string","title":"Back","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back.oneOf.0","typeLabel":"string"},{"type":"null","title":"Back","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.back","typeLabel":"string | null"},"cancel":{"oneOf":[{"type":"string","title":"Cancel","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel.oneOf.0","typeLabel":"string"},{"type":"null","title":"Cancel","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.cancel","typeLabel":"string | null"},"error_line":{"oneOf":[{"type":"string","title":"Error Line","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line.oneOf.0","typeLabel":"string"},{"type":"null","title":"Error Line","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.error_line","typeLabel":"string | null"},"fields":{"additionalProperties":{"additionalProperties":false,"description":"The caller's words for one form field's platform-drawn controls. Frozen, strict keys.\n\n``choice_label`` is the placeholder of the field's picker (its empty-state prompt); ``invalid``\nis the sentence shown when the field's value does not have its declared shape (never a missing\nrequired value: that is ``required``); ``required`` is the sentence a surface shows when this\nfield's required value is missing (at the field or anywhere inside it). ``true_label`` /\n``false_label`` are the words a surface shows for a boolean field's true and false values, on\nits control and in its readback. ``length_hint`` is the hint drawn under a text control that has\na maximum length; it MUST contain ``{max}`` (the maximum, filled by a plain substitution).\n``add_item`` / ``remove_item`` / ``item_label`` / ``no_items`` are the words of a free-text list\nfield: ``add_item`` its add button, ``remove_item`` each item's remove button, ``item_label``\neach item's label, which MUST contain ``{n}`` (the item's number, a plain substitution), and\n``no_items`` the line shown while the list is empty. Each is the sender's own words, in the\nend-user's language; absent, the surface shows its own generic word (for ``invalid``, its own\nword for the failing shape). A set value is non-blank; an empty object names nothing and is\nrefused; an unknown key is refused.","properties":{"add_item":{"oneOf":[{"type":"string","title":"Add Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Add Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item","typeLabel":"string | null"},"choice_label":{"oneOf":[{"type":"string","title":"Choice Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choice Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label","typeLabel":"string | null"},"false_label":{"oneOf":[{"type":"string","title":"False Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"False Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label","typeLabel":"string | null"},"invalid":{"oneOf":[{"type":"string","title":"Invalid","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.0","typeLabel":"string"},{"type":"null","title":"Invalid","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid","typeLabel":"string | null"},"item_label":{"oneOf":[{"type":"string","title":"Item Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Item Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label","typeLabel":"string | null"},"length_hint":{"oneOf":[{"type":"string","title":"Length Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Length Hint","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint","typeLabel":"string | null"},"no_items":{"oneOf":[{"type":"string","title":"No Items","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.0","typeLabel":"string"},{"type":"null","title":"No Items","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items","typeLabel":"string | null"},"remove_item":{"oneOf":[{"type":"string","title":"Remove Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Remove Item","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item","typeLabel":"string | null"},"required":{"oneOf":[{"type":"string","title":"Required","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.0","typeLabel":"string"},{"type":"null","title":"Required","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required","typeLabel":"string | null"},"true_label":{"oneOf":[{"type":"string","title":"True Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"True Label","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label","typeLabel":"string | null"}},"title":"FieldWording","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields.additionalProperties","typeLabel":"FieldWording · object"},"default":{},"title":"Fields","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.fields","typeLabel":"Fields · object"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.open","typeLabel":"string | null"},"review_empty":{"oneOf":[{"type":"string","title":"Review Empty","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty.oneOf.0","typeLabel":"string"},{"type":"null","title":"Review Empty","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.review_empty","typeLabel":"string | null"},"step_progress":{"oneOf":[{"type":"string","title":"Step Progress","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress.oneOf.0","typeLabel":"string"},{"type":"null","title":"Step Progress","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.step_progress","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.submit","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","title":"Title","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title.oneOf.0","typeLabel":"string"},{"type":"null","title":"Title","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.title","typeLabel":"string | null"},"update_failed":{"oneOf":[{"type":"string","title":"Update Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Update Failed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0.update_failed","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.0","typeLabel":"FormWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.form","typeLabel":"FormWording · object | null"},"lines":{"oneOf":[{"type":"object","title":"LineWording","description":"The caller's words for the lines of a delivery message, for ONE send. Frozen, strict keys.\n\n``answer_link`` is the sentence carrying the tappable answer link and MUST contain the ``{url}``\ntoken (the channel fills it by a plain substitution); ``deadline`` names the deadline and MUST\ncontain ``{deadline}`` (the channel fills it with its own formatted instant); ``reply`` tells\nthe end user how to reply and carries no token; ``options`` lists the choices and MUST contain\n``{options}`` (the channel fills it with its own joined list). Each is the sender's own words,\nin the end-user's language; absent, the surface shows its own generic word. A set value is\nnon-blank; an empty object names nothing and is refused; an unknown key is refused.","properties":{"answer_link":{"oneOf":[{"type":"string","title":"Answer Link","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answer Link","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.answer_link","typeLabel":"string | null"},"deadline":{"oneOf":[{"type":"string","title":"Deadline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Deadline","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.deadline","typeLabel":"string | null"},"options":{"oneOf":[{"type":"string","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options.oneOf.0","typeLabel":"string"},{"type":"null","title":"Options","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.options","typeLabel":"string | null"},"reply":{"oneOf":[{"type":"string","title":"Reply","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0.reply","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.0","typeLabel":"LineWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.lines","typeLabel":"LineWording · object | null"},"status":{"oneOf":[{"type":"object","title":"StatusWording","description":"The caller's words for in-flight and settled status copy, for ONE send. Frozen, strict keys.\n\n``sending`` is the screen-reader label while a send is in flight; ``answered`` / ``expired`` /\n``closed`` are the badges once a question settles; ``sent`` is the badge after an ask-less form\nis submitted; ``unavailable`` is the line when a form's door no longer resolves; ``countdown``\ncarries the live-countdown words. Each is the sender's own words, in the end-user's language;\nabsent, the surface shows its own generic word. A set value is non-blank; an empty object names\nnothing and is refused; an unknown key is refused.","properties":{"answered":{"oneOf":[{"type":"string","title":"Answered","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answered","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.answered","typeLabel":"string | null"},"closed":{"oneOf":[{"type":"string","title":"Closed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Closed","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.closed","typeLabel":"string | null"},"countdown":{"oneOf":[{"type":"object","title":"CountdownWording","description":"The caller's words for a live question card's countdown, for ONE send. Frozen, strict keys.\n\n``seconds_left`` is the visible plural line and MUST contain the ``{seconds}`` token (the card\nfills it with the number remaining); ``one_second_left`` is the visible singular line;\n``under_minute`` / ``under_half_minute`` / ``under_ten_seconds`` are the spoken lines at the\nthree thresholds. Each is the sender's own words, in the end-user's language; absent, the card\nshows its own generic word. A set value is non-blank; an empty object names nothing and is\nrefused; an unknown key is refused.","properties":{"one_second_left":{"oneOf":[{"type":"string","title":"One Second Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"One Second Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left","typeLabel":"string | null"},"seconds_left":{"oneOf":[{"type":"string","title":"Seconds Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"Seconds Left","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left","typeLabel":"string | null"},"under_half_minute":{"oneOf":[{"type":"string","title":"Under Half Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Half Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute","typeLabel":"string | null"},"under_minute":{"oneOf":[{"type":"string","title":"Under Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Minute","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute","typeLabel":"string | null"},"under_ten_seconds":{"oneOf":[{"type":"string","title":"Under Ten Seconds","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Ten Seconds","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.0","typeLabel":"CountdownWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.countdown","typeLabel":"CountdownWording · object | null"},"expired":{"oneOf":[{"type":"string","title":"Expired","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired.oneOf.0","typeLabel":"string"},{"type":"null","title":"Expired","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.expired","typeLabel":"string | null"},"sending":{"oneOf":[{"type":"string","title":"Sending","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sending","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sending","typeLabel":"string | null"},"sent":{"oneOf":[{"type":"string","title":"Sent","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sent","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.sent","typeLabel":"string | null"},"unavailable":{"oneOf":[{"type":"string","title":"Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Unavailable","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0.unavailable","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.0","typeLabel":"StatusWording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0.status","typeLabel":"StatusWording · object | null"}},"additionalProperties":false,"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.0","typeLabel":"Wording · object"},{"type":"null","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX].wording","typeLabel":"Wording · object | null"}},"title":"AnswerPart","type":"object","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0.items.[INDEX]","typeLabel":"AnswerPart · object"},"title":"Parts","uniqueKey":"data.answer.oneOf.0.parts.oneOf.0","typeLabel":"AnswerPart · object[]"},{"type":"null","title":"Parts","uniqueKey":"data.answer.oneOf.0.parts.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.parts","typeLabel":"AnswerPart · object[] | null"},"successor_id":{"oneOf":[{"type":"string","title":"Successor Id","uniqueKey":"data.answer.oneOf.0.successor_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Successor Id","uniqueKey":"data.answer.oneOf.0.successor_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer.oneOf.0.successor_id","typeLabel":"string | null"}},"uniqueKey":"data.answer.oneOf.0","typeLabel":"ConversationAnswer · object"},{"type":"null","uniqueKey":"data.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.answer","typeLabel":"ConversationAnswer · object | null"}},"required":["message_id","thread_id"],"title":"ConversationTurnAck","type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"ConversationTurnAck · object"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"message_id":"\u003cstring>","thread_id":"\u003cstring>","answer":{"message_id":"\u003cstring>","status":"answered","thread_id":"\u003cstring>","answer":"\u003cstring>","parts":[{"data":{"options":{},"values":{}},"footer":"\u003cstring>","form_tag":"\u003cstring>","header":{"kind":"image","url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"},"location":{"latitude":123,"longitude":123,"address":"\u003cstring>","name":"\u003cstring>"},"media":[{"kind":"image","url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"}],"message":"","options":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"pages":[{"fields":["\u003cstring>"],"title":"\u003cstring>","button_label":"\u003cstring>","display":[],"kind":"input"}],"schema":{},"sections":[{"rows":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"title":"\u003cstring>"}],"template":{"language":"\u003cstring>","name":"\u003cstring>","parameters":{}},"wording":{"answer":{"confirm":"\u003cstring>","decline":"\u003cstring>","open":"\u003cstring>","rejected":"\u003cstring>","rejected_final":"\u003cstring>","reply_hint":"\u003cstring>","submit":"\u003cstring>"},"answer_page":{"awaiting":{"heading":"\u003cstring>","text":"\u003cstring>"},"confirm":{"heading":"\u003cstring>","text":"\u003cstring>"},"done":{"heading":"\u003cstring>","text":"\u003cstring>"},"form":{"choose_one":"\u003cstring>","date_unavailable":"\u003cstring>","failed":"\u003cstring>","network_error":"\u003cstring>"},"submitted":{"heading":"\u003cstring>","text":"\u003cstring>"}},"choice":{"group_label":"\u003cstring>","label":"\u003cstring>","reply_hint":"\u003cstring>"},"form":{"back":"\u003cstring>","cancel":"\u003cstring>","error_line":"\u003cstring>","fields":{},"open":"\u003cstring>","review_empty":"\u003cstring>","step_progress":"\u003cstring>","submit":"\u003cstring>","title":"\u003cstring>","update_failed":"\u003cstring>"},"lines":{"answer_link":"\u003cstring>","deadline":"\u003cstring>","options":"\u003cstring>","reply":"\u003cstring>"},"status":{"answered":"\u003cstring>","closed":"\u003cstring>","countdown":{"one_second_left":"\u003cstring>","seconds_left":"\u003cstring>","under_half_minute":"\u003cstring>","under_minute":"\u003cstring>","under_ten_seconds":"\u003cstring>"},"expired":"\u003cstring>","sending":"\u003cstring>","sent":"\u003cstring>","unavailable":"\u003cstring>"}}}],"successor_id":"\u003cstring>"}}}}},"exampleType":"generated"}},"description":"Success.","exampleType":"generated"},"47dadf55-0b65-46ca-842a-3943eb9eff7e":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Malformed request.","exampleType":"generated"},"365ce35b-402f-4d09-9a5c-7a00d9af7b64":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Missing or invalid api key.","exampleType":"generated"},"5c6110df-9bda-40d8-87ee-cb226308d8a6":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Resource not found.","exampleType":"generated"},"27aaeee5-844b-4b4e-b122-381ff4ebc913":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Conflict with the current resource state.","exampleType":"generated"},"93336699-f948-4235-b26a-546c520331fd":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Error.","exampleType":"generated"},"aaed1f20-eb39-4bc4-b9a7-c3e43798e55d":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"code","typeLabel":"string"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Error.","exampleType":"generated"},"003edc8f-156b-4aa0-aa6c-1cd821000ef7":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error","reloading"],"properties":{"error":{"const":"reloading — the server is applying a config reload; retry shortly","type":"string","isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"string"},"reloading":{"const":true,"type":"boolean","isRequired":true,"uniqueKey":"oneOf.0.reloading","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"string"},"code":{"description":"Stable machine-readable reason a client keys a dedicated error state on, present on refusals that opt in (e.g. a 501 not-configured refusal). Optional: absent when the error carries only a human-readable message.","type":"string","uniqueKey":"oneOf.1.code","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"reloading — the server is applying a config reload; retry shortly","reloading":true}}},"exampleType":"generated"}},"description":"The server is applying a config reload, or a dependency this route needs is temporarily unavailable; retry shortly.","headers":{"Retry-After":{"description":"Seconds to wait before retrying; carried by the reloading answer.","schema":{"type":"integer"}}},"exampleType":"generated"}},"security":{"73b9d05b-21e5-4ac5-ae4b-4aea3ab7b7b8":{"ApiKeyAuth":{"in":"header","name":"x-api-key","type":"apiKey","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{},"processedSecurityOptions":[{"schemes":[{"scheme":{"in":"header","name":"x-api-key","type":"apiKey","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"x-api-key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"x-api-key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"openapi.json"},"subdomain":"tai42","siteName":"TAI42","title":"TAI42 — the OS for AI tools","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-05T00:56:35.392Z","originalFileLocation":"api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Run a structured event as a turn on an EXISTING thread of route_name. The thread must already exist: an event enters a conversation as a turn and never mints a thread. Address it by the address its listing shows or by its thread_id (exactly one). The turn runs the route\u0026#x27;s TOOL target AS the route\u0026#x27;s execution key — an agent-target route is refused (409) since an event carries no rendered text. The event is IDEMPOTENT on event_id: a redelivery returns the original turn\u0026#x27;s message_id (202) and runs no second turn. The answer is delivered by the TARGET route\u0026#x27;s door — a channel route texts the thread\u0026#x27;s address, an api route POSTs the route\u0026#x27;s signed callback (a wait_seconds body field, clamped to sync_wait_max_seconds, returns a finished turn\u0026#x27;s answer inline in the 200 and suppresses the callback, but only while the client is still connected — a hung-up caller\u0026#x27;s answer falls to the callback or its terminal poll record). Default is 202 {message_id, thread_id}. This is a TRUSTED-integration door: an authorized writer may address ANY existing thread of the route by thread_id (a channel participant\u0026#x27;s included), so a deployment grants its write action to service principals, not to low-trust API keys.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TAI42\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"TAI42 — the OS for AI tools\">\u003cmeta data-mint-head property=\"og:description\" content=\"An open-source runtime for MCP tools, agents, and workflows.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TAI42\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tai42.mintlify.app/images/og-image.svg\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"TAI42 — the OS for AI tools\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"An open-source runtime for MCP tools, agents, and workflows.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tai42.mintlify.app/images/og-image.svg\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TAI42\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#DC143C\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tai42.ai/#organization\",\"name\":\"TAI42\",\"url\":\"https://docs.tai42.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/light.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=2140f77615492c689d62fcb3a5df2d31\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tai42.ai#website\",\"name\":\"TAI42\",\"url\":\"https://docs.tai42.ai\",\"publisher\":{\"@id\":\"https://docs.tai42.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn#webpage\",\"url\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn\",\"name\":\"Deliver a structured event to a conversation thread as a turn\",\"description\":\"Run a structured event as a turn on an EXISTING thread of route_name. The thread must already exist: an event enters a conversation as a turn and never mints a thread. Address it by the address its listing shows or by its thread_id (exactly one). The turn runs the route's TOOL target AS the route's execution key — an agent-target route is refused (409) since an event carries no rendered text. The event is IDEMPOTENT on event_id: a redelivery returns the original turn's message_id (202) and runs no second turn. The answer is delivered by the TARGET route's door — a channel route texts the thread's address, an api route POSTs the route's signed callback (a wait_seconds body field, clamped to sync_wait_max_seconds, returns a finished turn's answer inline in the 200 and suppresses the callback, but only while the client is still connected — a hung-up caller's answer falls to the callback or its terminal poll record). Default is 202 {message_id, thread_id}. This is a TRUSTED-integration door: an authorized writer may address ANY existing thread of the route by thread_id (a channel participant's included), so a deployment grants its write action to service principals, not to low-trust API keys.\",\"dateModified\":\"2026-11-05T00:56:35.392Z\",\"isPartOf\":{\"@id\":\"https://docs.tai42.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"HTTP API\",\"item\":\"https://docs.tai42.ai/reference/api/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"conversations\",\"item\":\"https://docs.tai42.ai/api-reference/conversations/list-conversation-target-configs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Deliver a structured event to a conversation thread as a turn\",\"item\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn#apireference\",\"headline\":\"Deliver a structured event to a conversation thread as a turn\",\"name\":\"Deliver a structured event to a conversation thread as a turn\",\"description\":\"Run a structured event as a turn on an EXISTING thread of route_name. The thread must already exist: an event enters a conversation as a turn and never mints a thread. Address it by the address its listing shows or by its thread_id (exactly one). The turn runs the route's TOOL target AS the route's execution key — an agent-target route is refused (409) since an event carries no rendered text. The event is IDEMPOTENT on event_id: a redelivery returns the original turn's message_id (202) and runs no second turn. The answer is delivered by the TARGET route's door — a channel route texts the thread's address, an api route POSTs the route's signed callback (a wait_seconds body field, clamped to sync_wait_max_seconds, returns a finished turn's answer inline in the 200 and suppresses the callback, but only while the client is still connected — a hung-up caller's answer falls to the callback or its terminal poll record). Default is 202 {message_id, thread_id}. This is a TRUSTED-integration door: an authorized writer may address ANY existing thread of the route by thread_id (a channel participant's included), so a deployment grants its write action to service principals, not to low-trust API keys.\",\"url\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tai42.ai/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn#webpage\"},\"image\":\"https://docs.tai42.ai/images/og-image.svg\",\"dateModified\":\"2026-11-05T00:56:35.392Z\",\"publisher\":{\"@id\":\"https://docs.tai42.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tai42.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TAI42\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TAI42","nav":{"global":null,"tabs":[{"tab":"Docs","pages":[{"title":"Docs","href":""}]},{"tab":"Studio","pages":[{"title":"Studio","href":"/studio"}]},{"tab":"Reference","groups":[{"group":"HTTP API","icon":"cloud","pages":[{"title":"HTTP API","icon":"cloud","href":"/reference/api"},{"group":"agents","pages":[{"title":"List every registered agent","deprecated":null,"version":null,"openapi":"/openapi.json get /api/agents","href":"/api-reference/agents/list-every-registered-agent"},{"title":"Stream a run of an authored agent","deprecated":null,"version":null,"openapi":"/openapi.json post /api/agents/authored/{name}/runs","href":"/api-reference/agents/stream-a-run-of-an-authored-agent"},{"title":"List the spec-runnable (authorable) agents","deprecated":null,"version":null,"openapi":"/openapi.json get /api/agents/spec-runnable","href":"/api-reference/agents/list-the-spec-runnable-authorable-agents"},{"title":"Stream a run of an agent","deprecated":null,"version":null,"openapi":"/openapi.json post /api/agents/{name}/runs","href":"/api-reference/agents/stream-a-run-of-an-agent"}]},{"group":"manifest","pages":[{"title":"Add or replace agents config entries and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/agents-config/entries","href":"/api-reference/manifest/add-or-replace-agents-config-entries-and-hot-reload"},{"title":"Remove one agents config entry by title and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/agents-config/entries/{title}","href":"/api-reference/manifest/remove-one-agents-config-entry-by-title-and-hot-reload"},{"title":"Add/remove names on the api_tools include/exclude lists and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/api-tools","href":"/api-reference/manifest/addremove-names-on-the-api_tools-includeexclude-lists-and-hot-reload"},{"title":"Read the PRESERVED manifest MCP section, user tools and extension settings","deprecated":null,"version":null,"openapi":"/openapi.json get /api/manifest","href":"/api-reference/manifest/read-the-preserved-manifest-mcp-section-user-tools-and-extension-settings"},{"title":"List the manifest MCP section's !ENV marker refs (names + set/unset only)","deprecated":null,"version":null,"openapi":"/openapi.json get /api/manifest/mcp-env-refs","href":"/api-reference/manifest/list-the-manifest-mcp-sections-!env-marker-refs-names-+-setunset-only"},{"title":"Read the PRESERVED manifest (markers intact) MCP section, user tools and extension settings","deprecated":null,"version":null,"openapi":"/openapi.json get /api/manifest/preserved","href":"/api-reference/manifest/read-the-preserved-manifest-markers-intact-mcp-section-user-tools-and-extension-settings"},{"title":"Replace the whole manifest, persist, and reload the fleet","deprecated":null,"version":null,"openapi":"/openapi.json post /api/manifest/replace","href":"/api-reference/manifest/replace-the-whole-manifest-persist-and-reload-the-fleet"},{"title":"Replace the MCP config section and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-config","href":"/api-reference/manifest/replace-the-mcp-config-section-and-hot-reload"},{"title":"Add or replace MCP config entries and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-config/entries","href":"/api-reference/manifest/add-or-replace-mcp-config-entries-and-hot-reload"},{"title":"Remove one MCP config entry by title and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/mcp-config/entries/{title}","href":"/api-reference/manifest/remove-one-mcp-config-entry-by-title-and-hot-reload"},{"title":"Set an MCP server's tool selection","deprecated":null,"version":null,"openapi":"/openapi.json put /api/mcp-config/entries/{title}/tool-filter","href":"/api-reference/manifest/set-an-mcp-servers-tool-selection"},{"title":"Get the JSON schema for one MCP-config entry","deprecated":null,"version":null,"openapi":"/openapi.json get /api/mcp-config/schema","href":"/api-reference/manifest/get-the-json-schema-for-one-mcp-config-entry"},{"title":"Write a secret env value and its manifest !ENV marker together, then reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-config/secret-env","href":"/api-reference/manifest/write-a-secret-env-value-and-its-manifest-!env-marker-together-then-reload"},{"title":"Snapshot the live MCP binding status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/mcp-status","href":"/api-reference/manifest/snapshot-the-live-mcp-binding-status"},{"title":"List MCP servers skipped by the viability check","deprecated":null,"version":null,"openapi":"/openapi.json get /api/mcp-status/failed","href":"/api-reference/manifest/list-mcp-servers-skipped-by-the-viability-check"},{"title":"Re-probe every failed MCP server","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-status/reload-failed","href":"/api-reference/manifest/re-probe-every-failed-mcp-server"},{"title":"List the tools an MCP server advertised at its bind","deprecated":null,"version":null,"openapi":"/openapi.json get /api/mcp-status/{title}/advertised-tools","href":"/api-reference/manifest/list-the-tools-an-mcp-server-advertised-at-its-bind"},{"title":"Detach a single MCP server's tools by title","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-status/{title}/deregister","href":"/api-reference/manifest/detach-a-single-mcp-servers-tools-by-title"},{"title":"Reload a single MCP server by title","deprecated":null,"version":null,"openapi":"/openapi.json post /api/mcp-status/{title}/reload","href":"/api-reference/manifest/reload-a-single-mcp-server-by-title"},{"title":"Add or replace tools config entries and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tools-config/entries","href":"/api-reference/manifest/add-or-replace-tools-config-entries-and-hot-reload"},{"title":"Remove one tools config entry by title and hot-reload","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/tools-config/entries/{title}","href":"/api-reference/manifest/remove-one-tools-config-entry-by-title-and-hot-reload"}]},{"group":"access-control","pages":[{"title":"Create an api key","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/api-keys","href":"/api-reference/access-control/create-an-api-key"},{"title":"Edit an api key","deprecated":null,"version":null,"openapi":"/openapi.json put /api/auth/api-keys/{user_id}","href":"/api-reference/access-control/edit-an-api-key"},{"title":"Revoke an api key","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/api-keys/{user_id}","href":"/api-reference/access-control/revoke-an-api-key"},{"title":"Roll a policy back to a version","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/api-keys/{user_id}/policy/rollback","href":"/api-reference/access-control/roll-a-policy-back-to-a-version"},{"title":"List a user's policy version history","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/api-keys/{user_id}/policy/versions","href":"/api-reference/access-control/list-a-users-policy-version-history"},{"title":"Add/remove scopes on an api key","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/api-keys/{user_id}/scopes","href":"/api-reference/access-control/addremove-scopes-on-an-api-key"},{"title":"Report key-mint capabilities","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/capabilities","href":"/api-reference/access-control/report-key-mint-capabilities"},{"title":"Create a one-time claim link for an API key","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/claim-links","href":"/api-reference/access-control/create-a-one-time-claim-link-for-an-api-key"},{"title":"Log out the current session","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/logout","href":"/api-reference/access-control/log-out-the-current-session"},{"title":"The caller's capability projection","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/me","href":"/api-reference/access-control/the-callers-capability-projection"},{"title":"List member actions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/member-actions","href":"/api-reference/access-control/list-member-actions"},{"title":"Invoke a member action","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/member-actions/invoke","href":"/api-reference/access-control/invoke-a-member-action"},{"title":"List members and invites","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/members","href":"/api-reference/access-control/list-members-and-invites"},{"title":"List principals","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/principals","href":"/api-reference/access-control/list-principals"},{"title":"Create a principal","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/principals","href":"/api-reference/access-control/create-a-principal"},{"title":"Update a principal","deprecated":null,"version":null,"openapi":"/openapi.json put /api/auth/principals/{user_id}","href":"/api-reference/access-control/update-a-principal"},{"title":"Delete a principal","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/principals/{user_id}","href":"/api-reference/access-control/delete-a-principal"},{"title":"List public-pinned routes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/public-routes","href":"/api-reference/access-control/list-public-pinned-routes"},{"title":"Pin a route public","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/public-routes","href":"/api-reference/access-control/pin-a-route-public"},{"title":"Unpin a public route","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/public-routes","href":"/api-reference/access-control/unpin-a-public-route"},{"title":"List roles","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/roles","href":"/api-reference/access-control/list-roles"},{"title":"Create a role","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/roles","href":"/api-reference/access-control/create-a-role"},{"title":"Edit a role's grant map","deprecated":null,"version":null,"openapi":"/openapi.json put /api/auth/roles/{name}","href":"/api-reference/access-control/edit-a-roles-grant-map"},{"title":"Delete a role","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/roles/{name}","href":"/api-reference/access-control/delete-a-role"},{"title":"Set/remove single tag grants on a role","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/roles/{name}/grants","href":"/api-reference/access-control/setremove-single-tag-grants-on-a-role"},{"title":"Roll a role back to a version","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/roles/{name}/rollback","href":"/api-reference/access-control/roll-a-role-back-to-a-version"},{"title":"A role's version history + audit trail","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/roles/{name}/versions","href":"/api-reference/access-control/a-roles-version-history-+-audit-trail"},{"title":"List the app's HTTP routes and their scope mappings","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/routes","href":"/api-reference/access-control/list-the-apps-http-routes-and-their-scope-mappings"},{"title":"List all scopes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/scopes","href":"/api-reference/access-control/list-all-scopes"},{"title":"Add a URL to a scope","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/scopes","href":"/api-reference/access-control/add-a-url-to-a-scope"},{"title":"Remove a URL from all scopes","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/scopes/urls","href":"/api-reference/access-control/remove-a-url-from-all-scopes"},{"title":"Delete a scope","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/auth/scopes/{scope_id}","href":"/api-reference/access-control/delete-a-scope"},{"title":"List api-key token payloads","deprecated":null,"version":null,"openapi":"/openapi.json get /api/auth/tokens-payload","href":"/api-reference/access-control/list-api-key-token-payloads"},{"title":"Validate a jq policy condition","deprecated":null,"version":null,"openapi":"/openapi.json post /api/auth/validate-condition","href":"/api-reference/access-control/validate-a-jq-policy-condition"},{"title":"Initialize the deployment (owner + first key)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/setup","href":"/api-reference/access-control/initialize-the-deployment-owner-+-first-key"}]},{"group":"backend","pages":[{"title":"Get the backend identity","deprecated":null,"version":null,"openapi":"/openapi.json get /api/backend","href":"/api-reference/backend/get-the-backend-identity"},{"title":"Soft-restart the worker fleet, restarting the drifted workers whose reload built","deprecated":null,"version":null,"openapi":"/openapi.json post /api/fleet/reload-config","href":"/api-reference/backend/soft-restart-the-worker-fleet-restarting-the-drifted-workers-whose-reload-built"},{"title":"List the worker fleet","deprecated":null,"version":null,"openapi":"/openapi.json get /api/fleet/workers","href":"/api-reference/backend/list-the-worker-fleet"}]},{"group":"backup","pages":[{"title":"Export the named backup sections","deprecated":null,"version":null,"openapi":"/openapi.json post /api/backup/export","href":"/api-reference/backup/export-the-named-backup-sections"},{"title":"Import a backup document","deprecated":null,"version":null,"openapi":"/openapi.json post /api/backup/import","href":"/api-reference/backup/import-a-backup-document"},{"title":"List backup sections","deprecated":null,"version":null,"openapi":"/openapi.json get /api/backup/sections","href":"/api-reference/backup/list-backup-sections"}]},{"group":"channels","pages":[{"title":"List registered channels","deprecated":null,"version":null,"openapi":"/openapi.json get /api/channels","href":"/api-reference/channels/list-registered-channels"}]},{"group":"checkpoints","pages":[{"title":"Sweep expired checkpoint threads","deprecated":null,"version":null,"openapi":"/openapi.json post /api/checkpoints/sweep","href":"/api-reference/checkpoints/sweep-expired-checkpoint-threads"}]},{"group":"templates","pages":[{"title":"Clear the template render cache","deprecated":null,"version":null,"openapi":"/openapi.json post /api/clear-templates-cache","href":"/api-reference/templates/clear-the-template-render-cache"},{"title":"Delete a template","deprecated":null,"version":null,"openapi":"/openapi.json post /api/delete-template","href":"/api-reference/templates/delete-a-template"},{"title":"Delete a template directory","deprecated":null,"version":null,"openapi":"/openapi.json post /api/delete-template-dir","href":"/api-reference/templates/delete-a-template-directory"},{"title":"Render a template","deprecated":null,"version":null,"openapi":"/openapi.json post /api/render-template","href":"/api-reference/templates/render-a-template"},{"title":"Read a stored object as a template entry with its inferred input schema","deprecated":null,"version":null,"openapi":"/openapi.json post /api/template","href":"/api-reference/templates/read-a-stored-object-as-a-template-entry-with-its-inferred-input-schema"},{"title":"List templates","deprecated":null,"version":null,"openapi":"/openapi.json get /api/templates","href":"/api-reference/templates/list-templates"},{"title":"Upload a template","deprecated":null,"version":null,"openapi":"/openapi.json post /api/upload-template","href":"/api-reference/templates/upload-a-template"}]},{"group":"config","pages":[{"title":"Read the stored env config, secret-key marks and the stored keys the deployment sets","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/env","href":"/api-reference/config/read-the-stored-env-config-secret-key-marks-and-the-stored-keys-the-deployment-sets"},{"title":"Merge env changes into the stored env and reload the fleet","deprecated":null,"version":null,"openapi":"/openapi.json post /api/config/env","href":"/api-reference/config/merge-env-changes-into-the-stored-env-and-reload-the-fleet"},{"title":"Read the active config backend mode","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/mode","href":"/api-reference/config/read-the-active-config-backend-mode"},{"title":"List settings profiles","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/profiles","href":"/api-reference/config/list-settings-profiles"},{"title":"Get a settings profile","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/profiles/{name}","href":"/api-reference/config/get-a-settings-profile"},{"title":"Create or update a settings profile","deprecated":null,"version":null,"openapi":"/openapi.json put /api/config/profiles/{name}","href":"/api-reference/config/create-or-update-a-settings-profile"},{"title":"Delete a settings profile","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/config/profiles/{name}","href":"/api-reference/config/delete-a-settings-profile"},{"title":"Apply a settings profile — replace the stored env and reload the fleet","deprecated":null,"version":null,"openapi":"/openapi.json post /api/config/profiles/{name}/apply","href":"/api-reference/config/apply-a-settings-profile-—-replace-the-stored-env-and-reload-the-fleet"},{"title":"Diff a settings profile against the stored env","deprecated":null,"version":null,"openapi":"/openapi.json post /api/config/profiles/{name}/diff","href":"/api-reference/config/diff-a-settings-profile-against-the-stored-env"},{"title":"Roll a settings profile back to a version","deprecated":null,"version":null,"openapi":"/openapi.json post /api/config/profiles/{name}/rollback","href":"/api-reference/config/roll-a-settings-profile-back-to-a-version"},{"title":"List a settings profile's versions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/profiles/{name}/versions","href":"/api-reference/config/list-a-settings-profiles-versions"},{"title":"Get a settings profile version","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/profiles/{name}/versions/{version}","href":"/api-reference/config/get-a-settings-profile-version"},{"title":"Soft-restart the fleet from its manifest, restarting the drifted workers whose reload built","deprecated":null,"version":null,"openapi":"/openapi.json post /api/config/reload","href":"/api-reference/config/soft-restart-the-fleet-from-its-manifest-restarting-the-drifted-workers-whose-reload-built"},{"title":"List settings groups with their resolved field values","deprecated":null,"version":null,"openapi":"/openapi.json get /api/config/settings-schema","href":"/api-reference/config/list-settings-groups-with-their-resolved-field-values"}]},{"group":"connectors","pages":[{"title":"List connections","deprecated":null,"version":null,"openapi":"/openapi.json get /api/connectors/connections","href":"/api-reference/connectors/list-connections"},{"title":"Start a connection flow","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/connections/start","href":"/api-reference/connectors/start-a-connection-flow"},{"title":"Get a connection","deprecated":null,"version":null,"openapi":"/openapi.json get /api/connectors/connections/{connection_id}","href":"/api-reference/connectors/get-a-connection"},{"title":"Disconnect a connection","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/connectors/connections/{connection_id}","href":"/api-reference/connectors/disconnect-a-connection"},{"title":"Start a reconnect flow","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/connections/{connection_id}/reconnect","href":"/api-reference/connectors/start-a-reconnect-flow"},{"title":"Patch a connection's enabled sub-services","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/connectors/connections/{connection_id}/sub-services","href":"/api-reference/connectors/patch-a-connections-enabled-sub-services"},{"title":"Complete an OAuth connection flow","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/oauth/complete","href":"/api-reference/connectors/complete-an-oauth-connection-flow"},{"title":"List connector providers","deprecated":null,"version":null,"openapi":"/openapi.json get /api/connectors/providers","href":"/api-reference/connectors/list-connector-providers"},{"title":"Add an MCP server as a connector provider","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/providers","href":"/api-reference/connectors/add-an-mcp-server-as-a-connector-provider"},{"title":"Look up an MCP server's sign-in","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/providers/discover","href":"/api-reference/connectors/look-up-an-mcp-servers-sign-in"},{"title":"Remove a connector provider added by its address","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/connectors/providers/{provider_id}","href":"/api-reference/connectors/remove-a-connector-provider-added-by-its-address"},{"title":"Set the client credentials of a connector provider","deprecated":null,"version":null,"openapi":"/openapi.json put /api/connectors/providers/{provider_id}/client","href":"/api-reference/connectors/set-the-client-credentials-of-a-connector-provider"},{"title":"Re-encrypt connector tokens and client credentials under the current KEK","deprecated":null,"version":null,"openapi":"/openapi.json post /api/connectors/tokens/reencrypt","href":"/api-reference/connectors/re-encrypt-connector-tokens-and-client-credentials-under-the-current-kek"}]},{"group":"conversations","pages":[{"title":"List conversation target configs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversation-configs","href":"/api-reference/conversations/list-conversation-target-configs"},{"title":"Get a conversation target config","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversation-configs/{target_kind}/{target_name}","href":"/api-reference/conversations/get-a-conversation-target-config"},{"title":"Create or replace a conversation target config","deprecated":null,"version":null,"openapi":"/openapi.json put /api/conversation-configs/{target_kind}/{target_name}","href":"/api-reference/conversations/create-or-replace-a-conversation-target-config"},{"title":"Delete a conversation target config","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/conversation-configs/{target_kind}/{target_name}","href":"/api-reference/conversations/delete-a-conversation-target-config"},{"title":"List conversation routes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations","href":"/api-reference/conversations/list-conversation-routes"},{"title":"List failed conversation deliveries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/messages/failed","href":"/api-reference/conversations/list-failed-conversation-deliveries"},{"title":"Read a conversation person","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/persons/{person_id}","href":"/api-reference/conversations/read-a-conversation-person"},{"title":"Delete a conversation person","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/conversations/persons/{person_id}","href":"/api-reference/conversations/delete-a-conversation-person"},{"title":"Set a conversation person's locale","deprecated":null,"version":null,"openapi":"/openapi.json put /api/conversations/persons/{person_id}/locale","href":"/api-reference/conversations/set-a-conversation-persons-locale"},{"title":"Get a conversation route","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}","href":"/api-reference/conversations/get-a-conversation-route"},{"title":"Create or replace a conversation route","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}","href":"/api-reference/conversations/create-or-replace-a-conversation-route"},{"title":"Delete a conversation route","description":"Delete a conversation route by name, along with the thread indexes it owned.\n\nThose indexes carry no TTL and the prune pass only walks LIVE routes, so a delete that\nleft them behind would strand them unreachable forever; the answer records they name\nkeep their own retention TTL and are not touched.\n\nThe reclamation is RETRYABLE, because it can be interrupted (a socket timeout, a\nSIGTERM, a Redis blip) after the routing row is already gone: a name whose route index\nsurvives is one whose reclamation is still owed, so this door re-runs it and answers\n``removed=false`` rather than the 404 that would leave those keys unnameable forever.\nOnly a name that neither routes nor owes reclamation is the loud 404. A name that is not\na valid slug is a 400. Returns ``{\"removed\", \"route_name\"}``, where ``removed`` says\nwhether THIS call removed the routing row.","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/conversations/{route_name}","href":"/api-reference/conversations/delete-a-conversation-route"},{"title":"Deliver a structured event to a conversation thread as a turn","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}/events","href":"/api-reference/conversations/deliver-a-structured-event-to-a-conversation-thread-as-a-turn"},{"title":"Send a message to a conversation route","description":"Accept one authed message for ``route_name`` and run its turn AS the route's execution key.\n\nThe auth gate authorizes who may SEND; the turn's own authority is the route's\nexecution key, not the caller. Default answer is ``202 {message_id, thread_id}``; the\nanswer is then delivered later by signed callback when the route declares a\n``callback_url``, and otherwise read back from the poll door\n(``GET .../messages/{message_id}``). With a ``wait_seconds`` body field (clamped to\n``sync_wait_max_seconds``) a turn finishing in time answers ``200`` inline — an\nanswered/error turn with the answer, a silent turn with the silent marker (status\n``silent``, no answer text) — and any callback (which otherwise carries\nanswered/error/silent) is suppressed the same way, so it never double-fires; a turn\nstill running when the wait elapses falls back to ``202``. The inline ``200`` is taken\nonly while the client is still connected — a caller that hung up during the wait gets its\nanswer by the route's signed callback (or its terminal poll record), never a write to a\nclosed socket.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}/messages","href":"/api-reference/conversations/send-a-message-to-a-conversation-route"},{"title":"Search a conversation route's messages","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}/messages/search","href":"/api-reference/conversations/search-a-conversation-routes-messages"},{"title":"Read one conversation answer record","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}/messages/{message_id}","href":"/api-reference/conversations/read-one-conversation-answer-record"},{"title":"Delete a conversation thread","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/conversations/{route_name}/thread","href":"/api-reference/conversations/delete-a-conversation-thread"},{"title":"Send an operator message into a conversation thread","deprecated":null,"version":null,"openapi":"/openapi.json post /api/conversations/{route_name}/thread/messages","href":"/api-reference/conversations/send-an-operator-message-into-a-conversation-thread"},{"title":"Read a conversation thread's control mode","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}/thread/mode","href":"/api-reference/conversations/read-a-conversation-threads-control-mode"},{"title":"Set a conversation thread's control mode","deprecated":null,"version":null,"openapi":"/openapi.json put /api/conversations/{route_name}/thread/mode","href":"/api-reference/conversations/set-a-conversation-threads-control-mode"},{"title":"List a conversation route's threads","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}/threads","href":"/api-reference/conversations/list-a-conversation-routes-threads"},{"title":"Read a conversation thread's transcript","deprecated":null,"version":null,"openapi":"/openapi.json get /api/conversations/{route_name}/transcript","href":"/api-reference/conversations/read-a-conversation-threads-transcript"}]},{"group":"extensions","pages":[{"title":"List every registered extension","deprecated":null,"version":null,"openapi":"/openapi.json get /api/extensions","href":"/api-reference/extensions/list-every-registered-extension"},{"title":"Get a tool's applied extension combos","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tools/{name}/extensions","href":"/api-reference/extensions/get-a-tools-applied-extension-combos"},{"title":"Set a tool's applied extension combos","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tools/{name}/extensions","href":"/api-reference/extensions/set-a-tools-applied-extension-combos"},{"title":"Add or remove single extension combos on a tool","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tools/{name}/extensions/combos","href":"/api-reference/extensions/add-or-remove-single-extension-combos-on-a-tool"}]},{"group":"hooks","pages":[{"title":"List hook runs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/hook-runs","href":"/api-reference/hooks/list-hook-runs"},{"title":"Discard a failed hook run","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/hook-runs/{id}","href":"/api-reference/hooks/discard-a-failed-hook-run"},{"title":"Retry a failed hook run","deprecated":null,"version":null,"openapi":"/openapi.json post /api/hook-runs/{id}/retry","href":"/api-reference/hooks/retry-a-failed-hook-run"},{"title":"List registered hooks","deprecated":null,"version":null,"openapi":"/openapi.json get /api/hooks","href":"/api-reference/hooks/list-registered-hooks"},{"title":"Register a hook","deprecated":null,"version":null,"openapi":"/openapi.json post /api/hooks","href":"/api-reference/hooks/register-a-hook"},{"title":"Bind a webhook verifier to a topic","deprecated":null,"version":null,"openapi":"/openapi.json put /api/hooks/topics/{topic}/verifier","href":"/api-reference/hooks/bind-a-webhook-verifier-to-a-topic"},{"title":"Unbind a topic's webhook verifier","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/hooks/topics/{topic}/verifier","href":"/api-reference/hooks/unbind-a-topics-webhook-verifier"},{"title":"List trigger links","deprecated":null,"version":null,"openapi":"/openapi.json get /api/hooks/trigger-links","href":"/api-reference/hooks/list-trigger-links"},{"title":"Create a trigger link","deprecated":null,"version":null,"openapi":"/openapi.json post /api/hooks/trigger-links","href":"/api-reference/hooks/create-a-trigger-link"},{"title":"Delete a trigger link","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/hooks/trigger-links/{name}","href":"/api-reference/hooks/delete-a-trigger-link"},{"title":"List registered webhook verifiers","deprecated":null,"version":null,"openapi":"/openapi.json get /api/hooks/verifiers","href":"/api-reference/hooks/list-registered-webhook-verifiers"},{"title":"Unregister a hook","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/hooks/{name}","href":"/api-reference/hooks/unregister-a-hook"}]},{"group":"interactions","pages":[{"title":"List pending interactions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/interactions","href":"/api-reference/interactions/list-pending-interactions"},{"title":"External interaction callback door","deprecated":null,"version":null,"openapi":"/openapi.json get /api/interactions/callback/{ticket}","href":"/api-reference/interactions/external-interaction-callback-door"},{"title":"External interaction callback door","deprecated":null,"version":null,"openapi":"/openapi.json post /api/interactions/callback/{ticket}","href":"/api-reference/interactions/external-interaction-callback-door-1"},{"title":"External interaction mid-form reaction door","deprecated":null,"version":null,"openapi":"/openapi.json post /api/interactions/callback/{ticket}/react","href":"/api-reference/interactions/external-interaction-mid-form-reaction-door"},{"title":"Serve interaction media stored by reference","deprecated":null,"version":null,"openapi":"/openapi.json get /api/interactions/media/{media_id}","href":"/api-reference/interactions/serve-interaction-media-stored-by-reference"},{"title":"Serve interaction media stored by reference","deprecated":null,"version":null,"openapi":"/openapi.json head /api/interactions/media/{media_id}","href":"/api-reference/interactions/serve-interaction-media-stored-by-reference-1"},{"title":"List parked (async) interactions awaiting an answer","deprecated":null,"version":null,"openapi":"/openapi.json get /api/interactions/pending","href":"/api-reference/interactions/list-parked-async-interactions-awaiting-an-answer"},{"title":"Stream the interactions inbox live tail","deprecated":null,"version":null,"openapi":"/openapi.json get /api/interactions/stream","href":"/api-reference/interactions/stream-the-interactions-inbox-live-tail"},{"title":"Answer a pending interaction","deprecated":null,"version":null,"openapi":"/openapi.json post /api/interactions/{interaction_id}/answer","href":"/api-reference/interactions/answer-a-pending-interaction"},{"title":"Cancel a pending interaction","deprecated":null,"version":null,"openapi":"/openapi.json post /api/interactions/{interaction_id}/cancel","href":"/api-reference/interactions/cancel-a-pending-interaction"},{"title":"React to an open form interaction","deprecated":null,"version":null,"openapi":"/openapi.json post /api/interactions/{interaction_id}/react","href":"/api-reference/interactions/react-to-an-open-form-interaction"}]},{"group":"login","pages":[{"title":"Exchange a one-time claim token for its API key","deprecated":null,"version":null,"openapi":"/openapi.json post /api/login/claim","href":"/api-reference/login/exchange-a-one-time-claim-token-for-its-api-key"},{"title":"List available login methods","deprecated":null,"version":null,"openapi":"/openapi.json get /api/login/methods","href":"/api-reference/login/list-available-login-methods"}]},{"group":"marketplace","pages":[{"title":"Get advisories for installed plugins","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/advisories","href":"/api-reference/marketplace/get-advisories-for-installed-plugins"},{"title":"List marketplace categories","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/categories","href":"/api-reference/marketplace/list-marketplace-categories"},{"title":"Install a marketplace plugin","deprecated":null,"version":null,"openapi":"/openapi.json post /api/marketplace/install","href":"/api-reference/marketplace/install-a-marketplace-plugin"},{"title":"Preview a marketplace install","deprecated":null,"version":null,"openapi":"/openapi.json post /api/marketplace/install/preview","href":"/api-reference/marketplace/preview-a-marketplace-install"},{"title":"List installed marketplace plugins","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/installed","href":"/api-reference/marketplace/list-installed-marketplace-plugins"},{"title":"List marketplace item kinds","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/kinds","href":"/api-reference/marketplace/list-marketplace-item-kinds"},{"title":"Get a marketplace listing's detail","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/plugins/{ns}/{name}","href":"/api-reference/marketplace/get-a-marketplace-listings-detail"},{"title":"Search the marketplace","deprecated":null,"version":null,"openapi":"/openapi.json get /api/marketplace/search","href":"/api-reference/marketplace/search-the-marketplace"},{"title":"Uninstall a marketplace plugin","deprecated":null,"version":null,"openapi":"/openapi.json post /api/marketplace/uninstall","href":"/api-reference/marketplace/uninstall-a-marketplace-plugin"},{"title":"Update a marketplace plugin","deprecated":null,"version":null,"openapi":"/openapi.json post /api/marketplace/update","href":"/api-reference/marketplace/update-a-marketplace-plugin"},{"title":"Upgrade all installed marketplace plugins","deprecated":null,"version":null,"openapi":"/openapi.json post /api/marketplace/upgrade-all","href":"/api-reference/marketplace/upgrade-all-installed-marketplace-plugins"}]},{"group":"notifications","pages":[{"title":"List internal notifications","deprecated":null,"version":null,"openapi":"/openapi.json get /api/notifications","href":"/api-reference/notifications/list-internal-notifications"},{"title":"Send a human a one-way notification","deprecated":null,"version":null,"openapi":"/openapi.json post /api/notifications","href":"/api-reference/notifications/send-a-human-a-one-way-notification"}]},{"group":"observability","pages":[{"title":"Get the monitoring backend's observability capabilities","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/capabilities","href":"/api-reference/observability/get-the-monitoring-backends-observability-capabilities"},{"title":"Query observability metrics","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/metrics","href":"/api-reference/observability/query-observability-metrics"},{"title":"List observability runs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs","href":"/api-reference/observability/list-observability-runs"},{"title":"Export runs as a CSV download","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs/export","href":"/api-reference/observability/export-runs-as-a-csv-download"},{"title":"Get a run span's resolved value","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs/{trace_id}/spans/{span_id}/resolved","href":"/api-reference/observability/get-a-run-spans-resolved-value"},{"title":"Get a run's trace","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs/{trace_id}/trace","href":"/api-reference/observability/get-a-runs-trace"},{"title":"Export a run's trace as a JSON download","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs/{trace_id}/trace/export","href":"/api-reference/observability/export-a-runs-trace-as-a-json-download"},{"title":"Get a run's trace outline","deprecated":null,"version":null,"openapi":"/openapi.json get /api/observability/runs/{trace_id}/trace/outline","href":"/api-reference/observability/get-a-runs-trace-outline"}]},{"group":"plugins","pages":[{"title":"List the registered studio plugins","deprecated":null,"version":null,"openapi":"/openapi.json get /api/plugins","href":"/api-reference/plugins/list-the-registered-studio-plugins"},{"title":"Serve a studio plugin asset","deprecated":null,"version":null,"openapi":"/openapi.json get /api/plugins/{name}/studio/{path}","href":"/api-reference/plugins/serve-a-studio-plugin-asset"}]},{"group":"presets","pages":[{"title":"List presets","deprecated":null,"version":null,"openapi":"/openapi.json get /api/presets","href":"/api-reference/presets/list-presets"},{"title":"Create a preset","deprecated":null,"version":null,"openapi":"/openapi.json post /api/presets","href":"/api-reference/presets/create-a-preset"},{"title":"Validate a preset draft (dry-run)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/presets/validate","href":"/api-reference/presets/validate-a-preset-draft-dry-run"},{"title":"Get a preset","deprecated":null,"version":null,"openapi":"/openapi.json get /api/presets/{name}","href":"/api-reference/presets/get-a-preset"},{"title":"Delete a preset","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/presets/{name}","href":"/api-reference/presets/delete-a-preset"},{"title":"List live holders of this preset","deprecated":null,"version":null,"openapi":"/openapi.json get /api/presets/{name}/referees","href":"/api-reference/presets/list-live-holders-of-this-preset"},{"title":"Rename a preset","deprecated":null,"version":null,"openapi":"/openapi.json post /api/presets/{name}/rename","href":"/api-reference/presets/rename-a-preset"},{"title":"Roll a preset back to a version","deprecated":null,"version":null,"openapi":"/openapi.json post /api/presets/{name}/rollback","href":"/api-reference/presets/roll-a-preset-back-to-a-version"},{"title":"List a preset's versions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/presets/{name}/versions","href":"/api-reference/presets/list-a-presets-versions"},{"title":"Save a new preset version","deprecated":null,"version":null,"openapi":"/openapi.json post /api/presets/{name}/versions","href":"/api-reference/presets/save-a-new-preset-version"},{"title":"Get a specific preset version","deprecated":null,"version":null,"openapi":"/openapi.json get /api/presets/{name}/versions/{version}","href":"/api-reference/presets/get-a-specific-preset-version"},{"title":"Set a preset version's tags","deprecated":null,"version":null,"openapi":"/openapi.json put /api/presets/{name}/versions/{version}/tags","href":"/api-reference/presets/set-a-preset-versions-tags"}]},{"group":"resources","pages":[{"title":"Load a stored resource by id, optionally rendering it","deprecated":null,"version":null,"openapi":"/openapi.json get /api/resources/get","href":"/api-reference/resources/load-a-stored-resource-by-id-optionally-rendering-it"},{"title":"Load a stored resource by id, optionally rendering it","deprecated":null,"version":null,"openapi":"/openapi.json post /api/resources/get","href":"/api-reference/resources/load-a-stored-resource-by-id-optionally-rendering-it-1"}]},{"group":"tools","pages":[{"title":"Run a registered tool synchronously","deprecated":null,"version":null,"openapi":"/openapi.json post /api/run-tool","href":"/api-reference/tools/run-a-registered-tool-synchronously"},{"title":"List the registered tool names","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tools","href":"/api-reference/tools/list-the-registered-tool-names"},{"title":"Get the input/output schema of every tool","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tools-schema","href":"/api-reference/tools/get-the-inputoutput-schema-of-every-tool"},{"title":"Reload one app tool from its stored definition","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tools/reload","href":"/api-reference/tools/reload-one-app-tool-from-its-stored-definition"},{"title":"Remove one app tool from the live registry","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tools/remove","href":"/api-reference/tools/remove-one-app-tool-from-the-live-registry"},{"title":"List each tool's description, native tags, declared visibility, and badges","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tools/tags","href":"/api-reference/tools/list-each-tools-description-native-tags-declared-visibility-and-badges"},{"title":"Get one tool's input/output schema","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tools/{tool_name}/schema","href":"/api-reference/tools/get-one-tools-inputoutput-schema"}]},{"group":"runs","pages":[{"title":"List platform runs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/runs","href":"/api-reference/runs/list-platform-runs"},{"title":"Prune the platform runs index","deprecated":null,"version":null,"openapi":"/openapi.json post /api/runs/prune","href":"/api-reference/runs/prune-the-platform-runs-index"}]},{"group":"sandbox","pages":[{"title":"Get the sandbox identity and resolved policy","deprecated":null,"version":null,"openapi":"/openapi.json get /api/sandbox","href":"/api-reference/sandbox/get-the-sandbox-identity-and-resolved-policy"}]},{"group":"schedules","pages":[{"title":"List schedules","deprecated":null,"version":null,"openapi":"/openapi.json get /api/schedules","href":"/api-reference/schedules/list-schedules"},{"title":"Create a schedule","deprecated":null,"version":null,"openapi":"/openapi.json post /api/schedules","href":"/api-reference/schedules/create-a-schedule"},{"title":"Get the server date and time","deprecated":null,"version":null,"openapi":"/openapi.json get /api/schedules/server-datetime","href":"/api-reference/schedules/get-the-server-date-and-time"},{"title":"Delete a schedule","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/schedules/{schedule_name}","href":"/api-reference/schedules/delete-a-schedule"}]},{"group":"states","pages":[{"title":"List pending state saves","deprecated":null,"version":null,"openapi":"/openapi.json get /api/state-pending-saves","href":"/api-reference/states/list-pending-state-saves"},{"title":"Discard a failed pending state save","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/state-pending-saves/{id}","href":"/api-reference/states/discard-a-failed-pending-state-save"},{"title":"Retry a failed pending state save","deprecated":null,"version":null,"openapi":"/openapi.json post /api/state-pending-saves/{id}/retry","href":"/api-reference/states/retry-a-failed-pending-state-save"},{"title":"Prune expired state records","deprecated":null,"version":null,"openapi":"/openapi.json post /api/state-retention/prune","href":"/api-reference/states/prune-expired-state-records"},{"title":"List state templates","deprecated":null,"version":null,"openapi":"/openapi.json get /api/state-templates","href":"/api-reference/states/list-state-templates"},{"title":"Get a state template","deprecated":null,"version":null,"openapi":"/openapi.json get /api/state-templates/{name}","href":"/api-reference/states/get-a-state-template"},{"title":"Create or replace a state template","deprecated":null,"version":null,"openapi":"/openapi.json put /api/state-templates/{name}","href":"/api-reference/states/create-or-replace-a-state-template"},{"title":"Delete a state template","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/state-templates/{name}","href":"/api-reference/states/delete-a-state-template"},{"title":"List declared states","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states","href":"/api-reference/states/list-declared-states"},{"title":"Get a state","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}","href":"/api-reference/states/get-a-state"},{"title":"Create or re-declare a state","deprecated":null,"version":null,"openapi":"/openapi.json put /api/states/{name}","href":"/api-reference/states/create-or-re-declare-a-state"},{"title":"Delete a state","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/states/{name}","href":"/api-reference/states/delete-a-state"},{"title":"List a state's attachments","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/attachments","href":"/api-reference/states/list-a-states-attachments"},{"title":"Get a state's attachment","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/attachments/{template}","href":"/api-reference/states/get-a-states-attachment"},{"title":"Attach a template on a state","deprecated":null,"version":null,"openapi":"/openapi.json put /api/states/{name}/attachments/{template}","href":"/api-reference/states/attach-a-template-on-a-state"},{"title":"Detach a template from a state","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/states/{name}/attachments/{template}","href":"/api-reference/states/detach-a-template-from-a-state"},{"title":"Update an attachment's declarations","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/states/{name}/attachments/{template}","href":"/api-reference/states/update-an-attachments-declarations"},{"title":"List live holders of a state's template attachment","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/attachments/{template}/referees","href":"/api-reference/states/list-live-holders-of-a-states-template-attachment"},{"title":"A state's consumers","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/consumers","href":"/api-reference/states/a-states-consumers"},{"title":"Check a state's stored records against its schema","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/records/check","href":"/api-reference/states/check-a-states-stored-records-against-its-schema"},{"title":"Search a state's records","deprecated":null,"version":null,"openapi":"/openapi.json post /api/states/{name}/records/search","href":"/api-reference/states/search-a-states-records"},{"title":"Validate a candidate record against a state's schema","deprecated":null,"version":null,"openapi":"/openapi.json post /api/states/{name}/records/validate","href":"/api-reference/states/validate-a-candidate-record-against-a-states-schema"},{"title":"Read a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}","href":"/api-reference/states/read-a-subjects-record"},{"title":"Replace a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json put /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}","href":"/api-reference/states/replace-a-subjects-record"},{"title":"Erase a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}","href":"/api-reference/states/erase-a-subjects-record"},{"title":"Merge into a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}","href":"/api-reference/states/merge-into-a-subjects-record"},{"title":"Apply ops to a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json post /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}/deltas","href":"/api-reference/states/apply-ops-to-a-subjects-record"},{"title":"Fold one subject into another","deprecated":null,"version":null,"openapi":"/openapi.json post /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}/fold","href":"/api-reference/states/fold-one-subject-into-another"},{"title":"Evaluate an input-purpose template_jq program for a subject","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}/template-jq/{program}","href":"/api-reference/states/evaluate-an-input-purpose-template_jq-program-for-a-subject"},{"title":"Apply an update-purpose template_jq program to a subject's record","deprecated":null,"version":null,"openapi":"/openapi.json post /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}/template-jq/{program}","href":"/api-reference/states/apply-an-update-purpose-template_jq-program-to-a-subjects-record"},{"title":"A subject's write audit trail","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/records/{target_kind}/{target_name}/{kind}/{key}/writes","href":"/api-reference/states/a-subjects-write-audit-trail"},{"title":"A state's record statistics","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/stats","href":"/api-reference/states/a-states-record-statistics"},{"title":"List a state's subjects","deprecated":null,"version":null,"openapi":"/openapi.json get /api/states/{name}/subjects","href":"/api-reference/states/list-a-states-subjects"}]},{"group":"storage","pages":[{"title":"Get the storage provider identity","deprecated":null,"version":null,"openapi":"/openapi.json get /api/storage","href":"/api-reference/storage/get-the-storage-provider-identity"},{"title":"Delete a storage directory","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/storage/dirs/{dir_path}","href":"/api-reference/storage/delete-a-storage-directory"},{"title":"Read a stored object as a text, document or binary entry","deprecated":null,"version":null,"openapi":"/openapi.json get /api/storage/entries/{resource_id}","href":"/api-reference/storage/read-a-stored-object-as-a-text-document-or-binary-entry"},{"title":"List storage resources","deprecated":null,"version":null,"openapi":"/openapi.json get /api/storage/resources","href":"/api-reference/storage/list-storage-resources"},{"title":"Upload a storage resource","deprecated":null,"version":null,"openapi":"/openapi.json post /api/storage/resources","href":"/api-reference/storage/upload-a-storage-resource"},{"title":"Delete a storage resource","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/storage/resources/{resource_id}","href":"/api-reference/storage/delete-a-storage-resource"},{"title":"Download a storage resource","deprecated":null,"version":null,"openapi":"/openapi.json get /api/storage/resources/{resource_id}/content","href":"/api-reference/storage/download-a-storage-resource"},{"title":"Stat a storage resource","deprecated":null,"version":null,"openapi":"/openapi.json get /api/storage/resources/{resource_id}/stat","href":"/api-reference/storage/stat-a-storage-resource"}]},{"group":"sub-mcp","pages":[{"title":"List the registered sub-MCP apps","deprecated":null,"version":null,"openapi":"/openapi.json get /api/sub-mcp","href":"/api-reference/sub-mcp/list-the-registered-sub-mcp-apps"},{"title":"Register or reload a sub-MCP app","deprecated":null,"version":null,"openapi":"/openapi.json post /api/sub-mcp","href":"/api-reference/sub-mcp/register-or-reload-a-sub-mcp-app"},{"title":"Unregister a sub-MCP app","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/sub-mcp/{slug}","href":"/api-reference/sub-mcp/unregister-a-sub-mcp-app"}]},{"group":"system","pages":[{"title":"List pluggable-kind status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/system/kinds","href":"/api-reference/system/list-pluggable-kind-status"}]},{"group":"tool_meta","pages":[{"title":"List the tool-metadata overlay","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tool-meta","href":"/api-reference/tool_meta/list-the-tool-metadata-overlay"},{"title":"Create a folder","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tool-meta/folders","href":"/api-reference/tool_meta/create-a-folder"},{"title":"Delete a folder","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/tool-meta/folders/{folder_id}","href":"/api-reference/tool_meta/delete-a-folder"},{"title":"Move a folder","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tool-meta/folders/{folder_id}/move","href":"/api-reference/tool_meta/move-a-folder"},{"title":"Rename a folder","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tool-meta/folders/{folder_id}/rename","href":"/api-reference/tool_meta/rename-a-folder"},{"title":"Delete a tool's overlay row","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/tool-meta/tools/{tool_name}","href":"/api-reference/tool_meta/delete-a-tools-overlay-row"},{"title":"Upsert a tool's overlay","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/tool-meta/tools/{tool_name}","href":"/api-reference/tool_meta/upsert-a-tools-overlay"}]},{"group":"tool-runs","pages":[{"title":"List background tool runs for a tool","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tool-runs","href":"/api-reference/tool-runs/list-background-tool-runs-for-a-tool"},{"title":"Submit a tool for background execution","deprecated":null,"version":null,"openapi":"/openapi.json post /api/tool-runs","href":"/api-reference/tool-runs/submit-a-tool-for-background-execution"},{"title":"Get a background tool run's status and result","deprecated":null,"version":null,"openapi":"/openapi.json get /api/tool-runs/{run_id}","href":"/api-reference/tool-runs/get-a-background-tool-runs-status-and-result"}]}]},{"group":"CLI","icon":"terminal","pages":[{"title":"CLI","icon":"terminal","href":"/reference/cli/index"},{"title":"tai agents","icon":"terminal","href":"/reference/cli/agents"},{"title":"tai auth","icon":"terminal","href":"/reference/cli/auth"},{"title":"tai backend","icon":"terminal","href":"/reference/cli/backend"},{"title":"tai backup","icon":"terminal","href":"/reference/cli/backup"},{"title":"tai catalog","icon":"terminal","href":"/reference/cli/catalog"},{"title":"tai channels","icon":"terminal","href":"/reference/cli/channels"},{"title":"tai checkpoints","icon":"terminal","href":"/reference/cli/checkpoints"},{"title":"tai completion","icon":"terminal","href":"/reference/cli/completion"},{"title":"tai config","icon":"terminal","href":"/reference/cli/config"},{"title":"tai connectors","icon":"terminal","href":"/reference/cli/connectors"},{"title":"tai conversations","icon":"terminal","href":"/reference/cli/conversations"},{"title":"tai db","icon":"terminal","href":"/reference/cli/db"},{"title":"tai doctor","icon":"terminal","href":"/reference/cli/doctor"},{"title":"tai extensions","icon":"terminal","href":"/reference/cli/extensions"},{"title":"tai fleet","icon":"terminal","href":"/reference/cli/fleet"},{"title":"tai hooks","icon":"terminal","href":"/reference/cli/hooks"},{"title":"tai interactions","icon":"terminal","href":"/reference/cli/interactions"},{"title":"tai keys","icon":"terminal","href":"/reference/cli/keys"},{"title":"tai manifest","icon":"terminal","href":"/reference/cli/manifest"},{"title":"tai mcp","icon":"terminal","href":"/reference/cli/mcp"},{"title":"tai metrics","icon":"terminal","href":"/reference/cli/metrics"},{"title":"tai notifications","icon":"terminal","href":"/reference/cli/notifications"},{"title":"tai obs","icon":"terminal","href":"/reference/cli/obs"},{"title":"tai openapi","icon":"terminal","href":"/reference/cli/openapi"},{"title":"tai plugins","icon":"terminal","href":"/reference/cli/plugins"},{"title":"tai presets","icon":"terminal","href":"/reference/cli/presets"},{"title":"tai principals","icon":"terminal","href":"/reference/cli/principals"},{"title":"tai resources","icon":"terminal","href":"/reference/cli/resources"},{"title":"tai roles","icon":"terminal","href":"/reference/cli/roles"},{"title":"tai runs","icon":"terminal","href":"/reference/cli/runs"},{"title":"tai sandbox","icon":"terminal","href":"/reference/cli/sandbox"},{"title":"tai schedules","icon":"terminal","href":"/reference/cli/schedules"},{"title":"tai scopes","icon":"terminal","href":"/reference/cli/scopes"},{"title":"tai serve","icon":"terminal","href":"/reference/cli/serve"},{"title":"tai setup","icon":"terminal","href":"/reference/cli/setup"},{"title":"tai state-templates","icon":"terminal","href":"/reference/cli/state-templates"},{"title":"tai states","icon":"terminal","href":"/reference/cli/states"},{"title":"tai storage","icon":"terminal","href":"/reference/cli/storage"},{"title":"tai sub-mcp","icon":"terminal","href":"/reference/cli/sub-mcp"},{"title":"tai system","icon":"terminal","href":"/reference/cli/system"},{"title":"tai templates","icon":"terminal","href":"/reference/cli/templates"},{"title":"tai tool-meta","icon":"terminal","href":"/reference/cli/tool-meta"},{"title":"tai tools","icon":"terminal","href":"/reference/cli/tools"},{"title":"tai traces","icon":"terminal","href":"/reference/cli/traces"},{"title":"tai version","icon":"terminal","href":"/reference/cli/version"}]},{"group":"Settings","icon":"sliders","pages":[{"title":"Settings reference","icon":"sliders","href":"/reference/settings"}]},{"group":"Capability map","icon":"compass","pages":[{"title":"Capability map","icon":"compass","href":"/reference/capability-map"}]},{"group":"Conversation bridge","icon":"comments","pages":[{"title":"Conversation bridge","icon":"comments","href":"/reference/conversation-bridge"}]},{"group":"Python SDK","icon":"python","pages":[{"title":"Python SDK","icon":"python","href":"/reference/python-sdk/index"},{"title":"App facade (tai42_contract.app)","icon":"layer-group","href":"/reference/python-sdk/contract-app"},{"title":"Agents (tai42_contract.agent)","icon":"robot","href":"/reference/python-sdk/contract-agent"},{"title":"Versioning (tai42_contract.versioning)","icon":"code-branch","href":"/reference/python-sdk/contract-versioning"},{"title":"Presets (tai42_contract.presets)","icon":"sliders","href":"/reference/python-sdk/contract-presets"},{"title":"Connectors (tai42_contract.connectors)","icon":"plug","href":"/reference/python-sdk/contract-connectors"},{"title":"Extensions (tai42_contract.extensions)","icon":"puzzle-piece","href":"/reference/python-sdk/contract-extensions"},{"title":"Monitoring (tai42_contract.monitoring)","icon":"chart-line","href":"/reference/python-sdk/contract-monitoring"},{"title":"Storage (tai42_contract.storage)","icon":"database","href":"/reference/python-sdk/contract-storage"},{"title":"Backends (tai42_contract.backend)","icon":"server","href":"/reference/python-sdk/contract-backend"},{"title":"Sandbox (tai42_contract.sandbox)","icon":"box","href":"/reference/python-sdk/contract-sandbox"},{"title":"Channels (tai42_contract.channels)","icon":"paper-plane","href":"/reference/python-sdk/contract-channels"},{"title":"Accounts (tai42_contract.accounts)","icon":"user-lock","href":"/reference/python-sdk/contract-accounts"},{"title":"Tools (tai42_contract.tools)","icon":"wrench","href":"/reference/python-sdk/contract-tools"},{"title":"Manifest (tai42_contract.manifest)","icon":"file-lines","href":"/reference/python-sdk/contract-manifest"},{"title":"Plugins (tai42_contract.plugins)","icon":"store","href":"/reference/python-sdk/contract-plugins"},{"title":"Interaction outcomes (tai42_contract.interactions)","icon":"comments","href":"/reference/python-sdk/contract-interactions"},{"title":"Plugin I/O and env (tai42_kit.plugins)","icon":"store","href":"/reference/python-sdk/kit-plugins"},{"title":"Provider registration (tai42_kit.access_control, tai42_kit.accounts)","icon":"id-card","href":"/reference/python-sdk/kit-registration"},{"title":"Pooled clients (tai42_kit.clients)","icon":"network-wired","href":"/reference/python-sdk/kit-clients"},{"title":"Postgres client (tai42_kit.clients.impl.postgres)","icon":"database","href":"/reference/python-sdk/kit-postgres"},{"title":"Loop-bound resources (tai42_kit.loop_bound)","icon":"arrows-rotate","href":"/reference/python-sdk/kit-loop-bound"},{"title":"Private event loop (tai42_kit.backend.private_loop)","icon":"rotate","href":"/reference/python-sdk/kit-private-loop"},{"title":"Shared event loop (tai42_kit.backend.shared_loop)","icon":"share-nodes","href":"/reference/python-sdk/kit-shared-loop"},{"title":"Closing event loops (tai42_kit.loop_closing)","icon":"circle-stop","href":"/reference/python-sdk/kit-loop-closing"},{"title":"Backend tools (tai42_kit.backend tool surface)","icon":"toolbox","href":"/reference/python-sdk/kit-backend-tools"},{"title":"Backend dispatch (tai42_kit.backend dispatch helpers)","icon":"shuffle","href":"/reference/python-sdk/kit-backend-dispatch"},{"title":"LLM factories and the classifier contract (tai42_kit.llm)","icon":"brain","href":"/reference/python-sdk/kit-llm"},{"title":"Run traces (tai42_kit.monitoring)","icon":"diagram-project","href":"/reference/python-sdk/kit-monitoring"},{"title":"Checkpoint stores (tai42_kit.llm.checkpoint)","icon":"floppy-disk","href":"/reference/python-sdk/kit-checkpoint"},{"title":"Settings (tai42_kit.settings)","icon":"gear","href":"/reference/python-sdk/kit-settings"},{"title":"Transports (tai42_kit.transport)","icon":"route","href":"/reference/python-sdk/kit-transport"},{"title":"Network guard (tai42_kit.net)","icon":"shield-halved","href":"/reference/python-sdk/kit-net"},{"title":"Park index and park seams (tai42_kit.interactions)","icon":"square-parking","href":"/reference/python-sdk/kit-interactions"},{"title":"Logging (tai42_kit.logging)","icon":"file-lines","href":"/reference/python-sdk/kit-logging"},{"title":"Skeleton app (tai42_skeleton.app)","icon":"microchip","href":"/reference/python-sdk/skeleton-app"},{"title":"ASGI factory (tai42_skeleton.asgi)","icon":"server","href":"/reference/python-sdk/skeleton-asgi"},{"title":"State record validation (tai42_skeleton.states)","icon":"list-check","href":"/reference/python-sdk/skeleton-states"}]},{"group":"Studio SDK","icon":"puzzle-piece","pages":[{"title":"Studio SDK","icon":"puzzle-piece","href":"/reference/studio-sdk/index"},{"title":"Plugin API","icon":"plug","href":"/reference/studio-sdk/plugin-api"},{"title":"Hooks","icon":"circle-nodes","href":"/reference/studio-sdk/hooks"},{"title":"Navigation","icon":"compass","href":"/reference/studio-sdk/navigation"},{"title":"Components","icon":"shapes","href":"/reference/studio-sdk/components"},{"title":"Schema forms","icon":"list-check","href":"/reference/studio-sdk/schema-forms"},{"title":"MCP widgets","icon":"diagram-project","href":"/reference/studio-sdk/mcp-widgets"},{"title":"Utilities","icon":"wrench","href":"/reference/studio-sdk/utilities"},{"title":"Host \u0026 testing","icon":"shield-halved","href":"/reference/studio-sdk/host-testing"}]}]}]},"basePath":"","title":"TAI42 — the OS for AI tools","buildId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","deploymentId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-B5zPa4Vr.js","utils-CVjrr8Yd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DTgURWzl.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DxTHtkdZ.js","snippetPresets-Cx47o5Vx.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-4Fr6y9N_.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Dq2ElbEk.js","shallow-BfYl9r69.js","getApiPlaygroundDisplay-Ch3xc7i1.js","CodeSnippet-BsBxuJ1v.js","CodeSnippets-CetzeDL8.js","Page-CYZot51e.js","getPastedJson-BxPKFSJx.js","icon-o0J1Ochb.js","MethodPill-Du3usO5m.js","DuplicateIcon-DJypyMzl.js","createIcon-YMA6N8KJ.js","DynamicMarkdown-CWvhfcZc.js","SectionHeading-BdLVaXCd.js","axios-vUo_bRtp.js","Markdown-C4Ez6OeV.js","clsx-DptzKFCt.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Dt1IougW.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CZ6Wt2Vb.js"]}