Skip to main content

IVR Flow JSON Reference

This page lists every field of an IVR flow: the blocks, what each one says and does, its exits, the allowed values, and the rules the dashboard checks before you can publish. The editor saves your canvas in this format; each field below is what an editor setting stores, and the In the editor column names that setting. A flow is a graph of blocks (nodes) joined by arrows (edges). Each arrow leaves a block through a named exit and points at another block. A block has at most one arrow per exit.
version is always 1. Every block has an id that is unique in the flow; arrows refer to blocks by id. An id is non-empty text of up to 64 characters. Use letters, digits, _ and -: the editor creates ids that way, and Build with AI only accepts ids made of them. Every block except Start also has a name, shown as Name in the editor (see Names and limits).
Build with AI. If your editor shows a Build with AI button, its assistant can draft a whole flow or change one for you from a plain description. You review its change on the canvas and click Apply to keep it. A few things are always added by hand: secret API headers on Fetch blocks and recorded audio. The flow’s language and voice are picked in the editor toolbar. Each message is charged in credits for what it really used, based on the model and thinking level you pick; the panel shows what a message usually costs before you send (see Billing).

Blocks

Every exit in the table must be connected. The one exception: a single menu only needs the keys you use (at least one).

Start

Exactly one per flow. Declares the lead fields you send with each call; every pushed lead is checked against them.
Exit: next (required). Lead fields are available everywhere in the flow as {{lead.<name>}}.

Say

Speaks one line.
Exit: next (required). Speaks a prompt and waits for keys. A menu has two modes. Single mode. The caller presses one key and the call follows the arrow wired to that key. In the editor, switch keys on under Keys and draw each key’s arrow on the canvas. Connect at least one key (0-9, *, #); each connected key is an exit. no_input and invalid are both required. Collect mode. The caller types several digits, for example a date of birth or a PIN. Exits done, no_input and invalid are all required. After done, the digits are available as the variable {{<menu name>.digits}}. Keys are only allowed on single menus.
A menu is the only block a loop may pass through. For “press 9 to repeat”, connect key 9 back to the same menu.

Fetch

Calls your HTTPS API and reads fields from its JSON answer.
Exits: success and failed (both required). After success, the fields are available as {{<fetch name>.<field>}}.
A Fetch placed directly after Start runs before the phone rings. If it fails, the number is never dialed. Put the lookups your greeting needs there.

End

Says an optional last line and hangs up.
Exits: none.

Content and variables

Everything a block says (content, fallback, prompt, noInputLine, invalidLine, holdLine) is one of: Text lines, Fetch URLs and Fetch bodies can carry variables, written {{group.field}} (the IVR Flows page calls them placeholders): A variable must be available on every path into the block that uses it. For example, a Fetch field can’t be used on a block that is also reachable through that Fetch’s failed exit.

Field types and how they’re spoken

Lead fields and Fetch response fields both have a type. The type decides how the value is checked and how it is spoken. For what to send with each lead, see How to send each field type.

Names and limits

A slug is lowercase letters, digits and _, starting with a letter, up to 32 characters (for example pay_menu, due_date).
  • Block names (every block except Start) are slugs and unique in the flow.
  • Fetch and collect-menu names become variable groups, so they can’t be lead or call.
  • Lead field names, Fetch field names and End outcomes are slugs too.
  • Outcomes don’t have to be unique: several End blocks can report the same outcome, for example two ends that both report no_response.

Rules every flow must pass

The editor checks these as you build and lists every problem on the block it belongs to. A flow can’t be published until all of them pass.
  • Exactly one Start block.
  • At least one End block.
  • Every block can be reached from Start.
  • From every block, some path reaches an End.
  • Every required exit is connected, and no exit is connected twice.
  • Keys are only connected on single menus, and a single menu has at least one key.
  • Any loop passes through a Menu.
  • Every Fetch block has at least one response field.
  • Every variable is available on every path into the block that uses it.
  • Names, fields and outcomes follow Names and limits; Fetch URLs and timeouts follow Fetch.

Example

A payment reminder. Start declares the lead’s name, amount and due_date. A Say block greets the caller with their details, and a single menu offers two choices. Pressing 1 ends the call as paid, pressing 2 ends it as wants_agent, and no key or a wrong key (after two re-asks) ends it as no_response. The menu waits 6000 milliseconds for a key, shown as 6 seconds in the editor.
To push a lead to this flow, send data such as { "name": "Asha", "amount": 1250.5, "due_date": "2026-10-17" }. The greeting is spoken as “Hello Asha, this is a reminder that 1,250.50 rupees is due on seventeenth October.” See Push a lead.