API reference
Markets
Market-wide rate indices across destinations.
3 operationsBase URL https://packetexchange.io/api/v1Postman collection
BrowseMarkets
Get the marketplace summary
GET/
- 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
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
routesrequireddata.routes | integer | - |
destinationsrequireddata.destinations | integer | - |
voiceRoutesrequireddata.voiceRoutes | integer | - |
smsRoutesrequireddata.smsRoutes | integer | - |
hasRoutesrequireddata.hasRoutes | boolean | - |
hasActivityDatarequireddata.hasActivityData | boolean | - |
capacitydata.capacity | integer | - |
avgAsrdata.avgAsr | number | null | - |
measuredAsrdata.measuredAsr | number | null | - |
measuredAsrSampledata.measuredAsrSample | integer | - |
avgAcddata.avgAcd | number | null | - |
avgPricedata.avgPrice | number | null | Display figure |
topMoversrequireddata.topMovers | any[] | - |
marketStatusrequireddata.marketStatus | string | - |
asOfrequireddata.asOf | string (date-time) | Start of the 24h activity window |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List destinations with live routes and their lowest rates
GET/
- 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
| Name | In | Type | Description |
|---|---|---|---|
type | query | string | -One of voice, sms |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
voicedata.voice | object[] | - |
slugrequireddata.voice[].slug | string | URL slug from the country name, e.g. "pakistan" |
countryrequireddata.voice[].country | string | - |
countryCoderequireddata.voice[].countryCode | string | E.164 country calling code, digits only |
routesrequireddata.voice[].routes | integer | Live routes that price at least one number type |
lowestrequireddata.voice[].lowest | string | Lowest mobile, fixed or country-wide rate |
lowestBandrequireddata.voice[].lowestBand | string | mobile 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[].unit | string | Per minute (voice) or per message (SMS)One of min, msg |
smsdata.sms | object[] | Same fields as PricingDestination, shown earlier on this page. |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get the live market for one destination
GET/
- 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
| Name | In | Type | Description |
|---|---|---|---|
slugrequired | path | string | - |
type | query | string | -One of voice, smsDefault "voice" |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
slugrequireddata.slug | string | URL slug from the country name, e.g. "pakistan" |
countryrequireddata.country | string | - |
countryCoderequireddata.countryCode | string | E.164 country calling code, digits only |
routesrequireddata.routes | integer | Live routes that price at least one number type |
lowestrequireddata.lowest | string | Lowest mobile, fixed or country-wide rate |
lowestBandrequireddata.lowestBand | string | mobile 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.unit | string | Per minute (voice) or per message (SMS)One of min, msg |
typerequireddata.type | string | -One of voice, sms |
highestrequireddata.highest | string | Highest route "from" price in the destination |
bandsrequireddata.bands | object[] | Lowest rate per number type |
keyrequireddata.bands[].key | string | mobile 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[].from | string | USD, 6-decimal string, e.g. "0.020370" |
routesrequireddata.bands[].routes | integer | - |
operatorsrequireddata.operators | object[] | Mobile operators broken out on at least two routes, cheapest first, at most 12 |
namerequireddata.operators[].name | string | - |
fromrequireddata.operators[].from | string | USD, 6-decimal string, e.g. "0.020370" |
routesrequireddata.operators[].routes | integer | - |
cliTypesrequireddata.cliTypes | object[] | Caller-ID handling the sellers state (voice only) |
cliTyperequireddata.cliTypes[].cliType | string | - |
routesrequireddata.cliTypes[].routes | integer | - |
incrementsrequireddata.increments | object[] | Billing increments, e.g. "1/1" (voice only) |
incrementrequireddata.increments[].increment | string | - |
routesrequireddata.increments[].routes | integer | - |
routesWithStatedAsrrequireddata.routesWithStatedAsr | integer | Routes whose seller states an ASR |
otherBreakoutsrequireddata.otherBreakouts | integer | Named breakouts that are not a headline number type (toll-free, premium, cities) |
topRoutesrequireddata.topRoutes | object[] | The five cheapest routes, as anonymous facts |
rankrequireddata.topRoutes[].rank | integer | - |
fromrequireddata.topRoutes[].from | string | USD, 6-decimal string, e.g. "0.020370" |
mobileFromrequireddata.topRoutes[].mobileFrom | string | null | USD, 6-decimal string, e.g. "0.020370" |
cliTyperequireddata.topRoutes[].cliType | string | - |
billingIncrementrequireddata.topRoutes[].billingIncrement | string | null | - |
routeTyperequireddata.topRoutes[].routeType | string | Quality tier the route is listed under |
statedAsrrequireddata.topRoutes[].statedAsr | string | null | Seller-stated ASR %, not measured |
statedAcdrequireddata.topRoutes[].statedAcd | string | null | Seller-stated ACD in seconds, not measured |
relatedrequireddata.related | object[] | Destinations in the same world numbering zoneSame fields as PricingDestination, shown earlier on this page. |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.