Rich block schema
Bots, workflows, the AI agent and your own backend send interactive content to the messenger as blocks. Every block follows one versioned JSON schema, is checked on our servers and works with a keyboard and a screen reader.
Block types
| Type | Limits | What the visitor gets |
|---|---|---|
| quick_replies | Up to 10, 6 shown, 40 characters each | Tapping one sends its label as the visitor's message. The chips go away once the visitor sends anything. |
| buttons | Up to 10 | Each button posts back, opens a URL in a new tab or opens an article. Single-use buttons turn off after use. |
| field | email, phone, text, number, single select | Checked in the browser and on our servers. Phone numbers use E.164 with a country picker. After sending, the field collapses to a masked summary the visitor can edit until the conversation closes. |
| article | Title, 160-character excerpt, collection | Opens in the article reader inside the messenger, or in a new tab when the reader is turned off. |
| image, file | Alt text required for images | Images show inline. Files show as a card with their name and size and download on tap. |
Example
A reply in the "Invoice PDF shows the wrong tax rate" conversation that offers the visitor's recent invoices and asks where to send the corrected PDF.
{
"schema_version": "2026-09-01",
"text": "Which invoice shows the wrong tax rate?",
"fallback_text": "Reply with the invoice number, for example INV-2041.",
"blocks": [
{ "type": "quick_replies", "options": [
{ "label": "INV-2041", "value": "inv_2041" },
{ "label": "INV-2042", "value": "inv_2042" },
{ "label": "Another invoice", "value": "other" }
] },
{ "type": "field", "input": "email", "name": "billing_email",
"label": "Where should we send the corrected PDF?" }
]
}How it looks in the messenger
- Keyboard
- Tab reaches every reply, button and field. Enter or Space sends.
- Screen readers
- New blocks are announced, for example "3 replies available".
- Touch targets
- Replies, buttons and fields are at least 44 px high.
- AI label
- Blocks sent by the AI agent always carry the assistant's name and an AI label.
- A person is one tap away
- Talk to a person stays under every block. No schema field can hide it.
Rules every block follows
| One schema | Messages from your backend, workflows, bots and the AI agent all go through the same versioned schema. Set schema_version to the version you built against. |
|---|---|
| Server checks | An invalid block is rejected with error code block_invalid and the path of the field that failed. Nothing half-valid reaches the visitor. |
| No raw HTML | Text is plain text. Links are sanitized, and javascript: and data: URLs are blocked. |
| Fallback text | fallback_text is required. An older SDK that does not know a block type shows this text instead, so the visitor can still answer. |