Skip to content

Buy a phone number

POST
/phone-numbers/purchase

Buy a number from Twilio or Telnyx. THIS SPENDS CREDITS AND REAL MONEY.

Charged on PURCHASE, not on first use: the handler holds credits, buys the number from the carrier, stores it, registers it with the voice platform and only then converts the hold to a charge. A number bought and never dialled has still cost.

Not idempotent by number - buy the same number twice and the second call is a 409 rather than a second charge, but a retry after a timeout you cannot see the outcome of may have already succeeded. Send an Idempotency-Key header; every POST on this API honours it.

402 means insufficient credits and is the one failure worth handling distinctly - the number was not bought and nothing was charged.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

Buy ONE number from the provider. THIS SPENDS CREDITS AND REAL MONEY.

Mirrors phone_numbers.interfaces.fastapi.dtos.PurchasePhoneRequest field-for-field. capabilities is deliberately absent from both: it was dropped in the app on 2026-06-02 because the handler never read it and sending it silently 422’d.

object
assignee
Any of:
string
dialer

True provisions a dialer number; false provisions a voice-AI number.

boolean
default: true
phone_number
required

The number to buy, E.164 (e.g. +14155550123). Search for one first.

string
provider
required

Which carrier to buy it from.

string
Allowed values: twilio telnyx
work

True makes this someone’s personal work phone - provisioned like a dialer number but tagged work, and never part of the outbound caller-ID rotation pool.

boolean

Responses

201

Successful Response

object
data
required

An open envelope for a purchase result, a release, or an A2P job.

Open on purpose. A purchase returns the stored row (whose capability and provider-metadata keys differ per provider), a workflow start returns a workflow_id, and the A2P reconcile returns per-number outcomes that grow as carriers add statuses. Pinning it would silently drop whatever the provider reported that this contract had not caught up on.

object
key
additional properties
any
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
notes
Any of:
Array<string>
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer
total_available
Any of:
integer
total_is_lower_bound
Any of:
boolean

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string