Skip to main content
Magic Canvas lets a PAL show interactive cards, such as questions, calendars, and charts, during a conversation. The PAL’s LLM decides when to show one; user input flows back to the conversation and your webhook.
1

Attach the Magic Canvas skill

Attaching the skill enables the available components with default settings:
config.components is a sparse overlay, not an allowlist; add an entry only to configure or disable a component:
Disable charts
Later components are enabled automatically on PALs with the skill attached; disable them the same way. See Configuring your PAL for all component settings and when cards appear to steer timing.
The skill has no effect on echo and speech-to-speech PALs.
2

Create the conversation

Every video conversation with this PAL gets Canvas. Set callback_url; interactions arrive there in step 4:
Audio-only, text-chat, and Zoom/Teams/Meet (meeting_url) conversations never receive Canvas actions.
Conversation creation uses your API key; call it from your backend, never the browser.
3

Render the canvas

With the Tavus-hosted embed or widget, Canvas renders automatically:
For React, add the @tavus/cvi-ui component:
Mount it inside the same CVIProvider as your conversation UI:
The default class sets position: fixed (full-viewport overlay). To keep cards inside your player, wrap both in a position: relative container and pass a className that sets position: absolute !important.
4

Receive interactions

Each interaction arrives at your callback_url as a canvas.interaction event:
canvas.interaction
A retry of the same saved interaction does not send another webhook. The same webhook can still arrive twice. Treat two events as the same interaction when conversation_id and interaction_id match, and do not apply the second one again. Under Zero Data Retention there is no saved interaction, so a client retry is delivered again. See delivery guarantees.Fetch the full history any time with your API key:
The response is { "data": [ ... ] }, oldest first, with the same fields as the webhook’s properties. It’s empty for conversations on Zero Data Retention, which record no interactions.
See Canvas components for the full component list and per-component reference. scheduling_embed needs a booking link (provider plus scheduling_url) configured before it activates:
Cards render in a sandboxed iframe on Tavus infrastructure that isolates styles and scripts in both directions. Your webhook receives skip and dismiss interactions in addition to submit.