Skip to content
Markets open

API reference

Phone numbers

The DID Store: search, buy, route and release phone numbers; SMS and softphone lines on them.

52 operationsBase URL https://packetexchange.io/api/v1Postman collection

BrowsePhone numbers

Browse the number catalogue

GET/api/v1/dids/catalog

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Number groups by country, city and type, with the price of each SKU. While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Parameters

NameInTypeDescription
countryIdquerystringFrom GET .../catalog/countries
typeIdquerystringFrom GET .../catalog/types
searchquerystringText match over country, city, area prefix and type; digits also match the start of the full dialling prefix ("4420" finds London). Spans the whole catalogue once it is indexed, otherwise the fetched page
pagequeryinteger-
sortquerystringOrder by the cheapest monthly price, setup price or location. Omitted: the catalogue orderOne of monthly_asc, monthly_desc, setup_asc, location_asc
maxMonthlyquerynumberOnly groups whose cheapest monthly price is at most this, in USD

Response 200

FieldTypeDescription
groupsrequiredobject[]-
groupIdrequiredgroups[].groupIdstringPass to POST /dids/buy with a skuId
countryrequiredgroups[].countrystring-
countryIdrequiredgroups[].countryIdstringCatalogue country id (filter value), not an ISO code
countryPrefixrequiredgroups[].countryPrefixstring-
cityrequiredgroups[].citystring | null-
areaPrefixrequiredgroups[].areaPrefixstring | null-
typeIdrequiredgroups[].typeIdstring | null-
typeNamerequiredgroups[].typeNamestring | nullLocal, National, Mobile, Toll-free...
skusrequiredgroups[].skusobject[]-
skuIdrequiredgroups[].skus[].skuIdstringPass to POST /dids/buy
channelsrequiredgroups[].skus[].channelsintegerConcurrent call channels included
setupPricerequiredgroups[].skus[].setupPricenumberOne-off price in USD (display number, not a money string)
monthlyPricerequiredgroups[].skus[].monthlyPricenumberMonthly price in USD (display number, not a money string)
totalrequiredinteger | null-
pagerequiredinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List countries with numbers for sale

GET/api/v1/dids/catalog/countries

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject[]-
countryIdrequireddata[].countryIdstring-
countryrequireddata[].countrystring-
countryPrefixrequireddata[].countryPrefixstring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List number types for sale

GET/api/v1/dids/catalog/types

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring-
namerequireddata[].namestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Buy a phone number

POST/api/v1/dids/buy

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)
Safe retries
Send X-Idempotency-Key; a replay within 24 hours returns the first response.
Moves money
Buys a phone number, charged to your balance.

Charges the setup price plus the first month to your balance (or the named sub-account's) and orders the number. It starts pending; number is null until provisioning completes. Requires a verified identity where KYC is enforced.

Parameters

NameInTypeDescription
X-Idempotency-KeyheaderstringAny unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice.

Request body (application/json)

FieldTypeDescription
skuIdrequiredstring-max 64 chars
groupIdrequiredstring-max 64 chars
countryIdstring-max 64 chars
countrystring-max 120 chars
citystring | null-max 120 chars
areaPrefixstring | null-max 16 chars
didTypestring | null-max 40 chars
subAccountIdstring (uuid)Buy the number for one of your sub-accounts: its balance pays and the number is theirs

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
numberrequireddata.numberstring | nullnull while the number is still being provisioned
countryrequireddata.countrystring | null-
countryCoderequireddata.countryCodestring | nullISO-3166-1 alpha-2 country codemax 2 chars
cityrequireddata.citystring | null-
areaPrefixrequireddata.areaPrefixstring | null-
didTyperequireddata.didTypestring | null-
channelsIncludedrequireddata.channelsIncludedinteger-
statusrequireddata.statusstringsuspended = a monthly renewal failed; the number is held for graceDays before releaseOne of pending, active, suspended, released, failed
pointModerequireddata.pointModestring-One of unrouted, sip, forward
pointsTorequireddata.pointsTostring | nullPrimary destination: host[:port] for sip, E.164 for forward
pointsToBackuprequireddata.pointsToBackupstring | null-
autoRenewrequireddata.autoRenewboolean-
setupPricerequireddata.setupPricemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
monthlyPricerequireddata.monthlyPricemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
orderedAtrequireddata.orderedAtstring (date-time) | nullISO-8601 timestamp (UTC)
activatedAtrequireddata.activatedAtstring (date-time) | nullISO-8601 timestamp (UTC)
nextRenewalAtrequireddata.nextRenewalAtstring (date-time) | nullISO-8601 timestamp (UTC)
suspendedAtrequireddata.suspendedAtstring (date-time) | nullISO-8601 timestamp (UTC)
releasedAtrequireddata.releasedAtstring (date-time) | nullISO-8601 timestamp (UTC)
endpointReachablerequireddata.endpointReachableboolean | nullnull = not checked yet
endpointCauserequireddata.endpointCausestring | null-
endpointCheckedAtrequireddata.endpointCheckedAtstring (date-time) | nullISO-8601 timestamp (UTC)
aiAgentIdrequireddata.aiAgentIdstring (uuid) | nullThe AI voice agent answering inbound calls to this number, or null (PUT /dids/{id}/ai-agent)
graceDaysrequireddata.graceDaysintegerDays an unpaid (suspended) number is held before release

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.
  • AlsoKYC_REQUIRED

List your phone numbers

GET/api/v1/dids/mine

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject[]Same fields as Did, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your request to list numbers on the marketplace

GET/api/v1/dids/listing-request

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Your latest request, plus a profile prefill for the form. Works while the number store is off.

Response 200

FieldTypeDescription
datarequiredobject-
ownedActiveDidsrequireddata.ownedActiveDidsinteger-
requestrequireddata.requestobject | nullYour latest request, or null
idrequireddata.request.idstring (uuid)-
statusrequireddata.request.statusstring-
selectedDidsrequireddata.request.selectedDidsobject[] | null-
idrequireddata.request.selectedDids[].idstring (uuid)-
numberrequireddata.request.selectedDids[].numberstring | null-
countryrequireddata.request.selectedDids[].countrystring | null-
didTyperequireddata.request.selectedDids[].didTypestring | null-
didCountrequireddata.request.didCountinteger | null-
submittedAtrequireddata.request.submittedAtstring (date-time)ISO-8601 timestamp (UTC)
reviewedAtrequireddata.request.reviewedAtstring (date-time) | nullISO-8601 timestamp (UTC)
prefillrequireddata.prefillobject-
companyNamerequireddata.prefill.companyNamestring-
contactNamerequireddata.prefill.contactNamestring-
contactEmailrequireddata.prefill.contactEmailstring-
contactPhonerequireddata.prefill.contactPhonestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Ask to list your numbers on the marketplace

POST/api/v1/dids/listing-request

Access
API key. Scoped keys need numbers:write.
Rate limit
5 requests per 10 minutes

Our team reviews the request and lists the numbers by hand. One open request at a time (409 CONFLICT otherwise). A validation failure here answers 400 with error.field naming the first bad field instead of a details array.

Request body (application/json)

FieldTypeDescription
companyNamestring | null-max 255 chars
contactNamerequiredstring-max 255 chars
contactEmailstring (email) | null-max 255 chars
contactPhonestring | null-max 40 chars
selectedDidIdsstring (uuid)[]Numbers from your portfolio to list
didCountinteger | null-
countriesstring | null-max 255 chars
numberTypesstring | null-max 255 chars
monthlyVolumestring | null-max 255 chars
targetPricestring | null-max 2000 chars
notesstring | null-max 4000 chars

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
statusrequireddata.statusstring-
submittedAtrequireddata.submittedAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List your numbers usable as outbound caller IDs

GET/api/v1/dids/cli-eligible

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Active, provisioned numbers you own.

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
clirequireddata[].clistringDigits only
numberrequireddata[].numberstring-
countryrequireddata[].countrystring | null-
countryCoderequireddata[].countryCodestring | null-
cityrequireddata[].citystring | null-
didTyperequireddata[].didTypestring | null-
channelsrequireddata[].channelsinteger-
labelrequireddata[].labelstring | null-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Add your numbers to a dialer caller-ID set

POST/api/v1/dids/to-cli-set

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Adds the chosen (or all) active numbers so they rotate as caller IDs on voice campaigns.

Request body (application/json)

FieldTypeDescription
setIdrequiredstring (uuid)One of your dialer caller-ID sets
didIdsstring (uuid)[] | stringOmit or "all" for every active number

Response 201

FieldTypeDescription
datarequiredobject-
insertedrequireddata.insertedinteger-
skippedrequireddata.skippedinteger-
rejectsrequireddata.rejectsobject[]-
valuerequireddata.rejects[].valuestring-
reasonrequireddata.rejects[].reasonstring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get one of your phone numbers

GET/api/v1/dids/{id}

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as Did, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get a number's call flow

GET/api/v1/dids/{id}/routing

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Ring strategy and ordered destinations. Hosted line passwords are never included.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
strategyrequireddata.strategystring-One of failover, simultaneous
timeoutSecrequireddata.timeoutSecinteger-
endpointsrequireddata.endpointsobject[]-
idrequireddata.endpoints[].idstring (uuid)-
kindrequireddata.endpoints[].kindstring-One of sip, forward, hosted
targetrequireddata.endpoints[].targetstring | null-
sipUsernamerequireddata.endpoints[].sipUsernamestring | nullHosted lines only; the password is never listed
labelrequireddata.endpoints[].labelstring | null-
priorityrequireddata.endpoints[].priorityinteger-
enabledrequireddata.endpoints[].enabledboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Replace a number's call flow

PUT/api/v1/dids/{id}/routing

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Full replace: an endpoint sent with an id is kept or updated, one without an id is created, and any existing endpoint you leave out is deleted (hosted lines included - send them back by id to keep them).

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
strategystring-One of failover, simultaneous
timeoutSecinteger-5 to 600
endpointsrequiredobject[]-
idendpoints[].idstring (uuid)Send an existing id to keep or update it; omit to create
kindrequiredendpoints[].kindstring-One of sip, forward, hosted
targetendpoints[].targetstring | nullRequired for sip and forward; ignored for hostedmax 255 chars
labelendpoints[].labelstring | null-max 120 chars
priorityendpoints[].priorityinteger-1 to 999
enabledendpoints[].enabledboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidCallFlow, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Point a number at one destination (and an optional backup)

PATCH/api/v1/dids/{id}/routing

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

The simple form of call routing: a primary and an optional failover backup. Hosted softphone lines and any extra destinations are left alone. Use PUT for the full call flow.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
moderequiredstring-One of sip, forward
targetrequiredstringhost[:port] for sip, E.164 for forwardmax 255 chars
backupModestring | nullDefaults to modeOne of sip, forward
backupTargetstring | nullnull or "" clears the backup; omit to keep itmax 255 chars

Response 200

FieldTypeDescription
datarequiredobjectSame fields as Did, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List a number's softphone lines

GET/api/v1/dids/{id}/sip-lines

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Passwords are not included; use reveal.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
sipUsernamerequireddata[].sipUsernamestring-
labelrequireddata[].labelstring | null-
priorityrequireddata[].priorityinteger-
enabledrequireddata[].enabledboolean-
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Create a softphone line on a number

POST/api/v1/dids/{id}/sip-lines

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Returns the full login, password included, once.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
labelstring | null-max 120 chars

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
sipUsernamerequireddata.sipUsernamestring-
sipPasswordrequireddata.sipPasswordstringShown only here and on an explicit reveal
serverrequireddata.serverstring-
portrequireddata.portstring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Reveal a softphone line's login

POST/api/v1/dids/{id}/sip-lines/{lineId}/reveal

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
lineIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidSipLineLogin, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete a softphone line

DELETE/api/v1/dids/{id}/sip-lines/{lineId}

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
lineIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring-
deletedrequireddata.deletedboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Turn monthly auto-renew on or off

PATCH/api/v1/dids/{id}/auto-renew

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

With auto-renew off, the number is released at its next renewal date instead of being charged.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
enabledrequiredboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as Did, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List inbound calls to a number

GET/api/v1/dids/{id}/cdrs

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Recent inbound calls, newest first, with a calls and minutes total.

Parameters

NameInTypeDescription
idrequiredpathstring-
limitqueryintegerNewest first; default 200

Response 200

FieldTypeDescription
datarequiredobject-
callsrequireddata.callsobject[]-
idrequireddata.calls[].idstring (uuid)-
fromNumberrequireddata.calls[].fromNumberstring | null-
toNumberrequireddata.calls[].toNumberstring | null-
durationSecrequireddata.calls[].durationSecinteger-
statusrequireddata.calls[].statusstring | null-
startedAtrequireddata.calls[].startedAtstring (date-time)ISO-8601 timestamp (UTC)
summaryrequireddata.summaryobject-
callsrequireddata.summary.callsinteger-
minutesrequireddata.summary.minutesnumber-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

See which AI voice agent answers a number

GET/api/v1/dids/{id}/ai-agent

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Returns the agent pointed at this number (or null), whether inbound AI answering is switched on for the platform, and the per-minute AI voice rate.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)-

Response 200

FieldTypeDescription
datarequiredobject-
didIdrequireddata.didIdstring (uuid)-
agentIdrequireddata.agentIdstring (uuid) | null-
agentNamerequireddata.agentNamestring | null-
agentEnabledrequireddata.agentEnabledboolean | nullA disabled agent does not answer; the number rings its call flow
liverequireddata.livebooleanWhether inbound AI answering is switched on for the platform right now
ratePerMinrequireddata.ratePerMinstringAI voice rate in USD per minute, billed per second

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Point a number at an AI voice agent

PUT/api/v1/dids/{id}/ai-agent

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Send { "agentId": "<your agent id>" } and inbound calls to the number are answered by that agent instead of ringing the number's call flow; send { "agentId": null } to go back to the call flow, which is kept untouched meanwhile. Billed per second at the AI voice per-minute rate to the number's owner, on top of the number's monthly price. Each call is capped at the agent's maximum call length and at what your balance covers; when the agent is disabled or your balance covers less than 30 seconds, the number rings its call flow as usual. The agent must belong to your account.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)-

Request body (application/json)

FieldTypeDescription
agentIdrequiredstring (uuid) | nullOne of your AI agents (GET /ai-agents), or null to clear

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidAiAgent, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get a number's voicemail, recording, IVR and schedule settings

GET/api/v1/dids/{id}/features

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

A number with nothing configured rings its call flow as normal.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
voicemailrequireddata.voicemailobject-
enabledrequireddata.voicemail.enabledboolean-
moderequireddata.voicemail.modestring-One of on_no_answer, always
greetingAssetIdrequireddata.voicemail.greetingAssetIdstring (uuid) | null-
hasGreetingrequireddata.voicemail.hasGreetingboolean-
transcriberequireddata.voicemail.transcribeboolean-
recordingrequireddata.recordingobject-
enabledrequireddata.recording.enabledboolean-
announcerequireddata.recording.announceboolean-
retentionDaysrequireddata.recording.retentionDaysinteger-
ivrrequireddata.ivrobject-
enabledrequireddata.ivr.enabledboolean-
greetingAssetIdrequireddata.ivr.greetingAssetIdstring (uuid) | null-
hasGreetingrequireddata.ivr.hasGreetingboolean-
timeoutSecrequireddata.ivr.timeoutSecinteger-
maxRetriesrequireddata.ivr.maxRetriesinteger-
optionsrequireddata.ivr.optionsobject[]-
idrequireddata.ivr.options[].idstring (uuid)-
digitrequireddata.ivr.options[].digitstring-
actionrequireddata.ivr.options[].actionstring-One of endpoint, voicemail, hangup
endpointIdrequireddata.ivr.options[].endpointIdstring (uuid) | null-
labelrequireddata.ivr.options[].labelstring | null-
schedulerequireddata.scheduleobject-
enabledrequireddata.schedule.enabledboolean-
timezonerequireddata.schedule.timezonestring-
schedulerequireddata.schedule.scheduleobject | null-
sunrequireddata.schedule.schedule.sunobject[]-
openrequireddata.schedule.schedule.sun[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.sun[].closestringHH:MMmax 5 chars
monrequireddata.schedule.schedule.monobject[]-
openrequireddata.schedule.schedule.mon[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.mon[].closestringHH:MMmax 5 chars
tuerequireddata.schedule.schedule.tueobject[]-
openrequireddata.schedule.schedule.tue[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.tue[].closestringHH:MMmax 5 chars
wedrequireddata.schedule.schedule.wedobject[]-
openrequireddata.schedule.schedule.wed[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.wed[].closestringHH:MMmax 5 chars
thurequireddata.schedule.schedule.thuobject[]-
openrequireddata.schedule.schedule.thu[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.thu[].closestringHH:MMmax 5 chars
frirequireddata.schedule.schedule.friobject[]-
openrequireddata.schedule.schedule.fri[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.fri[].closestringHH:MMmax 5 chars
satrequireddata.schedule.schedule.satobject[]-
openrequireddata.schedule.schedule.sat[].openstringHH:MMmax 5 chars
closerequireddata.schedule.schedule.sat[].closestringHH:MMmax 5 chars
holidaysrequireddata.schedule.holidaysobject[] | null-
daterequireddata.schedule.holidays[].datestringYYYY-MM-DDmax 10 chars
namedata.schedule.holidays[].namestring-max 120 chars
outsideHoursActionrequireddata.schedule.outsideHoursActionstring-One of voicemail, endpoints, hangup
closedEndpointsrequireddata.schedule.closedEndpointsobject[]-
idrequireddata.schedule.closedEndpoints[].idstring (uuid)-
kindrequireddata.schedule.closedEndpoints[].kindstring-One of sip, forward
targetrequireddata.schedule.closedEndpoints[].targetstring-
labelrequireddata.schedule.closedEndpoints[].labelstring | null-
priorityrequireddata.schedule.closedEndpoints[].priorityinteger-
enabledrequireddata.schedule.closedEndpoints[].enabledboolean-
openNowrequireddata.schedule.openNowboolean | null-
assetsrequireddata.assetsobject[]-
idrequireddata.assets[].idstring (uuid)-
kindrequireddata.assets[].kindstring-One of voicemail_greeting, ivr_greeting
namerequireddata.assets[].namestring | null-
mimerequireddata.assets[].mimestring-
createdAtrequireddata.assets[].createdAtstring (date-time)ISO-8601 timestamp (UTC)
mediaLiverequireddata.mediaLivebooleanWhether voicemail and recording capture is live on the platform

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Configure voicemail on a number

PUT/api/v1/dids/{id}/features/voicemail

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
enabledboolean-
modestring-One of on_no_answer, always
greetingAssetIdstring (uuid) | null-
transcribeboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidFeatures, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Configure call recording on a number

PUT/api/v1/dids/{id}/features/recording

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
enabledboolean-
announceboolean-
retentionDaysinteger-0 to 3650

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidFeatures, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Configure the IVR menu on a number

PUT/api/v1/dids/{id}/features/ivr

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
enabledboolean-
greetingAssetIdstring (uuid) | null-
timeoutSecinteger-1 to 30
maxRetriesinteger-1 to 5
optionsobject[]Replaces the whole menu when sent
digitrequiredoptions[].digitstring0-9, * or #max 1 chars
actionrequiredoptions[].actionstring-One of endpoint, voicemail, hangup
endpointIdoptions[].endpointIdstring (uuid) | null-
labeloptions[].labelstring | null-max 120 chars

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidFeatures, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Configure business-hours routing on a number

PUT/api/v1/dids/{id}/features/schedule

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
enabledboolean-
timezonestringIANA zone, e.g. Europe/Londonmax 64 chars
scheduleobject-
sunrequiredschedule.sunobject[]-
openrequiredschedule.sun[].openstringHH:MMmax 5 chars
closerequiredschedule.sun[].closestringHH:MMmax 5 chars
monrequiredschedule.monobject[]-
openrequiredschedule.mon[].openstringHH:MMmax 5 chars
closerequiredschedule.mon[].closestringHH:MMmax 5 chars
tuerequiredschedule.tueobject[]-
openrequiredschedule.tue[].openstringHH:MMmax 5 chars
closerequiredschedule.tue[].closestringHH:MMmax 5 chars
wedrequiredschedule.wedobject[]-
openrequiredschedule.wed[].openstringHH:MMmax 5 chars
closerequiredschedule.wed[].closestringHH:MMmax 5 chars
thurequiredschedule.thuobject[]-
openrequiredschedule.thu[].openstringHH:MMmax 5 chars
closerequiredschedule.thu[].closestringHH:MMmax 5 chars
frirequiredschedule.friobject[]-
openrequiredschedule.fri[].openstringHH:MMmax 5 chars
closerequiredschedule.fri[].closestringHH:MMmax 5 chars
satrequiredschedule.satobject[]-
openrequiredschedule.sat[].openstringHH:MMmax 5 chars
closerequiredschedule.sat[].closestringHH:MMmax 5 chars
holidaysobject[]-
daterequiredholidays[].datestringYYYY-MM-DDmax 10 chars
nameholidays[].namestring-max 120 chars
outsideHoursActionstring-One of voicemail, endpoints, hangup
closedEndpointsobject[]-
kindrequiredclosedEndpoints[].kindstring-One of sip, forward
targetrequiredclosedEndpoints[].targetstring-max 255 chars
labelclosedEndpoints[].labelstring | null-max 120 chars
priorityclosedEndpoints[].priorityinteger-1 to 999
enabledclosedEndpoints[].enabledboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidFeatures, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List a number's uploaded greetings

GET/api/v1/dids/{id}/greetings

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
kindrequireddata[].kindstring-One of voicemail_greeting, ivr_greeting
namerequireddata[].namestring | null-
mimerequireddata[].mimestring-
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Upload a voicemail or IVR greeting

POST/api/v1/dids/{id}/greetings

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

WAV or MP3, up to 8 MB. Send multipart with a file part (and kind as a field or query parameter), or JSON with contentBase64.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
kindrequiredstring-One of voicemail_greeting, ivr_greeting
namestring | null-max 120 chars
contentBase64stringWAV or MP3, base64, up to 8 MB. Or send multipart with a file part

Response 201

FieldTypeDescription
datarequiredobjectSame fields as DidGreeting, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Download a greeting's audio

GET/api/v1/dids/{id}/greetings/{assetId}/audio

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
assetIdrequiredpathstring-

Response 200 (audio/*)

The greeting audio bytes (WAV or MP3; the Content-Type says which).

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete a greeting

DELETE/api/v1/dids/{id}/greetings/{assetId}

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
assetIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring-
deletedrequireddata.deletedboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List call recordings on a number

GET/api/v1/dids/{id}/recordings

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
limitqueryintegerNewest first; default 200

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
kindrequireddata[].kindstring-One of call, voicemail
fromNumberrequireddata[].fromNumberstring | null-
toNumberrequireddata[].toNumberstring | null-
durationSecrequireddata[].durationSecinteger-
mimerequireddata[].mimestring | null-
byteSizerequireddata[].byteSizeinteger-
heardrequireddata[].heardboolean-
transcriptrequireddata[].transcriptstring | null-
hasAudiorequireddata[].hasAudioboolean-
expiresAtrequireddata[].expiresAtstring (date-time) | nullISO-8601 timestamp (UTC)
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Download a call recording

GET/api/v1/dids/{id}/recordings/{recId}/audio

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
recIdrequiredpathstring-

Response 200 (audio/*)

The recording audio bytes (WAV or MP3; the Content-Type says which).

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete a call recording

DELETE/api/v1/dids/{id}/recordings/{recId}

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
recIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring-
deletedrequireddata.deletedboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List voicemails on a number

GET/api/v1/dids/{id}/voicemails

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
limitqueryintegerNewest first; default 200

Response 200

FieldTypeDescription
datarequiredobject[]Same fields as DidRecording, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Download a voicemail

GET/api/v1/dids/{id}/voicemails/{recId}/audio

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
recIdrequiredpathstring-

Response 200 (audio/*)

The voicemail audio bytes (WAV or MP3; the Content-Type says which).

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Mark a voicemail heard or unheard

POST/api/v1/dids/{id}/voicemails/{recId}/heard

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
recIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
heardbooleanDefault true

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
heardrequireddata.heardboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete a voicemail

DELETE/api/v1/dids/{id}/voicemails/{recId}

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
recIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring-
deletedrequireddata.deletedboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Release a phone number

POST/api/v1/dids/{id}/release

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Cancels the number and stops its monthly charge. Irreversible: the number goes back to the carrier.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as Did, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get a number's SMS settings

GET/api/v1/dids/{id}/sms-settings

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

While SMS on numbers is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
smsEnabledrequireddata.smsEnabledboolean-
forwardWebhookUrlrequireddata.forwardWebhookUrlstring | nullhttps URL each inbound SMS is forwarded to
notifyEmailrequireddata.notifyEmailstring | null-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Update a number's SMS settings

PUT/api/v1/dids/{id}/sms-settings

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
smsEnabledboolean-
forwardWebhookUrlstring | nullhttps only; null or "" clears itmax 2048 chars
notifyEmailstring | nullnull or "" clears itmax 255 chars

Response 200

FieldTypeDescription
datarequiredobjectSame fields as DidSmsSettings, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List SMS conversations on a number

GET/api/v1/dids/{id}/messages/conversations

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

One row per other party, newest activity first, with unread counts.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-
peerrequireddata[].peerstring-
lastBodyrequireddata[].lastBodystring-
lastDirectionrequireddata[].lastDirectionstring-One of in, out
lastStatusrequireddata[].lastStatusstring-One of received, queued, sent, delivered, failed
lastAtrequireddata[].lastAtstring (date-time)ISO-8601 timestamp (UTC)
unreadrequireddata[].unreadinteger-
totalrequireddata[].totalinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List SMS messages on a number

GET/api/v1/dids/{id}/messages

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Newest first. Page older with before set to the previous nextBefore.

Parameters

NameInTypeDescription
idrequiredpathstring-
peerquerystringOne conversation; omit for the number's whole log
beforequerystringISO timestamp: page older than this (use nextBefore)
limitqueryintegerDefault 50

Response 200

FieldTypeDescription
messagesrequiredobject[]-
idrequiredmessages[].idstring (uuid)-
directionrequiredmessages[].directionstring-One of in, out
fromrequiredmessages[].fromstring-
torequiredmessages[].tostring-
peerrequiredmessages[].peerstringThe other party, digits only; the conversation key
bodyrequiredmessages[].bodystring-
segmentsrequiredmessages[].segmentsinteger-
statusrequiredmessages[].statusstring-One of received, queued, sent, delivered, failed
errorrequiredmessages[].errorstring | null-
providerMessageIdrequiredmessages[].providerMessageIdstring | nullUpstream carrier message id
readAtrequiredmessages[].readAtstring (date-time) | nullISO-8601 timestamp (UTC)
createdAtrequiredmessages[].createdAtstring (date-time)ISO-8601 timestamp (UTC)
nextBeforerequiredstring | null-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Send an SMS from one of your numbers

POST/api/v1/dids/{id}/messages

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)
Safe retries
Send X-Idempotency-Key; a replay within 24 hours returns the first response.
Real traffic
Sends a real SMS from your number, billed to your balance.

Charges per segment, then hands the message to the carrier. A hard send failure refunds the charge and marks the message failed.

Parameters

NameInTypeDescription
idrequiredpathstring-
X-Idempotency-KeyheaderstringAny unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice.

Request body (application/json)

FieldTypeDescription
torequiredstring-max 32 chars
bodyrequiredstring-max 1600 chars
idempotencyKeystring | nullA retry with the same key returns the original messagemax 80 chars

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
directionrequireddata.directionstring-One of in, out
fromrequireddata.fromstring-
torequireddata.tostring-
peerrequireddata.peerstringThe other party, digits only; the conversation key
bodyrequireddata.bodystring-
segmentsrequireddata.segmentsinteger-
statusrequireddata.statusstring-One of received, queued, sent, delivered, failed
errorrequireddata.errorstring | null-
providerMessageIdrequireddata.providerMessageIdstring | nullUpstream carrier message id
readAtrequireddata.readAtstring (date-time) | nullISO-8601 timestamp (UTC)
createdAtrequireddata.createdAtstring (date-time)ISO-8601 timestamp (UTC)
costrequireddata.costmoneyWhat you were charged; 0.000000 when failed and refunded USD as a decimal string with exactly 6 places, e.g. "0.012500".

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Mark an SMS conversation read

POST/api/v1/dids/{id}/messages/read

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
peerrequiredstring-max 32 chars

Response 200

FieldTypeDescription
datarequiredobject-
updatedrequireddata.updatedinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Search the catalogue by digit pattern or vanity run

GET/api/v1/dids/search

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Scans catalogue pages for groups whose dialing prefix matches. While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Parameters

NameInTypeDescription
patternquerystringDigits to match against the dialing prefix (country + area)
matchquerystringDefault containsOne of contains, starts_with, ends_with, exact
vanityquerystringOnly prefixes with repeating or sequential runsOne of true, false, 1, 0, yes, no, on, off
countryIdquerystring-
typeIdquerystring-
textquerystringText over country, city and type name
limitqueryintegerDefault 50

Response 200

FieldTypeDescription
datarequiredobject-
hitsrequireddata.hitsobject[]-
groupIdrequireddata.hits[].groupIdstringPass to POST /dids/buy with a skuId
countryrequireddata.hits[].countrystring-
countryIdrequireddata.hits[].countryIdstringCatalogue country id (filter value), not an ISO code
countryPrefixrequireddata.hits[].countryPrefixstring-
cityrequireddata.hits[].citystring | null-
areaPrefixrequireddata.hits[].areaPrefixstring | null-
typeIdrequireddata.hits[].typeIdstring | null-
typeNamerequireddata.hits[].typeNamestring | nullLocal, National, Mobile, Toll-free...
skusrequireddata.hits[].skusobject[]Same fields as DidCatalogSku, shown earlier on this page.
dialingPrefixrequireddata.hits[].dialingPrefixstringCountry prefix plus area prefix
vanityrequireddata.hits[].vanityboolean-
scannedPagesrequireddata.scannedPagesinteger-
truncatedrequireddata.truncatedbooleanTrue when the scan budget ran out before the end of the catalogue
hitsobject[]-
groupIdrequiredhits[].groupIdstringPass to POST /dids/buy with a skuId
countryrequiredhits[].countrystring-
countryIdrequiredhits[].countryIdstringCatalogue country id (filter value), not an ISO code
countryPrefixrequiredhits[].countryPrefixstring-
cityrequiredhits[].citystring | null-
areaPrefixrequiredhits[].areaPrefixstring | null-
typeIdrequiredhits[].typeIdstring | null-
typeNamerequiredhits[].typeNamestring | nullLocal, National, Mobile, Toll-free...
skusrequiredhits[].skusobject[]Same fields as DidCatalogSku, shown earlier on this page.
dialingPrefixrequiredhits[].dialingPrefixstringCountry prefix plus area prefix
vanityrequiredhits[].vanityboolean-
scannedPagesinteger-
truncatedbooleanTrue when the scan budget ran out before the end of the catalogue

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Buy several phone numbers in one request

POST/api/v1/dids/bulk-buy

Access
API key. Scoped keys need numbers:write.
Rate limit
100 requests per second (the default)
Safe retries
Send X-Idempotency-Key; a replay within 24 hours returns the first response.
Moves money
Buys a phone number, charged to your balance.

Buys each item in order and reports a result per item. Stops buying once your balance runs out and marks the rest skipped.

Parameters

NameInTypeDescription
X-Idempotency-KeyheaderstringAny unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice.

Request body (application/json)

FieldTypeDescription
itemsrequiredobject[]-
skuIdrequireditems[].skuIdstring-max 64 chars
groupIdrequireditems[].groupIdstring-max 64 chars
countryIditems[].countryIdstring-max 64 chars
countryitems[].countrystring-max 120 chars
cityitems[].citystring | null-max 120 chars
areaPrefixitems[].areaPrefixstring | null-max 16 chars
didTypeitems[].didTypestring | null-max 40 chars

Response 201

FieldTypeDescription
datarequiredobject-
requestedrequireddata.requestedinteger-
succeededrequireddata.succeededinteger-
failedrequireddata.failedinteger-
skippedrequireddata.skippedinteger-
itemsrequireddata.itemsobject[]-
indexrequireddata.items[].indexintegerPosition in the submitted array
skuIdrequireddata.items[].skuIdstring-
groupIdrequireddata.items[].groupIdstring-
statusrequireddata.items[].statusstring-One of ok, failed, skipped
diddata.items[].didobjectPresent when status is okSame fields as Did, shown earlier on this page.
errordata.items[].errorstring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get a spend and usage overview across your numbers

GET/api/v1/dids/analytics/overview

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Response 200

FieldTypeDescription
datarequiredobject-
countsrequireddata.countsobject-
totalrequireddata.counts.totalinteger-
activerequireddata.counts.activeinteger-
pendingrequireddata.counts.pendinginteger-
suspendedrequireddata.counts.suspendedinteger-
releasedrequireddata.counts.releasedinteger-
failedrequireddata.counts.failedinteger-
monthlyRecurringrequireddata.monthlyRecurringnumberSum of monthly prices on active numbers, USD display number
lifetimeSpendrequireddata.lifetimeSpendnumberNet charged across all your numbers, USD display number
usagerequireddata.usageobject-
callsrequireddata.usage.callsinteger-
callMinutesrequireddata.usage.callMinutesnumber-
smsrequireddata.usage.smsinteger-
voicemailsrequireddata.usage.voicemailsinteger-
voicemailMinutesrequireddata.usage.voicemailMinutesnumber-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get spend and usage analytics for a number

GET/api/v1/dids/{id}/analytics

Access
API key. Scoped keys need numbers:read.
Rate limit
100 requests per second (the default)

Totals and a month-by-month series. Spend figures are USD display numbers.

Parameters

NameInTypeDescription
idrequiredpathstring-
monthsqueryintegerTrailing months in the series

Response 200

FieldTypeDescription
datarequiredobject-
numberrequireddata.numberstring | null-
statusrequireddata.statusstring-
pricerequireddata.priceobject-
setuprequireddata.price.setupmoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
monthlyrequireddata.price.monthlymoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
spendrequireddata.spendobjectUSD as display numbers
grossrequireddata.spend.grossnumber-
refundedrequireddata.spend.refundednumber-
netrequireddata.spend.netnumber-
setuprequireddata.spend.setupnumber-
recurringrequireddata.spend.recurringnumber-
usagerequireddata.usageobject-
callsrequireddata.usage.callsinteger-
callMinutesrequireddata.usage.callMinutesnumber-
smsrequireddata.usage.smsinteger-
voicemailsrequireddata.usage.voicemailsinteger-
voicemailMinutesrequireddata.usage.voicemailMinutesnumber-
windowrequireddata.windowobject-
monthsrequireddata.window.monthsinteger-
fromrequireddata.window.fromstring-
seriesrequireddata.seriesobject[]-
callsrequireddata.series[].callsinteger-
callMinutesrequireddata.series[].callMinutesnumber-
smsrequireddata.series[].smsinteger-
voicemailsrequireddata.series[].voicemailsinteger-
voicemailMinutesrequireddata.series[].voicemailMinutesnumber-
periodrequireddata.series[].periodstringYYYY-MM
spendrequireddata.series[].spendnumberUSD, display number

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Browse the public number catalogue

GET/api/v1/public/numbers/catalog

Access
Public. No key needed.
Rate limit
30 requests per minute

No account needed: prices only, for pre-signup browsing. While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Parameters

NameInTypeDescription
countryIdquerystringFrom GET .../catalog/countries
typeIdquerystringFrom GET .../catalog/types
searchquerystringText match over country, city, area prefix and type; digits also match the start of the full dialling prefix ("4420" finds London). Spans the whole catalogue once it is indexed, otherwise the fetched page
pagequeryinteger-
sortquerystringOrder by the cheapest monthly price, setup price or location. Omitted: the catalogue orderOne of monthly_asc, monthly_desc, setup_asc, location_asc
maxMonthlyquerynumberOnly groups whose cheapest monthly price is at most this, in USD

Response 200

FieldTypeDescription
groupsrequiredobject[]Same fields as DidCatalogGroup, shown earlier on this page.
totalrequiredinteger | null-
pagerequiredinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Number catalogue market summary

GET/api/v1/public/numbers/catalog/summary

Access
Public. No key needed.
Rate limit
15 requests per minute

No account needed. The store's live figures: how many countries and number groups are for sale, and the cheapest monthly price by number type and by country. Prices only. Indexed in the background and refreshed about every 20 minutes. While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject-
readydata.readybooleanThe catalogue is being indexed (the first minute after a restart); ask again shortlyOne of false
completedata.completebooleanfalse when the catalogue was larger than the indexing budget, so the figures are a lower bound
asOfdata.asOfstring (date-time)When the catalogue was last indexed
groupsdata.groupsintegerBuyable number groups (a city, area or national pool you order a number from)
countriesdata.countriesinteger-
fromMonthlydata.fromMonthlynumber | nullCheapest monthly price in the catalogue, USD
typesdata.typesobject[]Most groups first
typeIdrequireddata.types[].typeIdstring-
typeNamerequireddata.types[].typeNamestringLocal, National, Mobile, Toll-free...
groupsrequireddata.types[].groupsintegerNumber groups of this type
countriesrequireddata.types[].countriesintegerCountries with at least one group of this type
fromMonthlyrequireddata.types[].fromMonthlynumber | nullCheapest monthly price of this type, USD
fromSetuprequireddata.types[].fromSetupnumber | nullCheapest one-off setup price of this type, USD
countryListdata.countryListobject[]Alphabetical
countryIdrequireddata.countryList[].countryIdstringCatalogue country id (filter value)
countryrequireddata.countryList[].countrystring-
countryPrefixrequireddata.countryList[].countryPrefixstring-
groupsrequireddata.countryList[].groupsinteger-
fromMonthlyrequireddata.countryList[].fromMonthlynumber | nullCheapest monthly price in this country, USD
typeIdsrequireddata.countryList[].typeIdsstring[]Number types sold in this country

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List countries in the public number catalogue

GET/api/v1/public/numbers/catalog/countries

Access
Public. No key needed.
Rate limit
15 requests per minute

While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject[]Same fields as DidCatalogCountry, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List number types in the public number catalogue

GET/api/v1/public/numbers/catalog/types

Access
Public. No key needed.
Rate limit
15 requests per minute

While the number store is switched off this answers 200 with data: { disabled: true, comingSoon: true, message }.

Response 200

FieldTypeDescription
datarequiredobject[]Same fields as DidCatalogType, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.