Write the answering policy a verified BYO number answers by
const url = 'https://api.vocapable.com/v1/phone-numbers/example/answering-policy';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"timezone":"example","business_hours":{"additionalProperty":[{"start":"example","end":"example"}]},"holiday_dates":["2026-04-15"],"open_steps":[{"type":"menu","prompt":"example","branches":{},"timeout_seconds":5,"max_invalid_attempts":2,"timeout_branch":[{"type":"ring_humans","rep_ids":["example"],"timeout_seconds":20}]}],"closed_steps":[{"type":"menu","prompt":"example","branches":{},"timeout_seconds":5,"max_invalid_attempts":2,"timeout_branch":[{"type":"ring_humans","rep_ids":["example"],"timeout_seconds":20}]}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://api.vocapable.com/v1/phone-numbers/example/answering-policy \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "timezone": "example", "business_hours": { "additionalProperty": [ { "start": "example", "end": "example" } ] }, "holiday_dates": [ "2026-04-15" ], "open_steps": [ { "type": "menu", "prompt": "example", "branches": {}, "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "rep_ids": [ "example" ], "timeout_seconds": 20 } ] } ], "closed_steps": [ { "type": "menu", "prompt": "example", "branches": {}, "timeout_seconds": 5, "max_invalid_attempts": 2, "timeout_branch": [ { "type": "ring_humans", "rep_ids": [ "example" ], "timeout_seconds": 20 } ] } ] }'Replace one number’s whole answering document and put it on the policy route.
The same eligibility a live-agent route requires, for the same reason: a policy arms
carrier ingress just as an agent does. What it additionally proves is that every
reference inside the document resolves now - each ai step’s agent has a published
immutable version, and every ring_humans rep is an active transfer-enabled rep of this
tenant. Those are the two ways a policy could otherwise be written that answers a real
caller with a dead end, and a carrier callback is the wrong place to discover either.
The document is written before the route is moved, so a number is never in policy mode
with nothing to execute; both statements share the request transaction, so a failure at
either point leaves the number on the route it already had.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”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.
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.
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.
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.
object
Responses
Section titled “Responses”Successful Response
One number’s stored answering document, as its tenant reads it back.
version is server-owned and bumped on every write. It is not an optimistic-locking
token for this endpoint: it exists so a signed callback URL can carry the exact document
revision it was minted against, and a caller walking a policy that was edited mid-call
is detected rather than silently re-routed.
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.
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.
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.
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.
object
Example
{ "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 } ] } ]}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}