Skip to main content
POST
Send a human a one-way notification

Authorizations

x-api-key
string
header
required

Body

application/json

A notification to send.

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).

message
string
required
audience
string | null

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.

channel
string | null
data
FormData · object | null

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.

form_tag
string | null

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.

header
MediaItem · object | null

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.

location
LocationElement · object | null

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.

media
MediaItem · object[] | null

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.

options
(ReplyOption · object | LinkOption · object)[] | null

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.

pages
FormPage · object[] | null

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.

recipient
string | null
schema
Schema · object | null

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.

sections
OptionSection · object[] | null

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.

sender_identity
string | null

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.

template
ChannelTemplate · object | null

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.

wording
Wording · object | null

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).

Response

Success.

data
string
required

The notify-user body: a bare confirmation STRING.

The adapter envelopes it as {"data": <str>}. Typed as a string rather than wrapped, so the wire body is unchanged.