{"openapi":"3.1.0","info":{"title":"VICIfast API","version":"1","termsOfService":"https://vicifast.com/terms","contact":{"name":"VICIfast support","url":"https://vicifast.com/contact"},"license":{"name":"Proprietary: use under the VICIfast terms","url":"https://vicifast.com/terms"},"description":"Buy and manage phone numbers, place back-orders, read calls and recordings, follow your wallet, and manage the webhooks that tell you when things happen — from your own code.\n\nAuthenticate with an API key from API → Keys in the dashboard as `Authorization: Bearer vf_live_…`. Each key has scopes and, optionally, the addresses it may be used from. Test keys (`vf_test_…`) work against a sandbox that never charges.\n\nErrors: invalid_request, unauthorized, insufficient_funds, forbidden, ip_not_allowed, account_not_approved, test_mode_unsupported, sandbox_only, not_found, conflict, numbers_unavailable, unprocessable, premium_price_not_accepted, limit_exceeded, rate_limited, internal_error, service_unavailable."},"servers":[{"url":"https://vicifast.com"}],"tags":[{"name":"Numbers","description":"What you hold, the catalogue, buying and releasing."},{"name":"Orders","description":"Purchases and back-orders."},{"name":"Calls","description":"Call records and recordings."},{"name":"Billing","description":"The wallet."},{"name":"Webhook endpoints","description":"Where events are sent, their signing secrets, and what was delivered."},{"name":"Events","description":"The events of the last 30 days, and sending one again."},{"name":"Sandbox","description":"Test keys only: make a call ring, time pass, a back-order fill or the wallet run low, and see what your code does."},{"name":"Webhooks","description":"Events we POST to your endpoints."}],"security":[{"apiKey":[]}],"paths":{"/api/v1/numbers":{"get":{"operationId":"listNumbers","summary":"List your numbers","description":"The numbers this account holds (or held), newest first.","tags":["Numbers"],"x-scope":"numbers:read","parameters":[{"in":"query","name":"status","schema":{"description":"Default active.","type":"string","enum":["active","released","all"]},"description":"Default active."},{"in":"query","name":"type","schema":{"type":"string","enum":["local","toll_free"]}},{"in":"query","name":"routed","schema":{"description":"Pointed somewhere, or not.","type":"string","enum":["true","false"]},"description":"Pointed somewhere, or not."},{"in":"query","name":"area_code","schema":{"description":"Only numbers in this area code (or toll-free prefix).","type":"string","pattern":"^\\d{3}$"},"description":"Only numbers in this area code (or toll-free prefix)."},{"in":"query","name":"order_id","schema":{"description":"Only numbers from this order.","type":"string","maxLength":64},"description":"Only numbers from this order."},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of numbers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneNumberList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"bulkUpdateNumbers","summary":"Change many numbers at once","description":"One change — label, notes, auto_renew, routing (with CID groups) — to up to 500 of your numbers. Every one must be a number you hold now, or nothing changes and the answer lists the ones that are not.","tags":["Numbers"],"x-scope":"numbers:write","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateNumbersRequest"}}}},"responses":{"200":{"description":"Changed. warnings says what did not fully land (a carrier update, a CID group).","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BulkUpdateResult"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Some of those are not numbers you hold now (details.numbers).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The routing was refused: no such server, or no VICIfast trunk on it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/numbers/available":{"get":{"operationId":"searchNumbers","summary":"Search numbers for sale","description":"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.","tags":["Numbers"],"x-scope":"numbers:read","parameters":[{"in":"query","name":"type","schema":{"type":"string","enum":["local","toll_free"]}},{"in":"query","name":"area_code","schema":{"description":"For toll-free, the prefix: 800, 833, 844…","type":"string","pattern":"^\\d{3}$"},"description":"For toll-free, the prefix: 800, 833, 844…"},{"in":"query","name":"state","schema":{"description":"Two-letter state.","type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter state."},{"in":"query","name":"contains","schema":{"description":"Digits, or letters read off a keypad, anywhere in the number: 7777, or FLOWERS.","example":"CALL","type":"string","pattern":"^[\\dA-Za-z\\s().+-]{1,15}$"},"description":"Digits, or letters read off a keypad, anywhere in the number: 7777, or FLOWERS."},{"in":"query","name":"ends_with","schema":{"description":"Digits or keypad letters the number must END with: 0000, or SALES.","type":"string","pattern":"^[\\dA-Za-z\\s().+-]{1,15}$"},"description":"Digits or keypad letters the number must END with: 0000, or SALES."},{"in":"query","name":"npa_nxx","schema":{"description":"Area code and exchange together: 305555.","example":"305555","type":"string","pattern":"^\\d{6}$"},"description":"Area code and exchange together: 305555."},{"in":"query","name":"rate_center","schema":{"description":"The rate center (in practice, the town) the number belongs to, as the numbering plan names it: MIAMI, NEW YORK CITY. Case does not matter.","type":"string","minLength":2,"maxLength":60},"description":"The rate center (in practice, the town) the number belongs to, as the numbering plan names it: MIAMI, NEW YORK CITY. Case does not matter."},{"in":"query","name":"include_premium","schema":{"description":"Default false.","type":"string","enum":["true","false"]},"description":"Default false."},{"in":"query","name":"sort","schema":{"description":"recommended (the default): never-owned numbers first, as a quantity purchase takes them. number / number_desc: by the digits.","type":"string","enum":["recommended","number","number_desc"]},"description":"recommended (the default): never-owned numbers first, as a quantity purchase takes them. number / number_desc: by the digits."},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of numbers for sale.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableNumberList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/numbers/purchase":{"post":{"operationId":"purchaseNumbers","summary":"Buy numbers","description":"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.","tags":["Numbers"],"x-scope":"numbers:buy","parameters":[{"in":"header","name":"Idempotency-Key","schema":{"type":"string","minLength":1,"maxLength":255,"description":"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.","example":"6f1c1b3e-2b0a-4d55-9d0f-3c3b8b1f5a10"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequest"}}}},"responses":{"200":{"description":"With dry_run: what it would charge. Nothing bought.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PurchaseQuote"}},"required":["data"],"additionalProperties":false}}}},"201":{"description":"Bought. The numbers are yours.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PurchaseResult"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"insufficient_funds: the wallet cannot cover it. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"numbers_unavailable: not in stock, or not enough of them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"premium_price_not_accepted, or limit_exceeded (over max_total_cents).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/numbers/release":{"post":{"operationId":"releaseNumbers","summary":"Give numbers back","description":"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.","tags":["Numbers"],"x-scope":"numbers:release","parameters":[{"in":"header","name":"Idempotency-Key","schema":{"type":"string","minLength":1,"maxLength":255,"description":"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.","example":"6f1c1b3e-2b0a-4d55-9d0f-3c3b8b1f5a10"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseRequest"}}}},"responses":{"200":{"description":"Released (or, with dry_run, what releasing would cost).","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ReleaseResult"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The account does not hold one of those numbers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"limit_exceeded: over max_charge_cents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/numbers/{number}":{"get":{"operationId":"getNumber","summary":"Get a number","tags":["Numbers"],"x-scope":"numbers:read","parameters":[{"in":"path","name":"number","schema":{"type":"string","description":"The number, in any common form (+13055551234 URL-encoded as %2B13055551234)."},"required":true,"description":"The number, in any common form (+13055551234 URL-encoded as %2B13055551234)."}],"responses":{"200":{"description":"The number.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PhoneNumber"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The account does not hold that number.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateNumber","summary":"Update a number","description":"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.","tags":["Numbers"],"x-scope":"numbers:write","parameters":[{"in":"path","name":"number","schema":{"type":"string","description":"The number, in any common form (+13055551234 URL-encoded as %2B13055551234)."},"required":true,"description":"The number, in any common form (+13055551234 URL-encoded as %2B13055551234)."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNumberRequest"}}}},"responses":{"200":{"description":"The number, as it is now.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PhoneNumber"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The account does not hold that number.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The number has been released.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The routing was refused: no such server, it has no address yet, or no VICIfast trunk could be installed on it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/servers":{"get":{"operationId":"listServers","summary":"List your servers","description":"Where numbers can be pointed: use a server id in routing or ring_on.","tags":["Numbers"],"x-scope":"numbers:read","responses":{"200":{"description":"Your servers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/servers/{id}/cid-groups":{"get":{"operationId":"listCidGroups","summary":"List a server's CID groups","description":"The caller-ID pools on one of your servers that its campaigns dial out from, read from a snapshot of the server taken every minute.","tags":["Numbers"],"x-scope":"numbers:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Every CID group on the server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CidGroupList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such server on your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/servers/{id}/cid-groups/{group}":{"get":{"operationId":"getCidGroup","summary":"Get a CID group, with its numbers","tags":["Numbers"],"x-scope":"numbers:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"path","name":"group","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The group.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CidGroupWithNumbers"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such server, or no such group on it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/servers/{id}/cid-groups/{group}/numbers":{"post":{"operationId":"addCidGroupNumbers","summary":"Put numbers into a CID group","description":"Written to the server straight away. The area code column is filled the way the group's type needs: the number's area code, its state, or NONE in a rotation. Numbers the server will not take come back in skipped.","tags":["Numbers"],"x-scope":"numbers:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"path","name":"group","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"numbers":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."}},"description":{"description":"Default \"VICIfast DID\".","type":"string","maxLength":50}},"required":["numbers"],"additionalProperties":false}}}},"responses":{"200":{"description":"Added.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CidGroupAdded"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such server, or no such group on it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The server is not running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"service_unavailable: the server did not answer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/servers/{id}/cid-groups/{group}/numbers/remove":{"post":{"operationId":"removeCidGroupNumbers","summary":"Take numbers out of a CID group","description":"The numbers stay yours and keep ringing; campaigns using the group stop calling out from them.","tags":["Numbers"],"x-scope":"numbers:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"path","name":"group","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"numbers":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."}}},"required":["numbers"],"additionalProperties":false}}}},"responses":{"200":{"description":"Removed; not_in_group lists any that were not in it.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CidGroupRemoved"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such server, or no such group on it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"service_unavailable: the server did not answer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/orders":{"get":{"operationId":"listOrders","summary":"List orders","description":"Batches of numbers you received: a purchase, or a back-order as it fills.","tags":["Orders"],"x-scope":"orders:read","parameters":[{"in":"query","name":"status","schema":{"type":"string","enum":["open","filled","routed","closed"]}},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/orders/{id}":{"get":{"operationId":"getOrder","summary":"Get an order, with its numbers","tags":["Orders"],"x-scope":"orders:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The order.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Order"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such order.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/backorders":{"get":{"operationId":"listBackorders","summary":"List back-orders","tags":["Orders"],"x-scope":"orders:read","parameters":[{"in":"query","name":"status","schema":{"type":"string","enum":["open","filled","cancelled","expired"]}},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of back-orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackorderList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"placeBackorder","summary":"Place a back-order","description":"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.","tags":["Orders"],"x-scope":"orders:write","parameters":[{"in":"header","name":"Idempotency-Key","schema":{"type":"string","minLength":1,"maxLength":255,"description":"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.","example":"6f1c1b3e-2b0a-4d55-9d0f-3c3b8b1f5a10"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceBackorderRequest"}}}},"responses":{"200":{"description":"With dry_run: what it would charge. Nothing placed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BackorderQuote"}},"required":["data"],"additionalProperties":false}}}},"201":{"description":"Placed and paid.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Backorder"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"insufficient_funds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"limit_exceeded, or ring_on names a server that cannot take numbers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/backorders/{id}":{"get":{"operationId":"getBackorder","summary":"Get a back-order","tags":["Orders"],"x-scope":"orders:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The back-order.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Backorder"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such back-order.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/backorders/{id}/cancel":{"post":{"operationId":"cancelBackorder","summary":"Cancel a back-order","description":"Stops waiting and refunds the numbers that have not arrived. Delivered numbers stay yours.","tags":["Orders"],"x-scope":"orders:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"header","name":"Idempotency-Key","schema":{"type":"string","minLength":1,"maxLength":255,"description":"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.","example":"6f1c1b3e-2b0a-4d55-9d0f-3c3b8b1f5a10"},"required":true,"description":"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."}],"responses":{"200":{"description":"Cancelled and refunded.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"object":{"type":"string","const":"backorder"},"id":{"type":"string"},"status":{"type":"string","enum":["open","filled","cancelled","expired"]},"type":{"type":"string","enum":["local","toll_free"]},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filled":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"allow_nearby":{"type":"boolean"},"price_each_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Prepaid per number; the most any will cost."},"paid_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"refunded_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"lines":{"type":"array","items":{"$ref":"#/components/schemas/BackorderLine"}},"ring_on":{"anyOf":[{"type":"object","properties":{"server_id":{"type":"string"},"in_group":{"type":"string"}},"required":["server_id","in_group"],"additionalProperties":false},{"type":"null"}]},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The order the delivered numbers are in, once the first arrives."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What you sent with the order."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"refunded_now_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["object","id","status","type","quantity","filled","allow_nearby","price_each_cents","paid_cents","refunded_cents","lines","ring_on","order_id","notes","created_at","cancelled_at","refunded_now_cents"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No open back-order with that id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/calls":{"get":{"operationId":"listCalls","summary":"List calls","description":"Outbound calls you made and inbound calls to your numbers, newest first, from the last 90 days at most.","tags":["Calls"],"x-scope":"calls:read","parameters":[{"in":"query","name":"direction","schema":{"type":"string","enum":["inbound","outbound"]}},{"in":"query","name":"number","schema":{"description":"Inbound calls to this one of your numbers.","type":"string","minLength":10,"maxLength":20},"description":"Inbound calls to this one of your numbers."},{"in":"query","name":"answered","schema":{"type":"string","enum":["true","false"]}},{"in":"query","name":"from","schema":{"description":"Only calls from this number.","type":"string","minLength":10,"maxLength":20,"example":"+13055551234"},"description":"Only calls from this number."},{"in":"query","name":"to","schema":{"description":"Only calls to this number.","type":"string","minLength":10,"maxLength":20,"example":"+13055551234"},"description":"Only calls to this number."},{"in":"query","name":"window","schema":{"description":"Default 7d. Calls are kept for at least 90 days.","type":"string","enum":["1h","24h","7d","30d","90d"]},"description":"Default 7d. Calls are kept for at least 90 days."},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of calls.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"service_unavailable: call records could not be read just now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/calls/{id}":{"get":{"operationId":"getCall","summary":"Get a call","tags":["Calls"],"x-scope":"calls:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The call.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Call"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/calls/export":{"get":{"operationId":"exportCalls","summary":"Export calls as CSV","description":"The same calls and the same fields as List calls, as a CSV file of up to 50,000 rows. When there are more, X-Next-Cursor names where the next file starts (pass it as cursor).","tags":["Calls"],"x-scope":"calls:read","parameters":[{"in":"query","name":"direction","schema":{"type":"string","enum":["inbound","outbound"]}},{"in":"query","name":"number","schema":{"description":"Inbound calls to this one of your numbers.","type":"string","minLength":10,"maxLength":20},"description":"Inbound calls to this one of your numbers."},{"in":"query","name":"answered","schema":{"type":"string","enum":["true","false"]}},{"in":"query","name":"from","schema":{"description":"Only calls from this number.","type":"string","minLength":10,"maxLength":20,"example":"+13055551234"},"description":"Only calls from this number."},{"in":"query","name":"to","schema":{"description":"Only calls to this number.","type":"string","minLength":10,"maxLength":20,"example":"+13055551234"},"description":"Only calls to this number."},{"in":"query","name":"window","schema":{"description":"Default 7d. Calls are kept for at least 90 days.","type":"string","enum":["1h","24h","7d","30d","90d"]},"description":"Default 7d. Calls are kept for at least 90 days."},{"in":"query","name":"limit","schema":{"description":"Rows per file, up to 50,000 (default 10,000).","type":"integer","minimum":1,"maximum":50000},"description":"Rows per file, up to 50,000 (default 10,000)."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"text/csv: id, direction, from, to, number, started_at, answered_at, ended_at, answered, duration_s, billable_s, sip_code, hangup_cause, charge_nanos, recording.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"service_unavailable: call records could not be read just now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/calls/{id}/transcript":{"get":{"operationId":"getTranscript","summary":"Get a call's transcript","description":"A transcript made before, free to read as often as you like.","tags":["Calls"],"x-scope":"calls:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The transcript.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Transcript"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No transcript yet: POST to make one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTranscript","summary":"Transcribe a call","description":"Transcribes the call's recording, with the speakers told apart. 5¢ a minute of call (rounded up), charged to the wallet once: a call already transcribed returns its transcript free. dry_run says what it would cost. If the transcription fails, nothing is charged.","tags":["Calls"],"x-scope":"calls:transcribe","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"header","name":"Idempotency-Key","schema":{"type":"string","minLength":1,"maxLength":255,"description":"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.","example":"6f1c1b3e-2b0a-4d55-9d0f-3c3b8b1f5a10"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"dry_run":{"description":"Say what it would cost, and change nothing.","type":"boolean"},"max_charge_cents":{"description":"Refuse if it would cost more than this.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"With dry_run: what it would cost. Or the transcript made before, free.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"$ref":"#/components/schemas/TranscriptQuote"},{"$ref":"#/components/schemas/Transcript"}]}},"required":["data"],"additionalProperties":false}}}},"201":{"description":"Made and charged.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Transcript"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"insufficient_funds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such call, or it has no recording.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"limit_exceeded, or the account is managed by a reseller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"service_unavailable: the recording could not be fetched or transcribed. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/calls/{id}/recording":{"get":{"operationId":"getRecordingLink","summary":"Get a recording link","description":"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.","tags":["Calls"],"x-scope":"calls:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The link.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecordingLink"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such call, or it has no recording.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/balance":{"get":{"operationId":"getBalance","summary":"Get the wallet balance","tags":["Billing"],"x-scope":"billing:read","responses":{"200":{"description":"The wallet.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Balance"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/transactions":{"get":{"operationId":"listTransactions","summary":"List wallet transactions","tags":["Billing"],"x-scope":"billing:read","parameters":[{"in":"query","name":"type","schema":{"description":"One type or several, comma-separated: charge_did_purchase,topup_stripe","type":"string","pattern":"^[a-z_,]{1,400}$"},"description":"One type or several, comma-separated: charge_did_purchase,topup_stripe"},{"in":"query","name":"direction","schema":{"type":"string","enum":["credit","debit"]}},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of transactions, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/renewals":{"get":{"operationId":"listRenewals","summary":"List upcoming renewals","description":"What the wallet will be charged, and when: your numbers and wallet-billed servers.","tags":["Billing"],"x-scope":"billing:read","parameters":[{"in":"query","name":"days","schema":{"description":"Default 30.","type":"integer","minimum":1,"maximum":90},"description":"Default 30."}],"responses":{"200":{"description":"Upcoming renewals, soonest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewalList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook-endpoints":{"get":{"operationId":"listWebhookEndpoints","summary":"List webhook endpoints","description":"This key's mode only: a live key sees live endpoints, a test key test ones.","tags":["Webhook endpoints"],"x-scope":"webhooks:read","responses":{"200":{"description":"Every endpoint, oldest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createWebhookEndpoint","summary":"Add a webhook endpoint","description":"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.","tags":["Webhook endpoints"],"x-scope":"webhooks:write","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":8,"maxLength":2000,"example":"https://example.com/hooks/vicifast","description":"https only, and on the public internet: private and loopback addresses are refused."},"description":{"type":"string","maxLength":120},"events":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"wallet_low_threshold_cents":{"description":"Required with wallet.low.","type":"integer","minimum":0,"maximum":100000000}},"required":["url","events"]}}}},"responses":{"201":{"description":"Added.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"limit_exceeded: the account has 10 endpoints already.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook-endpoints/{id}":{"get":{"operationId":"getWebhookEndpoint","summary":"Get a webhook endpoint","tags":["Webhook endpoints"],"x-scope":"webhooks:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateWebhookEndpoint","summary":"Change a webhook endpoint","description":"Its address, events, threshold, description, or switch it off and on.","tags":["Webhook endpoints"],"x-scope":"webhooks:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":8,"maxLength":2000,"example":"https://example.com/hooks/vicifast","description":"https only, and on the public internet: private and loopback addresses are refused."},"description":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"events":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/EventType"},"description":"Replaces the list."},"enabled":{"type":"boolean"},"wallet_low_threshold_cents":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000000,"description":"US cents."},{"type":"null"}]}},"description":"Only what is given changes."}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteWebhookEndpoint","summary":"Remove a webhook endpoint","description":"Its undelivered events are dropped with it.","tags":["Webhook endpoints"],"x-scope":"webhooks:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string"},"deleted":{"type":"boolean","const":true}},"required":["object","id","deleted"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook-endpoints/{id}/rotate-secret":{"post":{"operationId":"rotateWebhookSecret","summary":"Rotate the signing secret","description":"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.","tags":["Webhook endpoints"],"x-scope":"webhooks:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The new secret.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSecret"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook-endpoints/{id}/test":{"post":{"operationId":"sendTestWebhook","summary":"Send a test event","description":"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.","tags":["Webhook endpoints"],"x-scope":"webhooks:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"description":"Which event to send a sample of.","$ref":"#/components/schemas/EventType"}},"required":["type"]}}}},"responses":{"200":{"description":"Sent; delivered says whether it arrived.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookTestResult"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook-endpoints/{id}/deliveries":{"get":{"operationId":"listWebhookDeliveries","summary":"List deliveries to an endpoint","description":"Newest first: what was sent, what came back, and what is still being retried.","tags":["Webhook endpoints"],"x-scope":"webhooks:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true},{"in":"query","name":"state","schema":{"type":"string","enum":["pending","retrying","delivered","gave_up"]}},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of deliveries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/events":{"get":{"operationId":"listEvents","summary":"List events","description":"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.","tags":["Events"],"x-scope":"webhooks:read","parameters":[{"in":"query","name":"type","schema":{"description":"One type or several, comma-separated: numbers.arrived,number.released","type":"string","pattern":"^[a-z._,]{1,400}$"},"description":"One type or several, comma-separated: numbers.arrived,number.released"},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},{"in":"query","name":"limit","schema":{"description":"Page size, up to 500.","type":"integer","minimum":1,"maximum":500},"description":"Page size, up to 500."},{"in":"query","name":"cursor","schema":{"description":"next_cursor from the previous page.","type":"string","maxLength":64},"description":"next_cursor from the previous page."}],"responses":{"200":{"description":"A page of events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/events/{id}":{"get":{"operationId":"getEvent","summary":"Get an event, with its deliveries","tags":["Events"],"x-scope":"webhooks:read","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The event.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EventWithDeliveries"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/events/{id}/resend":{"post":{"operationId":"resendEvent","summary":"Send an event again","description":"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.","tags":["Events"],"x-scope":"webhooks:write","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint_id":{"description":"Only to this endpoint. Left out: to every endpoint that is on and subscribed to the type now.","type":"string","maxLength":64}}}}}},"responses":{"202":{"description":"Queued; the deliveries are on their way.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResendResult"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the scope, is used from an address it is not allowed from, or the account is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such event, or no such endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sandbox/inbound-calls":{"post":{"operationId":"simulateInboundCall","summary":"Simulate an inbound call","description":"A caller rings one of your sandbox numbers. The call appears in List calls (with a recording you can transcribe, when answered) and call.inbound.completed goes to your test endpoints.","tags":["Sandbox"],"x-scope":"sandbox:simulate","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"number":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"One of the sandbox numbers you hold."},"from":{"description":"The caller. Default +12025550123.","type":"string","minLength":10,"maxLength":20,"example":"+13055551234"},"answered":{"description":"Default true.","type":"boolean"},"duration_s":{"description":"How long it lasted, if answered. Default 60.","type":"integer","minimum":1,"maximum":14400}},"required":["number"],"additionalProperties":false}}}},"responses":{"201":{"description":"The call.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Call"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sandbox_only: a live key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not a sandbox number you hold.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sandbox/time-travel":{"post":{"operationId":"timeTravel","summary":"Move the sandbox on in time","description":"Up to 400 days. Renewals that fall due are charged to the pretend wallet, oldest first; a number with auto-renew off past its minimum term is released; a renewal the wallet cannot pay fails. Each sends its webhook to your test endpoints.","tags":["Sandbox"],"x-scope":"sandbox:simulate","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":400,"description":"How far to move the sandbox on. Renewals that fall due are charged to the pretend wallet, numbers with auto-renew off past their minimum term are released, and a renewal the wallet cannot pay fails — each with its webhook."}},"required":["days"],"additionalProperties":false}}}},"responses":{"200":{"description":"What happened.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimeTravelResult"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sandbox_only: a live key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sandbox/backorders/{id}/deliver":{"post":{"operationId":"deliverBackorder","summary":"Simulate a back-order delivery","description":"Numbers arrive against an open sandbox back-order: numbers.arrived, and backorder.filled once everything asked for is in.","tags":["Sandbox"],"x-scope":"sandbox:simulate","parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"quantity":{"description":"How many to deliver now. Default: everything still to come.","type":"integer","minimum":1,"maximum":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"The back-order, after the delivery.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Backorder"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sandbox_only: a live key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No open sandbox back-order with that id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sandbox/wallet":{"post":{"operationId":"setSandboxWallet","summary":"Set the sandbox wallet","description":"Sets the pretend balance. Dropping below a test endpoint’s wallet.low threshold sends wallet.low; raising it sends wallet.topped_up. Set it low, then time-travel, to see a renewal fail.","tags":["Sandbox"],"x-scope":"sandbox:simulate","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"balance_cents":{"type":"integer","minimum":-100000,"maximum":10000000,"description":"The pretend balance to set. Below a test endpoint’s wallet.low threshold sends wallet.low; raising it sends wallet.topped_up."}},"required":["balance_cents"],"additionalProperties":false}}}},"responses":{"200":{"description":"The pretend wallet.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Balance"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sandbox_only: a live key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sandbox/reset":{"post":{"operationId":"resetSandbox","summary":"Start the sandbox over","description":"No numbers, no orders, and a fresh $100 pretend wallet.","tags":["Sandbox"],"x-scope":"sandbox:simulate","responses":{"200":{"description":"Reset.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SandboxReset"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"The request is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sandbox_only: a live key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 600 requests a minute on this key. Retry after Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{"numbers.arrived":{"post":{"operationId":"webhook_numbers_arrived","summary":"Numbers are yours: bought, delivered against a back-order, or assigned","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumbersArrivedEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"number.released":{"post":{"operationId":"webhook_number_released","summary":"A number left your account","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberReleasedEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"number.renewal_failed":{"post":{"operationId":"webhook_number_renewal_failed","summary":"A renewal could not be paid (sent once per number per billing month; the charge is retried every hour)","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewalFailedEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"call.inbound.completed":{"post":{"operationId":"webhook_call_inbound_completed","summary":"An inbound call to one of your numbers finished","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundCallEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"call.outbound.completed":{"post":{"operationId":"webhook_call_outbound_completed","summary":"An outbound call you made finished, answered or not. A dialer makes many; each is one delivery","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundCallEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"wallet.low":{"post":{"operationId":"webhook_wallet_low","summary":"The wallet dropped below the endpoint's threshold","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletLowEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"backorder.filled":{"post":{"operationId":"webhook_backorder_filled","summary":"Every number a back-order asked for has arrived (sent once, after the numbers.arrived for the last delivery)","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackorderFilledEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"number.routing_failed":{"post":{"operationId":"webhook_number_routing_failed","summary":"A 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","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutingFailedEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}},"wallet.topped_up":{"post":{"operationId":"webhook_wallet_topped_up","summary":"Money was added to the wallet: by card, PayPal, crypto, or by us","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletToppedUpEvent"}}}},"responses":{"200":{"description":"Answer any 2xx within ten seconds."}}}}},"components":{"schemas":{"BulkUpdateNumbersRequest":{"type":"object","properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"auto_renew":{"type":"boolean"},"routing":{"description":"Where it rings. null unpoints it; it stays yours and keeps billing.","anyOf":[{"$ref":"#/components/schemas/RouteTo"},{"type":"null"}]},"numbers":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."},"description":"Up to 500 of your numbers. Every one must be a number you hold now, or nothing changes."}},"required":["numbers"],"additionalProperties":false},"RouteTo":{"type":"object","properties":{"server_id":{"type":"string","minLength":1,"maxLength":64},"in_group":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"The VICIdial in-group calls should land on."},"cid_groups":{"description":"Also put the numbers into these CID groups on that server, so campaigns can call out from them. A group that does not take them is reported in warnings; the routing stands.","maxItems":10,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$"}}},"required":["server_id","in_group"]},"PurchaseRequest":{"type":"object","properties":{"numbers":{"description":"Buy these exact numbers. All of them or none. Premium numbers need accept_premium_price_cents.","minItems":1,"maxItems":100,"type":"array","items":{"anyOf":[{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."},{"type":"object","properties":{"number":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."},"accept_premium_price_cents":{"description":"Required for a premium number: its monthly price, as you were shown it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["number"]}]}},"quantity":{"description":"Or buy this many matching the criteria, chosen for you (never premium). All of them or none.","type":"integer","minimum":1,"maximum":500},"type":{"description":"With quantity: local or toll-free.","type":"string","enum":["local","toll_free"]},"area_code":{"description":"With quantity: the area code (toll-free: the prefix).","type":"string","pattern":"^\\d{3}$"},"state":{"description":"With quantity: two-letter state.","type":"string","pattern":"^[A-Za-z]{2}$"},"contains":{"description":"With quantity: digits or keypad letters the numbers must contain.","example":"CALL","type":"string","pattern":"^[\\dA-Za-z\\s().+-]{1,15}$"},"ends_with":{"description":"With quantity: digits or keypad letters the numbers must end with.","type":"string","pattern":"^[\\dA-Za-z\\s().+-]{1,15}$"},"npa_nxx":{"description":"With quantity: area code and exchange.","example":"305555","type":"string","pattern":"^\\d{6}$"},"rate_center":{"description":"With quantity: the rate center.","type":"string","minLength":2,"maxLength":60},"max_total_cents":{"description":"Refuse the purchase if it would charge more than this now.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ring_on":{"description":"Point the new numbers here straight away.","$ref":"#/components/schemas/RingOn"},"dry_run":{"description":"Return exactly what the purchase would charge and buy nothing. Needs no Idempotency-Key. Not a reservation.","type":"boolean"}},"additionalProperties":false},"RingOn":{"type":"object","properties":{"server_id":{"type":"string","minLength":1,"maxLength":64},"in_group":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"}},"required":["server_id","in_group"]},"ReleaseRequest":{"type":"object","properties":{"numbers":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":10,"maxLength":20,"example":"+13055551234","description":"Any common North American form."}},"dry_run":{"description":"Return exactly what releasing would charge, and release nothing.","type":"boolean"},"max_charge_cents":{"description":"Refuse if the minimum-term charge would be more than this.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["numbers"],"additionalProperties":false},"UpdateNumberRequest":{"type":"object","properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"auto_renew":{"type":"boolean"},"routing":{"description":"Where it rings. null unpoints it; it stays yours and keeps billing.","anyOf":[{"$ref":"#/components/schemas/RouteTo"},{"type":"null"}]}},"additionalProperties":false},"PlaceBackorderRequest":{"type":"object","properties":{"type":{"description":"Default local.","type":"string","enum":["local","toll_free"]},"lines":{"description":"Required for local. A toll-free order may give quantity instead.","minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"area_code":{"type":"string","pattern":"^\\d{3}$","description":"Area code; for toll-free, the prefix (800, 833…)."},"quantity":{"type":"integer","minimum":1,"maximum":1000}},"required":["area_code","quantity"]}},"quantity":{"description":"Toll-free only, in place of lines: this many numbers from whichever toll-free prefix is in stock.","type":"integer","minimum":1,"maximum":5000},"notes":{"description":"Free text sent with the order, for the people filling it.","type":"string","maxLength":1000},"allow_nearby":{"description":"When an area code runs short, a nearby one in the same state will do (any toll-free prefix, on a toll-free order).","type":"boolean"},"ring_on":{"description":"Point the numbers here as they arrive.","$ref":"#/components/schemas/RingOn"},"max_total_cents":{"description":"Refuse the order if it would charge more than this now.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dry_run":{"description":"Return exactly what the order would charge and place nothing. Needs no Idempotency-Key.","type":"boolean"}},"additionalProperties":false},"EventType":{"type":"string","enum":["numbers.arrived","number.released","number.renewal_failed","call.inbound.completed","call.outbound.completed","wallet.low","backorder.filled","number.routing_failed","wallet.topped_up"]},"NumbersArrivedEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"numbers.arrived"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"source":{"type":"string","enum":["purchase","backorder","assigned"]},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"backorder_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"numbers":{"type":"array","items":{"type":"string","example":"+13055551234","description":"E.164, with the plus."}},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["source","order_id","backorder_id","numbers"]}},"required":["id","object","type","livemode","created_at","data"]},"NumberReleasedEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"number.released"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"reason":{"type":"string","enum":["customer","auto_renew_off","account"]},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"released_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["number","reason","charge_cents","released_at"]}},"required":["id","object","type","livemode","created_at","data"]},"RenewalFailedEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"number.renewal_failed"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"amount_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"due_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"reason":{"type":"string","enum":["insufficient_funds","error"]},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["number","amount_cents","due_at","reason"]}},"required":["id","object","type","livemode","created_at","data"]},"InboundCallEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"call.inbound.completed"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"object":{"type":"string","const":"call"},"id":{"type":"string","description":"The SIP call id."},"direction":{"type":"string","enum":["inbound","outbound"]},"from":{"type":"string","description":"The caller, E.164 when it is a North American number."},"to":{"type":"string"},"number":{"anyOf":[{"type":"string","example":"+13055551234","description":"E.164, with the plus."},{"type":"null"}],"description":"Inbound: which of your numbers it arrived on."},"started_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"answered_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"ended_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"answered":{"type":"boolean"},"duration_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"billable_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sip_code":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"hangup_cause":{"type":"string"},"charge_nanos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"What the call cost, in billionths of a dollar (2000000 = $0.002)."},"recording":{"type":"boolean","description":"A recording can be fetched with GET /v1/calls/{id}/recording."},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["object","id","direction","from","to","number","started_at","answered_at","ended_at","answered","duration_s","billable_s","sip_code","hangup_cause","charge_nanos","recording"]}},"required":["id","object","type","livemode","created_at","data"]},"OutboundCallEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"call.outbound.completed"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"object":{"type":"string","const":"call"},"id":{"type":"string","description":"The SIP call id."},"direction":{"type":"string","enum":["inbound","outbound"]},"from":{"type":"string","description":"The caller, E.164 when it is a North American number."},"to":{"type":"string"},"number":{"anyOf":[{"type":"string","example":"+13055551234","description":"E.164, with the plus."},{"type":"null"}],"description":"Inbound: which of your numbers it arrived on."},"started_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"answered_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"ended_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"answered":{"type":"boolean"},"duration_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"billable_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sip_code":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"hangup_cause":{"type":"string"},"charge_nanos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"What the call cost, in billionths of a dollar (2000000 = $0.002)."},"recording":{"type":"boolean","description":"A recording can be fetched with GET /v1/calls/{id}/recording."},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["object","id","direction","from","to","number","started_at","answered_at","ended_at","answered","duration_s","billable_s","sip_code","hangup_cause","charge_nanos","recording"]}},"required":["id","object","type","livemode","created_at","data"]},"WalletLowEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"wallet.low"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"object":{"type":"string","const":"balance"},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"threshold_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","const":"usd"},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["object","balance_cents","threshold_cents","currency"]}},"required":["id","object","type","livemode","created_at","data"]},"BackorderFilledEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"backorder.filled"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"backorder_id":{"type":"string"},"order_id":{"type":"string","description":"The order the numbers were delivered into."},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"refunded_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Refunded in all because numbers cost less than the price paid up front."},"filled_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["backorder_id","order_id","quantity","refunded_cents","filled_at"]}},"required":["id","object","type","livemode","created_at","data"]},"RoutingFailedEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"number.routing_failed"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"server_id":{"type":"string"},"route_kind":{"type":"string","example":"ingroup"},"target":{"type":"string","description":"The in-group (or other target) it was to ring."},"stage":{"type":"string","enum":["platform","switch","server"],"description":"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?)."},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["number","server_id","route_kind","target","stage","error"]}},"required":["id","object","type","livemode","created_at","data"]},"WalletToppedUpEvent":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","const":"wallet.topped_up"},"livemode":{"type":"boolean","description":"false for events from the sandbox."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"data":{"type":"object","properties":{"object":{"type":"string","const":"transaction"},"id":{"type":"string"},"type":{"type":"string","example":"charge_did_purchase"},"amount_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Signed: positive credits the wallet."},"balance_after_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"test":{"description":"Only on a sample sent with \"send test\": the values are made up. Real events never carry it.","type":"boolean","const":true}},"required":["object","id","type","amount_cents","balance_after_cents","description","reference_id","created_at"]}},"required":["id","object","type","livemode","created_at","data"]},"PhoneNumberList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumber"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"PhoneNumber":{"type":"object","properties":{"object":{"type":"string","const":"phone_number"},"id":{"type":"string"},"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"type":{"type":"string","enum":["local","toll_free"]},"premium":{"type":"boolean","description":"A memorable number with its own price."},"status":{"type":"string","enum":["active","released"]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"example":"FL"},"area_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"rate_center":{"anyOf":[{"type":"string"},{"type":"null"}]},"monthly_price_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"currency":{"type":"string","const":"usd"},"auto_renew":{"type":"boolean"},"at_next_renewal":{"anyOf":[{"type":"string","enum":["charge","release"]},{"type":"null"}],"description":"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_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"min_term_ends_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"next_renewal_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"released_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"release_charge_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},{"type":"null"}]},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"routing":{"anyOf":[{"$ref":"#/components/schemas/Routing"},{"type":"null"}],"description":"Null when it rings nowhere."}},"required":["object","id","number","type","premium","status","label","notes","state","area_code","rate_center","monthly_price_cents","currency","auto_renew","at_next_renewal","purchased_at","min_term_ends_at","next_renewal_at","released_at","release_charge_cents","order_id","routing"],"additionalProperties":false},"Routing":{"type":"object","properties":{"server_id":{"type":"string"},"server_hostname":{"type":"string"},"route_kind":{"type":"string","enum":["ingroup","campaign","extension","ivr"]},"target":{"type":"string","description":"The in-group (or other target) calls land on."},"state":{"type":"string","enum":["pending","applied","failed"],"description":"Whether the server has taken the change yet."},"error":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["server_id","server_hostname","route_kind","target","state","error"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string","description":"For people. May be reworded at any time."},"param":{"description":"The field or header at fault.","type":"string"},"details":{"description":"Machine-readable facts about the failure.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"ErrorCode":{"type":"string","enum":["unauthorized","forbidden","not_found","invalid_request","rate_limited","conflict","unprocessable","internal_error","insufficient_funds","account_not_approved","ip_not_allowed","numbers_unavailable","premium_price_not_accepted","limit_exceeded","test_mode_unsupported","sandbox_only","service_unavailable"]},"BulkUpdateResult":{"type":"object","properties":{"object":{"type":"string","const":"bulk_update"},"updated":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"numbers":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumber"}}},"required":["object","updated","numbers"],"additionalProperties":false},"AvailableNumberList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AvailableNumber"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"AvailableNumber":{"type":"object","properties":{"object":{"type":"string","const":"available_number"},"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"type":{"type":"string","enum":["local","toll_free"]},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"area_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"rate_center":{"anyOf":[{"type":"string"},{"type":"null"}]},"fresh":{"type":"boolean","description":"Never owned by anybody before."},"premium":{"type":"boolean"},"monthly_price_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Your price, from your own terms."},"setup_price_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."}},"required":["object","number","type","state","area_code","rate_center","fresh","premium","monthly_price_cents","setup_price_cents"],"additionalProperties":false},"PurchaseQuote":{"type":"object","properties":{"object":{"type":"string","const":"purchase_quote"},"dry_run":{"type":"boolean","const":true},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"What the purchase would charge now."},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"numbers":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"type":{"type":"string","enum":["local","toll_free"]},"premium":{"type":"boolean"},"monthly_price_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"setup_price_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."}},"required":["number","type","premium","monthly_price_cents","setup_price_cents"],"additionalProperties":false}}},"required":["object","dry_run","charge_cents","balance_cents","numbers"],"additionalProperties":false},"PurchaseResult":{"type":"object","properties":{"object":{"type":"string","const":"purchase"},"order_id":{"type":"string"},"charged_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Your wallet after the charge."},"numbers":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumber"}},"ringing":{"anyOf":[{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string"}},"required":["ok","message"],"additionalProperties":false},{"type":"null"}],"description":"How pointing went, when ring_on was given."}},"required":["object","order_id","charged_cents","balance_cents","numbers","ringing"],"additionalProperties":false},"ReleaseResult":{"type":"object","properties":{"object":{"type":"string","const":"release"},"dry_run":{"type":"boolean"},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The balance of each number's three-month minimum term. Zero once the term is served."},"numbers":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"released":{"type":"boolean"},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"error":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["number","released","charge_cents","error"],"additionalProperties":false}}},"required":["object","dry_run","charge_cents","numbers"],"additionalProperties":false},"ServerList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Server"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Server":{"type":"object","properties":{"object":{"type":"string","const":"server"},"id":{"type":"string"},"hostname":{"type":"string"},"status":{"type":"string"},"accepts_numbers":{"type":"boolean","description":"Has an address, so numbers can be pointed at it. They arrive over the VICIfast trunk, installed on the server when needed."}},"required":["object","id","hostname","status","accepts_numbers"],"additionalProperties":false},"CidGroupList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CidGroup"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"CidGroup":{"type":"object","properties":{"object":{"type":"string","const":"cid_group"},"id":{"type":"string","example":"FL_LOCAL"},"type":{"type":"string","enum":["area_code","state","rotation"],"description":"area_code: a caller ID is picked to match the area code dialled. state: to match the state. rotation: every caller ID in turn."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"numbers_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"synced_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z","description":"When the server was last read."}},"required":["object","id","type","notes","numbers_count","synced_at"],"additionalProperties":false},"CidGroupWithNumbers":{"type":"object","properties":{"object":{"type":"string","const":"cid_group"},"id":{"type":"string","example":"FL_LOCAL"},"type":{"type":"string","enum":["area_code","state","rotation"],"description":"area_code: a caller ID is picked to match the area code dialled. state: to match the state. rotation: every caller ID in turn."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"numbers_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"synced_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z","description":"When the server was last read."},"numbers":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","example":"+13055550101"},"area_code":{"type":"string","description":"What VICIdial matches on: an area code, a state, or NONE in a rotation."},"active":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["number","area_code","active","description"],"additionalProperties":false}}},"required":["object","id","type","notes","numbers_count","synced_at","numbers"],"additionalProperties":false},"CidGroupAdded":{"type":"object","properties":{"object":{"type":"string","const":"cid_group_change"},"group_id":{"type":"string"},"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"skipped":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","example":"+13055551234","description":"E.164, with the plus."},"error":{"type":"string"}},"required":["number","error"],"additionalProperties":false}}},"required":["object","group_id","added","skipped"],"additionalProperties":false},"CidGroupRemoved":{"type":"object","properties":{"object":{"type":"string","const":"cid_group_change"},"group_id":{"type":"string"},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"not_in_group":{"type":"array","items":{"type":"string","example":"+13055551234","description":"E.164, with the plus."}}},"required":["object","group_id","removed","not_in_group"],"additionalProperties":false},"OrderList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Order":{"type":"object","properties":{"object":{"type":"string","const":"order"},"id":{"type":"string"},"status":{"type":"string","enum":["open","filled","routed","closed"],"description":"open: still arriving (from a back-order). filled: all delivered. routed: all pointed at one place. closed: every number released."},"type":{"anyOf":[{"type":"string","enum":["local","toll_free"]},{"type":"null"}]},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"active_numbers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"criteria":{"type":"object","properties":{"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"area_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"contains":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["state","area_code","contains"],"additionalProperties":false},"backorder_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"routing":{"anyOf":[{"type":"object","properties":{"server_id":{"type":"string"},"in_group":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["server_id","in_group"],"additionalProperties":false},{"type":"null"}],"description":"Where the whole order was pointed, when it was pointed as one."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"numbers":{"description":"On GET /v1/orders/{id} only.","type":"array","items":{"$ref":"#/components/schemas/PhoneNumber"}}},"required":["object","id","status","type","quantity","active_numbers","criteria","backorder_id","routing","created_at"],"additionalProperties":false},"BackorderList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Backorder"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Backorder":{"type":"object","properties":{"object":{"type":"string","const":"backorder"},"id":{"type":"string"},"status":{"type":"string","enum":["open","filled","cancelled","expired"]},"type":{"type":"string","enum":["local","toll_free"]},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filled":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"allow_nearby":{"type":"boolean"},"price_each_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Prepaid per number; the most any will cost."},"paid_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"refunded_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"lines":{"type":"array","items":{"$ref":"#/components/schemas/BackorderLine"}},"ring_on":{"anyOf":[{"type":"object","properties":{"server_id":{"type":"string"},"in_group":{"type":"string"}},"required":["server_id","in_group"],"additionalProperties":false},{"type":"null"}]},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The order the delivered numbers are in, once the first arrives."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What you sent with the order."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]}},"required":["object","id","status","type","quantity","filled","allow_nearby","price_each_cents","paid_cents","refunded_cents","lines","ring_on","order_id","notes","created_at","cancelled_at"],"additionalProperties":false},"BackorderLine":{"type":"object","properties":{"area_code":{"type":"string","description":"Area code, or toll-free prefix."},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filled":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["area_code","state","quantity","filled"],"additionalProperties":false},"BackorderQuote":{"type":"object","properties":{"object":{"type":"string","const":"backorder_quote"},"dry_run":{"type":"boolean","const":true},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price_each_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."}},"required":["object","dry_run","charge_cents","quantity","price_each_cents","balance_cents"],"additionalProperties":false},"CallList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Call"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Call":{"type":"object","properties":{"object":{"type":"string","const":"call"},"id":{"type":"string","description":"The SIP call id."},"direction":{"type":"string","enum":["inbound","outbound"]},"from":{"type":"string","description":"The caller, E.164 when it is a North American number."},"to":{"type":"string"},"number":{"anyOf":[{"type":"string","example":"+13055551234","description":"E.164, with the plus."},{"type":"null"}],"description":"Inbound: which of your numbers it arrived on."},"started_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"answered_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"ended_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"answered":{"type":"boolean"},"duration_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"billable_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sip_code":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"hangup_cause":{"type":"string"},"charge_nanos":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"What the call cost, in billionths of a dollar (2000000 = $0.002)."},"recording":{"type":"boolean","description":"A recording can be fetched with GET /v1/calls/{id}/recording."}},"required":["object","id","direction","from","to","number","started_at","answered_at","ended_at","answered","duration_s","billable_s","sip_code","hangup_cause","charge_nanos","recording"],"additionalProperties":false},"Transcript":{"type":"object","properties":{"object":{"type":"string","const":"transcript"},"call_id":{"type":"string"},"language":{"anyOf":[{"type":"string"},{"type":"null"}]},"text":{"type":"string"},"utterances":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptUtterance"}},"duration_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charged_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"What making it cost, once."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"}},"required":["object","call_id","language","text","utterances","duration_s","charged_cents","created_at"],"additionalProperties":false},"TranscriptUtterance":{"type":"object","properties":{"speaker":{"type":"string","description":"A, B, … as told apart in the audio; ? when unsure."},"start_s":{"type":"number"},"end_s":{"type":"number"},"text":{"type":"string"}},"required":["speaker","start_s","end_s","text"],"additionalProperties":false},"TranscriptQuote":{"type":"object","properties":{"object":{"type":"string","const":"transcript_quote"},"dry_run":{"type":"boolean","const":true},"call_id":{"type":"string"},"minutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price_per_minute_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"charge_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."}},"required":["object","dry_run","call_id","minutes","price_per_minute_cents","charge_cents","balance_cents"],"additionalProperties":false},"RecordingLink":{"type":"object","properties":{"object":{"type":"string","const":"recording_link"},"call_id":{"type":"string"},"url":{"type":"string","description":"Fetch with no API key: the URL is the credential. WAV audio. Works for 15 minutes."},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"}},"required":["object","call_id","url","expires_at"],"additionalProperties":false},"Balance":{"type":"object","properties":{"object":{"type":"string","const":"balance"},"balance_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"currency":{"type":"string","const":"usd"},"credit_limit_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How far below zero renewals may take the wallet so numbers keep ringing. Purchases need the funds."},"low_balance_alert":{"type":"object","properties":{"enabled":{"type":"boolean"},"threshold_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},{"type":"null"}]}},"required":["enabled","threshold_cents"],"additionalProperties":false},"auto_top_up":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false}},"required":["object","balance_cents","currency","credit_limit_cents","low_balance_alert","auto_top_up"],"additionalProperties":false},"TransactionList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Transaction":{"type":"object","properties":{"object":{"type":"string","const":"transaction"},"id":{"type":"string"},"type":{"type":"string","example":"charge_did_purchase"},"amount_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Signed: positive credits the wallet."},"balance_after_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"}},"required":["object","id","type","amount_cents","balance_after_cents","description","reference_id","created_at"],"additionalProperties":false},"RenewalList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Renewal"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Renewal":{"type":"object","properties":{"object":{"type":"string","const":"renewal"},"kind":{"type":"string","enum":["number","server"]},"description":{"type":"string","description":"The number, or the server hostname."},"due_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"action":{"type":"string","enum":["charge","release"],"description":"release: a number with auto-renew off, past its minimum term, ends that day."},"amount_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."}},"required":["object","kind","description","due_at","action","amount_cents"],"additionalProperties":false},"WebhookEndpointList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"WebhookEndpoint":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string"},"url":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"enabled":{"type":"boolean","description":"false: nothing is sent to it."},"livemode":{"type":"boolean","description":"true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it."},"wallet_low_threshold_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},{"type":"null"}],"description":"wallet.low fires once when the balance drops below this, and again only after it has been back above."},"last_status":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"HTTP status of the last attempt."},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_sent_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"failing_since":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}],"description":"Set while deliveries are failing; cleared by the next one that succeeds."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"}},"required":["object","id","url","description","events","enabled","livemode","wallet_low_threshold_cents","last_status","last_error","last_sent_at","failing_since","created_at"],"additionalProperties":false},"WebhookEndpointWithSecret":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string"},"url":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"enabled":{"type":"boolean","description":"false: nothing is sent to it."},"livemode":{"type":"boolean","description":"true: your account's real events. false: the sandbox's, from test keys. Follows the key that created it."},"wallet_low_threshold_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},{"type":"null"}],"description":"wallet.low fires once when the balance drops below this, and again only after it has been back above."},"last_status":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"HTTP status of the last attempt."},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_sent_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"failing_since":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}],"description":"Set while deliveries are failing; cleared by the next one that succeeds."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"secret":{"type":"string","description":"Signs every delivery (X-VICIfast-Signature). Shown when the endpoint is made and when the secret is rotated; keep it.","example":"whsec_…"}},"required":["object","id","url","description","events","enabled","livemode","wallet_low_threshold_cents","last_status","last_error","last_sent_at","failing_since","created_at","secret"],"additionalProperties":false},"WebhookSecret":{"type":"object","properties":{"object":{"type":"string","const":"webhook_secret"},"endpoint_id":{"type":"string"},"secret":{"type":"string","description":"The new secret. The old one stops working from the next delivery."}},"required":["object","endpoint_id","secret"],"additionalProperties":false},"WebhookTestResult":{"type":"object","properties":{"object":{"type":"string","const":"webhook_test"},"event_id":{"type":"string"},"delivery_id":{"type":"string"},"delivered":{"type":"boolean","description":"Whether your endpoint answered 2xx."},"status":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","event_id","delivery_id","delivered","status","error"],"additionalProperties":false},"WebhookDeliveryList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"WebhookDelivery":{"type":"object","properties":{"object":{"type":"string","const":"webhook_delivery"},"id":{"type":"string","description":"Sent as X-VICIfast-Delivery."},"endpoint_id":{"type":"string"},"event_id":{"type":"string"},"event_type":{"type":"string"},"test":{"type":"boolean","description":"A sample sent with \"send test\". Tried once."},"state":{"type":"string","enum":["pending","retrying","delivered","gave_up"],"description":"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)."},"attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"last_status":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},{"type":"null"}]}},"required":["object","id","endpoint_id","event_id","event_type","test","state","attempts","last_status","last_error","created_at","delivered_at","next_attempt_at"],"additionalProperties":false},"EventList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","has_more","next_cursor"],"additionalProperties":false},"Event":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","example":"numbers.arrived"},"livemode":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Shaped by the type; see Webhooks below. Samples sent with \"send test\" have test: true."}},"required":["id","object","type","livemode","created_at","data"],"additionalProperties":false},"EventWithDeliveries":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"event"},"type":{"type":"string","example":"numbers.arrived"},"livemode":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2026-10-03T20:00:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Shaped by the type; see Webhooks below. Samples sent with \"send test\" have test: true."},"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"required":["id","object","type","livemode","created_at","data","deliveries"],"additionalProperties":false},"ResendResult":{"type":"object","properties":{"object":{"type":"string","const":"event_resend"},"event_id":{"type":"string"},"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"required":["object","event_id","deliveries"],"additionalProperties":false},"TimeTravelResult":{"type":"object","properties":{"object":{"type":"string","const":"time_travel"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"renewals_charged":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"charged_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"US cents."},"released":{"type":"array","items":{"type":"string","example":"+13055551234","description":"E.164, with the plus."}},"renewal_failed":{"type":"array","items":{"type":"string","example":"+13055551234","description":"E.164, with the plus."}}},"required":["object","days","renewals_charged","charged_cents","released","renewal_failed"],"additionalProperties":false},"SandboxReset":{"type":"object","properties":{"object":{"type":"string","const":"sandbox"},"reset":{"type":"boolean","const":true}},"required":["object","reset"],"additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"vf_live_… or vf_test_…","description":"An API key from API → Keys in the dashboard."}}}}