Record Canvas Interaction
Record a Magic Canvas interaction (submit, skip, dismiss, clear, error, or heartbeat) while a conversation is active.
The Tavus-hosted embed and @tavus/cvi-ui post interactions for you. Call this endpoint directly only if you build your own renderer.
Authentication: No API key is required while the conversation is active. Never put your Tavus API key in a browser. Once the conversation ends, every POST is rejected.
Idempotency: Retries with the same (conversation_id, interaction_id) and identical tool_call_id, component, component_version, type, and value return 200 without firing a second webhook. metadata is excluded from the match.
Rate limiting: 120 POSTs per 60-second window per (client IP, conversation_id). Exceeding the limit returns 429 with { "error": "Too many requests" } and a Retry-After header (seconds until the window resets). Custom renderers posting heartbeat interactions count toward this limit.
See Canvas interactions for per-component value rules, webhook delivery, and the full error catalog.
https://docs.tavus.io/openapi.yaml for the full HTTP API contract.value rules, webhook delivery, and the full error catalog.Path Parameters
The unique identifier of the conversation.
"c123456"
Body
Body for Record Canvas Interaction. value validation depends on component and type - see Canvas interactions.
Idempotency key. Unique per logical interaction; reuse verbatim on retries. Tavus clients use ci_{tool_call_id}_{type}_{uuid}.
1 - 128"ci_call_8f2d41_submit_5e0b7c2a"
The id of the Canvas invocation that showed the card. Ties the interaction to a specific card instance.
1 - 128"call_8f2d41"
Component id.
canvas.question, canvas.input, canvas.calendar, canvas.scheduling_embed, canvas.text, canvas.image, canvas.video, canvas.chart, canvas.alert "canvas.question"
Component contract version. v1 for all current components.
"v1"
Interaction type. Submit-capable components also allow submit and skip.
submit, skip, dismiss, clear, error, heartbeat "submit"
Interaction payload. At most 16 KB serialized. Shape depends on component and type.
{
"selected_option_ids": ["opt_2"],
"skipped": false
}
Optional client annotations, at most 4 KB serialized. Not part of idempotency matching.
{ "client": "kiosk-web" }
Response
Interaction recorded (or idempotent replay)
true

