Skip to content
Markets open

API reference

Markets

Market-wide rate indices across destinations.

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

Get the marketplace summary

GET/api/v1/markets/summary

Access
Key optional. A key or token personalises the answer.
Rate limit
100 requests per second (the default)

Public counts for everyone; capacity, ASR, ACD and average price only for signed-in callers.

Response 200

FieldTypeDescription
datarequiredobject-
routesrequireddata.routesinteger-
destinationsrequireddata.destinationsinteger-
voiceRoutesrequireddata.voiceRoutesinteger-
smsRoutesrequireddata.smsRoutesinteger-
hasRoutesrequireddata.hasRoutesboolean-
hasActivityDatarequireddata.hasActivityDataboolean-
capacitydata.capacityinteger-
avgAsrdata.avgAsrnumber | null-
measuredAsrdata.measuredAsrnumber | null-
measuredAsrSampledata.measuredAsrSampleinteger-
avgAcddata.avgAcdnumber | null-
avgPricedata.avgPricenumber | nullDisplay figure
topMoversrequireddata.topMoversany[]-
marketStatusrequireddata.marketStatusstring-
asOfrequireddata.asOfstring (date-time)Start of the 24h activity window

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 destinations with live routes and their lowest rates

GET/api/v1/pricing/destinations

Access
Public. No key needed.
Rate limit
100 requests per second (the default)

Public. Every destination with at least one live, buyer-visible route, per product: slug, route count and lowest rate. Pass type for one product; without it both voice and sms lists are returned. Rebuilt at most every 10 minutes (Cache-Control: public, max-age=600). Rates are the sellers' list prices before the platform fee.

Parameters

NameInTypeDescription
typequerystring-One of voice, sms

Response 200

FieldTypeDescription
datarequiredobject-
voicedata.voiceobject[]-
slugrequireddata.voice[].slugstringURL slug from the country name, e.g. "pakistan"
countryrequireddata.voice[].countrystring-
countryCoderequireddata.voice[].countryCodestringE.164 country calling code, digits only
routesrequireddata.voice[].routesintegerLive routes that price at least one number type
lowestrequireddata.voice[].loweststringLowest mobile, fixed or country-wide rate
lowestBandrequireddata.voice[].lowestBandstringmobile and fixed: rate-sheet rows named for that number type. countryWide: the bare country row (or a single-price listing), which prices every number without a more specific row.One of mobile, fixed, countryWide
unitrequireddata.voice[].unitstringPer minute (voice) or per message (SMS)One of min, msg
smsdata.smsobject[]Same fields as PricingDestination, shown earlier on this page.
updatedAtrequireddata.updatedAtstring (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 }.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get the live market for one destination

GET/api/v1/pricing/destinations/{slug}

Access
Public. No key needed.
Rate limit
100 requests per second (the default)

Public. Lowest rate per number type, mobile operator breakouts, caller-ID and billing-increment mix, and the five cheapest routes as anonymous facts (price, caller ID, increment, stated ASR). The ASR here is the one the seller states; measured figures per listing are on GET /routes (measured). 404 when the destination has no live route of that type. Cached like the list.

Parameters

NameInTypeDescription
slugrequiredpathstring-
typequerystring-One of voice, smsDefault "voice"

Response 200

FieldTypeDescription
datarequiredobject-
slugrequireddata.slugstringURL slug from the country name, e.g. "pakistan"
countryrequireddata.countrystring-
countryCoderequireddata.countryCodestringE.164 country calling code, digits only
routesrequireddata.routesintegerLive routes that price at least one number type
lowestrequireddata.loweststringLowest mobile, fixed or country-wide rate
lowestBandrequireddata.lowestBandstringmobile and fixed: rate-sheet rows named for that number type. countryWide: the bare country row (or a single-price listing), which prices every number without a more specific row.One of mobile, fixed, countryWide
unitrequireddata.unitstringPer minute (voice) or per message (SMS)One of min, msg
typerequireddata.typestring-One of voice, sms
highestrequireddata.higheststringHighest route "from" price in the destination
bandsrequireddata.bandsobject[]Lowest rate per number type
keyrequireddata.bands[].keystringmobile and fixed: rate-sheet rows named for that number type. countryWide: the bare country row (or a single-price listing), which prices every number without a more specific row.One of mobile, fixed, countryWide
fromrequireddata.bands[].fromstringUSD, 6-decimal string, e.g. "0.020370"
routesrequireddata.bands[].routesinteger-
operatorsrequireddata.operatorsobject[]Mobile operators broken out on at least two routes, cheapest first, at most 12
namerequireddata.operators[].namestring-
fromrequireddata.operators[].fromstringUSD, 6-decimal string, e.g. "0.020370"
routesrequireddata.operators[].routesinteger-
cliTypesrequireddata.cliTypesobject[]Caller-ID handling the sellers state (voice only)
cliTyperequireddata.cliTypes[].cliTypestring-
routesrequireddata.cliTypes[].routesinteger-
incrementsrequireddata.incrementsobject[]Billing increments, e.g. "1/1" (voice only)
incrementrequireddata.increments[].incrementstring-
routesrequireddata.increments[].routesinteger-
routesWithStatedAsrrequireddata.routesWithStatedAsrintegerRoutes whose seller states an ASR
otherBreakoutsrequireddata.otherBreakoutsintegerNamed breakouts that are not a headline number type (toll-free, premium, cities)
topRoutesrequireddata.topRoutesobject[]The five cheapest routes, as anonymous facts
rankrequireddata.topRoutes[].rankinteger-
fromrequireddata.topRoutes[].fromstringUSD, 6-decimal string, e.g. "0.020370"
mobileFromrequireddata.topRoutes[].mobileFromstring | nullUSD, 6-decimal string, e.g. "0.020370"
cliTyperequireddata.topRoutes[].cliTypestring-
billingIncrementrequireddata.topRoutes[].billingIncrementstring | null-
routeTyperequireddata.topRoutes[].routeTypestringQuality tier the route is listed under
statedAsrrequireddata.topRoutes[].statedAsrstring | nullSeller-stated ASR %, not measured
statedAcdrequireddata.topRoutes[].statedAcdstring | nullSeller-stated ACD in seconds, not measured
relatedrequireddata.relatedobject[]Destinations in the same world numbering zoneSame fields as PricingDestination, shown earlier on this page.
updatedAtrequireddata.updatedAtstring (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 }.
  • 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.