Skip to main content
Besides plain text, a chat agent can send a structured interactive message — buttons, a carousel, or a date picker — and wait for the customer to answer it before continuing. Interactive messages arrive the same way regular messages do (a reply on Send Message, a callback on the delivery webhook, or an event over the chat WebSocket), tagged type: "interaction".
Whether an agent offers interactive messages at all depends on its configuration. If your integration can’t render a given type, declare what you can render with supported_interactions on every inbound request — the agent only offers types your client has declared.

Declaring what you support

Send supported_interactions on content/message requests to tell the agent which interaction types your client can display:
Omit supported_interactions (or send an empty array) on a plain text message — the agent then won’t offer any interactive type for that turn.

What the agent sends

An interactive message is a message with type: "interaction":

ui_buttons presentation

description and each option’s description are optional. At most one option may have allow_input: true (schema version 2 only) — selecting it lets the customer type free text instead of a fixed answer.
description, image, and action_label are optional per item.

ui_date_picker presentation

selection_mode is single (answer with one date) or range (answer with a start and end date). min_date/max_date bound the selectable range and may be omitted.

Answering an interactive message

Send an inbound request (Send Message, Send Message Async, or a WebSocket message frame) with: response.kind depends on what you’re answering:
A response is validated against the exact message you’re answering — a selection id that isn’t among its options/items, or a date outside min_date/max_date, is rejected with a 422. Answering the same interaction twice with the same content (a retry, or a duplicate tap) returns the original answer instead of accepting a second one.