API reference · v1
VICIfast API
Buy and manage phone numbers, place back-orders, read your calls and recordings, and follow your wallet from your own code. JSON over HTTPS, one error shape, signed webhooks, and a sandbox that never charges.
Authentication
Create a key in API → Keys in the dashboard and send it on every request. A key carries scopes — reading numbers, buying them, releasing them and seeing billing are separate grants — and can be limited to the IP addresses you use. The number, order, call and billing endpoints need an approved termination account.
curl https://vicifast.com/api/v1/numbers \
-H "Authorization: Bearer vf_live_…"Test mode
Keys that start vf_test_ work against a sandbox: a pretend $100.00 wallet, a made-up catalogue (555-0100 to 555-0199 in every area code; numbers ending 00 or 11 are premium at $25.00) and one server, srv_sandbox. Prices are your real ones. Nothing real is bought, charged or pointed, and every response carries X-VICIfast-Mode: test. A sandbox back-order delivers half of each line at once and leaves the rest open, so you can try tracking and cancelling. Reset the sandbox from API → Keys in the dashboard.
Errors
Every error has the same shape. Branch on code; the message is for people and may change. Every response carries an X-Request-Id to quote to support.
{ "error": { "code": "insufficient_funds",
"message": "That comes to $5.00 and the wallet holds $2.10. …",
"details": { "needed_cents": 500, "balance_cents": 210 } } }| Code | Status | Meaning |
|---|---|---|
invalid_request | 400 | Malformed input; `param` names the field. |
unauthorized | 401 | No API key, or not a valid one. |
insufficient_funds | 402 | The wallet cannot cover it. Nothing was charged; top up and retry with the same Idempotency-Key. |
forbidden | 403 | The key lacks the scope this endpoint needs. |
ip_not_allowed | 403 | The key is restricted to other addresses. |
account_not_approved | 403 | The account has no approved termination account yet. Test keys still work. |
test_mode_unsupported | 403 | This endpoint has no sandbox. |
not_found | 404 | No such thing on this account. |
conflict | 409 | A request with this Idempotency-Key is still running, or the thing changed state. |
numbers_unavailable | 409 | Those numbers are no longer for sale, or there are not enough. `details` says which. |
unprocessable | 422 | Understood but refused (an Idempotency-Key reused for a different request, a server that cannot take numbers). |
premium_price_not_accepted | 422 | A premium number named without accept_premium_price_cents equal to its price. |
limit_exceeded | 422 | It would charge more than your max_total_cents or max_charge_cents. Nothing happened. |
rate_limited | 429 | Over 600 requests a minute on this key. Wait Retry-After seconds. |
internal_error | 500 | Our fault. Quote X-Request-Id to support. |
service_unavailable | 503 | Something we depend on did not answer. Retry shortly. |
Retries and Idempotency-Key
Requests that spend or refund money — buying, releasing, placing and cancelling back-orders — need an Idempotency-Key header: any unique string, sent again unchanged when you retry. A retry of a request that succeeded gets the original answer back (with Idempotent-Replayed: true) and nothing happens twice. A request refused with a 4xx changed nothing, so the same key may be retried once the cause is fixed. Keys are remembered for 24 hours.
Pagination
Lists answer { "data": […], "has_more": true, "next_cursor": "…" }. Pass cursor=next_cursor for the next page, and limit (up to 500) for its size.
Rate limits
600 requests a minute per key, on every endpoint. Over it, the answer is 429 with a Retry-After header.
Numbers
What you hold, the catalogue, buying and releasing.
/api/v1/numbersList your numbers
The numbers this account holds (or held), newest first.
Needs the numbers:read scope.
Parameters
status | "active" | "released" | "all" · query | Default active. |
type | "local" | "toll_free" · query | |
routed | "true" | "false" · query | Pointed somewhere, or not. |
area_code | string · query | Only numbers in this area code (or toll-free prefix). |
order_id | string · query | Only numbers from this order. |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of numbers.
datarequired | object[] | |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/numbers?status=active&limit=50 \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/numbers/availableSearch numbers for sale
Numbers in stock, at your own price, in the order a quantity purchase takes them: never-owned first. Premium numbers only with include_premium=true.
Needs the numbers:read scope.
Parameters
type | "local" | "toll_free" · query | |
area_code | string · query | For toll-free, the prefix: 800, 833, 844… |
state | string · query | Two-letter state. |
contains | string · query | Digits the number must contain. |
include_premium | "true" | "false" · query | Default false. |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of numbers for sale.
datarequired | object[] | |
objectrequired | "available_number" | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
freshrequired | boolean | Never owned by anybody before. |
premiumrequired | boolean | |
monthly_price_centsrequired | integer | Your price, from your own terms. |
setup_price_centsrequired | integer | US cents. |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/numbers/available?area_code=305 \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/numbers/purchaseBuy numbers
Pays from the wallet: the first month of each number (plus any setup fee) now, then monthly. All of them or none. Name the numbers, or ask for a quantity matching criteria. A premium number is bought only when named with accept_premium_price_cents equal to its monthly price. Each number has a three-month minimum term. dry_run returns the exact charge and buys nothing; without it an Idempotency-Key is required.
Needs the numbers:buy scope.
Parameters
Idempotency-Key | string · header |
Request body
numbers | (string | object)[] | Buy these exact numbers. All of them or none. Premium numbers need accept_premium_price_cents. |
numberrequired | string | Any common North American form. |
accept_premium_price_cents | integer | Required for a premium number: its monthly price, as you were shown it. |
quantity | integer | Or buy this many matching the criteria, chosen for you (never premium). All of them or none. |
type | "local" | "toll_free" | With quantity: local or toll-free. |
area_code | string | With quantity: the area code (toll-free: the prefix). |
state | string | With quantity: two-letter state. |
contains | string | With quantity: digits the numbers must contain. |
max_total_cents | integer | Refuse the purchase if it would charge more than this now. |
ring_on | object | Point the new numbers here straight away. |
server_idrequired | string | |
in_grouprequired | string | |
dry_run | boolean | Return exactly what the purchase would charge and buy nothing. Needs no Idempotency-Key. Not a reservation. |
200 · With dry_run: what it would charge. Nothing bought.
datarequired | object | |
objectrequired | "purchase_quote" | |
dry_runrequired | true | |
charge_centsrequired | integer | What the purchase would charge now. |
balance_centsrequired | integer | US cents. |
numbersrequired | object[] | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | |
monthly_price_centsrequired | integer | US cents. |
setup_price_centsrequired | integer | US cents. |
201 · Bought. The numbers are yours.
datarequired | object | |
objectrequired | "purchase" | |
order_idrequired | string | |
charged_centsrequired | integer | US cents. |
balance_centsrequired | integer | Your wallet after the charge. |
numbersrequired | object[] | |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null | |
ringingrequired | object | null | How pointing went, when ring_on was given. |
okrequired | boolean | |
messagerequired | string |
curl -X POST https://vicifast.com/api/v1/numbers/purchase \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"quantity": 5,
"area_code": "305",
"max_total_cents": 1000,
"ring_on": { "server_id": "srv_…", "in_group": "SALES" }
}'/api/v1/numbers/releaseGive numbers back
Inside the three-month minimum term, the rest of the term is charged per number. dry_run returns that charge and changes nothing; the same call without it releases. All of them or none. Needs an Idempotency-Key unless dry_run.
Needs the numbers:release scope.
Parameters
Idempotency-Key | string · header |
Request body
numbersrequired | string[] | |
dry_run | boolean | Return exactly what releasing would charge, and release nothing. |
max_charge_cents | integer | Refuse if the minimum-term charge would be more than this. |
200 · Released (or, with dry_run, what releasing would cost).
datarequired | object | |
objectrequired | "release" | |
dry_runrequired | boolean | |
charge_centsrequired | integer | The balance of each number's three-month minimum term. Zero once the term is served. |
numbersrequired | object[] | |
numberrequired | string | E.164, with the plus. |
releasedrequired | boolean | |
charge_centsrequired | integer | US cents. |
errorrequired | string | null |
curl -X POST https://vicifast.com/api/v1/numbers/release \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "numbers": ["+13055550101"], "dry_run": true }'/api/v1/numbers/{number}Get a number
Needs the numbers:read scope.
Parameters
numberrequired | string · path | The number, in any common form (+13055551234 URL-encoded as %2B13055551234). |
200 · The number.
datarequired | object | |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null |
curl https://vicifast.com/api/v1/numbers/%2B13055550101 \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/numbers/{number}Update a number
Label it, write notes, turn auto-renew on or off, or change where it rings: routing points it at one of your servers and an in-group, and null unpoints it (it stays yours and keeps billing). With auto-renew off a number is released at its first renewal after the minimum term.
Needs the numbers:write scope.
Parameters
numberrequired | string · path | The number, in any common form (+13055551234 URL-encoded as %2B13055551234). |
Request body
label | string | null | |
notes | string | null | |
auto_renew | boolean | |
routing | object | null | Where it rings. null unpoints it; it stays yours and keeps billing. |
server_idrequired | string | |
in_grouprequired | string | The VICIdial in-group calls should land on. |
200 · The number, as it is now.
datarequired | object | |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null |
curl -X PATCH https://vicifast.com/api/v1/numbers/%2B13055550101 \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Miami sales",
"auto_renew": false,
"routing": { "server_id": "srv_…", "in_group": "SALES" }
}'/api/v1/serversList your servers
Where numbers can be pointed: use a server id in routing or ring_on.
Needs the numbers:read scope.
200 · Your servers.
datarequired | object[] | |
objectrequired | "server" | |
idrequired | string | |
hostnamerequired | string | |
statusrequired | string | |
accepts_numbersrequired | boolean | Has an address, so numbers can be pointed at it. They arrive over the VICIfast trunk, installed on the server when needed. |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/servers \
-H "Authorization: Bearer $VICIFAST_KEY"Orders
Purchases and back-orders.
/api/v1/ordersList orders
Batches of numbers you received: a purchase, or a back-order as it fills.
Needs the orders:read scope.
Parameters
status | "open" | "filled" | "routed" | "closed" · query | |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of orders.
datarequired | object[] | |
objectrequired | "order" | |
idrequired | string | |
statusrequired | "open" | "filled" | "routed" | "closed" | open: still arriving (from a back-order). filled: all delivered. routed: all pointed at one place. closed: every number released. |
typerequired | "local" | "toll_free" | null | |
quantityrequired | integer | |
active_numbersrequired | integer | |
criteriarequired | object | |
staterequired | string | null | |
area_coderequired | string | null | |
containsrequired | string | null | |
backorder_idrequired | string | null | |
routingrequired | object | null | Where the whole order was pointed, when it was pointed as one. |
server_idrequired | string | |
in_grouprequired | string | null | |
created_atrequired | string | |
numbers | object[] | On GET /v1/orders/{id} only. |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/orders \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/orders/{id}Get an order, with its numbers
Needs the orders:read scope.
Parameters
idrequired | string · path |
200 · The order.
datarequired | object | |
objectrequired | "order" | |
idrequired | string | |
statusrequired | "open" | "filled" | "routed" | "closed" | open: still arriving (from a back-order). filled: all delivered. routed: all pointed at one place. closed: every number released. |
typerequired | "local" | "toll_free" | null | |
quantityrequired | integer | |
active_numbersrequired | integer | |
criteriarequired | object | |
staterequired | string | null | |
area_coderequired | string | null | |
containsrequired | string | null | |
backorder_idrequired | string | null | |
routingrequired | object | null | Where the whole order was pointed, when it was pointed as one. |
server_idrequired | string | |
in_grouprequired | string | null | |
created_atrequired | string | |
numbers | object[] | On GET /v1/orders/{id} only. |
objectrequired | "phone_number" | |
idrequired | string | |
numberrequired | string | E.164, with the plus. |
typerequired | "local" | "toll_free" | |
premiumrequired | boolean | A memorable number with its own price. |
statusrequired | "active" | "released" | |
labelrequired | string | null | |
notesrequired | string | null | |
staterequired | string | null | |
area_coderequired | string | null | |
rate_centerrequired | string | null | |
monthly_price_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
auto_renewrequired | boolean | |
at_next_renewalrequired | "charge" | "release" | null | What happens on next_renewal_at. With auto_renew off the number is released at the first renewal after its three-month minimum term; before that, months are still charged. |
purchased_atrequired | string | |
min_term_ends_atrequired | string | |
next_renewal_atrequired | string | null | |
released_atrequired | string | null | |
release_charge_centsrequired | integer | null | |
order_idrequired | string | null | |
routingrequired | object | null | Null when it rings nowhere. |
server_idrequired | string | |
server_hostnamerequired | string | |
route_kindrequired | "ingroup" | "campaign" | "extension" | "ivr" | |
targetrequired | string | The in-group (or other target) calls land on. |
staterequired | "pending" | "applied" | "failed" | Whether the server has taken the change yet. |
errorrequired | string | null |
curl https://vicifast.com/api/v1/orders/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/backordersList back-orders
Needs the orders:read scope.
Parameters
status | "open" | "filled" | "cancelled" | "expired" · query | |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of back-orders.
datarequired | object[] | |
objectrequired | "backorder" | |
idrequired | string | |
statusrequired | "open" | "filled" | "cancelled" | "expired" | |
typerequired | "local" | "toll_free" | |
quantityrequired | integer | |
filledrequired | integer | |
allow_nearbyrequired | boolean | |
price_each_centsrequired | integer | Prepaid per number; the most any will cost. |
paid_centsrequired | integer | US cents. |
refunded_centsrequired | integer | US cents. |
linesrequired | object[] | |
area_coderequired | string | Area code, or toll-free prefix. |
staterequired | string | null | |
quantityrequired | integer | |
filledrequired | integer | |
ring_onrequired | object | null | |
server_idrequired | string | |
in_grouprequired | string | |
order_idrequired | string | null | The order the delivered numbers are in, once the first arrives. |
created_atrequired | string | |
cancelled_atrequired | string | null | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/backorders \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/backordersPlace a back-order
Ask for numbers by area code (or toll-free prefix). Paid up front at your price; numbers are delivered as stock arrives, each line counted separately. Cancel any time to get back what has not arrived.
Needs the orders:write scope.
Parameters
Idempotency-Key | string · header |
Request body
type | "local" | "toll_free" | Default local. |
linesrequired | object[] | |
area_coderequired | string | Area code; for toll-free, the prefix (800, 833…). |
quantityrequired | integer | |
allow_nearby | boolean | When an area code runs short, a nearby one in the same state will do (any toll-free prefix, on a toll-free order). |
ring_on | object | Point the numbers here as they arrive. |
server_idrequired | string | |
in_grouprequired | string | |
max_total_cents | integer | Refuse the order if it would charge more than this now. |
dry_run | boolean | Return exactly what the order would charge and place nothing. Needs no Idempotency-Key. |
200 · With dry_run: what it would charge. Nothing placed.
datarequired | object | |
objectrequired | "backorder_quote" | |
dry_runrequired | true | |
charge_centsrequired | integer | US cents. |
quantityrequired | integer | |
price_each_centsrequired | integer | US cents. |
balance_centsrequired | integer | US cents. |
201 · Placed and paid.
datarequired | object | |
objectrequired | "backorder" | |
idrequired | string | |
statusrequired | "open" | "filled" | "cancelled" | "expired" | |
typerequired | "local" | "toll_free" | |
quantityrequired | integer | |
filledrequired | integer | |
allow_nearbyrequired | boolean | |
price_each_centsrequired | integer | Prepaid per number; the most any will cost. |
paid_centsrequired | integer | US cents. |
refunded_centsrequired | integer | US cents. |
linesrequired | object[] | |
area_coderequired | string | Area code, or toll-free prefix. |
staterequired | string | null | |
quantityrequired | integer | |
filledrequired | integer | |
ring_onrequired | object | null | |
server_idrequired | string | |
in_grouprequired | string | |
order_idrequired | string | null | The order the delivered numbers are in, once the first arrives. |
created_atrequired | string | |
cancelled_atrequired | string | null |
curl -X POST https://vicifast.com/api/v1/backorders \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"lines": [{ "area_code": "305", "quantity": 20 }, { "area_code": "786", "quantity": 10 }],
"allow_nearby": true
}'/api/v1/backorders/{id}Get a back-order
Needs the orders:read scope.
Parameters
idrequired | string · path |
200 · The back-order.
datarequired | object | |
objectrequired | "backorder" | |
idrequired | string | |
statusrequired | "open" | "filled" | "cancelled" | "expired" | |
typerequired | "local" | "toll_free" | |
quantityrequired | integer | |
filledrequired | integer | |
allow_nearbyrequired | boolean | |
price_each_centsrequired | integer | Prepaid per number; the most any will cost. |
paid_centsrequired | integer | US cents. |
refunded_centsrequired | integer | US cents. |
linesrequired | object[] | |
area_coderequired | string | Area code, or toll-free prefix. |
staterequired | string | null | |
quantityrequired | integer | |
filledrequired | integer | |
ring_onrequired | object | null | |
server_idrequired | string | |
in_grouprequired | string | |
order_idrequired | string | null | The order the delivered numbers are in, once the first arrives. |
created_atrequired | string | |
cancelled_atrequired | string | null |
curl https://vicifast.com/api/v1/backorders/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/backorders/{id}/cancelCancel a back-order
Stops waiting and refunds the numbers that have not arrived. Delivered numbers stay yours.
Needs the orders:write scope.
Parameters
idrequired | string · path | |
Idempotency-Keyrequired | string · header | Required. Any unique string (a UUID is ideal). Retry with the same key and the original result is returned instead of the work being done twice. |
200 · Cancelled and refunded.
datarequired | object | |
objectrequired | "backorder" | |
idrequired | string | |
statusrequired | "open" | "filled" | "cancelled" | "expired" | |
typerequired | "local" | "toll_free" | |
quantityrequired | integer | |
filledrequired | integer | |
allow_nearbyrequired | boolean | |
price_each_centsrequired | integer | Prepaid per number; the most any will cost. |
paid_centsrequired | integer | US cents. |
refunded_centsrequired | integer | US cents. |
linesrequired | object[] | |
area_coderequired | string | Area code, or toll-free prefix. |
staterequired | string | null | |
quantityrequired | integer | |
filledrequired | integer | |
ring_onrequired | object | null | |
server_idrequired | string | |
in_grouprequired | string | |
order_idrequired | string | null | The order the delivered numbers are in, once the first arrives. |
created_atrequired | string | |
cancelled_atrequired | string | null | |
refunded_now_centsrequired | integer |
curl -X POST https://vicifast.com/api/v1/backorders/:id/cancel \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Idempotency-Key: $(uuidgen)"Calls
Call records and recordings.
/api/v1/callsList calls
Outbound calls you made and inbound calls to your numbers, newest first, from the last 30 days at most.
Needs the calls:read scope.
Parameters
direction | "inbound" | "outbound" · query | |
number | string · query | Inbound calls to this one of your numbers. |
answered | "true" | "false" · query | |
window | "1h" | "24h" | "7d" | "30d" · query | Default 7d. |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of calls.
datarequired | object[] | |
objectrequired | "call" | |
idrequired | string | The SIP call id. |
directionrequired | "inbound" | "outbound" | |
fromrequired | string | The caller, E.164 when it is a North American number. |
torequired | string | |
numberrequired | string | null | Inbound: which of your numbers it arrived on. |
started_atrequired | string | |
answered_atrequired | string | null | |
ended_atrequired | string | null | |
answeredrequired | boolean | |
duration_srequired | integer | |
billable_srequired | integer | |
sip_coderequired | integer | null | |
hangup_causerequired | string | |
charge_nanosrequired | integer | What the call cost, in billionths of a dollar (2000000 = $0.002). |
recordingrequired | boolean | A recording can be fetched with GET /v1/calls/{id}/recording. |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/calls?direction=inbound&window=7d \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/calls/{id}Get a call
Needs the calls:read scope.
Parameters
idrequired | string · path |
200 · The call.
datarequired | object | |
objectrequired | "call" | |
idrequired | string | The SIP call id. |
directionrequired | "inbound" | "outbound" | |
fromrequired | string | The caller, E.164 when it is a North American number. |
torequired | string | |
numberrequired | string | null | Inbound: which of your numbers it arrived on. |
started_atrequired | string | |
answered_atrequired | string | null | |
ended_atrequired | string | null | |
answeredrequired | boolean | |
duration_srequired | integer | |
billable_srequired | integer | |
sip_coderequired | integer | null | |
hangup_causerequired | string | |
charge_nanosrequired | integer | What the call cost, in billionths of a dollar (2000000 = $0.002). |
recordingrequired | boolean | A recording can be fetched with GET /v1/calls/{id}/recording. |
curl https://vicifast.com/api/v1/calls/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/calls/{id}/recordingGet a recording link
A link to the call's recording, good for fifteen minutes and usable without an API key (hand it to a browser or a player). Only for calls that have one.
Needs the calls:read scope.
Parameters
idrequired | string · path |
200 · The link.
datarequired | object | |
objectrequired | "recording_link" | |
call_idrequired | string | |
urlrequired | string | Fetch with no API key: the URL is the credential. WAV audio. Works for 15 minutes. |
expires_atrequired | string |
curl https://vicifast.com/api/v1/calls/:id/recording \
-H "Authorization: Bearer $VICIFAST_KEY"Billing
The wallet.
/api/v1/billing/balanceGet the wallet balance
Needs the billing:read scope.
200 · The wallet.
datarequired | object | |
objectrequired | "balance" | |
balance_centsrequired | integer | US cents. |
currencyrequired | "usd" | |
credit_limit_centsrequired | integer | How far below zero renewals may take the wallet so numbers keep ringing. Purchases need the funds. |
low_balance_alertrequired | object | |
enabledrequired | boolean | |
threshold_centsrequired | integer | null | |
auto_top_uprequired | object | |
enabledrequired | boolean |
curl https://vicifast.com/api/v1/billing/balance \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/billing/transactionsList wallet transactions
Needs the billing:read scope.
Parameters
type | string · query | One type or several, comma-separated: charge_did_purchase,topup_stripe |
direction | "credit" | "debit" · query | |
from | string · query | |
to | string · query | |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of transactions, newest first.
datarequired | object[] | |
objectrequired | "transaction" | |
idrequired | string | |
typerequired | string | |
amount_centsrequired | integer | Signed: positive credits the wallet. |
balance_after_centsrequired | integer | US cents. |
descriptionrequired | string | null | |
reference_idrequired | string | null | |
created_atrequired | string | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/billing/transactions \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/billing/renewalsList upcoming renewals
What the wallet will be charged, and when: your numbers and wallet-billed servers.
Needs the billing:read scope.
Parameters
days | integer · query | Default 30. |
200 · Upcoming renewals, soonest first.
datarequired | object[] | |
objectrequired | "renewal" | |
kindrequired | "number" | "server" | |
descriptionrequired | string | The number, or the server hostname. |
due_atrequired | string | |
actionrequired | "charge" | "release" | release: a number with auto-renew off, past its minimum term, ends that day. |
amount_centsrequired | integer | US cents. |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/billing/renewals \
-H "Authorization: Bearer $VICIFAST_KEY"Webhook endpoints
Where events are sent, their signing secrets, and what was delivered.
/api/v1/webhook-endpointsList webhook endpoints
This key's mode only: a live key sees live endpoints, a test key test ones.
Needs the webhooks:read scope.
200 · Every endpoint, oldest first.
datarequired | object[] | |
objectrequired | "webhook_endpoint" | |
idrequired | string | |
urlrequired | string | |
descriptionrequired | string | null | |
eventsrequired | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | |
enabledrequired | boolean | false: nothing is sent to it. |
livemoderequired | boolean | true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it. |
wallet_low_threshold_centsrequired | integer | null | wallet.low fires once when the balance drops below this, and again only after it has been back above. |
last_statusrequired | integer | null | HTTP status of the last attempt. |
last_errorrequired | string | null | |
last_sent_atrequired | string | null | |
failing_sincerequired | string | null | Set while deliveries are failing; cleared by the next one that succeeds. |
created_atrequired | string | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/webhook-endpoints \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/webhook-endpointsAdd a webhook endpoint
Up to 10 per account. The endpoint gets this key's mode: one made with a test key receives the sandbox's events. The secret is in the answer; keep it.
Needs the webhooks:write scope.
Request body
urlrequired | string | https only, and on the public internet: private and loopback addresses are refused. |
description | string | |
eventsrequired | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | |
wallet_low_threshold_cents | integer | Required with wallet.low. |
201 · Added.
datarequired | object | |
objectrequired | "webhook_endpoint" | |
idrequired | string | |
urlrequired | string | |
descriptionrequired | string | null | |
eventsrequired | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | |
enabledrequired | boolean | false: nothing is sent to it. |
livemoderequired | boolean | true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it. |
wallet_low_threshold_centsrequired | integer | null | wallet.low fires once when the balance drops below this, and again only after it has been back above. |
last_statusrequired | integer | null | HTTP status of the last attempt. |
last_errorrequired | string | null | |
last_sent_atrequired | string | null | |
failing_sincerequired | string | null | Set while deliveries are failing; cleared by the next one that succeeds. |
created_atrequired | string | |
secretrequired | string | Signs every delivery (X-VICIfast-Signature). Shown when the endpoint is made and when the secret is rotated; keep it. |
curl -X POST https://vicifast.com/api/v1/webhook-endpoints \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/vicifast",
"events": ["numbers.arrived", "number.routing_failed", "wallet.low"],
"wallet_low_threshold_cents": 5000
}'/api/v1/webhook-endpoints/{id}Get a webhook endpoint
Needs the webhooks:read scope.
Parameters
idrequired | string · path |
200 · The endpoint.
datarequired | object | |
objectrequired | "webhook_endpoint" | |
idrequired | string | |
urlrequired | string | |
descriptionrequired | string | null | |
eventsrequired | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | |
enabledrequired | boolean | false: nothing is sent to it. |
livemoderequired | boolean | true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it. |
wallet_low_threshold_centsrequired | integer | null | wallet.low fires once when the balance drops below this, and again only after it has been back above. |
last_statusrequired | integer | null | HTTP status of the last attempt. |
last_errorrequired | string | null | |
last_sent_atrequired | string | null | |
failing_sincerequired | string | null | Set while deliveries are failing; cleared by the next one that succeeds. |
created_atrequired | string |
curl https://vicifast.com/api/v1/webhook-endpoints/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/webhook-endpoints/{id}Change a webhook endpoint
Its address, events, threshold, description, or switch it off and on.
Needs the webhooks:write scope.
Parameters
idrequired | string · path |
Request body
url | string | https only, and on the public internet: private and loopback addresses are refused. |
description | string | null | |
events | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | Replaces the list. |
enabled | boolean | |
wallet_low_threshold_cents | integer | null |
200 · Changed.
datarequired | object | |
objectrequired | "webhook_endpoint" | |
idrequired | string | |
urlrequired | string | |
descriptionrequired | string | null | |
eventsrequired | ("numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up")[] | |
enabledrequired | boolean | false: nothing is sent to it. |
livemoderequired | boolean | true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it. |
wallet_low_threshold_centsrequired | integer | null | wallet.low fires once when the balance drops below this, and again only after it has been back above. |
last_statusrequired | integer | null | HTTP status of the last attempt. |
last_errorrequired | string | null | |
last_sent_atrequired | string | null | |
failing_sincerequired | string | null | Set while deliveries are failing; cleared by the next one that succeeds. |
created_atrequired | string |
curl -X PATCH https://vicifast.com/api/v1/webhook-endpoints/:id \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Content-Type: application/json" \
-d '{ "enabled": false }'/api/v1/webhook-endpoints/{id}Remove a webhook endpoint
Its undelivered events are dropped with it.
Needs the webhooks:write scope.
Parameters
idrequired | string · path |
200 · Removed.
datarequired | object | |
objectrequired | "webhook_endpoint" | |
idrequired | string | |
deletedrequired | true |
curl -X DELETE https://vicifast.com/api/v1/webhook-endpoints/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/webhook-endpoints/{id}/rotate-secretRotate the signing secret
A new secret for this endpoint, used from the next delivery on. The old one stops working at once, so update your receiver straight after.
Needs the webhooks:write scope.
Parameters
idrequired | string · path |
200 · The new secret.
datarequired | object | |
objectrequired | "webhook_secret" | |
endpoint_idrequired | string | |
secretrequired | string | The new secret. The old one stops working from the next delivery. |
curl -X POST https://vicifast.com/api/v1/webhook-endpoints/:id/rotate-secret \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/webhook-endpoints/{id}/testSend a test event
Sends a sample of one event type to this endpoint now, signed like any other, and says what came back. The sample has test: true in its data and is tried once.
Needs the webhooks:write scope.
Parameters
idrequired | string · path |
Request body
typerequired | "numbers.arrived" | "number.released" | "number.renewal_failed" | "call.inbound.completed" | "call.outbound.completed" | "wallet.low" | "backorder.filled" | "number.routing_failed" | "wallet.topped_up" | Which event to send a sample of. |
200 · Sent; delivered says whether it arrived.
datarequired | object | |
objectrequired | "webhook_test" | |
event_idrequired | string | |
delivery_idrequired | string | |
deliveredrequired | boolean | Whether your endpoint answered 2xx. |
statusrequired | integer | null | |
errorrequired | string | null |
curl -X POST https://vicifast.com/api/v1/webhook-endpoints/:id/test \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "numbers.arrived" }'/api/v1/webhook-endpoints/{id}/deliveriesList deliveries to an endpoint
Newest first: what was sent, what came back, and what is still being retried.
Needs the webhooks:read scope.
Parameters
idrequired | string · path | |
state | "pending" | "retrying" | "delivered" | "gave_up" · query | |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of deliveries.
datarequired | object[] | |
objectrequired | "webhook_delivery" | |
idrequired | string | Sent as X-VICIfast-Delivery. |
endpoint_idrequired | string | |
event_idrequired | string | |
event_typerequired | string | |
testrequired | boolean | A sample sent with "send test". Tried once. |
staterequired | "pending" | "retrying" | "delivered" | "gave_up" | retrying: failed, and tried again after 1, 5, 15, 60 and 240 minutes. gave_up: every attempt failed, or the receiver refused it outright (a 4xx other than 408 or 429). |
attemptsrequired | integer | |
last_statusrequired | integer | null | |
last_errorrequired | string | null | |
created_atrequired | string | |
delivered_atrequired | string | null | |
next_attempt_atrequired | string | null | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/webhook-endpoints/:id/deliveries \
-H "Authorization: Bearer $VICIFAST_KEY"Events
The events of the last 30 days, and sending one again.
/api/v1/eventsList events
The events of the last 30 days, newest first, in this key's mode — each one exactly as its webhook body. An event is recorded when at least one endpoint was subscribed to it at the time; catch up on what your receiver missed from here.
Needs the webhooks:read scope.
Parameters
type | string · query | One type or several, comma-separated: numbers.arrived,number.released |
from | string · query | |
to | string · query | |
limit | integer · query | Page size, up to 500. |
cursor | string · query | next_cursor from the previous page. |
200 · A page of events.
datarequired | object[] | |
idrequired | string | |
objectrequired | "event" | |
typerequired | string | |
livemoderequired | boolean | |
created_atrequired | string | |
datarequired | object | Shaped by the type; see Webhooks below. Samples sent with "send test" have test: true. |
has_morerequired | boolean | |
next_cursorrequired | string | null |
curl https://vicifast.com/api/v1/events?type=numbers.arrived,number.released&limit=50 \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/events/{id}Get an event, with its deliveries
Needs the webhooks:read scope.
Parameters
idrequired | string · path |
200 · The event.
datarequired | object | |
idrequired | string | |
objectrequired | "event" | |
typerequired | string | |
livemoderequired | boolean | |
created_atrequired | string | |
datarequired | object | Shaped by the type; see Webhooks below. Samples sent with "send test" have test: true. |
deliveriesrequired | object[] | |
objectrequired | "webhook_delivery" | |
idrequired | string | Sent as X-VICIfast-Delivery. |
endpoint_idrequired | string | |
event_idrequired | string | |
event_typerequired | string | |
testrequired | boolean | A sample sent with "send test". Tried once. |
staterequired | "pending" | "retrying" | "delivered" | "gave_up" | retrying: failed, and tried again after 1, 5, 15, 60 and 240 minutes. gave_up: every attempt failed, or the receiver refused it outright (a 4xx other than 408 or 429). |
attemptsrequired | integer | |
last_statusrequired | integer | null | |
last_errorrequired | string | null | |
created_atrequired | string | |
delivered_atrequired | string | null | |
next_attempt_atrequired | string | null |
curl https://vicifast.com/api/v1/events/:id \
-H "Authorization: Bearer $VICIFAST_KEY"/api/v1/events/{id}/resendSend an event again
Queues the event again, to one endpoint or to every endpoint subscribed to it now, and starts sending at once. Each is a new delivery with a new X-VICIfast-Delivery id; the event id is the same, so a receiver that keeps the event ids it has handled can tell it is a repeat.
Needs the webhooks:write scope.
Parameters
idrequired | string · path |
Request body
endpoint_id | string | Only to this endpoint. Left out: to every endpoint that is on and subscribed to the type now. |
202 · Queued; the deliveries are on their way.
datarequired | object | |
objectrequired | "event_resend" | |
event_idrequired | string | |
deliveriesrequired | object[] | |
objectrequired | "webhook_delivery" | |
idrequired | string | Sent as X-VICIfast-Delivery. |
endpoint_idrequired | string | |
event_idrequired | string | |
event_typerequired | string | |
testrequired | boolean | A sample sent with "send test". Tried once. |
staterequired | "pending" | "retrying" | "delivered" | "gave_up" | retrying: failed, and tried again after 1, 5, 15, 60 and 240 minutes. gave_up: every attempt failed, or the receiver refused it outright (a 4xx other than 408 or 429). |
attemptsrequired | integer | |
last_statusrequired | integer | null | |
last_errorrequired | string | null | |
created_atrequired | string | |
delivered_atrequired | string | null | |
next_attempt_atrequired | string | null |
curl -X POST https://vicifast.com/api/v1/events/:id/resend \
-H "Authorization: Bearer $VICIFAST_KEY" \
-H "Content-Type: application/json" \
-d '{ "endpoint_id": "we_…" }'Webhooks
Add endpoints in API → Webhooks in the dashboard — several if you like, each with its own events and its own signing secret. We POST each event as JSON and retry anything but a 2xx after 1, 5, 15, 60 and 240 minutes. X-VICIfast-Delivery stays the same across retries of one event, so you can skip one you have already handled.
{
"id": "cmg…",
"object": "event",
"type": "numbers.arrived",
"livemode": true,
"created_at": "2026-10-03T20:00:00.000Z",
"data": { … }
}Checking a request is from us
X-VICIfast-Signature: t=…,v1=… carries an HMAC-SHA256 of `${t}.${body}` with the endpoint’s secret. Compare it in constant time and refuse a t more than five minutes old.
import crypto from 'node:crypto';
function fromVicifast(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const want = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return v1?.length === want.length &&
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(want));
}numbers.arrivedNumbers are yours: bought, delivered against a back-order, or assigned.
data
sourcerequired | "purchase" | "backorder" | "assigned" | |
order_idrequired | string | null | |
backorder_idrequired | string | null | |
numbersrequired | string[] |
number.releasedA number left your account.
data
numberrequired | string | E.164, with the plus. |
reasonrequired | "customer" | "auto_renew_off" | "account" | |
charge_centsrequired | integer | |
released_atrequired | string |
number.renewal_failedA renewal could not be paid (sent once per number per billing month; the charge is retried every hour).
data
numberrequired | string | E.164, with the plus. |
amount_centsrequired | integer | |
due_atrequired | string | |
reasonrequired | "insufficient_funds" | "error" |
call.inbound.completedAn inbound call to one of your numbers finished.
data
objectrequired | "call" | |
idrequired | string | The SIP call id. |
directionrequired | "inbound" | "outbound" | |
fromrequired | string | The caller, E.164 when it is a North American number. |
torequired | string | |
numberrequired | string | null | Inbound: which of your numbers it arrived on. |
started_atrequired | string | |
answered_atrequired | string | null | |
ended_atrequired | string | null | |
answeredrequired | boolean | |
duration_srequired | integer | |
billable_srequired | integer | |
sip_coderequired | integer | null | |
hangup_causerequired | string | |
charge_nanosrequired | integer | What the call cost, in billionths of a dollar (2000000 = $0.002). |
recordingrequired | boolean | A recording can be fetched with GET /v1/calls/{id}/recording. |
call.outbound.completedAn outbound call you made finished, answered or not. A dialer makes many; each is one delivery..
data
objectrequired | "call" | |
idrequired | string | The SIP call id. |
directionrequired | "inbound" | "outbound" | |
fromrequired | string | The caller, E.164 when it is a North American number. |
torequired | string | |
numberrequired | string | null | Inbound: which of your numbers it arrived on. |
started_atrequired | string | |
answered_atrequired | string | null | |
ended_atrequired | string | null | |
answeredrequired | boolean | |
duration_srequired | integer | |
billable_srequired | integer | |
sip_coderequired | integer | null | |
hangup_causerequired | string | |
charge_nanosrequired | integer | What the call cost, in billionths of a dollar (2000000 = $0.002). |
recordingrequired | boolean | A recording can be fetched with GET /v1/calls/{id}/recording. |
wallet.lowThe wallet dropped below the endpoint's threshold.
data
objectrequired | "balance" | |
balance_centsrequired | integer | |
threshold_centsrequired | integer | |
currencyrequired | "usd" |
backorder.filledEvery number a back-order asked for has arrived (sent once, after the numbers.arrived for the last delivery).
data
backorder_idrequired | string | |
order_idrequired | string | The order the numbers were delivered into. |
quantityrequired | integer | |
refunded_centsrequired | integer | Refunded in all because numbers cost less than the price paid up front. |
filled_atrequired | string |
number.routing_failedA number could not be pointed at your server, so it will not ring there yet. Point it again (PATCH the number) once the cause is fixed..
data
numberrequired | string | E.164, with the plus. |
server_idrequired | string | |
route_kindrequired | string | |
targetrequired | string | The in-group (or other target) it was to ring. |
stagerequired | "platform" | "switch" | "server" | platform: the server had no address or VICIfast trunk, or pointing failed before anything was sent. switch: our switch did not take the change. server: your server did not take it after three tries (is it running?). |
errorrequired | string | null |
wallet.topped_upMoney was added to the wallet: by card, PayPal, crypto, or by us.
data
objectrequired | "transaction" | |
idrequired | string | |
typerequired | string | |
amount_centsrequired | integer | Signed: positive credits the wallet. |
balance_after_centsrequired | integer | US cents. |
descriptionrequired | string | null | |
reference_idrequired | string | null | |
created_atrequired | string |