Send a human a one-way notification, fire-and-forget.
No reply is expected and nothing blocks. With a named channel the message is
sent and the call returns as soon as the medium ACCEPTED it (not that a human
saw it). With channel omitted the message is recorded to the internal
notifications sink the Studio inbox reads. One send attempt, no retry; every
failure raises loudly, never a silent no-op:
a blank message with no media to carry it (the contract admits a blank message
only for a media-only send), an unknown channel name, a blank recipient/audience, a
caller-supplied sender_identity, a contract-invalid media/template/
options/schema combination (an empty list/dict, an over-cap value, or a
mutually exclusive
media+template / options+template / schema+template / schema+options), a schema
with no channel (the internal sink has no submission door) or one the channel’s form
subset/hook refuses, or a channel’s permanent refusal of the input’s
shape (retrying cannot succeed) → 400;
a restricted caller addressing another identity (cross-identity denial) → 403;
a channel that cannot notify, or does not advertise the
media/template/options/schema capability the send needs → 501;
a transient channel delivery failure (the raised error’s retryable) → 503,
carrying the medium’s retry_after when it named one;
a permanent channel delivery refusal → 502.
media (display media sent with the message), location (a shared map pin),
template (a pre-approved out-of-window send), options (FLAT tappable options a tap
of which enters the conversation), sections (the SECTIONED tappable-options
alternative), header/footer (a media header / trailing line composing an interactive
message) and schema (an ask-less form’s answer schema — the channel renders the
message as the form’s prompt, and a submission enters the conversation as a message from
the person) are OPTIONAL richer-send forms — FULL parity with the turn answer path’s
AnswerPart vocabulary. The contract’s shared composition matrix is enforced on this
request model identically: options XOR sections (one choice surface); schema
excludes both; header/footer require a choice surface; template is the standalone
out-of-window send exclusive with every other content/interactive field; options/
sections may each combine with media/location (a contract-invalid combination is
a 400). On a
named channel each needs a channel that advertises the matching capability
(media→media, location→location, template→template, options/sections→
interactive, schema→form; header/footer ride the choice surface’s capability, no
flag of their own) — otherwise
the send is refused as a 501, never downgraded to a silent freeform send. With no
channel media/location/template/options/sections/header/footer are stored on the internal
inbox record and rendered
there; schema alone REQUIRES a channel (a 400 without one) — a stored form nobody
could submit would be a dead surface, not a notification.
data (per-send prefill values and per-send options lists) and pages (the
stepped layout) are the ask-less form’s per-send extras — the same FormData/FormPage
an ask carries. They ride ONLY a form send: present without schema is a 400. When a
schema is present each is cross-checked against it by the same validator the ask door
runs — a prefill against an unknown/ill-typed property, a per-send option list on a
non-string property, or a page that omits/duplicates/misnames a property is a 400.
form_tag is the caller-set opaque per-send correlation the channel carries with the form
and hands back on submit. It rides ONLY a form send: present without schema is a 400. The
platform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it,
and it is not written to the in-app feed record.
wording is the per-send catalogue of the notification’s platform-drawn texts, grouped by
what each decorates — form (a form send’s chrome), choice (a choice list’s control
words) and status (in-flight status copy). Each member is admitted only on the surface that
draws it (a schema form, a flat options list, or a sectioned sections list); a
member on a notification with no such surface is a 400. It is display content, so an
audience-addressed send records it on the in-app feed.
audience addresses the in-app record to an identity’s feed; it is honored
even when a channel also delivers the message (channel push AND in-app record).
sender_identity is the sending identity a channel message leaves FROM, which the
conversation bridge sets on the notification it builds to answer a route; a caller may
not supply it here and a set value is rejected loudly, never forwarded to the channel.
Returns a short confirmation string — "notification sent via '<channel>'"
for a channel send, "notification recorded to the internal sink" otherwise.
The message text, an optional named channel that carries it (omit to record to the internal sink),
an optional per-call recipient delivery address, and an optional audience identity whose in-app
inbox shows it (honored even with a channel set; distinct from recipient).
The identity (user_id) whose in-app inbox shows this (honored even with a channel set); leave unset for an operator/broadcast notification. Distinct from recipient, which is a channel delivery address.
Optional per-send form data over schema: values prefills top-level properties and options supplies a per-send choice list for a string (or array-of-strings) property (replacing its enum for this send). Rides ONLY a form send — present without schema is a 400. A prefill against an unknown/ill-typed property, or an option list on a non-string property, is a 400.
Optional short trailing line under an interactive message. Like the header it COMPOSES an interactive message, so it REQUIRES options or sections; it rides the choice surface's own capability (no separate flag) and mutually exclusive with template.
Optional caller-set opaque per-send form tag the channel carries with the form and hands back on submit. Rides ONLY a form send — present without schema is a 400. Bounded as transport (an out-of-charset or over-length tag is a 400) but never interpreted; not written to the in-app feed record.
Optional single display-media header above an interactive message. It COMPOSES an interactive message, so it REQUIRES options or sections; it rides the interactive choice surface's own capability (no separate flag) and mutually exclusive with template.
Optional shared geographic point sent WITH the message (a map pin). On a named channel it requires a channel that advertises location support (else a 501); with no channel it is stored on the internal inbox record. It may carry the message content on its own (a blank message is admissible when media or a location carries it). Mutually exclusive with template.
Optional display media sent WITH the message. On a named channel it requires a channel that advertises media support (else a 501); with no channel it is stored on the internal inbox record and rendered there. Mutually exclusive with template.
Optional FLAT tappable options sent WITH the message — each a reply option (a tap submits its text as a visitor message) or a link option (a tap opens its url). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with template, sections and schema; may combine with media and location.
A tappable suggested reply.
Tapping SUBMITS text as the participant's next inbound message —
the quick-reply / list-row case, where the option's own text becomes the turn. description
is an OPTIONAL secondary line a sectioned-list row renders under its text; a channel that
renders flat buttons (no descriptions) ignores it.
id is an OPTIONAL author-set stable identifier for the button/list row. When set, a channel
sends it verbatim on the wire and the participant's tap echoes it back (a channel surfaces the echoed
id to the inbound turn as opaque enrichment — e.g. Slack forwards it as params.reply_id);
when None the channel mints its own id. Bounded by the platform abuse bound
OPTION_ID_MAX_CHARS and a single-line non-blank label; a channel with a tighter id cap
enforces it in its own code. Frozen.
Optional stepped layout over schema: each page names the top-level properties shown on one step, and across the pages every property appears exactly once. Rides ONLY a form send — present without schema is a 400. A page that omits, duplicates, or names an unknown property is a 400.
Optional form answer schema for an ask-less form: the channel renders the message as the form's prompt and this schema as the fillable form, and a submission enters the conversation as a message from the person. Requires a named channel (else a 400 — the internal sink has no submission door) that advertises form support (else a 501). Mutually exclusive with template and with options, may combine with media.
Optional SECTIONED tappable options — titled groups of reply rows, the sectioned alternative to the flat options list (rows summed across sections stay within the same cap). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with options, template and schema; may combine with media and location.
Reserved: the sending identity a channel message leaves FROM, set by the conversation bridge on the notification it builds to answer a route. Callers MUST NOT supply it here — a set value is rejected with a 400, never forwarded.
Optional pre-approved template for an out-of-window send. On a named channel it requires a channel that advertises template support (else a 501); with no channel it is stored on the internal inbox record. Mutually exclusive with media and options.
Optional per-send catalogue of the notification's platform-drawn texts, grouped by what each decorates — form (a form send's chrome), choice (a choice list's control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned list); a member on a notification with no such surface is a 400. Recorded on the in-app feed (display content, feed parity).
The adapter envelopes it as {"data": <str>}. Typed as a string rather
than wrapped, so the wire body is unchanged.
{"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/notifications/send-a-human-a-one-way-notification","slug":"/api-reference/notifications/send-a-human-a-one-way-notification","pageMetadata":{"title":"Send a human a one-way notification","description":"Send a human a one-way notification, fire-and-forget.\n\nNo reply is expected and nothing blocks. With a named channel the message is\nsent and the call returns as soon as the medium ACCEPTED it (not that a human\nsaw it). With ``channel`` omitted the message is recorded to the internal\nnotifications sink the Studio inbox reads. One send attempt, no retry; every\nfailure raises loudly, never a silent no-op:\n\n* a blank message with no media to carry it (the contract admits a blank message\n only for a media-only send), an unknown channel name, a blank recipient/audience, a\n caller-supplied ``sender_identity``, a contract-invalid ``media``/``template``/\n ``options``/``schema`` combination (an empty list/dict, an over-cap value, or a\n mutually exclusive\n media+template / options+template / schema+template / schema+options), a ``schema``\n with no channel (the internal sink has no submission door) or one the channel's form\n subset/hook refuses, or a channel's permanent refusal of the input's\n shape (retrying cannot succeed) → 400;\n* a restricted caller addressing another identity (cross-identity denial) → 403;\n* a channel that cannot notify, or does not advertise the\n ``media``/``template``/``options``/``schema`` capability the send needs → 501;\n* a transient channel delivery failure (the raised error's ``retryable``) → 503,\n carrying the medium's ``retry_after`` when it named one;\n* a permanent channel delivery refusal → 502.\n\n``media`` (display media sent with the message), ``location`` (a shared map pin),\n``template`` (a pre-approved out-of-window send), ``options`` (FLAT tappable options a tap\nof which enters the conversation), ``sections`` (the SECTIONED tappable-options\nalternative), ``header``/``footer`` (a media header / trailing line composing an interactive\nmessage) and ``schema`` (an ask-less form's answer schema — the channel renders the\nmessage as the form's prompt, and a submission enters the conversation as a message from\nthe person) are OPTIONAL richer-send forms — FULL parity with the turn answer path's\n``AnswerPart`` vocabulary. The contract's shared composition matrix is enforced on this\nrequest model identically: ``options`` XOR ``sections`` (one choice surface); ``schema``\nexcludes both; ``header``/``footer`` require a choice surface; ``template`` is the standalone\nout-of-window send exclusive with every other content/interactive field; ``options``/\n``sections`` may each combine with ``media``/``location`` (a contract-invalid combination is\na 400). On a\nnamed channel each needs a channel that advertises the matching capability\n(``media``→media, ``location``→location, ``template``→template, ``options``/``sections``→\ninteractive, ``schema``→form; ``header``/``footer`` ride the choice surface's capability, no\nflag of their own) — otherwise\nthe send is refused as a 501, never downgraded to a silent freeform send. With no\nchannel media/location/template/options/sections/header/footer are stored on the internal\ninbox record and rendered\nthere; ``schema`` alone REQUIRES a channel (a 400 without one) — a stored form nobody\ncould submit would be a dead surface, not a notification.\n\n``data`` (per-send prefill ``values`` and per-send ``options`` lists) and ``pages`` (the\nstepped layout) are the ask-less form's per-send extras — the same ``FormData``/``FormPage``\nan ask carries. They ride ONLY a form send: present without ``schema`` is a 400. When a\n``schema`` is present each is cross-checked against it by the same validator the ask door\nruns — a prefill against an unknown/ill-typed property, a per-send option list on a\nnon-string property, or a page that omits/duplicates/misnames a property is a 400.\n\n``form_tag`` is the caller-set opaque per-send correlation the channel carries with the form\nand hands back on submit. It rides ONLY a form send: present without ``schema`` is a 400. The\nplatform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it,\nand it is not written to the in-app feed record.\n\n``wording`` is the per-send catalogue of the notification's platform-drawn texts, grouped by\nwhat each decorates — ``form`` (a form send's chrome), ``choice`` (a choice list's control\nwords) and ``status`` (in-flight status copy). Each member is admitted only on the surface that\ndraws it (a ``schema`` form, a flat ``options`` list, or a sectioned ``sections`` list); a\nmember on a notification with no such surface is a 400. It is display content, so an\n``audience``-addressed send records it on the in-app feed.\n\n``audience`` addresses the in-app record to an identity's feed; it is honored\neven when a channel also delivers the message (channel push AND in-app record).\n``sender_identity`` is the sending identity a channel message leaves FROM, which the\nconversation bridge sets on the notification it builds to answer a route; a caller may\nnot supply it here and a set value is rejected loudly, never forwarded to the channel.\n\nReturns a short confirmation string — ``\"notification sent via '\u003cchannel>'\"``\nfor a channel send, ``\"notification recorded to the internal sink\"`` otherwise.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/notifications","href":"/api-reference/notifications/send-a-human-a-one-way-notification","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 li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Send a human a one-way notification, fire-and-forget.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"No reply is expected and nothing blocks. With a named channel the message is\\nsent and the call returns as soon as the medium ACCEPTED it (not that a human\\nsaw it). With \", _jsx(_components.code, {\n children: \"channel\"\n }), \" omitted the message is recorded to the internal\\nnotifications sink the Studio inbox reads. One send attempt, no retry; every\\nfailure raises loudly, never a silent no-op:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"a blank message with no media to carry it (the contract admits a blank message\\nonly for a media-only send), an unknown channel name, a blank recipient/audience, a\\ncaller-supplied \", _jsx(_components.code, {\n children: \"sender_identity\"\n }), \", a contract-invalid \", _jsx(_components.code, {\n children: \"media\"\n }), \"/\", _jsx(_components.code, {\n children: \"template\"\n }), \"/\\n\", _jsx(_components.code, {\n children: \"options\"\n }), \"/\", _jsx(_components.code, {\n children: \"schema\"\n }), \" combination (an empty list/dict, an over-cap value, or a\\nmutually exclusive\\nmedia+template / options+template / schema+template / schema+options), a \", _jsx(_components.code, {\n children: \"schema\"\n }), \"\\nwith no channel (the internal sink has no submission door) or one the channel’s form\\nsubset/hook refuses, or a channel’s permanent refusal of the input’s\\nshape (retrying cannot succeed) → 400;\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"a restricted caller addressing another identity (cross-identity denial) → 403;\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"a channel that cannot notify, or does not advertise the\\n\", _jsx(_components.code, {\n children: \"media\"\n }), \"/\", _jsx(_components.code, {\n children: \"template\"\n }), \"/\", _jsx(_components.code, {\n children: \"options\"\n }), \"/\", _jsx(_components.code, {\n children: \"schema\"\n }), \" capability the send needs → 501;\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"a transient channel delivery failure (the raised error’s \", _jsx(_components.code, {\n children: \"retryable\"\n }), \") → 503,\\ncarrying the medium’s \", _jsx(_components.code, {\n children: \"retry_after\"\n }), \" when it named one;\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"a permanent channel delivery refusal → 502.\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"media\"\n }), \" (display media sent with the message), \", _jsx(_components.code, {\n children: \"location\"\n }), \" (a shared map pin),\\n\", _jsx(_components.code, {\n children: \"template\"\n }), \" (a pre-approved out-of-window send), \", _jsx(_components.code, {\n children: \"options\"\n }), \" (FLAT tappable options a tap\\nof which enters the conversation), \", _jsx(_components.code, {\n children: \"sections\"\n }), \" (the SECTIONED tappable-options\\nalternative), \", _jsx(_components.code, {\n children: \"header\"\n }), \"/\", _jsx(_components.code, {\n children: \"footer\"\n }), \" (a media header / trailing line composing an interactive\\nmessage) and \", _jsx(_components.code, {\n children: \"schema\"\n }), \" (an ask-less form’s answer schema — the channel renders the\\nmessage as the form’s prompt, and a submission enters the conversation as a message from\\nthe person) are OPTIONAL richer-send forms — FULL parity with the turn answer path’s\\n\", _jsx(_components.code, {\n children: \"AnswerPart\"\n }), \" vocabulary. The contract’s shared composition matrix is enforced on this\\nrequest model identically: \", _jsx(_components.code, {\n children: \"options\"\n }), \" XOR \", _jsx(_components.code, {\n children: \"sections\"\n }), \" (one choice surface); \", _jsx(_components.code, {\n children: \"schema\"\n }), \"\\nexcludes both; \", _jsx(_components.code, {\n children: \"header\"\n }), \"/\", _jsx(_components.code, {\n children: \"footer\"\n }), \" require a choice surface; \", _jsx(_components.code, {\n children: \"template\"\n }), \" is the standalone\\nout-of-window send exclusive with every other content/interactive field; \", _jsx(_components.code, {\n children: \"options\"\n }), \"/\\n\", _jsx(_components.code, {\n children: \"sections\"\n }), \" may each combine with \", _jsx(_components.code, {\n children: \"media\"\n }), \"/\", _jsx(_components.code, {\n children: \"location\"\n }), \" (a contract-invalid combination is\\na 400). On a\\nnamed channel each needs a channel that advertises the matching capability\\n(\", _jsx(_components.code, {\n children: \"media\"\n }), \"→media, \", _jsx(_components.code, {\n children: \"location\"\n }), \"→location, \", _jsx(_components.code, {\n children: \"template\"\n }), \"→template, \", _jsx(_components.code, {\n children: \"options\"\n }), \"/\", _jsx(_components.code, {\n children: \"sections\"\n }), \"→\\ninteractive, \", _jsx(_components.code, {\n children: \"schema\"\n }), \"→form; \", _jsx(_components.code, {\n children: \"header\"\n }), \"/\", _jsx(_components.code, {\n children: \"footer\"\n }), \" ride the choice surface’s capability, no\\nflag of their own) — otherwise\\nthe send is refused as a 501, never downgraded to a silent freeform send. With no\\nchannel media/location/template/options/sections/header/footer are stored on the internal\\ninbox record and rendered\\nthere; \", _jsx(_components.code, {\n children: \"schema\"\n }), \" alone REQUIRES a channel (a 400 without one) — a stored form nobody\\ncould submit would be a dead surface, not a notification.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"data\"\n }), \" (per-send prefill \", _jsx(_components.code, {\n children: \"values\"\n }), \" and per-send \", _jsx(_components.code, {\n children: \"options\"\n }), \" lists) and \", _jsx(_components.code, {\n children: \"pages\"\n }), \" (the\\nstepped layout) are the ask-less form’s per-send extras — the same \", _jsx(_components.code, {\n children: \"FormData\"\n }), \"/\", _jsx(_components.code, {\n children: \"FormPage\"\n }), \"\\nan ask carries. They ride ONLY a form send: present without \", _jsx(_components.code, {\n children: \"schema\"\n }), \" is a 400. When a\\n\", _jsx(_components.code, {\n children: \"schema\"\n }), \" is present each is cross-checked against it by the same validator the ask door\\nruns — a prefill against an unknown/ill-typed property, a per-send option list on a\\nnon-string property, or a page that omits/duplicates/misnames a property is a 400.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"form_tag\"\n }), \" is the caller-set opaque per-send correlation the channel carries with the form\\nand hands back on submit. It rides ONLY a form send: present without \", _jsx(_components.code, {\n children: \"schema\"\n }), \" is a 400. The\\nplatform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it,\\nand it is not written to the in-app feed record.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"wording\"\n }), \" is the per-send catalogue of the notification’s platform-drawn texts, grouped by\\nwhat each decorates — \", _jsx(_components.code, {\n children: \"form\"\n }), \" (a form send’s chrome), \", _jsx(_components.code, {\n children: \"choice\"\n }), \" (a choice list’s control\\nwords) and \", _jsx(_components.code, {\n children: \"status\"\n }), \" (in-flight status copy). Each member is admitted only on the surface that\\ndraws it (a \", _jsx(_components.code, {\n children: \"schema\"\n }), \" form, a flat \", _jsx(_components.code, {\n children: \"options\"\n }), \" list, or a sectioned \", _jsx(_components.code, {\n children: \"sections\"\n }), \" list); a\\nmember on a notification with no such surface is a 400. It is display content, so an\\n\", _jsx(_components.code, {\n children: \"audience\"\n }), \"-addressed send records it on the in-app feed.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"audience\"\n }), \" addresses the in-app record to an identity’s feed; it is honored\\neven when a channel also delivers the message (channel push AND in-app record).\\n\", _jsx(_components.code, {\n children: \"sender_identity\"\n }), \" is the sending identity a channel message leaves FROM, which the\\nconversation bridge sets on the notification it builds to answer a route; a caller may\\nnot supply it here and a set value is rejected loudly, never forwarded to the channel.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Returns a short confirmation string — \", _jsx(_components.code, {\n children: \"\\\"notification sent via '\u003cchannel>'\\\"\"\n }), \"\\nfor a channel send, \", _jsx(_components.code, {\n children: \"\\\"notification recorded to the internal sink\\\"\"\n }), \" otherwise.\"]\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":"Send a human a one-way notification","description":"Send a human a one-way notification, fire-and-forget.\n\nNo reply is expected and nothing blocks. With a named channel the message is\nsent and the call returns as soon as the medium ACCEPTED it (not that a human\nsaw it). With ``channel`` omitted the message is recorded to the internal\nnotifications sink the Studio inbox reads. One send attempt, no retry; every\nfailure raises loudly, never a silent no-op:\n\n* a blank message with no media to carry it (the contract admits a blank message\n only for a media-only send), an unknown channel name, a blank recipient/audience, a\n caller-supplied ``sender_identity``, a contract-invalid ``media``/``template``/\n ``options``/``schema`` combination (an empty list/dict, an over-cap value, or a\n mutually exclusive\n media+template / options+template / schema+template / schema+options), a ``schema``\n with no channel (the internal sink has no submission door) or one the channel's form\n subset/hook refuses, or a channel's permanent refusal of the input's\n shape (retrying cannot succeed) → 400;\n* a restricted caller addressing another identity (cross-identity denial) → 403;\n* a channel that cannot notify, or does not advertise the\n ``media``/``template``/``options``/``schema`` capability the send needs → 501;\n* a transient channel delivery failure (the raised error's ``retryable``) → 503,\n carrying the medium's ``retry_after`` when it named one;\n* a permanent channel delivery refusal → 502.\n\n``media`` (display media sent with the message), ``location`` (a shared map pin),\n``template`` (a pre-approved out-of-window send), ``options`` (FLAT tappable options a tap\nof which enters the conversation), ``sections`` (the SECTIONED tappable-options\nalternative), ``header``/``footer`` (a media header / trailing line composing an interactive\nmessage) and ``schema`` (an ask-less form's answer schema — the channel renders the\nmessage as the form's prompt, and a submission enters the conversation as a message from\nthe person) are OPTIONAL richer-send forms — FULL parity with the turn answer path's\n``AnswerPart`` vocabulary. The contract's shared composition matrix is enforced on this\nrequest model identically: ``options`` XOR ``sections`` (one choice surface); ``schema``\nexcludes both; ``header``/``footer`` require a choice surface; ``template`` is the standalone\nout-of-window send exclusive with every other content/interactive field; ``options``/\n``sections`` may each combine with ``media``/``location`` (a contract-invalid combination is\na 400). On a\nnamed channel each needs a channel that advertises the matching capability\n(``media``→media, ``location``→location, ``template``→template, ``options``/``sections``→\ninteractive, ``schema``→form; ``header``/``footer`` ride the choice surface's capability, no\nflag of their own) — otherwise\nthe send is refused as a 501, never downgraded to a silent freeform send. With no\nchannel media/location/template/options/sections/header/footer are stored on the internal\ninbox record and rendered\nthere; ``schema`` alone REQUIRES a channel (a 400 without one) — a stored form nobody\ncould submit would be a dead surface, not a notification.\n\n``data`` (per-send prefill ``values`` and per-send ``options`` lists) and ``pages`` (the\nstepped layout) are the ask-less form's per-send extras — the same ``FormData``/``FormPage``\nan ask carries. They ride ONLY a form send: present without ``schema`` is a 400. When a\n``schema`` is present each is cross-checked against it by the same validator the ask door\nruns — a prefill against an unknown/ill-typed property, a per-send option list on a\nnon-string property, or a page that omits/duplicates/misnames a property is a 400.\n\n``form_tag`` is the caller-set opaque per-send correlation the channel carries with the form\nand hands back on submit. It rides ONLY a form send: present without ``schema`` is a 400. The\nplatform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it,\nand it is not written to the in-app feed record.\n\n``wording`` is the per-send catalogue of the notification's platform-drawn texts, grouped by\nwhat each decorates — ``form`` (a form send's chrome), ``choice`` (a choice list's control\nwords) and ``status`` (in-flight status copy). Each member is admitted only on the surface that\ndraws it (a ``schema`` form, a flat ``options`` list, or a sectioned ``sections`` list); a\nmember on a notification with no such surface is a 400. It is display content, so an\n``audience``-addressed send records it on the in-app feed.\n\n``audience`` addresses the in-app record to an identity's feed; it is honored\neven when a channel also delivers the message (channel push AND in-app record).\n``sender_identity`` is the sending identity a channel message leaves FROM, which the\nconversation bridge sets on the notification it builds to answer a route; a caller may\nnot supply it here and a set value is rejected loudly, never forwarded to the channel.\n\nReturns a short confirmation string — ``\"notification sent via '\u003cchannel>'\"``\nfor a channel send, ``\"notification recorded to the internal sink\"`` otherwise.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/notifications","href":"/api-reference/notifications/send-a-human-a-one-way-notification","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Send a human a one-way notification, fire-and-forget.\n\nNo reply is expected and nothing blocks. With a named channel the message is\nsent and the call returns as soon as the medium ACCEPTED it (not that a human\nsaw it). With ``channel`` omitted the message is recorded to the internal\nnotifications sink the Studio inbox reads. One send attempt, no retry; every\nfailure raises loudly, never a silent no-op:\n\n* a blank message with no media to carry it (the contract admits a blank message\n only for a media-only send), an unknown channel name, a blank recipient/audience, a\n caller-supplied ``sender_identity``, a contract-invalid ``media``/``template``/\n ``options``/``schema`` combination (an empty list/dict, an over-cap value, or a\n mutually exclusive\n media+template / options+template / schema+template / schema+options), a ``schema``\n with no channel (the internal sink has no submission door) or one the channel's form\n subset/hook refuses, or a channel's permanent refusal of the input's\n shape (retrying cannot succeed) → 400;\n* a restricted caller addressing another identity (cross-identity denial) → 403;\n* a channel that cannot notify, or does not advertise the\n ``media``/``template``/``options``/``schema`` capability the send needs → 501;\n* a transient channel delivery failure (the raised error's ``retryable``) → 503,\n carrying the medium's ``retry_after`` when it named one;\n* a permanent channel delivery refusal → 502.\n\n``media`` (display media sent with the message), ``location`` (a shared map pin),\n``template`` (a pre-approved out-of-window send), ``options`` (FLAT tappable options a tap\nof which enters the conversation), ``sections`` (the SECTIONED tappable-options\nalternative), ``header``/``footer`` (a media header / trailing line composing an interactive\nmessage) and ``schema`` (an ask-less form's answer schema — the channel renders the\nmessage as the form's prompt, and a submission enters the conversation as a message from\nthe person) are OPTIONAL richer-send forms — FULL parity with the turn answer path's\n``AnswerPart`` vocabulary. The contract's shared composition matrix is enforced on this\nrequest model identically: ``options`` XOR ``sections`` (one choice surface); ``schema``\nexcludes both; ``header``/``footer`` require a choice surface; ``template`` is the standalone\nout-of-window send exclusive with every other content/interactive field; ``options``/\n``sections`` may each combine with ``media``/``location`` (a contract-invalid combination is\na 400). On a\nnamed channel each needs a channel that advertises the matching capability\n(``media``→media, ``location``→location, ``template``→template, ``options``/``sections``→\ninteractive, ``schema``→form; ``header``/``footer`` ride the choice surface's capability, no\nflag of their own) — otherwise\nthe send is refused as a 501, never downgraded to a silent freeform send. With no\nchannel media/location/template/options/sections/header/footer are stored on the internal\ninbox record and rendered\nthere; ``schema`` alone REQUIRES a channel (a 400 without one) — a stored form nobody\ncould submit would be a dead surface, not a notification.\n\n``data`` (per-send prefill ``values`` and per-send ``options`` lists) and ``pages`` (the\nstepped layout) are the ask-less form's per-send extras — the same ``FormData``/``FormPage``\nan ask carries. They ride ONLY a form send: present without ``schema`` is a 400. When a\n``schema`` is present each is cross-checked against it by the same validator the ask door\nruns — a prefill against an unknown/ill-typed property, a per-send option list on a\nnon-string property, or a page that omits/duplicates/misnames a property is a 400.\n\n``form_tag`` is the caller-set opaque per-send correlation the channel carries with the form\nand hands back on submit. It rides ONLY a form send: present without ``schema`` is a 400. The\nplatform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it,\nand it is not written to the in-app feed record.\n\n``wording`` is the per-send catalogue of the notification's platform-drawn texts, grouped by\nwhat each decorates — ``form`` (a form send's chrome), ``choice`` (a choice list's control\nwords) and ``status`` (in-flight status copy). Each member is admitted only on the surface that\ndraws it (a ``schema`` form, a flat ``options`` list, or a sectioned ``sections`` list); a\nmember on a notification with no such surface is a 400. It is display content, so an\n``audience``-addressed send records it on the in-app feed.\n\n``audience`` addresses the in-app record to an identity's feed; it is honored\neven when a channel also delivers the message (channel push AND in-app record).\n``sender_identity`` is the sending identity a channel message leaves FROM, which the\nconversation bridge sets on the notification it builds to answer a route; a caller may\nnot supply it here and a set value is rejected loudly, never forwarded to the channel.\n\nReturns a short confirmation string — ``\"notification sent via '\u003cchannel>'\"``\nfor a channel send, ``\"notification recorded to the internal sink\"`` otherwise.","operationId":"post_api_notifications","requestBody":"b8cce7b2-47f0-4d89-821b-dacb482075d6","responses":{"200":"c979ead8-7d96-4fdb-9862-77fb13c126c1","400":"0c51638e-fed3-4785-aca9-6909390636c9","401":"e2a60b81-10ab-4a10-b2a8-bb0e2613ff7e","403":"f5160c51-84c6-4758-98bf-9c833d6cb9e1","501":"5e1aaafc-20dd-4ad4-bf4a-a44259f31eb3","502":"92f70210-0fca-4ca9-9096-f366235affd1","503":"1c12e8ad-da73-4e80-96ce-46c5c853fc88"},"security":["54c011ae-22bb-41c9-bd52-4cbc53be1028"],"summary":"Send a human a one-way notification","tags":["notifications"],"x-destructive":true,"method":"post","type":"path","servers":[],"path":"/api/notifications","baseUrlOptions":[],"title":"Send a human a one-way notification","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"A notification to send.\n\nThe ``message`` text, an optional named ``channel`` that carries it (omit to record to the internal sink),\nan optional per-call ``recipient`` delivery address, and an optional ``audience`` identity whose in-app\ninbox shows it (honored even with a channel set; distinct from ``recipient``).","properties":{"message":{"title":"Message","type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"audience":{"oneOf":[{"type":"string","title":"Audience","description":"The identity (user_id) whose in-app inbox shows this (honored even with a channel set); leave unset for an operator/broadcast notification. Distinct from recipient, which is a channel delivery address.","uniqueKey":"audience.oneOf.0","typeLabel":"string"},{"type":"null","title":"Audience","description":"The identity (user_id) whose in-app inbox shows this (honored even with a channel set); leave unset for an operator/broadcast notification. Distinct from recipient, which is a channel delivery address.","uniqueKey":"audience.oneOf.1","typeLabel":"null"}],"uniqueKey":"audience","typeLabel":"string | null"},"channel":{"oneOf":[{"type":"string","title":"Channel","uniqueKey":"channel.oneOf.0","typeLabel":"string"},{"type":"null","title":"Channel","uniqueKey":"channel.oneOf.1","typeLabel":"null"}],"uniqueKey":"channel","typeLabel":"string | null"},"data":{"oneOf":[{"type":"object","title":"FormData","description":"Optional per-send form data over schema: values prefills top-level properties and options supplies a per-send choice list for a string (or array-of-strings) property (replacing its enum for this send). Rides ONLY a form send — present without schema is a 400. A prefill against an unknown/ill-typed property, or an option list on a non-string property, is a 400.","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.oneOf.0.options.additionalProperties.items.[INDEX].value","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].description","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX].label","typeLabel":"string | null"}},"required":["value"],"title":"FormOption","type":"object","uniqueKey":"data.oneOf.0.options.additionalProperties.items.[INDEX]","typeLabel":"FormOption · object"},"type":"array","uniqueKey":"data.oneOf.0.options.additionalProperties","typeLabel":"FormOption · object[]"},"default":{},"title":"Options","type":"object","uniqueKey":"data.oneOf.0.options","typeLabel":"Options · object"},"values":{"additionalProperties":true,"default":{},"title":"Values","type":"object","uniqueKey":"data.oneOf.0.values","typeLabel":"Values · object"}},"additionalProperties":false,"uniqueKey":"data.oneOf.0","typeLabel":"FormData · object"},{"type":"null","description":"Optional per-send form data over schema: values prefills top-level properties and options supplies a per-send choice list for a string (or array-of-strings) property (replacing its enum for this send). Rides ONLY a form send — present without schema is a 400. A prefill against an unknown/ill-typed property, or an option list on a non-string property, is a 400.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"FormData · object | null"},"footer":{"oneOf":[{"type":"string","title":"Footer","description":"Optional short trailing line under an interactive message. Like the header it COMPOSES an interactive message, so it REQUIRES options or sections; it rides the choice surface's own capability (no separate flag) and mutually exclusive with template.","uniqueKey":"footer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Footer","description":"Optional short trailing line under an interactive message. Like the header it COMPOSES an interactive message, so it REQUIRES options or sections; it rides the choice surface's own capability (no separate flag) and mutually exclusive with template.","uniqueKey":"footer.oneOf.1","typeLabel":"null"}],"uniqueKey":"footer","typeLabel":"string | null"},"form_tag":{"oneOf":[{"type":"string","title":"Form Tag","description":"Optional caller-set opaque per-send form tag the channel carries with the form and hands back on submit. Rides ONLY a form send — present without schema is a 400. Bounded as transport (an out-of-charset or over-length tag is a 400) but never interpreted; not written to the in-app feed record.","uniqueKey":"form_tag.oneOf.0","typeLabel":"string"},{"type":"null","title":"Form Tag","description":"Optional caller-set opaque per-send form tag the channel carries with the form and hands back on submit. Rides ONLY a form send — present without schema is a 400. Bounded as transport (an out-of-charset or over-length tag is a 400) but never interpreted; not written to the in-app feed record.","uniqueKey":"form_tag.oneOf.1","typeLabel":"null"}],"uniqueKey":"form_tag","typeLabel":"string | null"},"header":{"oneOf":[{"type":"object","title":"MediaItem","description":"Optional single display-media header above an interactive message. It COMPOSES an interactive message, so it REQUIRES options or sections; it rides the interactive choice surface's own capability (no separate flag) and mutually exclusive with template.","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":"header.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"header.oneOf.0.url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"header.oneOf.0.caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"header.oneOf.0.caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"header.oneOf.0.caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"header.oneOf.0.filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"header.oneOf.0.filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"header.oneOf.0.filename","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"header.oneOf.0","typeLabel":"MediaItem · object"},{"type":"null","description":"Optional single display-media header above an interactive message. It COMPOSES an interactive message, so it REQUIRES options or sections; it rides the interactive choice surface's own capability (no separate flag) and mutually exclusive with template.","uniqueKey":"header.oneOf.1","typeLabel":"null"}],"uniqueKey":"header","typeLabel":"MediaItem · object | null"},"location":{"oneOf":[{"type":"object","title":"LocationElement","description":"Optional shared geographic point sent WITH the message (a map pin). On a named channel it requires a channel that advertises location support (else a 501); with no channel it is stored on the internal inbox record. It may carry the message content on its own (a blank message is admissible when media or a location carries it). Mutually exclusive with template.","required":["latitude","longitude"],"properties":{"latitude":{"title":"Latitude","type":"number","isRequired":true,"uniqueKey":"location.oneOf.0.latitude","typeLabel":"number"},"longitude":{"title":"Longitude","type":"number","isRequired":true,"uniqueKey":"location.oneOf.0.longitude","typeLabel":"number"},"address":{"oneOf":[{"type":"string","title":"Address","uniqueKey":"location.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","title":"Address","uniqueKey":"location.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.address","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","uniqueKey":"location.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"location.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.name","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"location.oneOf.0","typeLabel":"LocationElement · object"},{"type":"null","description":"Optional shared geographic point sent WITH the message (a map pin). On a named channel it requires a channel that advertises location support (else a 501); with no channel it is stored on the internal inbox record. It may carry the message content on its own (a blank message is admissible when media or a location carries it). Mutually exclusive with template.","uniqueKey":"location.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"media.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"media.oneOf.0.items.[INDEX].url","typeLabel":"string"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"media.oneOf.0.items.[INDEX].caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"media.oneOf.0.items.[INDEX].caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"media.oneOf.0.items.[INDEX].caption","typeLabel":"string | null"},"filename":{"oneOf":[{"type":"string","title":"Filename","uniqueKey":"media.oneOf.0.items.[INDEX].filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Filename","uniqueKey":"media.oneOf.0.items.[INDEX].filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"media.oneOf.0.items.[INDEX].filename","typeLabel":"string | null"}},"required":["kind","url"],"title":"MediaItem","type":"object","uniqueKey":"media.oneOf.0.items.[INDEX]","typeLabel":"MediaItem · object"},"title":"Media","description":"Optional display media sent WITH the message. On a named channel it requires a channel that advertises media support (else a 501); with no channel it is stored on the internal inbox record and rendered there. Mutually exclusive with template.","uniqueKey":"media.oneOf.0","typeLabel":"MediaItem · object[]"},{"type":"null","title":"Media","description":"Optional display media sent WITH the message. On a named channel it requires a channel that advertises media support (else a 501); with no channel it is stored on the internal inbox record and rendered there. Mutually exclusive with template.","uniqueKey":"media.oneOf.1","typeLabel":"null"}],"uniqueKey":"media","typeLabel":"MediaItem · object[] | null"},"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":"options.oneOf.0.items.[INDEX].oneOf.0.text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.0.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"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":"options.oneOf.0.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"title":"Url","type":"string","isRequired":true,"uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.1.url","typeLabel":"string"},"kind":{"const":"link","default":"link","title":"Kind","type":"string","uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.1.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"options.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"LinkOption · object"}],"uniqueKey":"options.oneOf.0.items.[INDEX]","typeLabel":"ReplyOption · object | LinkOption · object"},"title":"Options","description":"Optional FLAT tappable options sent WITH the message — each a reply option (a tap submits its text as a visitor message) or a link option (a tap opens its url). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with template, sections and schema; may combine with media and location.","uniqueKey":"options.oneOf.0","typeLabel":"(ReplyOption · object | LinkOption · object)[]"},{"type":"null","title":"Options","description":"Optional FLAT tappable options sent WITH the message — each a reply option (a tap submits its text as a visitor message) or a link option (a tap opens its url). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with template, sections and schema; may combine with media and location.","uniqueKey":"options.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"pages.oneOf.0.items.[INDEX].fields.items.[INDEX]","typeLabel":"string"},"title":"Fields","type":"array","isRequired":true,"uniqueKey":"pages.oneOf.0.items.[INDEX].fields","typeLabel":"string[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"pages.oneOf.0.items.[INDEX].title","typeLabel":"string"},"button_label":{"oneOf":[{"type":"string","title":"Button Label","uniqueKey":"pages.oneOf.0.items.[INDEX].button_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Button Label","uniqueKey":"pages.oneOf.0.items.[INDEX].button_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"alt":{"oneOf":[{"type":"string","title":"Alt","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.0","typeLabel":"string"},{"type":"null","title":"Alt","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt.oneOf.1","typeLabel":"null"}],"uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].alt","typeLabel":"string | null"},"slot":{"oneOf":[{"type":"string","title":"Slot","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.0","typeLabel":"string"},{"type":"null","title":"Slot","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot.oneOf.1","typeLabel":"null"}],"uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].slot","typeLabel":"string | null"},"src":{"oneOf":[{"type":"string","title":"Src","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.0","typeLabel":"string"},{"type":"null","title":"Src","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].src.oneOf.1","typeLabel":"null"}],"uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].src","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].text.oneOf.1","typeLabel":"null"}],"uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX].text","typeLabel":"string | null"}},"required":["kind"],"title":"DisplayBlock","type":"object","uniqueKey":"pages.oneOf.0.items.[INDEX].display.items.[INDEX]","typeLabel":"DisplayBlock · object"},"title":"Display","type":"array","uniqueKey":"pages.oneOf.0.items.[INDEX].display","typeLabel":"DisplayBlock · object[]"},"kind":{"default":"input","enum":["input","review"],"title":"Kind","type":"string","uniqueKey":"pages.oneOf.0.items.[INDEX].kind","typeLabel":"enum\u003cstring>"}},"required":["title","fields"],"title":"FormPage","type":"object","uniqueKey":"pages.oneOf.0.items.[INDEX]","typeLabel":"FormPage · object"},"title":"Pages","description":"Optional stepped layout over schema: each page names the top-level properties shown on one step, and across the pages every property appears exactly once. Rides ONLY a form send — present without schema is a 400. A page that omits, duplicates, or names an unknown property is a 400.","uniqueKey":"pages.oneOf.0","typeLabel":"FormPage · object[]"},{"type":"null","title":"Pages","description":"Optional stepped layout over schema: each page names the top-level properties shown on one step, and across the pages every property appears exactly once. Rides ONLY a form send — present without schema is a 400. A page that omits, duplicates, or names an unknown property is a 400.","uniqueKey":"pages.oneOf.1","typeLabel":"null"}],"uniqueKey":"pages","typeLabel":"FormPage · object[] | null"},"recipient":{"oneOf":[{"type":"string","title":"Recipient","uniqueKey":"recipient.oneOf.0","typeLabel":"string"},{"type":"null","title":"Recipient","uniqueKey":"recipient.oneOf.1","typeLabel":"null"}],"uniqueKey":"recipient","typeLabel":"string | null"},"schema":{"oneOf":[{"type":"object","title":"Schema","description":"Optional form answer schema for an ask-less form: the channel renders the message as the form's prompt and this schema as the fillable form, and a submission enters the conversation as a message from the person. Requires a named channel (else a 400 — the internal sink has no submission door) that advertises form support (else a 501). Mutually exclusive with template and with options, may combine with media.","additionalProperties":true,"uniqueKey":"schema.oneOf.0","typeLabel":"Schema · object"},{"type":"null","title":"Schema","description":"Optional form answer schema for an ask-less form: the channel renders the message as the form's prompt and this schema as the fillable form, and a submission enters the conversation as a message from the person. Requires a named channel (else a 400 — the internal sink has no submission door) that advertises form support (else a 501). Mutually exclusive with template and with options, may combine with media.","uniqueKey":"schema.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].text","typeLabel":"string"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].description","typeLabel":"string | null"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].id","typeLabel":"string | null"},"kind":{"const":"reply","default":"reply","title":"Kind","type":"string","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX].kind","typeLabel":"string"}},"required":["text"],"title":"ReplyOption","type":"object","uniqueKey":"sections.oneOf.0.items.[INDEX].rows.items.[INDEX]","typeLabel":"ReplyOption · object"},"title":"Rows","type":"array","isRequired":true,"uniqueKey":"sections.oneOf.0.items.[INDEX].rows","typeLabel":"ReplyOption · object[]"},"title":{"title":"Title","type":"string","isRequired":true,"uniqueKey":"sections.oneOf.0.items.[INDEX].title","typeLabel":"string"}},"required":["title","rows"],"title":"OptionSection","type":"object","uniqueKey":"sections.oneOf.0.items.[INDEX]","typeLabel":"OptionSection · object"},"title":"Sections","description":"Optional SECTIONED tappable options — titled groups of reply rows, the sectioned alternative to the flat options list (rows summed across sections stay within the same cap). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with options, template and schema; may combine with media and location.","uniqueKey":"sections.oneOf.0","typeLabel":"OptionSection · object[]"},{"type":"null","title":"Sections","description":"Optional SECTIONED tappable options — titled groups of reply rows, the sectioned alternative to the flat options list (rows summed across sections stay within the same cap). On a named channel it requires a channel that advertises interactive support (else a 501); with no channel it is stored on the internal inbox record. One message carries ONE interactive surface: mutually exclusive with options, template and schema; may combine with media and location.","uniqueKey":"sections.oneOf.1","typeLabel":"null"}],"uniqueKey":"sections","typeLabel":"OptionSection · object[] | null"},"sender_identity":{"oneOf":[{"type":"string","title":"Sender Identity","description":"Reserved: the sending identity a channel message leaves FROM, set by the conversation bridge on the notification it builds to answer a route. Callers MUST NOT supply it here — a set value is rejected with a 400, never forwarded.","uniqueKey":"sender_identity.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sender Identity","description":"Reserved: the sending identity a channel message leaves FROM, set by the conversation bridge on the notification it builds to answer a route. Callers MUST NOT supply it here — a set value is rejected with a 400, never forwarded.","uniqueKey":"sender_identity.oneOf.1","typeLabel":"null"}],"uniqueKey":"sender_identity","typeLabel":"string | null"},"template":{"oneOf":[{"type":"object","title":"ChannelTemplate","description":"Optional pre-approved template for an out-of-window send. On a named channel it requires a channel that advertises template support (else a 501); with no channel it is stored on the internal inbox record. Mutually exclusive with media and options.","required":["name","language"],"properties":{"language":{"title":"Language","type":"string","isRequired":true,"uniqueKey":"template.oneOf.0.language","typeLabel":"string"},"name":{"title":"Name","type":"string","isRequired":true,"uniqueKey":"template.oneOf.0.name","typeLabel":"string"},"parameters":{"oneOf":[{"type":"object","title":"Parameters","additionalProperties":true,"uniqueKey":"template.oneOf.0.parameters.oneOf.0","typeLabel":"Parameters · object"},{"type":"null","title":"Parameters","uniqueKey":"template.oneOf.0.parameters.oneOf.1","typeLabel":"null"}],"uniqueKey":"template.oneOf.0.parameters","typeLabel":"Parameters · object | null"}},"additionalProperties":false,"uniqueKey":"template.oneOf.0","typeLabel":"ChannelTemplate · object"},{"type":"null","description":"Optional pre-approved template for an out-of-window send. On a named channel it requires a channel that advertises template support (else a 501); with no channel it is stored on the internal inbox record. Mutually exclusive with media and options.","uniqueKey":"template.oneOf.1","typeLabel":"null"}],"uniqueKey":"template","typeLabel":"ChannelTemplate · object | null"},"wording":{"oneOf":[{"type":"object","title":"Wording","description":"Optional per-send catalogue of the notification's platform-drawn texts, grouped by what each decorates — form (a form send's chrome), choice (a choice list's control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned list); a member on a notification with no such surface is a 400. Recorded on the in-app feed (display content, feed parity).","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":"wording.oneOf.0.answer.oneOf.0.confirm.oneOf.0","typeLabel":"string"},{"type":"null","title":"Confirm","uniqueKey":"wording.oneOf.0.answer.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.confirm","typeLabel":"string | null"},"decline":{"oneOf":[{"type":"string","title":"Decline","uniqueKey":"wording.oneOf.0.answer.oneOf.0.decline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Decline","uniqueKey":"wording.oneOf.0.answer.oneOf.0.decline.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.decline","typeLabel":"string | null"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"wording.oneOf.0.answer.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"wording.oneOf.0.answer.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.open","typeLabel":"string | null"},"rejected":{"oneOf":[{"type":"string","title":"Rejected","uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected","uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected","typeLabel":"string | null"},"rejected_final":{"oneOf":[{"type":"string","title":"Rejected Final","uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.0","typeLabel":"string"},{"type":"null","title":"Rejected Final","uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected_final.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.rejected_final","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"wording.oneOf.0.answer.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.reply_hint","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"wording.oneOf.0.answer.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"wording.oneOf.0.answer.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer.oneOf.0.submit","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer.oneOf.0","typeLabel":"AnswerWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.awaiting.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.confirm.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.done.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choose One","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.choose_one","typeLabel":"string | null"},"date_unavailable":{"oneOf":[{"type":"string","title":"Date Unavailable","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Date Unavailable","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.date_unavailable","typeLabel":"string | null"},"failed":{"oneOf":[{"type":"string","title":"Failed","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Failed","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.failed","typeLabel":"string | null"},"network_error":{"oneOf":[{"type":"string","title":"Network Error","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.0","typeLabel":"string"},{"type":"null","title":"Network Error","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0.network_error","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.0","typeLabel":"FormPageWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.0","typeLabel":"string"},{"type":"null","title":"Heading","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.heading","typeLabel":"string | null"},"text":{"oneOf":[{"type":"string","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.0","typeLabel":"string"},{"type":"null","title":"Text","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0.text","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.0","typeLabel":"PageCopy · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0.submitted","typeLabel":"PageCopy · object | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.answer_page.oneOf.0","typeLabel":"AnswerPageWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.answer_page.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.choice.oneOf.0.group_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Group Label","uniqueKey":"wording.oneOf.0.choice.oneOf.0.group_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.choice.oneOf.0.group_label","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","title":"Label","uniqueKey":"wording.oneOf.0.choice.oneOf.0.label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Label","uniqueKey":"wording.oneOf.0.choice.oneOf.0.label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.choice.oneOf.0.label","typeLabel":"string | null"},"reply_hint":{"oneOf":[{"type":"string","title":"Reply Hint","uniqueKey":"wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply Hint","uniqueKey":"wording.oneOf.0.choice.oneOf.0.reply_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.choice.oneOf.0.reply_hint","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.choice.oneOf.0","typeLabel":"ChoiceWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.choice.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.form.oneOf.0.back.oneOf.0","typeLabel":"string"},{"type":"null","title":"Back","uniqueKey":"wording.oneOf.0.form.oneOf.0.back.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.back","typeLabel":"string | null"},"cancel":{"oneOf":[{"type":"string","title":"Cancel","uniqueKey":"wording.oneOf.0.form.oneOf.0.cancel.oneOf.0","typeLabel":"string"},{"type":"null","title":"Cancel","uniqueKey":"wording.oneOf.0.form.oneOf.0.cancel.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.cancel","typeLabel":"string | null"},"error_line":{"oneOf":[{"type":"string","title":"Error Line","uniqueKey":"wording.oneOf.0.form.oneOf.0.error_line.oneOf.0","typeLabel":"string"},{"type":"null","title":"Error Line","uniqueKey":"wording.oneOf.0.form.oneOf.0.error_line.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Add Item","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.add_item","typeLabel":"string | null"},"choice_label":{"oneOf":[{"type":"string","title":"Choice Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Choice Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.choice_label","typeLabel":"string | null"},"false_label":{"oneOf":[{"type":"string","title":"False Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"False Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.false_label","typeLabel":"string | null"},"invalid":{"oneOf":[{"type":"string","title":"Invalid","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.0","typeLabel":"string"},{"type":"null","title":"Invalid","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.invalid","typeLabel":"string | null"},"item_label":{"oneOf":[{"type":"string","title":"Item Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"Item Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.item_label","typeLabel":"string | null"},"length_hint":{"oneOf":[{"type":"string","title":"Length Hint","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.0","typeLabel":"string"},{"type":"null","title":"Length Hint","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.length_hint","typeLabel":"string | null"},"no_items":{"oneOf":[{"type":"string","title":"No Items","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.0","typeLabel":"string"},{"type":"null","title":"No Items","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.no_items","typeLabel":"string | null"},"remove_item":{"oneOf":[{"type":"string","title":"Remove Item","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.0","typeLabel":"string"},{"type":"null","title":"Remove Item","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.remove_item","typeLabel":"string | null"},"required":{"oneOf":[{"type":"string","title":"Required","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.0","typeLabel":"string"},{"type":"null","title":"Required","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.required","typeLabel":"string | null"},"true_label":{"oneOf":[{"type":"string","title":"True Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.0","typeLabel":"string"},{"type":"null","title":"True Label","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties.true_label","typeLabel":"string | null"}},"title":"FieldWording","type":"object","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields.additionalProperties","typeLabel":"FieldWording · object"},"default":{},"title":"Fields","type":"object","uniqueKey":"wording.oneOf.0.form.oneOf.0.fields","typeLabel":"Fields · object"},"open":{"oneOf":[{"type":"string","title":"Open","uniqueKey":"wording.oneOf.0.form.oneOf.0.open.oneOf.0","typeLabel":"string"},{"type":"null","title":"Open","uniqueKey":"wording.oneOf.0.form.oneOf.0.open.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.open","typeLabel":"string | null"},"review_empty":{"oneOf":[{"type":"string","title":"Review Empty","uniqueKey":"wording.oneOf.0.form.oneOf.0.review_empty.oneOf.0","typeLabel":"string"},{"type":"null","title":"Review Empty","uniqueKey":"wording.oneOf.0.form.oneOf.0.review_empty.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.review_empty","typeLabel":"string | null"},"step_progress":{"oneOf":[{"type":"string","title":"Step Progress","uniqueKey":"wording.oneOf.0.form.oneOf.0.step_progress.oneOf.0","typeLabel":"string"},{"type":"null","title":"Step Progress","uniqueKey":"wording.oneOf.0.form.oneOf.0.step_progress.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.step_progress","typeLabel":"string | null"},"submit":{"oneOf":[{"type":"string","title":"Submit","uniqueKey":"wording.oneOf.0.form.oneOf.0.submit.oneOf.0","typeLabel":"string"},{"type":"null","title":"Submit","uniqueKey":"wording.oneOf.0.form.oneOf.0.submit.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.submit","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","title":"Title","uniqueKey":"wording.oneOf.0.form.oneOf.0.title.oneOf.0","typeLabel":"string"},{"type":"null","title":"Title","uniqueKey":"wording.oneOf.0.form.oneOf.0.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.title","typeLabel":"string | null"},"update_failed":{"oneOf":[{"type":"string","title":"Update Failed","uniqueKey":"wording.oneOf.0.form.oneOf.0.update_failed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Update Failed","uniqueKey":"wording.oneOf.0.form.oneOf.0.update_failed.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.form.oneOf.0.update_failed","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.form.oneOf.0","typeLabel":"FormWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.form.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answer Link","uniqueKey":"wording.oneOf.0.lines.oneOf.0.answer_link.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.lines.oneOf.0.answer_link","typeLabel":"string | null"},"deadline":{"oneOf":[{"type":"string","title":"Deadline","uniqueKey":"wording.oneOf.0.lines.oneOf.0.deadline.oneOf.0","typeLabel":"string"},{"type":"null","title":"Deadline","uniqueKey":"wording.oneOf.0.lines.oneOf.0.deadline.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.lines.oneOf.0.deadline","typeLabel":"string | null"},"options":{"oneOf":[{"type":"string","title":"Options","uniqueKey":"wording.oneOf.0.lines.oneOf.0.options.oneOf.0","typeLabel":"string"},{"type":"null","title":"Options","uniqueKey":"wording.oneOf.0.lines.oneOf.0.options.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.lines.oneOf.0.options","typeLabel":"string | null"},"reply":{"oneOf":[{"type":"string","title":"Reply","uniqueKey":"wording.oneOf.0.lines.oneOf.0.reply.oneOf.0","typeLabel":"string"},{"type":"null","title":"Reply","uniqueKey":"wording.oneOf.0.lines.oneOf.0.reply.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.lines.oneOf.0.reply","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.lines.oneOf.0","typeLabel":"LineWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.lines.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.status.oneOf.0.answered.oneOf.0","typeLabel":"string"},{"type":"null","title":"Answered","uniqueKey":"wording.oneOf.0.status.oneOf.0.answered.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.answered","typeLabel":"string | null"},"closed":{"oneOf":[{"type":"string","title":"Closed","uniqueKey":"wording.oneOf.0.status.oneOf.0.closed.oneOf.0","typeLabel":"string"},{"type":"null","title":"Closed","uniqueKey":"wording.oneOf.0.status.oneOf.0.closed.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"One Second Left","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.one_second_left","typeLabel":"string | null"},"seconds_left":{"oneOf":[{"type":"string","title":"Seconds Left","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.0","typeLabel":"string"},{"type":"null","title":"Seconds Left","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.seconds_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Half Minute","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_half_minute","typeLabel":"string | null"},"under_minute":{"oneOf":[{"type":"string","title":"Under Minute","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Minute","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_minute.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.0","typeLabel":"string"},{"type":"null","title":"Under Ten Seconds","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0.under_ten_seconds","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.0","typeLabel":"CountdownWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.countdown","typeLabel":"CountdownWording · object | null"},"expired":{"oneOf":[{"type":"string","title":"Expired","uniqueKey":"wording.oneOf.0.status.oneOf.0.expired.oneOf.0","typeLabel":"string"},{"type":"null","title":"Expired","uniqueKey":"wording.oneOf.0.status.oneOf.0.expired.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.expired","typeLabel":"string | null"},"sending":{"oneOf":[{"type":"string","title":"Sending","uniqueKey":"wording.oneOf.0.status.oneOf.0.sending.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sending","uniqueKey":"wording.oneOf.0.status.oneOf.0.sending.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.sending","typeLabel":"string | null"},"sent":{"oneOf":[{"type":"string","title":"Sent","uniqueKey":"wording.oneOf.0.status.oneOf.0.sent.oneOf.0","typeLabel":"string"},{"type":"null","title":"Sent","uniqueKey":"wording.oneOf.0.status.oneOf.0.sent.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.sent","typeLabel":"string | null"},"unavailable":{"oneOf":[{"type":"string","title":"Unavailable","uniqueKey":"wording.oneOf.0.status.oneOf.0.unavailable.oneOf.0","typeLabel":"string"},{"type":"null","title":"Unavailable","uniqueKey":"wording.oneOf.0.status.oneOf.0.unavailable.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status.oneOf.0.unavailable","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0.status.oneOf.0","typeLabel":"StatusWording · object"},{"type":"null","uniqueKey":"wording.oneOf.0.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording.oneOf.0.status","typeLabel":"StatusWording · object | null"}},"additionalProperties":false,"uniqueKey":"wording.oneOf.0","typeLabel":"Wording · object"},{"type":"null","description":"Optional per-send catalogue of the notification's platform-drawn texts, grouped by what each decorates — form (a form send's chrome), choice (a choice list's control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned list); a member on a notification with no such surface is a 400. Recorded on the in-app feed (display content, feed parity).","uniqueKey":"wording.oneOf.1","typeLabel":"null"}],"uniqueKey":"wording","typeLabel":"Wording · object | null"}},"required":["message"],"title":"NotifyUser","type":"object","uniqueKey":"","typeLabel":"NotifyUser · object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","audience":"\u003cstring>","channel":"\u003cstring>","data":{"options":{},"values":{}},"footer":"\u003cstring>","form_tag":"\u003cstring>","header":{"url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"},"location":{"latitude":123,"longitude":123,"address":"\u003cstring>","name":"\u003cstring>"},"media":[{"url":"\u003cstring>","caption":"\u003cstring>","filename":"\u003cstring>"}],"options":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"pages":[{"fields":["\u003cstring>"],"title":"\u003cstring>","button_label":"\u003cstring>","display":[],"kind":"input"}],"recipient":"\u003cstring>","schema":{},"sections":[{"rows":[{"text":"\u003cstring>","description":"\u003cstring>","id":"\u003cstring>","kind":"reply"}],"title":"\u003cstring>"}],"sender_identity":"\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>"}}}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"c979ead8-7d96-4fdb-9862-77fb13c126c1":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"The notify-user body: a bare confirmation STRING.\n\nThe adapter envelopes it as ``{\"data\": \u003cstr>}``. Typed as a string rather\nthan wrapped, so the wire body is unchanged.","title":"NotifyResult","type":"string","isRequired":true,"uniqueKey":"data","typeLabel":"string"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Success.","exampleType":"generated"},"0c51638e-fed3-4785-aca9-6909390636c9":{"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"},"e2a60b81-10ab-4a10-b2a8-bb0e2613ff7e":{"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"},"f5160c51-84c6-4758-98bf-9c833d6cb9e1":{"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":"Forbidden.","exampleType":"generated"},"5e1aaafc-20dd-4ad4-bf4a-a44259f31eb3":{"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"},"92f70210-0fca-4ca9-9096-f366235affd1":{"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"},"1c12e8ad-da73-4e80-96ce-46c5c853fc88":{"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":"A dependency this route needs is temporarily unavailable; retry shortly.","exampleType":"generated"}},"security":{"54c011ae-22bb-41c9-bd52-4cbc53be1028":{"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:36.300Z","originalFileLocation":"api-reference/notifications/send-a-human-a-one-way-notification.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=\"Send a human a one-way notification, fire-and-forget. No reply is expected and nothing blocks. With a named channel the message is sent and the call returns as soon as the medium ACCEPTED it (not that a human saw it). With channel omitted the message is recorded to the internal notifications sink the Studio inbox reads. One send attempt, no retry; every failure raises loudly, never a silent no-op: a blank message with no media to carry it (the contract admits a blank message only for a media-only send), an unknown channel name, a blank recipient/audience, a caller-supplied sender_identity, a contract-invalid media/template/ options/schema combination (an empty list/dict, an over-cap value, or a mutually exclusive media+template / options+template / schema+template / schema+options), a schema with no channel (the internal sink has no submission door) or one the channel\u0026#x27;s form subset/hook refuses, or a channel\u0026#x27;s permanent refusal of the input\u0026#x27;s shape (retrying cannot succeed) → 400; a restricted caller addressing another identity (cross-identity denial) → 403; a channel that cannot notify, or does not advertise the media/template/options/schema capability the send needs → 501; a transient channel delivery failure (the raised error\u0026#x27;s retryable) → 503, carrying the medium\u0026#x27;s retry_after when it named one; * a permanent channel delivery refusal → 502. media (display media sent with the message), location (a shared map pin), template (a pre-approved out-of-window send), options (FLAT tappable options a tap of which enters the conversation), sections (the SECTIONED tappable-options alternative), header/footer (a media header / trailing line composing an interactive message) and schema (an ask-less form\u0026#x27;s answer schema — the channel renders the message as the form\u0026#x27;s prompt, and a submission enters the conversation as a message from the person) are OPTIONAL richer-send forms — FULL parity with the turn answer path\u0026#x27;s AnswerPart vocabulary. The contract\u0026#x27;s shared composition matrix is enforced on this request model identically: options XOR sections (one choice surface); schema excludes both; header/footer require a choice surface; template is the standalone out-of-window send exclusive with every other content/interactive field; options/ sections may each combine with media/location (a contract-invalid combination is a 400). On a named channel each needs a channel that advertises the matching capability (media→media, location→location, template→template, options/sections→ interactive, schema→form; header/footer ride the choice surface\u0026#x27;s capability, no flag of their own) — otherwise the send is refused as a 501, never downgraded to a silent freeform send. With no channel media/location/template/options/sections/header/footer are stored on the internal inbox record and rendered there; schema alone REQUIRES a channel (a 400 without one) — a stored form nobody could submit would be a dead surface, not a notification. data (per-send prefill values and per-send options lists) and pages (the stepped layout) are the ask-less form\u0026#x27;s per-send extras — the same FormData/FormPage an ask carries. They ride ONLY a form send: present without schema is a 400. When a schema is present each is cross-checked against it by the same validator the ask door runs — a prefill against an unknown/ill-typed property, a per-send option list on a non-string property, or a page that omits/duplicates/misnames a property is a 400. form_tag is the caller-set opaque per-send correlation the channel carries with the form and hands back on submit. It rides ONLY a form send: present without schema is a 400. The platform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it, and it is not written to the in-app feed record. wording is the per-send catalogue of the notification\u0026#x27;s platform-drawn texts, grouped by what each decorates — form (a form send\u0026#x27;s chrome), choice (a choice list\u0026#x27;s control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned sections list); a member on a notification with no such surface is a 400. It is display content, so an audience-addressed send records it on the in-app feed. audience addresses the in-app record to an identity\u0026#x27;s feed; it is honored even when a channel also delivers the message (channel push AND in-app record). sender_identity is the sending identity a channel message leaves FROM, which the conversation bridge sets on the notification it builds to answer a route; a caller may not supply it here and a set value is rejected loudly, never forwarded to the channel. Returns a short confirmation string — \u0026quot;notification sent via \u0026#x27;\u0026#x27;\u0026quot; for a channel send, \u0026quot;notification recorded to the internal sink\u0026quot; otherwise.\">\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/notifications/send-a-human-a-one-way-notification\">\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/notifications/send-a-human-a-one-way-notification\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/notifications/send-a-human-a-one-way-notification.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/notifications/send-a-human-a-one-way-notification#webpage\",\"url\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification\",\"name\":\"Send a human a one-way notification\",\"description\":\"Send a human a one-way notification, fire-and-forget. No reply is expected and nothing blocks. With a named channel the message is sent and the call returns as soon as the medium ACCEPTED it (not that a human saw it). With channel omitted the message is recorded to the internal notifications sink the Studio inbox reads. One send attempt, no retry; every failure raises loudly, never a silent no-op: a blank message with no media to carry it (the contract admits a blank message only for a media-only send), an unknown channel name, a blank recipient/audience, a caller-supplied sender_identity, a contract-invalid media/template/ options/schema combination (an empty list/dict, an over-cap value, or a mutually exclusive media+template / options+template / schema+template / schema+options), a schema with no channel (the internal sink has no submission door) or one the channel's form subset/hook refuses, or a channel's permanent refusal of the input's shape (retrying cannot succeed) → 400; a restricted caller addressing another identity (cross-identity denial) → 403; a channel that cannot notify, or does not advertise the media/template/options/schema capability the send needs → 501; a transient channel delivery failure (the raised error's retryable) → 503, carrying the medium's retry_after when it named one; * a permanent channel delivery refusal → 502. media (display media sent with the message), location (a shared map pin), template (a pre-approved out-of-window send), options (FLAT tappable options a tap of which enters the conversation), sections (the SECTIONED tappable-options alternative), header/footer (a media header / trailing line composing an interactive message) and schema (an ask-less form's answer schema — the channel renders the message as the form's prompt, and a submission enters the conversation as a message from the person) are OPTIONAL richer-send forms — FULL parity with the turn answer path's AnswerPart vocabulary. The contract's shared composition matrix is enforced on this request model identically: options XOR sections (one choice surface); schema excludes both; header/footer require a choice surface; template is the standalone out-of-window send exclusive with every other content/interactive field; options/ sections may each combine with media/location (a contract-invalid combination is a 400). On a named channel each needs a channel that advertises the matching capability (media→media, location→location, template→template, options/sections→ interactive, schema→form; header/footer ride the choice surface's capability, no flag of their own) — otherwise the send is refused as a 501, never downgraded to a silent freeform send. With no channel media/location/template/options/sections/header/footer are stored on the internal inbox record and rendered there; schema alone REQUIRES a channel (a 400 without one) — a stored form nobody could submit would be a dead surface, not a notification. data (per-send prefill values and per-send options lists) and pages (the stepped layout) are the ask-less form's per-send extras — the same FormData/FormPage an ask carries. They ride ONLY a form send: present without schema is a 400. When a schema is present each is cross-checked against it by the same validator the ask door runs — a prefill against an unknown/ill-typed property, a per-send option list on a non-string property, or a page that omits/duplicates/misnames a property is a 400. form_tag is the caller-set opaque per-send correlation the channel carries with the form and hands back on submit. It rides ONLY a form send: present without schema is a 400. The platform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it, and it is not written to the in-app feed record. wording is the per-send catalogue of the notification's platform-drawn texts, grouped by what each decorates — form (a form send's chrome), choice (a choice list's control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned sections list); a member on a notification with no such surface is a 400. It is display content, so an audience-addressed send records it on the in-app feed. audience addresses the in-app record to an identity's feed; it is honored even when a channel also delivers the message (channel push AND in-app record). sender_identity is the sending identity a channel message leaves FROM, which the conversation bridge sets on the notification it builds to answer a route; a caller may not supply it here and a set value is rejected loudly, never forwarded to the channel. Returns a short confirmation string — \\\"notification sent via ''\\\" for a channel send, \\\"notification recorded to the internal sink\\\" otherwise.\",\"dateModified\":\"2026-11-05T00:56:36.300Z\",\"isPartOf\":{\"@id\":\"https://docs.tai42.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"HTTP API\",\"item\":\"https://docs.tai42.ai/reference/api/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"notifications\",\"item\":\"https://docs.tai42.ai/api-reference/notifications/list-internal-notifications\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Send a human a one-way notification\",\"item\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification#apireference\",\"headline\":\"Send a human a one-way notification\",\"name\":\"Send a human a one-way notification\",\"description\":\"Send a human a one-way notification, fire-and-forget. No reply is expected and nothing blocks. With a named channel the message is sent and the call returns as soon as the medium ACCEPTED it (not that a human saw it). With channel omitted the message is recorded to the internal notifications sink the Studio inbox reads. One send attempt, no retry; every failure raises loudly, never a silent no-op: a blank message with no media to carry it (the contract admits a blank message only for a media-only send), an unknown channel name, a blank recipient/audience, a caller-supplied sender_identity, a contract-invalid media/template/ options/schema combination (an empty list/dict, an over-cap value, or a mutually exclusive media+template / options+template / schema+template / schema+options), a schema with no channel (the internal sink has no submission door) or one the channel's form subset/hook refuses, or a channel's permanent refusal of the input's shape (retrying cannot succeed) → 400; a restricted caller addressing another identity (cross-identity denial) → 403; a channel that cannot notify, or does not advertise the media/template/options/schema capability the send needs → 501; a transient channel delivery failure (the raised error's retryable) → 503, carrying the medium's retry_after when it named one; * a permanent channel delivery refusal → 502. media (display media sent with the message), location (a shared map pin), template (a pre-approved out-of-window send), options (FLAT tappable options a tap of which enters the conversation), sections (the SECTIONED tappable-options alternative), header/footer (a media header / trailing line composing an interactive message) and schema (an ask-less form's answer schema — the channel renders the message as the form's prompt, and a submission enters the conversation as a message from the person) are OPTIONAL richer-send forms — FULL parity with the turn answer path's AnswerPart vocabulary. The contract's shared composition matrix is enforced on this request model identically: options XOR sections (one choice surface); schema excludes both; header/footer require a choice surface; template is the standalone out-of-window send exclusive with every other content/interactive field; options/ sections may each combine with media/location (a contract-invalid combination is a 400). On a named channel each needs a channel that advertises the matching capability (media→media, location→location, template→template, options/sections→ interactive, schema→form; header/footer ride the choice surface's capability, no flag of their own) — otherwise the send is refused as a 501, never downgraded to a silent freeform send. With no channel media/location/template/options/sections/header/footer are stored on the internal inbox record and rendered there; schema alone REQUIRES a channel (a 400 without one) — a stored form nobody could submit would be a dead surface, not a notification. data (per-send prefill values and per-send options lists) and pages (the stepped layout) are the ask-less form's per-send extras — the same FormData/FormPage an ask carries. They ride ONLY a form send: present without schema is a 400. When a schema is present each is cross-checked against it by the same validator the ask door runs — a prefill against an unknown/ill-typed property, a per-send option list on a non-string property, or a page that omits/duplicates/misnames a property is a 400. form_tag is the caller-set opaque per-send correlation the channel carries with the form and hands back on submit. It rides ONLY a form send: present without schema is a 400. The platform bounds it (an out-of-charset or over-length tag is a 400) but never interprets it, and it is not written to the in-app feed record. wording is the per-send catalogue of the notification's platform-drawn texts, grouped by what each decorates — form (a form send's chrome), choice (a choice list's control words) and status (in-flight status copy). Each member is admitted only on the surface that draws it (a schema form, a flat options list, or a sectioned sections list); a member on a notification with no such surface is a 400. It is display content, so an audience-addressed send records it on the in-app feed. audience addresses the in-app record to an identity's feed; it is honored even when a channel also delivers the message (channel push AND in-app record). sender_identity is the sending identity a channel message leaves FROM, which the conversation bridge sets on the notification it builds to answer a route; a caller may not supply it here and a set value is rejected loudly, never forwarded to the channel. Returns a short confirmation string — \\\"notification sent via ''\\\" for a channel send, \\\"notification recorded to the internal sink\\\" otherwise.\",\"url\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tai42.ai/api-reference/notifications/send-a-human-a-one-way-notification#webpage\"},\"image\":\"https://docs.tai42.ai/images/og-image.svg\",\"dateModified\":\"2026-11-05T00:56:36.300Z\",\"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","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","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","description":"List internal notifications, newest-first.\n\nA RESTRICTED caller reads its OWN per-identity feed (complete within its own\nbound — never truncated by other identities' volume, never a broadcast); an\nUNRESTRICTED caller reads the shared feed unchanged (the operator view).","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","description":"The run-list page ceiling, sorts and sort/filter incompatibilities, and the metrics measures and dimensions.\n\nRead from the backend's pure declarations (``max_page_size``, ``list_capability``,\n``metrics_capability``) in the run list's wire names; no backend query is issued.","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"]}