API reference
Purchases
Buy access to marketplace routes and manage what you bought.
BrowsePurchases
List your route purchases
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
statusquery · string
One of active, paused, cancelledcursorquery · string (uuid)
limitquery · integer
Default 25
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
buyerIdrequiredstring (uuid) · data[].buyerId
Your account idrouteIdrequiredstring (uuid) · data[].routeId
statusrequiredstring · data[].status
One ofactive,paused,cancelled,pending_reviewsipUsernamerequiredstring | null · data[].sipUsername
createdAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)cancelledAtrequiredstring (date-time) | null · data[].cancelledAt
ISO-8601 timestamp (UTC)agreedPricerequiredmoney | null · data[].agreedPrice
Negotiated price (from an accepted offer) that overrides the list price USD as a decimal string with exactly 6 places, e.g. "0.012500".heldOldRaterequiredmoney | null · data[].heldOldRate
Set while the purchase is paused by a seller rate increase: the rate you were paying USD as a decimal string with exactly 6 places, e.g. "0.012500".heldNewRaterequiredmoney | null · data[].heldNewRate
The increased rate waiting for your acceptance USD as a decimal string with exactly 6 places, e.g. "0.012500".routingPriorityrequiredinteger | null · data[].routingPriority
Your routing position (1 = first); null = unrankedsipPasswordrequiredstring | null · data[].sipPassword
Your own SIP password, for your connection cardheldDeckVersionrequiredstring | null · data[].heldDeckVersion
Deck fingerprint to pass as deckVersion when accepting a deck increaserouterequiredobject · data[].route
typerequiredstring · data[].route.type
One ofvoice,smscountryrequiredstring · data[].route.country
prefixrequiredstring[] · data[].route.prefix
countryCoderequiredstring · data[].route.countryCode
destinationNamerequiredstring · data[].route.destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.pricePerUnitrequiredmoney · data[].route.pricePerUnit
USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data[].route.billingIncrement
jingleSipIprequiredenum | null · data[].route.jingleSipIp
Always null: the seller endpoint is never disclosedOne ofnullcapacityrequiredinteger · data[].route.capacity
expectedAsrrequiredstring | null · data[].route.expectedAsr
expectedAcdrequiredstring | null · data[].route.expectedAcd
dialerCompatiblerequiredboolean · data[].route.dialerCompatible
rateCountrequiredinteger · data[].route.rateCount
nextCursorrequiredstring | null
Pass ascursorto fetch the next page; null on the last page.hasMorerequiredboolean
True when another page exists.
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.
Buy access to a marketplace route
POST/
- Access
- API key. Scoped keys need
purchases:write. - Rate limit
- 100 requests per second (the default)
- Moves money
- Buys access to a marketplace route.
No upfront cost: usage is billed per minute or message from your balance. Requires a LIVE API key: a test key is refused with 400.
Request body (application/json)
routeIdrequiredstring (uuid)
Response 201
datarequiredobject
idrequiredstring (uuid) · data.id
buyerIdrequiredstring (uuid) · data.buyerId
Your account idrouteIdrequiredstring (uuid) · data.routeId
statusrequiredstring · data.status
One ofactive,paused,cancelled,pending_reviewsipUsernamerequiredstring | null · data.sipUsername
createdAtrequiredstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)cancelledAtrequiredstring (date-time) | null · data.cancelledAt
ISO-8601 timestamp (UTC)agreedPricerequiredmoney | null · data.agreedPrice
Negotiated price (from an accepted offer) that overrides the list price USD as a decimal string with exactly 6 places, e.g. "0.012500".heldOldRaterequiredmoney | null · data.heldOldRate
Set while the purchase is paused by a seller rate increase: the rate you were paying USD as a decimal string with exactly 6 places, e.g. "0.012500".heldNewRaterequiredmoney | null · data.heldNewRate
The increased rate waiting for your acceptance USD as a decimal string with exactly 6 places, e.g. "0.012500".routingPriorityrequiredinteger | null · data.routingPriority
Your routing position (1 = first); null = unrankedrequiresUsCompliancerequiredboolean · data.requiresUsCompliance
A US voice route that needs STIR/SHAKEN review before traffic flowsreviewedAtrequiredstring (date-time) | null · data.reviewedAt
ISO-8601 timestamp (UTC)reviewNoterequiredstring | null · data.reviewNote
The compliance reviewer's note to you, if anysipPasswordSetrequiredboolean · data.sipPasswordSet
Whether a SIP password exists. The value is not returned here: it is shown once at purchase, on your purchased-routes list and on Interconnections.smppSystemIdrequiredstring | null · data.smppSystemId
offerIdrequiredstring (uuid) | null · data.offerId
The accepted offer that set agreedPricerouterequiredobject | null · data.route
idrequiredstring (uuid) · data.route.id
typerequiredstring · data.route.type
One ofvoice,smscountryrequiredstring · data.route.country
destinationNamerequiredstring · data.route.destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.listingRefrequiredstring · data.route.listingRef
Anonymous short reference of the listing (4 characters, e.g. "7K2Q"): stable for the life of the listing, unique enough to tell two same-named listings apart, and derived from the listing alone (it says nothing about the seller). Absent on your own listings.pricePerUnitrequiredmoney · data.route.pricePerUnit
USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data.route.billingIncrement
jingleSipIprequiredenum | null · data.route.jingleSipIp
One ofnullsipPublicIprequiredstring · data.sipPublicIp
Where to send your SIP trafficsipPasswordrequiredstring | null · data.sipPassword
Plaintext SIP password, returned once herependingCompliancerequiredboolean · data.pendingCompliance
True when US STIR/SHAKEN compliance review must finish before traffic flows
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. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get your voice routing order
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Your SIP credentials and whitelisted IPs identify your ACCOUNT, not a route, so every active voice purchase can carry any call it covers. When several cover a number equally well (same prefix length), your routing order decides, then the cheaper rate, then the older purchase. This lists every voice purchase that can hold a position (active, paused or pending review): ranked ones first by position, then unranked ones oldest first. Destination names are cleaned of seller details. rateSheet routes are priced by an A-Z deck, so they can overlap any destination.
Response 200
datarequiredobject[]
purchaseIdrequiredstring (uuid) · data[].purchaseId
routeIdrequiredstring (uuid) · data[].routeId
statusrequiredstring · data[].status
One ofactive,paused,cancelled,pending_reviewroutingPriorityrequiredinteger | null · data[].routingPriority
Your position (1 = first); null = unrankedcreatedAtrequiredstring (date-time) · data[].createdAt
When you bought it (the tie-break among unranked routes)destinationNamerequiredstring · data[].destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.countryrequiredstring · data[].country
countryCoderequiredstring · data[].countryCode
prefixrequiredstring[] · data[].prefix
rateSheetrequiredboolean · data[].rateSheet
Priced by an A-Z rate sheet, so it can overlap any destination
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.
Replace your voice routing order
PUT/
- Access
- API key. Scoped keys need
purchases:write. - Rate limit
- 100 requests per second (the default)
purchaseIds[0] becomes position 1, the next 2, and so on; every other voice purchase of yours is cleared to unranked. Atomic: a reorder never leaves two routes half-swapped. An empty list clears the whole order (back to cheapest, then oldest). A repeated id is 400 VALIDATION_ERROR; an id that is not one of your rankable voice purchases is 404 and nothing changes.
Request body (application/json)
purchaseIdsrequiredstring (uuid)[]
Your voice purchases in the order to try them; an empty list clears the order
Response 200
datarequiredobject
orderrequiredobject[] · data.order
purchaseIdrequiredstring (uuid) · data.order[].purchaseId
routingPriorityrequiredinteger · data.order[].routingPriority
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. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
See your first-choice and backup routes per destination
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
For each prefix your active voice routes list: the route tried first and the backups behind it, in the order a call would use them. When automatic failover is on (enabled: true), a call that a route refuses before it is answered (for example SIP 403, 480, 5xx or no response) is tried straight away on the next route, up to maxAttempts routes, and only the route that connects is billed. A wrong number, a busy or declined call and an unanswered call are never retried. Over a SIP trunk only server errors and congestion (5xx) move a call on; apiOnly marks backups SIP trunk calls never use. singleRoute: true marks a destination with no backup. A-Z rate sheets are listed separately because they have no single prefix. Names are cleaned of seller details. Read-only.
Response 200
datarequiredobject
enabledrequiredboolean · data.enabled
Whether automatic failover is switched onmaxAttemptsrequiredinteger · data.maxAttempts
The most routes tried for one call, the first includeddestinationsrequiredobject[] · data.destinations
prefixrequiredstring · data.destinations[].prefix
"+" and the listed prefixcountryrequiredstring · data.destinations[].country
routesrequiredobject[] · data.destinations[].routes
purchaseIdrequiredstring (uuid) · data.destinations[].routes[].purchaseId
routeIdrequiredstring (uuid) · data.destinations[].routes[].routeId
destinationNamerequiredstring · data.destinations[].routes[].destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.positionrequiredinteger · data.destinations[].routes[].position
1 is tried firstrolerequiredstring · data.destinations[].routes[].role
not_tried: beyond maxAttempts, so never reached by one callOne offirst,backup,not_triedapiOnlyrequiredboolean · data.destinations[].routes[].apiOnly
true for a backup that calls over your SIP trunk never use (it needs SIP credentials, call screening or a reshaped number, or the first choice does); Voice API calls still fail over to itsingleRouterequiredboolean · data.destinations[].singleRoute
True when only one of your routes covers this prefix: no backuprateSheetsrequiredobject[] · data.rateSheets
purchaseIdrequiredstring (uuid) · data.rateSheets[].purchaseId
routeIdrequiredstring (uuid) · data.rateSheets[].routeId
destinationNamerequiredstring · data.rateSheets[].destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.
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.
See which of your routes would carry a number
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 60 requests per minute
Runs the same ranking the live SIP path uses, for your account and with the same number normalisation, so the answer is what a real call would do. Lists every route of yours that covers the number, in order, with the step of the rule that put each one behind the one above. Also reports the two refusals that sit in front of routing: an embargoed destination and an empty balance; when refused is set, no route carries the call. Read-only.
Parameters
torequiredquery · string
The number to check, international format
Response 200
datarequiredobject
numberrequiredstring · data.number
The number as checked, "+" and digitscarriedByrequiredobject | null · data.carriedBy
The route that would carry it (candidates[0]); null when none covers itpositionrequiredinteger · data.carriedBy.position
1 = the route that would carry the callcarriesrequiredboolean · data.carriedBy.carries
purchaseIdrequiredstring (uuid) | null · data.carriedBy.purchaseId
null for one of your own listingsrouteIdrequiredstring (uuid) · data.carriedBy.routeId
ownRouterequiredboolean · data.carriedBy.ownRoute
True when this is a route you sell yourselfdestinationNamerequiredstring · data.carriedBy.destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.countryrequiredstring · data.carriedBy.country
matchedPrefixrequiredstring | null · data.carriedBy.matchedPrefix
matchedDigitsrequiredinteger · data.carriedBy.matchedDigits
Length of the matching prefixroutingPriorityrequiredinteger | null · data.carriedBy.routingPriority
raterequiredmoney | null · data.carriedBy.rate
What you are billed per minute for this number on this route USD as a decimal string with exactly 6 places, e.g. "0.012500".rateSheetrequiredboolean · data.carriedBy.rateSheet
The route is priced by an A-Z rate sheetpurchasedAtrequiredstring (date-time) | null · data.carriedBy.purchasedAt
ISO-8601 timestamp (UTC)behindBecauserequiredstring | null · data.carriedBy.behindBecause
For every route after the first: why the route above it winsOne ofprefix,routing_order,rate,age,route_idreasonrequiredstring · data.reason
Why that route wins, in wordsdecidedByrequiredstring | null · data.decidedBy
The step that decided between the first two routes; null with fewer than twoOne ofprefix,routing_order,rate,age,route_idcandidatesrequiredobject[] · data.candidates
Same fields as RouteForCandidate, shown earlier on this page.refusedrequiredobject | null · data.refused
reasonrequiredstring · data.refused.reason
One ofembargoed,no_balancemessagerequiredstring · data.refused.message
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.
Set a purchase's routing position
PATCH/
- Access
- API key. Scoped keys need
purchases:write. - Rate limit
- 100 requests per second (the default)
Sets (priority: n) or clears (priority: null) one voice purchase's position in your routing order; 1 is tried first. Positions do not have to be contiguous, and two purchases may share one (then rate, then age decides). Voice purchases only, and not a cancelled one (400 VALIDATION_ERROR). To reorder several at once use PUT /purchases/routing-order.
Parameters
idrequiredpath · string (uuid)
Request body (application/json)
priorityrequiredinteger | null
1 = tried first; null clears the position1 to 9999
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
routingPriorityrequiredinteger | null · data.routingPriority
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. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Clear a purchase's routing position
DELETE/
- Access
- API key. Scoped keys need
purchases:write. - Rate limit
- 100 requests per second (the default)
The purchase goes back to unranked: after every ranked route, cheapest then oldest.
Parameters
idrequiredpath · string (uuid)
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
routingPriorityrequiredinteger | null · data.routingPriority
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. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a purchase
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
buyerIdrequiredstring (uuid) · data.buyerId
Your account idrouteIdrequiredstring (uuid) · data.routeId
statusrequiredstring · data.status
One ofactive,paused,cancelled,pending_reviewsipUsernamerequiredstring | null · data.sipUsername
createdAtrequiredstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)cancelledAtrequiredstring (date-time) | null · data.cancelledAt
ISO-8601 timestamp (UTC)agreedPricerequiredmoney | null · data.agreedPrice
Negotiated price (from an accepted offer) that overrides the list price USD as a decimal string with exactly 6 places, e.g. "0.012500".heldOldRaterequiredmoney | null · data.heldOldRate
Set while the purchase is paused by a seller rate increase: the rate you were paying USD as a decimal string with exactly 6 places, e.g. "0.012500".heldNewRaterequiredmoney | null · data.heldNewRate
The increased rate waiting for your acceptance USD as a decimal string with exactly 6 places, e.g. "0.012500".routingPriorityrequiredinteger | null · data.routingPriority
Your routing position (1 = first); null = unrankedrequiresUsCompliancerequiredboolean · data.requiresUsCompliance
A US voice route that needs STIR/SHAKEN review before traffic flowsreviewedAtrequiredstring (date-time) | null · data.reviewedAt
ISO-8601 timestamp (UTC)reviewNoterequiredstring | null · data.reviewNote
The compliance reviewer's note to you, if anysipPasswordSetrequiredboolean · data.sipPasswordSet
Whether a SIP password exists. The value is not returned here: it is shown once at purchase, on your purchased-routes list and on Interconnections.smppSystemIdrequiredstring | null · data.smppSystemId
offerIdrequiredstring (uuid) | null · data.offerId
The accepted offer that set agreedPricerouterequiredobject | null · data.route
idrequiredstring (uuid) · data.route.id
typerequiredstring · data.route.type
One ofvoice,smscountryrequiredstring · data.route.country
destinationNamerequiredstring · data.route.destinationName
The listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.listingRefrequiredstring · data.route.listingRef
Anonymous short reference of the listing (4 characters, e.g. "7K2Q"): stable for the life of the listing, unique enough to tell two same-named listings apart, and derived from the listing alone (it says nothing about the seller). Absent on your own listings.pricePerUnitrequiredmoney · data.route.pricePerUnit
USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data.route.billingIncrement
jingleSipIprequiredenum | null · data.route.jingleSipIp
One ofnullsipPublicIprequiredstring · data.sipPublicIp
Where to send your SIP traffic
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. - 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.
Pause or resume a purchase
PATCH/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Request body (application/json)
statusrequiredstring
One ofactive,paused
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
buyerIdrequiredstring (uuid) · data.buyerId
Your account idrouteIdrequiredstring (uuid) · data.routeId
statusrequiredstring · data.status
One ofactive,paused,cancelled,pending_reviewsipUsernamerequiredstring | null · data.sipUsername
createdAtrequiredstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)cancelledAtrequiredstring (date-time) | null · data.cancelledAt
ISO-8601 timestamp (UTC)agreedPricerequiredmoney | null · data.agreedPrice
Negotiated price (from an accepted offer) that overrides the list price USD as a decimal string with exactly 6 places, e.g. "0.012500".heldOldRaterequiredmoney | null · data.heldOldRate
Set while the purchase is paused by a seller rate increase: the rate you were paying USD as a decimal string with exactly 6 places, e.g. "0.012500".heldNewRaterequiredmoney | null · data.heldNewRate
The increased rate waiting for your acceptance USD as a decimal string with exactly 6 places, e.g. "0.012500".routingPriorityrequiredinteger | null · data.routingPriority
Your routing position (1 = first); null = unrankedrequiresUsCompliancerequiredboolean · data.requiresUsCompliance
A US voice route that needs STIR/SHAKEN review before traffic flowsreviewedAtrequiredstring (date-time) | null · data.reviewedAt
ISO-8601 timestamp (UTC)reviewNoterequiredstring | null · data.reviewNote
The compliance reviewer's note to you, if anysipPasswordSetrequiredboolean · data.sipPasswordSet
Whether a SIP password exists. The value is not returned here: it is shown once at purchase, on your purchased-routes list and on Interconnections.smppSystemIdrequiredstring | null · data.smppSystemId
offerIdrequiredstring (uuid) | null · data.offerId
The accepted offer that set agreedPrice
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. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Cancel a purchase
DELETE/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
Same fields as PurchaseRow, shown earlier on this page.
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. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get call counts, ASR and spend for a purchase
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
calls24hrequiredinteger · data.calls24h
calls7drequiredinteger · data.calls7d
calls30drequiredinteger · data.calls30d
totalCallsrequiredinteger · data.totalCalls
lastActivityAtrequiredstring (date-time) | null · data.lastActivityAt
ISO-8601 timestamp (UTC)spend30dmoney · data.spend30d
Absent when nothing was spent USD as a decimal string with exactly 6 places, e.g. "0.012500".measuredAsrnumber · data.measuredAsr
measuredAsrSessionsinteger · data.measuredAsrSessions
measuredAsrPopulationstring · data.measuredAsrPopulation
measuredAsrWindowstring · data.measuredAsrWindow
measuredAcdnumber · data.measuredAcd
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. - 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.
Accept a seller's rate increase
POST/
- Access
- API key. Scoped keys need
purchases:write. - Rate limit
- 100 requests per second (the default)
- Moves money
- Accepts a higher rate on a route you buy.
A purchase paused by a price rise resumes at the new rate. Pass the rate (or deck version) you reviewed so a further change is not accepted by mistake.
Parameters
idrequiredpath · string
Request body (application/json)
acceptedRatestring | number
The new rate you are agreeing to, as shown to you (guards against a further change in between)deckVersionstring
For A-Z decks: the heldDeckVersion you reviewedchangeIdstring (uuid)
Accept a SCHEDULED change in advance (id from upcoming-rate-changes). Nothing resumes or bills now.
Response 200
datarequiredobject
idstring (uuid) · data.id
buyerIdstring (uuid) · data.buyerId
Your account idrouteIdstring (uuid) · data.routeId
statusstring · data.status
One ofactive,paused,cancelled,pending_reviewsipUsernamestring | null · data.sipUsername
createdAtstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)cancelledAtstring (date-time) | null · data.cancelledAt
ISO-8601 timestamp (UTC)agreedPricemoney | null · data.agreedPrice
Negotiated price (from an accepted offer) that overrides the list price USD as a decimal string with exactly 6 places, e.g. "0.012500".heldOldRatemoney | null · data.heldOldRate
Set while the purchase is paused by a seller rate increase: the rate you were paying USD as a decimal string with exactly 6 places, e.g. "0.012500".heldNewRatemoney | null · data.heldNewRate
The increased rate waiting for your acceptance USD as a decimal string with exactly 6 places, e.g. "0.012500".routingPriorityinteger | null · data.routingPriority
Your routing position (1 = first); null = unrankedrequiresUsComplianceboolean · data.requiresUsCompliance
A US voice route that needs STIR/SHAKEN review before traffic flowsreviewedAtstring (date-time) | null · data.reviewedAt
ISO-8601 timestamp (UTC)reviewNotestring | null · data.reviewNote
The compliance reviewer's note to you, if anysipPasswordSetboolean · data.sipPasswordSet
Whether a SIP password exists. The value is not returned here: it is shown once at purchase, on your purchased-routes list and on Interconnections.smppSystemIdstring | null · data.smppSystemId
offerIdstring (uuid) | null · data.offerId
The accepted offer that set agreedPriceacceptedboolean · data.accepted
One oftruechangeIdstring (uuid) · data.changeId
purchaseIdstring (uuid) · data.purchaseId
effectiveDatestring (date-time) · data.effectiveDate
ISO-8601 timestamp (UTC)
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. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List scheduled rate changes on a route you bought
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Rate changes the seller has scheduled on a route you bought and that are not yet in effect, soonest first: the effective date, the old and new rate per destination (biggest increases first, at most 200 rows per change; totalRows is the full count), and whether you have already accepted each one. For a per-country listing of an A-Z deck, only that listing's destinations are shown. Accept a change in advance with POST /purchases/{id}/accept-rate and changeId: at the effective date an accepted purchase keeps running instead of being paused for re-consent. affectsYou is false when you do not pay the list rate (an accepted offer or a private price), so a change will not pause you. Destination names are cleaned of seller details.
Parameters
idrequiredpath · string (uuid)
Response 200
datarequiredobject
purchaseIdrequiredstring (uuid) · data.purchaseId
affectsYourequiredboolean · data.affectsYou
True when you pay the list rate, so this change would pause you until acceptedchangesrequiredobject[] · data.changes
changeIdrequiredstring (uuid) · data.changes[].changeId
Pass as changeId to POST /purchases/{id}/accept-ratekindrequiredstring · data.changes[].kind
flat = the route's single price changes; deck = rate-sheet rows changeOne offlat,deckeffectiveDaterequiredstring (date-time) · data.changes[].effectiveDate
ISO-8601 timestamp (UTC)increasesrequiredinteger · data.changes[].increases
decreasesrequiredinteger · data.changes[].decreases
addedrequiredinteger · data.changes[].added
removedrequiredinteger · data.changes[].removed
largestIncreasePctrequirednumber | null · data.changes[].largestIncreasePct
acceptedrequiredboolean · data.changes[].accepted
acceptedAtrequiredstring (date-time) | null · data.changes[].acceptedAt
ISO-8601 timestamp (UTC)rowsrequiredobject[] · data.changes[].rows
destinationrequiredstring | null · data.changes[].rows[].destination
prefixrequiredstring | null · data.changes[].rows[].prefix
oldRaterequiredmoney | null · data.changes[].rows[].oldRate
US dollars as a decimal string with exactly 6 decimal places, e.g. "0.012500". Do money arithmetic with a decimal type, not floating point. USD as a decimal string with exactly 6 places, e.g. "0.012500".newRaterequiredmoney | null · data.changes[].rows[].newRate
US dollars as a decimal string with exactly 6 decimal places, e.g. "0.012500". Do money arithmetic with a decimal type, not floating point. USD as a decimal string with exactly 6 places, e.g. "0.012500".oldIncrementrequiredstring | null · data.changes[].rows[].oldIncrement
newIncrementrequiredstring | null · data.changes[].rows[].newIncrement
deltaPctrequirednumber | null · data.changes[].rows[].deltaPct
removedrequiredboolean · data.changes[].rows[].removed
totalRowsrequiredinteger · data.changes[].totalRows
Rows in the change for this listing (rows is capped at 200)
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. - 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.