ready. Try Ready →Sign up

#Phone numbers

List, buy and release your numbers. Each is $5 a month: first month up front, no setup fee.

Details

Buying needs a card on file (Settings → Billing).

Buy a number in 3 calls

Optionally check the area code, pay at checkout, then buy with the payment id.

Details
  1. Optional: GET /v1/numbers/available?area_code=415 to see whether Ready can offer the area code.
  2. POST /v1/numbers/checkout with { "area_code": "415" } pays the first month and returns data.payment_intent_id.
  3. POST /v1/numbers with { "area_code": "415", "payment_intent_id": "…" }. Often the number is ready at once; otherwise poll GET /v1/numbers/:id until it's active, usually about 2 minutes.

Store phone_number_id from step 3, and send from the number with from. Rarely, the carrier rejects a number; the status table says what to do.

Number status

Only active can send. provider_rejected and payment_declined never will.

Details
statusMeaning
activeCan send.
pending_provisioning, requested, submittedBeing set up. phone_number is a placeholder like "Pending (415)", not a phone number.
provider_rejected, payment_declinedFailed and won't become active. Stop polling, sort out the payment with support if needed, and buy again.
billing_suspended, suspendedPaused for billing or review.
released, inactive, retiredNo longer in use.
deletedReleased. Hidden from the list; GET /v1/numbers/:id can still return it.

#List numbers

GET/v1/numbers

Every number on the account, newest first. Not paginated.

  • Cost Free

Returns

data[]object[]
id, phone_number, status, created_at. Includes pending and failed numbers, so check status.

Errors

HTTPCodeWhen
500internal_errorRead failed. Safe to retry.

#Get a number

GET/v1/numbers/:id

One number. Poll this after a purchase until it's ready.

  • Cost Free

Path parameters

idintegerRequired
The phone_number_id from the purchase.

Returns

dataobject
Same shape as one item of List numbers.

Poll every 10 to 30 seconds until status is active (usually about 2 minutes).

Details

Stop if it becomes provider_rejected or payment_declined. After you release a number this returns status: "deleted" or a 404.

Errors

HTTPCodeWhen
404no codeNot on this account. Body: {"success": false, "error": "Number not found"}.

#Check an area code

GET/v1/numbers/available

Whether you can buy a number in an area code.

  • Cost Free

Query parameters

area_codestringRequired
A 3-digit US or Canada area code. Only the format is checked.

Returns

Fields are at the top level, not under data, and there's no success.

availableboolean
available: true means Ready will try to get a number there.
DetailsIt doesn't check that the area code exists: 000, 911 and 999 answer true, so validate the area code yourself.
numbers[]object[]
Format examples only. You can't pick one; the carrier assigns your number when you buy.
alternatives[]object[]
When out of stock: up to 5 nearby area codes, each { area_code, state, ready }.
Detailsready: true means a number there can be ready right away.

Errors

HTTPCodeWhen
400area_code_invalidMissing or not 3 digits (in code).

#Start a number purchase

POST/v1/numbers/checkout

Pays the first month ($5) on your saved card and returns the payment to buy with.

  • Idempotent Yes, with Idempotency-Key
  • Rate limit 120/min (700/min shared ceiling)
  • Cost $5, the first month
Note. POST /phone-numbers/checkout is an older alias; use this path.
DetailsThe alias is limited to 20 a minute and doesn't accept X-Sub-Account-Id, so use this path for client accounts.

Headers

Idempotency-KeystringRecommended
Retry safely without paying twice. A key is tied to its first body.

Body parameters

area_codestringRequired
The 3-digit area code to buy in. Also accepted, for the dashboard: replaces_phone_id, checkout_id.

Returns

data.payment_intent_idstring
Pass it to Buy a number.
data.charged, data.authorizedboolean
Checkout either charges or holds the first month.
DetailsIf the number can't be provisioned, the hold is released or the charge refunded.
data.card_brand, data.card_last4string
The card used.
data.client_secret, data.has_cardstring, boolean
Instead of the above when there's no card on file.
DetailsThe API can't finish that payment: add a card in Settings → Billing and call again.

Errors

HTTPCodeWhen
400area_code_invalidMissing or not 3 digits.
402card_declinedCard refused. Also card_authentication_required.
402PURCHASE_BLOCKEDUnpaid bill or account review (in code).
403permission_deniedKey lacks manage_phones.
409area_code_unavailableNo stock; see alternatives.
409purchase_in_progressAnother purchase is running. Also campaign_number_limit.
502checkout_unconfirmedDon't retry: check GET /v1/numbers first.
503checkout_unavailableNothing charged.
DetailsAlso availability_check_unavailable, cap_check_unavailable, billing_check_unavailable, billing_account_unavailable, payments_unavailable.

#Buy a number

POST/v1/numbers

Provisions the number you paid for at checkout.

  • Idempotent Yes, with Idempotency-Key
  • Rate limit 120/min (140/min shared ceiling)
  • Cost Paid at checkout

Headers

Idempotency-KeystringRecommended
A new key for each new purchase.

Body parameters

area_codestringRequired
The area code you checked out with. The number comes from this one.
payment_intent_idstringRequired
data.payment_intent_id from checkout. Each one provisions exactly one number.

Returns

Fields are at the top level, not under data. Always read phone_number_id: id is only on the instant outcome.

phone_number_idinteger
The number's id. Poll it with GET /v1/numbers/:id.
instantboolean
true: the number is ready now and phone_number is real.
pending_provisioningboolean
true: being set up; poll until active.
pending_campaign_approvalboolean
true: can't send until your 10DLC campaign is approved (usually within 48 hours).
replaced_phone_id, noteinteger | null, string
The number replaced, if any, and a sentence on what happens next.

Errors

HTTPCodeWhen
400area_code_invalidMissing or not 3 digits (in code).
400payment_intent_requiredAlso payment_not_confirmed, payment_not_for_number, payment_not_taken.
400invalid_fieldA field has the wrong type.
400no_campaignNo approved registration. Charge returned.
402PURCHASE_BLOCKEDUnpaid bill or account review (in code).
403payment_not_ownedAnother account's payment.
403permission_deniedKey lacks manage_phones.
409payment_intent_already_usedThis payment already bought one.
409campaign_number_limitYour campaign is full. Charge returned.
500buy_incompleteNot finished. Don't buy again: check GET /v1/numbers.
502infobip_submit_failedThe carrier gave no number. Charge returned.
503billing_check_unavailableRetry. Also payments_unavailable.

#Release a number

DEL/v1/numbers/:id

Permanent. The number goes back to the carrier and you can't get it back.

  • Cost Free
Important. Releasing stops the monthly fee. The current month isn't refunded.

Path parameters

idintegerRequired
The number id.

Errors

HTTPCodeWhen
403permission_deniedKey lacks manage_phones.
403test_key_not_allowedCalled with a test key.
404NUMBER_NOT_FOUNDNot yours, or already released (in code).
409NUMBER_RESERVEDA protected number. Contact support.
500RELEASE_INCOMPLETEDidn't finish. Check GET /v1/numbers/:id.
502BILLING_CANCEL_FAILEDFee not stopped, so nothing released.