One line's call flow: draft, live, history
const url = 'https://api.vocapable.com/v1/workspace/call-flows/example';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.vocapable.com/v1/workspace/call-flows/example \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”Successful Response
object
object
One overflow/after-hours step. Destinations are references, never free carrier input.
forward names a number on the company’s verified-number allow-list (checked when
the flow is published; the published answering policy dials only that stored number);
line names another of the company’s business lines, whose own published flow then
answers the caller (the forward presents the caller’s own number).
One overflow/after-hours step. Destinations are references, never free carrier input.
forward names a number on the company’s verified-number allow-list (checked when
the flow is published; the published answering policy dials only that stored number);
line names another of the company’s business lines, whose own published flow then
answers the caller (the forward presents the caller’s own number).
The whole answering document for one number, written in a single call.
Whole-document rather than patch: the steps form a tree whose branches reference each other by position, and a partial write is the shape in which a menu keeps pointing at a branch the same request deleted.
business_hours is the tenant’s own calendar in the tenant’s own zone, and it shares
only the vocabulary of campaign_schedules.calling_windows, never its meaning: the
compliance layer’s quiet hours are keyed to the callee’s jurisdiction and are untouched
here. An empty map means the number is answered by open_steps at every hour; naming
any day at all makes every unnamed day closed, which is the same load-bearing
empty-versus-absent distinction CallingSchedule.windows_for carries.
object
object
One local-time window on one weekday.
object
Read options, then follow the branch the caller pressed.
timeout_branch is required rather than optional, and it is also where the invalid
budget lands once it is spent: a menu whose silent or fumbling caller has nowhere to go
re-prompts forever, which is the single most common way a keypress tree becomes a trap.
object
object
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Read options, then follow the branch the caller pressed.
timeout_branch is required rather than optional, and it is also where the invalid
budget lands once it is spent: a menu whose silent or fumbling caller has nowhere to go
re-prompts forever, which is the single most common way a keypress tree becomes a trap.
object
object
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
object
One overflow/after-hours step. Destinations are references, never free carrier input.
forward names a number on the company’s verified-number allow-list (checked when
the flow is published; the published answering policy dials only that stored number);
line names another of the company’s business lines, whose own published flow then
answers the caller (the forward presents the caller’s own number).
One overflow/after-hours step. Destinations are references, never free carrier input.
forward names a number on the company’s verified-number allow-list (checked when
the flow is published; the published answering policy dials only that stored number);
line names another of the company’s business lines, whose own published flow then
answers the caller (the forward presents the caller’s own number).
The whole answering document for one number, written in a single call.
Whole-document rather than patch: the steps form a tree whose branches reference each other by position, and a partial write is the shape in which a menu keeps pointing at a branch the same request deleted.
business_hours is the tenant’s own calendar in the tenant’s own zone, and it shares
only the vocabulary of campaign_schedules.calling_windows, never its meaning: the
compliance layer’s quiet hours are keyed to the callee’s jurisdiction and are untouched
here. An empty map means the number is answered by open_steps at every hour; naming
any day at all makes every unnamed day closed, which is the same load-bearing
empty-versus-absent distinction CallingSchedule.windows_for carries.
object
object
One local-time window on one weekday.
object
Read options, then follow the branch the caller pressed.
timeout_branch is required rather than optional, and it is also where the invalid
budget lands once it is spent: a menu whose silent or fumbling caller has nowhere to go
re-prompts forever, which is the single most common way a keypress tree becomes a trap.
object
object
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Read options, then follow the branch the caller pressed.
timeout_branch is required rather than optional, and it is also where the invalid
budget lands once it is spent: a menu whose silent or fumbling caller has nowhere to go
re-prompts forever, which is the single most common way a keypress tree becomes a trap.
object
object
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
Ring real people, in the order the customer listed them.
Only rep_id values, resolved at build time against active transfer-enabled reps.
Order is meaningful and preserved, because an escalation list whose order the server
re-derives is not the list the customer wrote.
object
Hand the caller to one of this tenant’s published agents.
The agent is named per step rather than by phone_numbers.inbound_agent_id so a
single number can route sales and support to different agents without widening a
column three call paths already read as “the one inbound agent”.
Take a message. Consent is re-decided per call, never by this configuration.
The greeting here is the same kind of value inbound_voicemail_greeting is: a
tenant-authored announcement. Whether a recording may actually be made is settled at
admission against the published recording policy and the caller’s matched jurisdiction,
exactly as the legacy voicemail route settles it - a policy document cannot grant
itself a recording basis.
object
Speak one message, then hang up. The terminal step every chain can fall back to.
object
Bridge the caller to one number the tenant configured.
E.164 is carried here and nowhere near a model-visible shape: this is a customer typing
a destination into their own answering policy, which is the same act as configuring a
HumanRep. :class:DirectRepHandoffTarget deliberately carries no destination and
is not widened by this - a live model still cannot name a number to dial.
A reason the draft cannot be published, in words the editor can show beside a field.
object
object
A contact-center queue this line may route into (CC1-R1).
object
Example
{ "draft": { "name": "Business phone", "greeting": "Thank you for calling. We will be with you shortly.", "waiting_message": "Your call is important to us. Please stay on the line.", "timeout_message": "We are unable to answer right now. Please call again later.", "ai_offer_message": "An AI representative is available. Press 3 to speak with it, or stay on the line for our team.", "answer_order": "ai_first", "ai_offer_mode": "ask", "strategy": "ring_together", "ring_seconds": 20, "max_wait_seconds": 300, "max_callers": 25, "announcement_seconds": 45, "announce_position": true, "callback_enabled": true, "voicemail_enabled": true, "callback_attempts": 2, "music": "calm", "voicemail_greeting": "Please leave your name, your number and a short message after the tone.", "closed_message": "Thank you for calling. We are closed right now.", "closed_message_before_forward": true, "overflow_chain": [ { "kind": "voicemail" } ], "after_hours_chain": [ { "kind": "voicemail" } ], "receptionist_voice_prompts": true, "schedule": { "open_steps": [ { "type": "menu", "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "timeout_seconds": 20 } ] } ], "closed_steps": [ { "type": "menu", "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "timeout_seconds": 20 } ] } ] } }, "draft_source": "saved", "published": { "name": "Business phone", "greeting": "Thank you for calling. We will be with you shortly.", "waiting_message": "Your call is important to us. Please stay on the line.", "timeout_message": "We are unable to answer right now. Please call again later.", "ai_offer_message": "An AI representative is available. Press 3 to speak with it, or stay on the line for our team.", "answer_order": "ai_first", "ai_offer_mode": "ask", "strategy": "ring_together", "ring_seconds": 20, "max_wait_seconds": 300, "max_callers": 25, "announcement_seconds": 45, "announce_position": true, "callback_enabled": true, "voicemail_enabled": true, "callback_attempts": 2, "music": "calm", "voicemail_greeting": "Please leave your name, your number and a short message after the tone.", "closed_message": "Thank you for calling. We are closed right now.", "closed_message_before_forward": true, "overflow_chain": [ { "kind": "voicemail" } ], "after_hours_chain": [ { "kind": "voicemail" } ], "receptionist_voice_prompts": true, "schedule": { "open_steps": [ { "type": "menu", "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "timeout_seconds": 20 } ] } ], "closed_steps": [ { "type": "menu", "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "timeout_seconds": 20 } ] } ] } }, "prompts": [ { "prompt": "greeting" } ], "queue_routing_enabled": false}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}