Tonedocs
API referencePhone numbers

Search every carrier for numbers available to buy (cursor-paginated)

Asks every carrier Tone sells from and lists their numbers together, cheapest first. Each result names its provider — pass it back when you buy, and the number is bought from and operated by that carrier. Pass provider here to list one carrier’s numbers only (GET /v1/numbers/carriers names them). If one carrier is unreachable the others still list; if nothing lists and a carrier failed, that failure is returned rather than an empty list. Page with meta.pagination.cursor, sending the same filters with it. Every page is sorted cheapest first; carriers are read a page at a time, so a later page can occasionally hold a cheaper number than an earlier one, and a page can hold fewer than limit results while hasMore is still true. The first page carries meta.pagination.total, how many numbers the whole search lists, when every carrier searched can count it; it is the carriers’ own count where they page, so a walk can end a little short of it, and it is left out when a carrier cannot count a circle (VoiceLink) or failed. Live inventory, so results go stale — a number can be taken between this call and your purchase, which is a 409 number_unavailable, and a number sold between two pages can shift a carrier's listing by one. Only regular numbers are offered: the 140 and 160 series are not purchasable through any carrier API.

Requires the read scope. A key with less gets 403 insufficient_scope.

GET
/v1/numbers/available
AuthorizationBearer <token>

Authorization: Bearer tone_live_… or tone_test_…. The prefix IS the environment: a test key reaches only the sandbox, and no request field bridges the two.

In: header

Query Parameters

number_type?string

Which kind of number to search for. Open set — handle an unrecognised value rather than throwing. Today: landline, mobile, tollfree.

Default"landline"

Value in

  • "landline"
  • "mobile"
  • "tollfree"
region?string

Telecom circle code, uppercase — list them with GET /v1/numbers/regions. Omit to search every circle. Every number listed for a circle is known to be in it: where a carrier does not report circles, each number is looked up, and one whose circle cannot be determined is left out of a circle search.

Match^[A-Z]+$
Length2 <= length <= 4
contains?string

Digits the number must contain. Digits only — carriers treat other characters inconsistently. Plivo can only match from the start of a number, so its numbers are found when the digits come right after the area code (64 finds +91 22 6423 3591), not deeper in the number.

Match^\d{1,10}$
sms?string

Only numbers that can also send SMS. A carrier with no SMS product lists nothing when this is set. Note that SMS itself additionally requires DLT registration.

Value in

  • "0"
  • "1"
  • "true"
  • "false"
provider?string

Only this carrier — one of the provider values GET /v1/numbers/carriers lists. Omit to include every carrier Tone sells from. Naming a carrier that is not selling right now is a 422.

Value in

  • "exotel"
  • "voicelink"
  • "plivo"
  • "vobiz"
  • "sandbox"
limit?integer

How many results to return. 1-50, defaulting to 20.

Range1 <= value <= 50
Default20
cursor?string

Opaque page cursor — pass meta.pagination.cursor from the previous response to fetch the next page. Its contents are an implementation detail; do not parse or construct one.

Length1 <= length

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/numbers/available"
{  "data": [    {      "capabilities": {        "sms": false,        "voice": true      },      "e164": "+918045678901",      "numberType": "landline",      "provider": "exotel",      "region": "KA",      "renewalCycle": "anniversary",      "renewsAt": "2026-10-31T18:30:00Z",      "rentalPaise": 0,      "setupPaise": 0,      "totalPaise": 0    }  ]}
Was this page helpful?