Cards overview
A card is a structured UI element the voice agent renders on the user’s screen during a call. The user interacts with it (tap, select, type, upload) and the result is returned to the LLM so the conversation continues with accurate, confirmed data.
Cards replace the “can you spell that for me?” loop entirely.
When to use a card
| Use case | Without Powsoo | With Powsoo |
|---|---|---|
| Capture email | Agent asks user to spell: “j-o-h-n at…” | STT pre-fill, user taps Confirm |
| Capture phone | Repeat-back loop, mishears digits | Tap-to-confirm with edit option |
| Pick appointment | Say a date verbally, mishear time | Date/time picker card |
| Choose from a list | Read all options aloud, wait for verbal pick | Tap-to-select list card |
| Upload a photo | Impossible over voice | Upload card with camera/gallery |
| Consent | Ask verbally, no record | Consent checkbox card with timestamp |
Card anatomy
Every card has:
- Title — short heading shown at the top (
"Confirm your email") - Description — optional sub-text for context
- Fields — zero or more editable rows; each has a label, a pre-filled value (from STT), and a type
- Actions — one or more tap buttons (
"Confirm","Edit","Skip")
The LLM populates fields with values it captured during the conversation. The user can edit before confirming. Edits are returned in edited: [...] so the LLM knows what changed.
The one-card rule
Only one card is visible at a time. If the LLM fires a second powsoo_show_card before the first is resolved, the second card is queued and slides in after the first is dismissed. This matches how voice conversations naturally flow — one question at a time.
Card result shape
Every card interaction returns the same structure to the LLM:
{ "status": "confirmed", "action": "confirm", "fields": { "Email": "john@example.com" }, "edited": []}| Field | Description |
|---|---|
status | "confirmed" = no edits. "edited" = user changed at least one field. "skipped" = user tapped a skip/cancel action. |
action | The value of the action button tapped. |
fields | Key-value map of all field labels → current values (including any edits). |
edited | Array of field labels that were changed from the pre-filled value. |
Reference
- powsoo_show_card tool reference — full JSON schema for Retell and Vapi
- Field types — all supported
typevalues - System prompt — how to instruct the LLM to use cards effectively