Phone numbers
Numbers have different capabilities: standard phone numbers support SMS/MMS and voice; iMessage lines require a separate purchase; RCS and WhatsApp use their own onboarding. You can provision new numbers, attach them to agents, list existing numbers, retrieve messages for a number, and release numbers when no longer needed.
SMS compliance: Receiving inbound SMS works out of the box. To send outbound SMS, US carriers require 10DLC (10-Digit Long Code) registration. Fill out the registration form, it takes about 5 minutes and we submit everything to the carriers for you. If you can’t figure it out, schedule a call and we’ll handle the registration for you. Voice does not require 10DLC registration, but outbound calls have separate funding, number-readiness, and concurrency requirements. See Calls.
Search available numbers
Preview purchasable numbers before buying one.
Query parameters
Searching with no criteria returns a page of whatever is in stock. Giving a Canadian area code searches Canada even though country defaults to US.
Criteria support varies by account and there is no single rule that holds everywhere:
areaCodeis the most broadly supported filter.city,stateandzipwork on some accounts and not others. Where they aren’t supported they are ignored rather than rejected, so check what comes back instead of assuming the filter applied.stateon its own is honored on some accounts and rejected with400on others. Pair it withcityfor consistent behavior.
Number search isn’t available on every account. When it isn’t, this endpoint returns 404 (or 422 if it’s enabled but not yet configured).
That doesn’t block you from buying a number. POST /v1/numbers accepts an areaCode and picks one for you on any account, so search is a convenience rather than a requirement. Contact support if you want search enabled.
Example
phoneNumber is the only guaranteed field. city, state and rateCenter are null when the inventory source returns no per-number detail, so key off phoneNumber and treat the rest as best-effort labels.
widened: true means your exact criteria were out of stock and these are nearby alternatives instead. Check it before assuming you got what you asked for.
Buying a number you found
Pass the same phoneNumber to POST /v1/numbers:
Search results are not reserved. This is live inventory, so a number can be bought by someone else between your search and your purchase. When that happens the purchase returns 409 with fresh alternatives in the same shape as the search response. Pick another and retry rather than treating it as fatal.
Search and buy under the same account. Each account and sub-account has its own inventory. Use the same account and X-Sub-Account-Id for GET /v1/numbers/available and POST /v1/numbers. Inventory and provisioning can differ across accounts; a candidate from another account or vendor may return 409 with NUMBER_UNAVAILABLE. If you don’t need a specific number, send an areaCode instead and the sub-account gets the next available number in that code.
Search is rate limited to 30 requests per minute per account, and purchase to 20.
Create number
Provision a standard SMS/voice number, or use type: "imessage" for an iMessage line. Standard numbers are available in the US and Canada. UK numbers (UK or GB) are available only on enabled accounts and are SMS-only; US/CA location filters do not apply to them.
Request body
Example
Wait for outbound SMS to activate
A new US or CA number is attached to your messaging campaign right after purchase. That attachment takes a couple of minutes to confirm, and sends from the number are rejected with a 403 until it does. The outboundSms field on every number response tells you where the number stands:
After POST /v1/numbers returns, poll GET /v1/numbers/{number_id} until outboundSms is "enabled" before sending messages from the number:
Carriers pick up the new campaign mapping on their own schedule once the attachment is confirmed. This usually takes seconds, but a send fired in the first few minutes after enabled can occasionally fail with carrier error 4773 (campaign inactive for this destination). Retry that message once after about 30 seconds; it does not mean the number or campaign is misconfigured. Numbers outside the US and CA have no campaign requirement and are enabled from purchase.
List numbers
List all phone numbers for this project.
Query parameters
Example
Look up a number
Check line-type intelligence for any phone number before you message it: whether it is a mobile, landline, or VoIP line, its country, and whether the handset supports RCS. Useful for keeping agents from spending messages on numbers that can never receive them.
Billed at $0.009 per number looked up.
Query parameters
Example
lineType is "mobile", "landline", or "voip"; fields are null when a number cannot be resolved. Accounts with a negative balance receive a 402 before any lookup runs.
Update number
Change a number’s own fields. Only the fields you send are changed; null clears a field, omitting it leaves it alone. Unsupported fields are rejected with 422.
Request body
Expiring numbers
If you sell or lease numbers for a fixed period, set expiresAt when you buy the number and extend it on each renewal. You don’t need to remember to call DELETE:
- Every few minutes a sweep releases any active number whose
expiresAthas passed, exactly asDELETE /v1/numbers/{number_id}would. - A
number.releasedwebhook withreason: "expired"is sent to the number’s webhook (the agent’s if it has one, otherwise your project default). - Messages and conversation history are kept; the number itself is gone and cannot be recovered.
Monthly billing is unchanged: a number with an expiry bills like any other until it is released. Expiry is not available on iMessage area-code orders, which are fulfilled later; set it with PATCH once the number is delivered.
Example
Enable or disable inbound calls
Turn incoming calls on or off for one number. With inbound calls disabled the number rejects calls before they are answered: no call record is created and nothing is billed. Messaging in both directions and outbound calls are unaffected.
Request body
Example
The setting survives agent changes. Attaching the number to an agent, or editing that agent, keeps inbound calls off, so you can hold an agent assignment on a number for messaging only. Disable before you attach and there is no window in which a call can be answered.
Use the number’s id as returned by the API in the path, not the phone number itself. Numbers that cannot enforce the setting return 422: messaging-only lines, and most numbers that route calls to your own SIP trunk, which manage inbound calls on your platform instead. Numbers under a sub-account need the X-Sub-Account-Id header alongside your main API key.
Delete number (release)
Release (delete) a phone number.
For a standard number, this action:
- Releases the number back to the carrier pool
- Marks the number as
"released"in the database - Keeps all messages and conversation history for audit purposes
This action is irreversible. The number cannot be recovered once released.
Example
For iMessage, release deactivates the line immediately; provider teardown is handled separately. Check Billing for the subscription state and contact support if a released line still appears billable. Deleting or detaching an agent does not release its number.
Get messages for number
Get messages for a specific phone number. Supports cursor-based pagination via before/after timestamps. This endpoint uses from_ for the sender, unlike the webhook field data.from or conversation-history field fromNumber.

