Skip to main content
The question component (canvas.question) shows a multiple-choice question card during a conversation. The user taps an option (or types a free-text answer, when allowed) and the structured result goes to the PAL and your conversation webhook.

Triggering

The PAL shows the card by invoking canvas_show_question when the user should answer a structured question. Steer the timing in the PAL’s system prompt.
  • Renders in the safe-area-right slot by default.
  • A repeat canvas_show_question invocation replaces the card currently on screen with a new instance and a new tool_call_id; in-progress input is lost and interactions arrive under the new id.
  • Only one canvas card is on screen at a time. A new canvas_show_question invocation always replaces the current card; two cards never appear at once.
question has no component-specific settings beyond enabled. See Enabling and configuring components.

Arguments

The PAL passes these to canvas_show_question:

Example invocation

Quiz example with answer reveal:

Interactions

question is a submit-capable component emitting six interaction types: submit, skip, dismiss, clear, error, and heartbeat. Only submit and skip carry an answer value; the rest are lifecycle signals with no question payload. Each interaction reaches your conversation webhook as a canvas.interaction event with the answer in properties.value.

Value Shape (submit and skip)

Tavus rejects values with any other keys and enforces these rules before delivery:
  • skip: always skipped: true, with no selections, custom_text, or option_texts.
  • submit: always skipped: false, with at least one selected id or a non-empty custom_text; never an empty answer.
The hosted card offers Skip only when allow_skip is true. Tavus does not re-check an incoming skip against the original action arguments, so a custom renderer could post one regardless.

Example Payload

properties always carries the same nine keys. interaction_id uniquely identifies the interaction; tool_call_id ties it to the originating canvas_show_question call. created_at is a naive ISO-8601 timestamp with microseconds and no timezone suffix (no trailing Z); treat it as UTC.
Submit

Webhook Handling

Branch on type first, then read the value:
Key your logic on option ids, not labels. Labels may vary between conversations; ids are required to be unique and are echoed back verbatim.