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, fired once when first recorded; duplicate submissions and client retries never re-fire it:
canvas.interaction
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.
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.