Appearance
IVR flows
| Method | Path | Body | Response |
|---|---|---|---|
PUT | /v1/tenants/{t}/ivr-flows/{flowRef} | see below | { ivrFlow } |
GET | /v1/tenants/{t}/ivr-flows | — | { ivrFlows } (without structure) |
GET | /v1/tenants/{t}/ivr-flows/{flowRef} | — | { ivrFlow } (with structure) |
DELETE | /v1/tenants/{t}/ivr-flows/{flowRef} | — | 204 — see Deleting |
json
{
"name": "Main menu",
"channel_ref": "whatsapp-main",
"status": "ACTIVE",
"trigger_condition": "ALWAYS",
"trigger_priority": 0,
"timeout_seconds": 10,
"agent_ring_timeout": 60,
"schema_version": 1,
"structure": {
"nodes": [
{ "id": "start", "type": "ivr_start", "data": {} },
{ "id": "menu", "type": "ivr_menu", "data": { "audioFileId": 12, "timeoutSeconds": 8, "noInputAction": "replay" } },
{ "id": "sales", "type": "ivr_transfer", "data": { "targetType": "queue", "targetId": 3 } },
{ "id": "bye", "type": "ivr_hangup", "data": {} }
],
"edges": [
{ "source": "start", "target": "menu" },
{ "source": "menu", "target": "sales", "sourceHandle": "1" },
{ "source": "menu", "target": "bye", "sourceHandle": "9" }
]
}
}ivrFlow: { id, ref, name, channelId, schemaVersion, triggerCondition, triggerPriority, timeoutSeconds, agentRingTimeout, status, structure }.
| Field | Values | Omitted |
|---|---|---|
name | required, ≤255 chars | — |
structure | required, { nodes: [], edges: [] } | — |
channel_ref | a channel of this tenant; none = tenant-wide | null |
status | ACTIVE, INACTIVE | INACTIVE |
trigger_condition | ALWAYS, ALL_AGENTS_BUSY, ALL_AGENTS_OFFLINE, ALL_AGENTS_UNAVAILABLE | ALWAYS |
trigger_priority | 0–10000 | 0 |
timeout_seconds | 1–120 | 10 |
agent_ring_timeout | 5–600 — how long an agent the flow transfers to may ring before the call ends as IVR_AGENT_NO_ANSWER | 60 |
schema_version | 1 | 1 |
- Selection on an inbound call, among
ACTIVEflows: flows for that channel first, then tenant-wide flows; within each, lowesttrigger_priorityfirst, then most recently updated. The first whosetrigger_conditionholds takes the call. Conditions are evaluated over the channel's inbound queue. - Node types:
ivr_start,ivr_menu(playsaudioFileId, waits for a key; edges'sourceHandleis the digit),ivr_play,ivr_transfer(targetType: queue|agent,targetId= queue/agent id; notargetId= the channel's inbound queue;offlineAction/busyActionwithofflineAudioFileId/busyAudioFileIdfor unavailable targets),ivr_hangup. Ids inside nodes are Calloop ids (audio assets, queues, agents). structureis checked on save, and the first problem is a400whosedetails.fieldis its path (e.g.structure.nodes[2].data.digits): at most 500 steps and 2000 edges; unique step ids; known node types; at most oneivr_start; anivr_menu'sdigitsare distinct keys0–9*#and itstimeoutSeconds1–120;noInputActionreplay|hangup,offlineActionhangup|queue|replay,busyActionwait|hangup|queue|replay; every audio, queue and agent id is this tenant's; every edge joins two steps. An unfinished flow (a menu without a prompt, a key leading nowhere) may still be saved.- Keys are detected in-band from the customer's audio.