API reference
Marketplace routes
Browse, resolve, list and manage voice and SMS termination routes.
BrowseMarketplace routes
Browse the route marketplace
GET/
- Access
- Key optional. A key or token personalises the answer.
- Rate limit
- 100 requests per second (the default)
Public. Every row is anonymous: no seller name, id or endpoint. Signed-in callers get the full stats block; anonymous callers get counts only. Money fields are 6-decimal USD strings. Each row carries measured (ASR, ACD, NER and PDD measured from real calls, or null) beside the seller-stated expectedAsr/expectedAcd/expectedPdd; anonymous callers get the attempt count as a band and no buyer count. Sort by measured quality with sort=measured_asr_desc|measured_asr_asc|measured_acd_desc|measured_acd_asc|ner_desc|ner_asc, or quality_desc (measured NER then ASR where measured, else stated ASR): listings with measured figures come first.
Parameters
typequery · string
One of voice, smscountryquery · string
countryCodequery · string
cliTypequery · string
One of full_cli, local_cli, mixed_cli, ncli, partial_clirouteTypequery · string
One of direct, premium, standard, ncliminPricequery · string
maxPricequery · string
minAsrquery · string
minAcdquery · string
maxPddquery · string
minScorequery · integer
minCapacityquery · integer
billingquery · string
One of per_second, per_minutewholesalequery · string
One of true, falsecallcenterquery · string
One of true, falseretailquery · string
One of true, falseotpquery · string
One of true, falseopenRtpquery · string
One of true, falsedialerquery · string
One of true, falsea2pquery · string
One of true, falsebundlesOnlyquery · string
One of true, falsesearchquery · string
sortquery · string
One of price_asc, price_desc, asr_desc, asr_asc, acd_desc, acd_asc, pdd_asc, pdd_desc, capacity_desc, created_desc, country_asc, score_desc, score_asc, measured_asr_desc, measured_asr_asc, measured_acd_desc, measured_acd_asc, ner_desc, ner_asc, quality_desccursorquery · string (uuid)
limitquery · integer
Default 25
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
kindrequiredstring · data[].kind
One ofsingle,blendtyperequiredstring · data[].type
One ofvoice,smscountryrequiredstring · data[].country
countryCoderequiredstring · data[].countryCode
E.164 country calling code, digits onlyprefixrequiredstring[] · data[].prefix
Dial prefixes the route coversdestinationNamerequiredstring · data[].destinationName
The listing name. For anyone but the seller it is GENERATED by the platform from its own data, never the seller's text: "<Country> <Operator?> <Mobile|Fixed|All Networks>" for one destination (e.g. "Niger Mobile", "Kenya Safaricom Mobile"), "A-Z Voice · <tier> · <CLI> · Ref XXXX" or "A-Z SMS · <quality> · Ref XXXX" for an A-Z bundle. The seller sees the name they gave it.cliTyperequiredstring · data[].cliType
One offull_cli,ncli,partial_cli,local_cli,mixed_clirouteTyperequiredstring · data[].routeType
Quality tierOne ofdirect,premium,standard,nclipricePerUnitrequiredmoney · data[].pricePerUnit
USD per minute (voice) or per message segment (SMS). On an A-Z deck (rateCount > 0) the per-destination rates apply instead. USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data[].billingIncrement
First/subsequent increment in seconds, e.g. "60/60"capacityrequiredinteger · data[].capacity
Channels (voice) or messages per second (SMS)expectedAsrrequiredstring | null · data[].expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdrequiredstring | null · data[].expectedAcd
Seller-stated ACD in secondsexpectedPddrequiredstring | null · data[].expectedPdd
Seller-stated PDD in secondsminAcdrequiredinteger | null · data[].minAcd
minAsrrequiredstring | null · data[].minAsr
Decimal as a string, e.g. "92.50"visibilityrequiredstring · data[].visibility
One ofpublic,privatestatusrequiredstring · data[].status
One ofactive,paused,suspended,pending_reviewwholesaleCompatiblerequiredboolean · data[].wholesaleCompatible
callcenterCompatiblerequiredboolean · data[].callcenterCompatible
dialerCompatiblerequiredboolean · data[].dialerCompatible
retailCompatiblerequiredboolean · data[].retailCompatible
otpCompatiblerequiredboolean · data[].otpCompatible
notesrequiredstring | null · data[].notes
smsTypestring | null · data[].smsType
One ofa2p,p2p,bothexchangeScorerequiredinteger | null · data[].exchangeScore
Exchange Score 1-100, null until the route has carried real traffic. Uses the measured ASR, NER, ACD and PDD in place of the stated ones when the listing has recent measured figureslastQcAtrequiredstring (date-time) | null · data[].lastQcAt
ISO-8601 timestamp (UTC)measuredobject | null · data[].measured
Measured quality from real calls; null until the listing has enough traffic from enough buyerswindowrequiredstring · data[].measured.window
Evidence window: the last 7 days if enough, else the last 30, elselast= the most recent 30-day stretch that had enoughOne of7d,30d,lastfromrequiredstring · data[].measured.from
First UTC day of the evidence, YYYY-MM-DDtorequiredstring · data[].measured.to
Last UTC day of the evidence, YYYY-MM-DDsessionsrequiredinteger · data[].measured.sessions
Call attempts on this listing the figures are built from (at least 50). For anonymous callers, floored to a band (50, 100, 250, 500, 1000, 5000, ...) withsessionsBanded: truesessionsBandedboolean · data[].measured.sessionsBanded
True whensessionsis a band floor (anonymous callers)buyersrequiredinteger | null · data[].measured.buyers
Distinct buying accounts behind the figures (at least 2). Null for anonymous callersasrrequirednumber | null · data[].measured.asr
Answer-seizure ratio %: answered attempts / attemptsacdrequirednumber | null · data[].measured.acd
Average call duration of answered attempts, seconds of talk timenerrequirednumber | null · data[].measured.ner
Network effectiveness ratio %: attempts the network delivered to the handset (answered, user busy, no answer, callee rejected) / attemptspddMsrequiredinteger | null · data[].measured.pddMs
Median post-dial delay in milliseconds (to the nearest 100 ms); null when not capturedrouteChecksobject | null · data[].routeChecks
Route checks on this listing in the last 7 days. Null when there were none.totalrequiredinteger · data[].routeChecks.total
Route checks in the last 7 days that count towards the listing's health (calls to registered test lines)answeredrequiredinteger · data[].routeChecks.answered
Of those, how many the test line answered through this routelastAtrequiredstring (date-time) | null · data[].routeChecks.lastAt
When the last check completedlastResultrequiredstring | null · data[].routeChecks.lastResult
The last check's verdict: working, no_capacity or not_deliveredcreatedAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data[].updatedAt
ISO-8601 timestamp (UTC)isOwnrequiredboolean · data[].isOwn
True only on your own listingslistingRefstring · data[].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.sellerProfilerequiredobject | null · data[].sellerProfile
Trust signals only. The marketplace never names the seller behind a listing.verifiedrequiredboolean · data[].sellerProfile.verified
Seller identity verifiedsellerScorerequiredinteger | null · data[].sellerProfile.sellerScore
Average Exchange Score across the seller's trafficked routesrateCountrequiredinteger · data[].rateCount
Active per-destination deck rows; > 0 means an A-Z deckpriceTrendobject | null · data[].priceTrend
Real 24h price movement from the price history; null when the route has not repricedchangePctrequirednumber · data[].priceTrend.changePct
pointsrequirednumber[] · data[].priceTrend.points
nextCursorstring | null
hasMoreboolean
totalinteger
Routes matching the filters across all pagesstatsobject
totalrequiredinteger · stats.total
voiceCountrequiredinteger · stats.voiceCount
smsCountrequiredinteger · stats.smsCount
destinationsrequiredinteger · stats.destinations
avgPricenumber | null · stats.avgPrice
Signed-in callers only. Average list price (display figure)avgAsrnumber | null · stats.avgAsr
Signed-in only. Average seller-stated ASR %measuredAsrnumber | null · stats.measuredAsr
Signed-in only. Measured ASR % over 30 days of real callsavgScoreinteger | null · stats.avgScore
Signed-in onlytotalCapacityinteger · stats.totalCapacity
Signed-in only
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 a new route for sale
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 30 requests per minute
Request body (application/json)
typerequiredstring
One ofvoice,smscountryrequiredstring
max 100 charscountryCoderequiredstring
prefixrequiredstring[]
destinationNamerequiredstring
max 255 charspricePerUnitrequiredstring
cliTyperequiredstring
One offull_cli,local_cli,mixed_cli,ncli,partial_clicapacityrequiredinteger
0 to 1000000expectedAsrstring
expectedAcdstring
expectedPddstring
minAsrstring
minAcdinteger
min 0billingIncrementrequiredstring
routeTyperequiredstring
One ofdirect,premium,standard,ncliwholesaleCompatibleboolean
default truecallcenterCompatibleboolean
default truedialerCompatibleboolean
default trueretailCompatibleboolean
default trueotpCompatibleboolean
default trueopenRtpboolean
default falsevisibilitystring
default "public"One ofpublic,privatejingleEnabledboolean
default falsejingleApiUrlstring (uri) | null
smsDeliveryUrlstring (uri) | null
smsDeliveryMethodstring
One ofhttp,smppsmppHoststring | null
smppPortinteger | null
1 to 65535smppSystemIdstring | null
smppPasswordstring | null
max 64 charssmppBindTypestring | null
One oftransceiver,transmittersmppSystemTypestring | null
max 13 charssmppTpsinteger | null
1 to 1000smppSourceToninteger | null
0 to 6smppSourceNpiinteger | null
0 to 18smppDestToninteger | null
0 to 6smppDestNpiinteger | null
0 to 18jingleSipIpstring | null
sipPortinteger | null
1 to 65535sipAuthUsernamestring | null
max 128 charssipAuthPasswordstring | null
max 128 charstechPrefixstring | null
numberFormatobject | null
modestring · numberFormat.mode
One ofcustomnationalPrefixstring · numberFormat.nationalPrefix
stripinteger · numberFormat.strip
0 to 10addstring · numberFormat.add
t38Supportboolean
default falsesupportedCodecsstring[]
maxCallDurationinteger
min 0smsTypestring
One ofa2p,p2p,bothsmsDlrSupportboolean
smsConcatSupportboolean
smsSenderIdTypestring
One ofalphanumeric,numeric,preregisteredsmsContentRestrictionsstring
smsRouteQualitystring | null
One ofhq,direct,aggregator,simsmsSenderIdBehaviorstring | null
One ofalphanumeric_preserved,numeric_long,overwritten,not_guaranteedsmsDlrLevelstring | null
One ofreal_operator,intermediate,submit_only,nonesmsDlrPercentstring | null
smsUnicodeSupportboolean | null
smsAcceptedTrafficstring[] | null
One ofwholesale,transactional,otp,marketing,promo_shortcodetimeOfDayPricingobject
notesstring
max 2000 chars
Response 201
datarequiredobject
A route you listed, as only you (the seller) see it. Passwords are never returned.idrequiredstring (uuid) · data.id
kindrequiredstring · data.kind
One ofsingle,blendtyperequiredstring · data.type
One ofvoice,smscountryrequiredstring · data.country
countryCoderequiredstring · data.countryCode
E.164 country calling code, digits onlyprefixrequiredstring[] · data.prefix
Dial prefixes the route coversdestinationNamerequiredstring · data.destinationName
The listing name. For anyone but the seller it is GENERATED by the platform from its own data, never the seller's text: "<Country> <Operator?> <Mobile|Fixed|All Networks>" for one destination (e.g. "Niger Mobile", "Kenya Safaricom Mobile"), "A-Z Voice · <tier> · <CLI> · Ref XXXX" or "A-Z SMS · <quality> · Ref XXXX" for an A-Z bundle. The seller sees the name they gave it.cliTyperequiredstring · data.cliType
One offull_cli,ncli,partial_cli,local_cli,mixed_clirouteTyperequiredstring · data.routeType
Quality tierOne ofdirect,premium,standard,nclipricePerUnitrequiredmoney · data.pricePerUnit
USD per minute (voice) or per message segment (SMS). On an A-Z deck (rateCount > 0) the per-destination rates apply instead. USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data.billingIncrement
First/subsequent increment in seconds, e.g. "60/60"capacityrequiredinteger · data.capacity
Channels (voice) or messages per second (SMS)expectedAsrrequiredstring | null · data.expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdrequiredstring | null · data.expectedAcd
Seller-stated ACD in secondsexpectedPddrequiredstring | null · data.expectedPdd
Seller-stated PDD in secondsminAcdrequiredinteger | null · data.minAcd
minAsrrequiredstring | null · data.minAsr
Decimal as a string, e.g. "92.50"visibilityrequiredstring · data.visibility
One ofpublic,privatestatusrequiredstring · data.status
One ofactive,paused,suspended,pending_reviewwholesaleCompatiblerequiredboolean · data.wholesaleCompatible
callcenterCompatiblerequiredboolean · data.callcenterCompatible
dialerCompatiblerequiredboolean · data.dialerCompatible
retailCompatiblerequiredboolean · data.retailCompatible
otpCompatiblerequiredboolean · data.otpCompatible
notesrequiredstring | null · data.notes
smsTypestring | null · data.smsType
One ofa2p,p2p,bothexchangeScorerequiredinteger | null · data.exchangeScore
Exchange Score 1-100, null until the route has carried real traffic. Uses the measured ASR, NER, ACD and PDD in place of the stated ones when the listing has recent measured figureslastQcAtrequiredstring (date-time) | null · data.lastQcAt
ISO-8601 timestamp (UTC)measuredobject | null · data.measured
Measured quality from real calls; null until the listing has enough traffic from enough buyersSame fields as MeasuredRouteQuality, shown earlier on this page.routeChecksobject | null · data.routeChecks
Route checks on this listing in the last 7 days. Null when there were none.Same fields as RouteCheckRecord, shown earlier on this page.createdAtrequiredstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data.updatedAt
ISO-8601 timestamp (UTC)sellerIdrequiredstring (uuid) · data.sellerId
Your own account idisOwnerboolean · data.isOwner
One oftrueparentRouteIdrequiredstring (uuid) | null · data.parentRouteId
isBundlerequiredboolean · data.isBundle
jingleSipIprequiredstring | null · data.jingleSipIp
Your SIP endpointsipPortrequiredinteger | null · data.sipPort
techPrefixrequiredstring | null · data.techPrefix
sipAuthUsernamerequiredstring | null · data.sipAuthUsername
sipAuthPasswordSetrequiredboolean · data.sipAuthPasswordSet
A SIP digest password is stored (never returned)smsDeliveryMethodstring | null · data.smsDeliveryMethod
One ofhttp,smppsmsDeliveryUrlrequiredstring | null · data.smsDeliveryUrl
smppHostrequiredstring | null · data.smppHost
smppPortrequiredinteger | null · data.smppPort
smppSystemIdrequiredstring | null · data.smppSystemId
smppPasswordSetrequiredboolean · data.smppPasswordSet
An SMPP password is stored (never returned)endpointReachablerequiredboolean | null · data.endpointReachable
endpointCheckedAtrequiredstring (date-time) | null · data.endpointCheckedAt
ISO-8601 timestamp (UTC)sellerProfileobject | null · data.sellerProfile
Trust signals only. The marketplace never names the seller behind a listing.Same fields as MarketplaceSellerProfile, shown earlier on this page.rateCountinteger · data.rateCount
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 marketplace totals for a filter
GET/
- Access
- Key optional. A key or token personalises the answer.
- Rate limit
- 100 requests per second (the default)
Same filters as the listing. Anonymous callers get counts only; price, ASR, score and capacity figures need a signed-in caller.
Parameters
typequery · string
One of voice, smscountryquery · string
countryCodequery · string
cliTypequery · string
One of full_cli, local_cli, mixed_cli, ncli, partial_clirouteTypequery · string
One of direct, premium, standard, ncliminPricequery · string
maxPricequery · string
minAsrquery · string
minAcdquery · string
maxPddquery · string
minScorequery · integer
minCapacityquery · integer
billingquery · string
One of per_second, per_minutewholesalequery · string
One of true, falsecallcenterquery · string
One of true, falseretailquery · string
One of true, falseotpquery · string
One of true, falseopenRtpquery · string
One of true, falsedialerquery · string
One of true, falsea2pquery · string
One of true, falsebundlesOnlyquery · string
One of true, falsesearchquery · string
sortquery · string
One of price_asc, price_desc, asr_desc, asr_asc, acd_desc, acd_asc, pdd_asc, pdd_desc, capacity_desc, created_desc, country_asc, score_desc, score_asc, measured_asr_desc, measured_asr_asc, measured_acd_desc, measured_acd_asc, ner_desc, ner_asc, quality_desccursorquery · string (uuid)
limitquery · integer
Default 25
Response 200
datarequiredobject
Same fields as MarketplaceStats, 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Price a phone number across the marketplace
GET/
- Access
- Key optional. A key or token personalises the answer.
- Rate limit
- 30 requests per minute
Every buyer-visible route that serves the number, at the rate it would actually charge for it, cheapest first. A route with a rate sheet is priced by its longest matching active prefix (if that row is blocked the route does not serve the number); a single-price route serves it when a listed prefix, or failing that its country code, starts the number. This is the public list price: negotiated prices and private grants are not applied. SMS prices are by destination network on routes that price a country per mobile network: network says which network rate is for and countryRate is the price for other or unknown networks. The network is determined from the number's range (ported numbers may be priced at the network the range belongs to). The number is normalised to digits (a leading 00 is dropped). At most 100 routes are returned; total counts all of them. An embargoed destination returns no routes and notice: "sanctioned". Seller identities are never included.
Parameters
numberrequiredquery · string
A full number or dial code, any formattingtypequery · string
One of voice, smsDefault "voice"
Response 200
datarequiredobject
numberrequiredstring · data.number
The number as priced: digits onlytyperequiredstring · data.type
One ofvoice,smsunitrequiredstring · data.unit
Whatrateis per: a minute (voice) or a message (SMS)One ofmin,msgtotalrequiredinteger · data.total
Routes that serve the number, before the 100-row caproutesrequiredobject[] · data.routes
Cheapest firstidrequiredstring (uuid) · data.routes[].id
typerequiredstring · data.routes[].type
One ofvoice,smsnamerequiredstring · data.routes[].name
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.listingRefstring · data.routes[].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.countryrequiredstring · data.routes[].country
countryCoderequiredstring · data.routes[].countryCode
E.164 country calling code, digits onlymatchedPrefixrequiredstring · data.routes[].matchedPrefix
The dial prefix the number matched on this route (the longest one, on a deck)destinationrequiredstring · data.routes[].destination
The destination that prefix belongs to, e.g. "United Kingdom-Mobile"; the country for a flat-priced listingraterequiredmoney · data.routes[].rate
What this route charges for THIS number: USD per minute (voice) or per message (SMS) USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data.routes[].billingIncrement
e.g. "60/60" or "1/1"; null when the listing does not state onepricedByrequiredstring · data.routes[].pricedBy
deck = priced by the matching rate-sheet row; flat = the listing's single priceOne ofdeck,flatexpectedAsrrequiredstring | null · data.routes[].expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdrequiredstring | null · data.routes[].expectedAcd
Seller-stated ACD in secondscliTyperequiredstring · data.routes[].cliType
routeTyperequiredstring · data.routes[].routeType
Quality tiercapacityrequiredinteger · data.routes[].capacity
Channels (voice) or messages per second (SMS)exchangeScorerequiredinteger | null · data.routes[].exchangeScore
Exchange Score 1-100; null ("New") until the route has carried trafficmeasuredrequiredobject | null · data.routes[].measured
Measured quality of the listing from real calls; null until it has enough traffic from enough buyersSame fields as MeasuredRouteQuality, shown earlier on this page.routeChecksrequiredobject | null · data.routes[].routeChecks
Route checks on this listing in the last 7 days. Null when there were none.Same fields as RouteCheckRecord, shown earlier on this page.isOwnrequiredboolean · data.routes[].isOwn
True only on your own listing (signed-in callers), so you are not offered your own routenetworkobject | null · data.routes[].network
SMS routes that price the country per mobile network: which networkrateis for. Absent otherwisemccMncrequiredstring | null · data.routes[].network.mccMnc
Mobile network code (MCC-MNC)rateis for, e.g. "234-10"; null when unknownoperatorrequiredstring | null · data.routes[].network.operator
Network name from public number-range data, e.g. "O2"sourcerequiredstring · data.routes[].network.source
range = number-range data; none = not determinedOne ofrange,hlr,nonerateBasisrequiredstring · data.routes[].network.rateBasis
network = that network's own rate; all_operators = the route's rate for networks it does not list separately; country = the price for other or unknown networksOne ofnetwork,all_operators,countrycountryRatemoney | null · data.routes[].countryRate
SMS routes that price per network: the price for other or unknown networks USD as a decimal string with exactly 6 places, e.g. "0.012500".noticerequiredstring | null · data.notice
Why the list is empty when it is empty for a reason other than "no route covers it"One ofsanctioned
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 on the marketplace
GET/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
Every country with at least one live public route, with its route count, A to Z.
Response 200
datarequiredobject[]
countryrequiredstring · data[].country
countryCoderequiredstring · data[].countryCode
countrequiredinteger · data[].count
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 a route
GET/
- Access
- Key optional. A key or token personalises the answer.
- Rate limit
- 100 requests per second (the default)
Public for live public routes. The seller gets the full owner view; a granted buyer sees a private route; any other signed-in caller gets an access stub for a private route. Carries measured (quality measured from real calls, or null) and routeChecks (the last 7 days of route checks, or null).
Parameters
idrequiredpath · string
Response 200
datarequiredobject
idstring (uuid) · data.id
kindstring · data.kind
One ofsingle,blendtypestring · data.type
One ofvoice,smscountrystring · data.country
countryCodestring · data.countryCode
prefixstring[] · data.prefix
Dial prefixes the route coversdestinationNamestring · data.destinationName
The listing name. For anyone but the seller it is GENERATED by the platform from its own data, never the seller's text: "<Country> <Operator?> <Mobile|Fixed|All Networks>" for one destination (e.g. "Niger Mobile", "Kenya Safaricom Mobile"), "A-Z Voice · <tier> · <CLI> · Ref XXXX" or "A-Z SMS · <quality> · Ref XXXX" for an A-Z bundle. The seller sees the name they gave it.cliTypestring · data.cliType
One offull_cli,ncli,partial_cli,local_cli,mixed_clirouteTypestring · data.routeType
Quality tierOne ofdirect,premium,standard,nclipricePerUnitmoney · data.pricePerUnit
USD per minute (voice) or per message segment (SMS). On an A-Z deck (rateCount > 0) the per-destination rates apply instead. USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementstring | null · data.billingIncrement
First/subsequent increment in seconds, e.g. "60/60"capacityinteger · data.capacity
Channels (voice) or messages per second (SMS)expectedAsrstring | null · data.expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdstring | null · data.expectedAcd
Seller-stated ACD in secondsexpectedPddstring | null · data.expectedPdd
Seller-stated PDD in secondsminAcdinteger | null · data.minAcd
minAsrstring | null · data.minAsr
Decimal as a string, e.g. "92.50"visibilitystring · data.visibility
One ofprivatestatusstring · data.status
One ofactive,paused,suspended,pending_reviewwholesaleCompatibleboolean · data.wholesaleCompatible
callcenterCompatibleboolean · data.callcenterCompatible
dialerCompatibleboolean · data.dialerCompatible
retailCompatibleboolean · data.retailCompatible
otpCompatibleboolean · data.otpCompatible
notesstring | null · data.notes
smsTypestring | null · data.smsType
One ofa2p,p2p,bothexchangeScoreinteger | null · data.exchangeScore
Exchange Score 1-100, null until the route has carried real traffic. Uses the measured ASR, NER, ACD and PDD in place of the stated ones when the listing has recent measured figureslastQcAtstring (date-time) | null · data.lastQcAt
ISO-8601 timestamp (UTC)measuredobject | null · data.measured
Measured quality from real calls; null until the listing has enough traffic from enough buyersSame fields as MeasuredRouteQuality, shown earlier on this page.routeChecksobject | null · data.routeChecks
Route checks on this listing in the last 7 days. Null when there were none.Same fields as RouteCheckRecord, shown earlier on this page.createdAtstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)updatedAtstring (date-time) · data.updatedAt
ISO-8601 timestamp (UTC)isOwnboolean · data.isOwn
True only on your own listingslistingRefstring · data.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.sellerProfileobject | null · data.sellerProfile
Trust signals only. The marketplace never names the seller behind a listing.Same fields as MarketplaceSellerProfile, shown earlier on this page.rateCountinteger · data.rateCount
priceTrendobject | null · data.priceTrend
Real 24h price movement from the price history; null when the route has not repricedchangePctrequirednumber · data.priceTrend.changePct
pointsrequirednumber[] · data.priceTrend.points
sellerIdstring (uuid) · data.sellerId
Your own account idisOwnerboolean · data.isOwner
One oftrueparentRouteIdstring (uuid) | null · data.parentRouteId
isBundleboolean · data.isBundle
jingleSipIpstring | null · data.jingleSipIp
Your SIP endpointsipPortinteger | null · data.sipPort
techPrefixstring | null · data.techPrefix
sipAuthUsernamestring | null · data.sipAuthUsername
sipAuthPasswordSetboolean · data.sipAuthPasswordSet
A SIP digest password is stored (never returned)smsDeliveryMethodstring | null · data.smsDeliveryMethod
One ofhttp,smppsmsDeliveryUrlstring | null · data.smsDeliveryUrl
smppHoststring | null · data.smppHost
smppPortinteger | null · data.smppPort
smppSystemIdstring | null · data.smppSystemId
smppPasswordSetboolean · data.smppPasswordSet
An SMPP password is stored (never returned)endpointReachableboolean | null · data.endpointReachable
endpointCheckedAtstring (date-time) | null · data.endpointCheckedAt
ISO-8601 timestamp (UTC)accessRequiredboolean · data.accessRequired
One oftrueaccessRequestPendingboolean · data.accessRequestPending
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.
Update a route you listed
PUT/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
The price of an ACTIVE route cannot change in place (400 VALIDATION_ERROR): schedule the change with POST /routes/{id}/rate-changes/flat, or pause the route first. On a paused route a price increase pauses buyers who pay the list rate until they accept it (see POST /purchases/{id}/accept-rate).
Parameters
idrequiredpath · string
Request body (application/json)
typestring
One ofvoice,smscountrystring
max 100 charscountryCodestring
prefixstring[]
destinationNamestring
max 255 charspricePerUnitstring
cliTypestring
One offull_cli,local_cli,mixed_cli,ncli,partial_clicapacityinteger
0 to 1000000expectedAsrstring
expectedAcdstring
expectedPddstring
minAsrstring
minAcdinteger
min 0billingIncrementstring
routeTypestring
One ofdirect,premium,standard,ncliwholesaleCompatibleboolean
default truecallcenterCompatibleboolean
default truedialerCompatibleboolean
default trueretailCompatibleboolean
default trueotpCompatibleboolean
default trueopenRtpboolean
default falsevisibilitystring
default "public"One ofpublic,privatejingleEnabledboolean
default falsejingleApiUrlstring (uri) | null
smsDeliveryUrlstring (uri) | null
smsDeliveryMethodstring
One ofhttp,smppsmppHoststring | null
smppPortinteger | null
1 to 65535smppSystemIdstring | null
smppPasswordstring | null
max 64 charssmppBindTypestring | null
One oftransceiver,transmittersmppSystemTypestring | null
max 13 charssmppTpsinteger | null
1 to 1000smppSourceToninteger | null
0 to 6smppSourceNpiinteger | null
0 to 18smppDestToninteger | null
0 to 6smppDestNpiinteger | null
0 to 18jingleSipIpstring | null
sipPortinteger | null
1 to 65535sipAuthUsernamestring | null
max 128 charssipAuthPasswordstring | null
max 128 charstechPrefixstring | null
numberFormatobject | null
modestring · numberFormat.mode
One ofcustomnationalPrefixstring · numberFormat.nationalPrefix
stripinteger · numberFormat.strip
0 to 10addstring · numberFormat.add
t38Supportboolean
default falsesupportedCodecsstring[]
maxCallDurationinteger
min 0smsTypestring
One ofa2p,p2p,bothsmsDlrSupportboolean
smsConcatSupportboolean
smsSenderIdTypestring
One ofalphanumeric,numeric,preregisteredsmsContentRestrictionsstring
smsRouteQualitystring | null
One ofhq,direct,aggregator,simsmsSenderIdBehaviorstring | null
One ofalphanumeric_preserved,numeric_long,overwritten,not_guaranteedsmsDlrLevelstring | null
One ofreal_operator,intermediate,submit_only,nonesmsDlrPercentstring | null
smsUnicodeSupportboolean | null
smsAcceptedTrafficstring[] | null
One ofwholesale,transactional,otp,marketing,promo_shortcodetimeOfDayPricingobject
notesstring
max 2000 charsstatusstring
One ofactive,paused
Response 200
datarequiredobject
A route you listed, as only you (the seller) see it. Passwords are never returned.Same fields as OwnRoute, 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.
Delete a route you listed
DELETE/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Restorable for restoreWindowDays via POST /routes/{id}/restore.
Parameters
idrequiredpath · string
Response 200
datarequiredobject
messagerequiredstring · data.message
restorablerequiredboolean · data.restorable
One oftruerestoreWindowDaysrequiredinteger · data.restoreWindowDays
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.
Draft a listing from a rate sheet
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 10 requests per minute
Upload a CSV or Excel sheet (multipart field file, optional note). Returns a proposed listing and the questions a sheet cannot answer. Writes nothing.
Request body (multipart/form-data)
filerequiredstring
CSV or Excel rate sheet (binary)notestring
max 500 chars
Response 200
datarequiredobject
A proposed listing form plus open questions
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.
Test an endpoint before listing a route
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 20 requests per minute
Sends a real SIP probe (voice), SMPP bind (SMS over SMPP) or URL check (SMS over HTTP) to the details you enter. Nothing is stored.
Request body (application/json)
typerequiredstring
One ofvoice,smsjingleSipIpstring | null
max 255 charssipPortinteger | null
1 to 65535techPrefixstring | null
max 24 charssmsDeliveryUrlstring | null
max 2048 charssmsDeliveryMethodstring | null
One ofhttp,smppsmppHoststring | null
max 255 charssmppPortinteger | null
1 to 65535smppSystemIdstring | null
Short account code your SMS supplier issued (max 16 chars). An email address is rejected.max 16 charssmppPasswordstring | null
Used for one bind attempt, never storedmax 64 charssmppBindTypestring | null
One oftransceiver,transmittersmppSystemTypestring | null
max 13 chars
Response 200
datarequiredobject
passrequiredboolean · data.pass
True when the endpoint answered from every one of our media addressesbarredboolean · data.barred
Reachable but refusing our callsdegradedboolean · data.degraded
Refusing some of our source addresseschecksrequiredobject[] · data.checks
labelrequiredstring · data.checks[].label
valuerequiredstring · data.checks[].value
okrequiredboolean · data.checks[].ok
egressAddressesrequiredstring · data.egressAddresses
The addresses our traffic comes from; whitelist thesegatewayIprequiredstring · data.gatewayIp
Deprecated alias of egressAddressesdiagnosticsobject · data.diagnostics
messagerequiredstring · data.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. - 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 your call-centre routes and their call screening
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject[]
routeIdrequiredstring (uuid) · data[].routeId
namerequiredstring · data[].name
countryrequiredstring · data[].country
enabledrequiredboolean · data[].enabled
consentAtrequiredstring (date-time) | null · data[].consentAt
ISO-8601 timestamp (UTC)statusrequiredstring · data[].status
One ofactive,paused,suspended,pending_review
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.
Get call screening settings, stats and flagged calls
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
Screening config, statistics and the flagged calls
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.
Turn call screening on or off for a route
PATCH/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Only for call-centre voice routes. Turning it on records your recording consent.
Parameters
idrequiredpath · string
Request body (application/json)
enabledrequiredboolean
Response 200
datarequiredobject
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.
Classify a sample transcript with call screening
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 20 requests per minute
Parameters
idrequiredpath · string
Request body (application/json)
transcriptrequiredstring
max 20000 chars
Response 200
datarequiredobject
The classification the transcript would receive
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 your saved listing presets
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject
presetsrequiredobject[] · data.presets
namerequiredstring · data.presets[].name
valuesrequiredobject · data.presets[].values
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.
Save a listing preset
PUT/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Upserts by name; keeps your 12 most recent presets.
Request body (application/json)
namerequiredstring
max 60 charsvaluesrequiredobject
Response 200
datarequiredobject
presetsrequiredobject[] · data.presets
namerequiredstring · data.presets[].name
valuesrequiredobject · data.presets[].values
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.
Delete a listing preset
DELETE/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Parameters
namerequiredpath · string
Response 200
datarequiredobject
presetsrequiredobject[] · data.presets
namerequiredstring · data.presets[].name
valuesrequiredobject · data.presets[].values
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.
Preview the listings publishing a deck will create
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
Per-country listings that publishing would produce
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.
List your recently deleted routes
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject
routesrequiredobject[] · data.routes
idstring (uuid) · data.routes[].id
kindstring · data.routes[].kind
One ofsingle,blendtypestring · data.routes[].type
One ofvoice,smscountrystring · data.routes[].country
countryCodestring · data.routes[].countryCode
E.164 country calling code, digits onlyprefixstring[] · data.routes[].prefix
Dial prefixes the route coversdestinationNamestring · data.routes[].destinationName
The listing name. For anyone but the seller it is GENERATED by the platform from its own data, never the seller's text: "<Country> <Operator?> <Mobile|Fixed|All Networks>" for one destination (e.g. "Niger Mobile", "Kenya Safaricom Mobile"), "A-Z Voice · <tier> · <CLI> · Ref XXXX" or "A-Z SMS · <quality> · Ref XXXX" for an A-Z bundle. The seller sees the name they gave it.cliTypestring · data.routes[].cliType
One offull_cli,ncli,partial_cli,local_cli,mixed_clirouteTypestring · data.routes[].routeType
Quality tierOne ofdirect,premium,standard,nclipricePerUnitmoney · data.routes[].pricePerUnit
USD per minute (voice) or per message segment (SMS). On an A-Z deck (rateCount > 0) the per-destination rates apply instead. USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementstring | null · data.routes[].billingIncrement
First/subsequent increment in seconds, e.g. "60/60"capacityinteger · data.routes[].capacity
Channels (voice) or messages per second (SMS)expectedAsrstring | null · data.routes[].expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdstring | null · data.routes[].expectedAcd
Seller-stated ACD in secondsexpectedPddstring | null · data.routes[].expectedPdd
Seller-stated PDD in secondsminAcdinteger | null · data.routes[].minAcd
minAsrstring | null · data.routes[].minAsr
Decimal as a string, e.g. "92.50"visibilitystring · data.routes[].visibility
One ofpublic,privatestatusstring · data.routes[].status
One ofactive,paused,suspended,pending_reviewwholesaleCompatibleboolean · data.routes[].wholesaleCompatible
callcenterCompatibleboolean · data.routes[].callcenterCompatible
dialerCompatibleboolean · data.routes[].dialerCompatible
retailCompatibleboolean · data.routes[].retailCompatible
otpCompatibleboolean · data.routes[].otpCompatible
notesstring | null · data.routes[].notes
smsTypestring | null · data.routes[].smsType
One ofa2p,p2p,bothexchangeScoreinteger | null · data.routes[].exchangeScore
Exchange Score 1-100, null until the route has carried real traffic. Uses the measured ASR, NER, ACD and PDD in place of the stated ones when the listing has recent measured figureslastQcAtstring (date-time) | null · data.routes[].lastQcAt
ISO-8601 timestamp (UTC)measuredobject | null · data.routes[].measured
Measured quality from real calls; null until the listing has enough traffic from enough buyersSame fields as MeasuredRouteQuality, shown earlier on this page.routeChecksobject | null · data.routes[].routeChecks
Route checks on this listing in the last 7 days. Null when there were none.Same fields as RouteCheckRecord, shown earlier on this page.createdAtstring (date-time) · data.routes[].createdAt
ISO-8601 timestamp (UTC)updatedAtstring (date-time) · data.routes[].updatedAt
ISO-8601 timestamp (UTC)sellerIdstring (uuid) · data.routes[].sellerId
Your own account idisOwnerboolean · data.routes[].isOwner
One oftrueparentRouteIdstring (uuid) | null · data.routes[].parentRouteId
isBundleboolean · data.routes[].isBundle
jingleSipIpstring | null · data.routes[].jingleSipIp
Your SIP endpointsipPortinteger | null · data.routes[].sipPort
techPrefixstring | null · data.routes[].techPrefix
sipAuthUsernamestring | null · data.routes[].sipAuthUsername
sipAuthPasswordSetboolean · data.routes[].sipAuthPasswordSet
A SIP digest password is stored (never returned)smsDeliveryMethodstring | null · data.routes[].smsDeliveryMethod
One ofhttp,smppsmsDeliveryUrlstring | null · data.routes[].smsDeliveryUrl
smppHoststring | null · data.routes[].smppHost
smppPortinteger | null · data.routes[].smppPort
smppSystemIdstring | null · data.routes[].smppSystemId
smppPasswordSetboolean · data.routes[].smppPasswordSet
An SMPP password is stored (never returned)endpointReachableboolean | null · data.routes[].endpointReachable
endpointCheckedAtstring (date-time) | null · data.routes[].endpointCheckedAt
ISO-8601 timestamp (UTC)sellerProfileobject | null · data.routes[].sellerProfile
Trust signals only. The marketplace never names the seller behind a listing.Same fields as MarketplaceSellerProfile, shown earlier on this page.rateCountinteger · data.routes[].rateCount
restoreWindowDaysrequiredinteger · data.restoreWindowDays
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.
Restore a deleted route
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
The route comes back paused and private; publish it again when ready.
Parameters
idrequiredpath · string
Response 200
datarequiredobject
messagerequiredstring · data.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. - 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 your saved SIP endpoints
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject[]
idstring (uuid) | null · data[].id
iprequiredstring · data[].ip
labelstring | null · data[].label
routeCountinteger · data[].routeCount
How many of your routes use this IPusedBystring | null · data[].usedBy
Name of the newest route using this IP
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.
Save a SIP endpoint
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Request body (application/json)
iprequiredstring
labelstring | null
max 60 chars
Response 200
datarequiredobject
idstring (uuid) | null · data.id
iprequiredstring · data.ip
labelstring | null · data.label
routeCountinteger · data.routeCount
How many of your routes use this IPusedBystring | null · data.usedBy
Name of the newest route using this IP
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.
Label a saved SIP endpoint
PATCH/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 60 requests per minute
Sets the label shown next to the IP in "My IPs" and in the SIP endpoint pickers, so a seller with several switches can tell them apart. The label is trimmed, control and bidirectional-override characters are removed, and it is cut to 60 characters; an empty string or null clears it. Only saved endpoints (those with an id in GET /routes/my-endpoints) can be labelled; an unknown id, or someone else's, answers 404.
Parameters
idrequiredpath · string (uuid)
Request body (application/json)
labelrequiredstring | null
The new label; "" or null clears itmax 60 chars
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
iprequiredstring · data.ip
labelrequiredstring | null · data.label
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.
Remove a saved SIP endpoint
DELETE/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
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.
Preview which route would carry a destination
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Resolves as your account (including private routes you bought). price is a 6-decimal USD string.
Parameters
torequiredquery · string
Destination number or prefixtypequery · string
One of voice, smsDefault "voice"strategyquery · string
One of cheapest, best_quality, balancedDefault "balanced"
Response 200
datarequiredobject
strategyrequiredstring · data.strategy
One ofcheapest,best_quality,balancedselectedrequiredobject | null · data.selected
idrequiredstring (uuid) · data.selected.id
destinationNamerequiredstring · data.selected.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.selected.country
countryCoderequiredstring · data.selected.countryCode
typerequiredstring · data.selected.type
One ofvoice,smscliTyperequiredstring | null · data.selected.cliType
pricerequiredmoney · data.selected.price
Rate for this destination: USD per minute or message, 6-decimal string USD as a decimal string with exactly 6 places, e.g. "0.012500".asrrequirednumber | null · data.selected.asr
acdrequirednumber | null · data.selected.acd
matchedPrefixrequiredstring | null · data.selected.matchedPrefix
alternativesrequiredobject[] · data.alternatives
Same fields as ResolvedRoute, shown earlier on this page.countrequiredinteger · data.count
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.
Test connectivity to your route endpoint
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 100 requests per second (the default)
- Real traffic
- Places a real test call over the route.
Sends a real SIP probe to the route endpoint from every one of our media addresses.
Parameters
idrequiredpath · string
Response 200
datarequiredobject
Same fields as ConnectivityTestResult, 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.
Capture a SIP trace of a test call on a route
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 10 requests per minute
- Real traffic
- Places a real test call over the route.
For the seller or an active buyer. Optionally dials a real number. Buyers receive the trace with seller addresses masked.
Parameters
idrequiredpath · string
Request body (application/json)
numberstring
Response 200
datarequiredobject
The SIP ladder: messages, timings and the final response
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 route's price history
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
For the seller and buyers of the route. Newest first.
Parameters
idrequiredpath · string
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
routeIdrequiredstring (uuid) · data[].routeId
oldPricerequiredmoney | null · data[].oldPrice
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".newPricerequiredmoney · data[].newPrice
USD as a decimal string with exactly 6 places, e.g. "0.012500".changedAtrequiredstring (date-time) · data[].changedAt
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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get traffic and revenue stats for your route
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
activePurchasesrequiredinteger · data.activePurchases
volumerequiredobject · data.volume
Keyed 24h, 7d, 30d. revenue is USD (display figure, 2 decimals)measuredAsrrequirednumber | null · data.measuredAsr
measuredAcdrequirednumber | null · data.measuredAcd
recentOffersrequiredobject[] · data.recentOffers
idrequiredstring (uuid) · data.recentOffers[].id
proposedPricerequiredmoney · data.recentOffers[].proposedPrice
USD as a decimal string with exactly 6 places, e.g. "0.012500".agreedPricerequiredmoney | null · data.recentOffers[].agreedPrice
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".statusrequiredstring · data.recentOffers[].status
lastActorrequiredstring · data.recentOffers[].lastActor
createdAtrequiredstring (date-time) · data.recentOffers[].createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data.recentOffers[].updatedAt
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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List the routes you sell
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Two modes. Cursor mode (only cursor, limit, includeChildren): newest first, A-Z deck children hidden unless includeChildren=true. Paged mode (any of offset, search, type, status, visibility, live, hiddenReason, scope, endpoint, deck, sort, dir): up to 200 rows a page, with total, and each row carries origin (its endpoint, your label for it, and the deck and rate sheet it came from). scope=listings lists every row a buyer could see as a listing (single routes and deck children); hiddenReason lists exactly the routes counted under that reason by GET /routes/my/listing-health. search matches the route name, country, endpoint IP or host, your IP label, the deck name and a route id prefix; a number such as +44 is a dial code (country code or coverage prefix). endpoint and deck take a group key from GET /routes/my/groups.
Parameters
cursorquery · string (uuid)
limitquery · integer
Cursor mode: default 25, max 100. Paged mode: default 50, max 200.includeChildrenquery · string
Include the per-country children of A-Z decksOne of true, false, 1, 0searchquery · string
typequery · string
One of voice, smsstatusquery · string
One of active, paused, pending_review, suspendedvisibilityquery · string
One of public, privatelivequery · boolean | string
hiddenReasonquery · string
One of sms_no_delivery, voice_no_endpointscopequery · string
One of listings, decksendpointquery · string
deckquery · string (uuid) | string
offsetquery · integer
sortquery · string
One of created, name, country, type, price, statusdirquery · string
One of asc, desc
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
kindrequiredstring · data[].kind
One ofsingle,blendtyperequiredstring · data[].type
One ofvoice,smscountryrequiredstring · data[].country
countryCoderequiredstring · data[].countryCode
E.164 country calling code, digits onlyprefixrequiredstring[] · data[].prefix
Dial prefixes the route coversdestinationNamerequiredstring · data[].destinationName
The listing name. For anyone but the seller it is GENERATED by the platform from its own data, never the seller's text: "<Country> <Operator?> <Mobile|Fixed|All Networks>" for one destination (e.g. "Niger Mobile", "Kenya Safaricom Mobile"), "A-Z Voice · <tier> · <CLI> · Ref XXXX" or "A-Z SMS · <quality> · Ref XXXX" for an A-Z bundle. The seller sees the name they gave it.cliTyperequiredstring · data[].cliType
One offull_cli,ncli,partial_cli,local_cli,mixed_clirouteTyperequiredstring · data[].routeType
Quality tierOne ofdirect,premium,standard,nclipricePerUnitrequiredmoney · data[].pricePerUnit
USD per minute (voice) or per message segment (SMS). On an A-Z deck (rateCount > 0) the per-destination rates apply instead. USD as a decimal string with exactly 6 places, e.g. "0.012500".billingIncrementrequiredstring | null · data[].billingIncrement
First/subsequent increment in seconds, e.g. "60/60"capacityrequiredinteger · data[].capacity
Channels (voice) or messages per second (SMS)expectedAsrrequiredstring | null · data[].expectedAsr
Seller-stated ASR %. The measured figure is inmeasured.asrexpectedAcdrequiredstring | null · data[].expectedAcd
Seller-stated ACD in secondsexpectedPddrequiredstring | null · data[].expectedPdd
Seller-stated PDD in secondsminAcdrequiredinteger | null · data[].minAcd
minAsrrequiredstring | null · data[].minAsr
Decimal as a string, e.g. "92.50"visibilityrequiredstring · data[].visibility
One ofpublic,privatestatusrequiredstring · data[].status
One ofactive,paused,suspended,pending_reviewwholesaleCompatiblerequiredboolean · data[].wholesaleCompatible
callcenterCompatiblerequiredboolean · data[].callcenterCompatible
dialerCompatiblerequiredboolean · data[].dialerCompatible
retailCompatiblerequiredboolean · data[].retailCompatible
otpCompatiblerequiredboolean · data[].otpCompatible
notesrequiredstring | null · data[].notes
smsTypestring | null · data[].smsType
One ofa2p,p2p,bothexchangeScorerequiredinteger | null · data[].exchangeScore
Exchange Score 1-100, null until the route has carried real traffic. Uses the measured ASR, NER, ACD and PDD in place of the stated ones when the listing has recent measured figureslastQcAtrequiredstring (date-time) | null · data[].lastQcAt
ISO-8601 timestamp (UTC)measuredobject | null · data[].measured
Measured quality from real calls; null until the listing has enough traffic from enough buyersSame fields as MeasuredRouteQuality, shown earlier on this page.routeChecksobject | null · data[].routeChecks
Route checks on this listing in the last 7 days. Null when there were none.Same fields as RouteCheckRecord, shown earlier on this page.createdAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data[].updatedAt
ISO-8601 timestamp (UTC)sellerIdrequiredstring (uuid) · data[].sellerId
Your own account idisOwnerboolean · data[].isOwner
One oftrueparentRouteIdrequiredstring (uuid) | null · data[].parentRouteId
isBundlerequiredboolean · data[].isBundle
jingleSipIprequiredstring | null · data[].jingleSipIp
Your SIP endpointsipPortrequiredinteger | null · data[].sipPort
techPrefixrequiredstring | null · data[].techPrefix
sipAuthUsernamerequiredstring | null · data[].sipAuthUsername
sipAuthPasswordSetrequiredboolean · data[].sipAuthPasswordSet
A SIP digest password is stored (never returned)smsDeliveryMethodstring | null · data[].smsDeliveryMethod
One ofhttp,smppsmsDeliveryUrlrequiredstring | null · data[].smsDeliveryUrl
smppHostrequiredstring | null · data[].smppHost
smppPortrequiredinteger | null · data[].smppPort
smppSystemIdrequiredstring | null · data[].smppSystemId
smppPasswordSetrequiredboolean · data[].smppPasswordSet
An SMPP password is stored (never returned)endpointReachablerequiredboolean | null · data[].endpointReachable
endpointCheckedAtrequiredstring (date-time) | null · data[].endpointCheckedAt
ISO-8601 timestamp (UTC)sellerProfileobject | null · data[].sellerProfile
Trust signals only. The marketplace never names the seller behind a listing.Same fields as MarketplaceSellerProfile, shown earlier on this page.rateCountinteger · data[].rateCount
revenue30drequirednumber · data[].revenue30d
USD seller credit over 30 days (display figure, 2 decimals)liveChannelsrequiredinteger · data[].liveChannels
childCountrequiredinteger · data[].childCount
Per-country child listings created from this deckoriginobject · data[].origin
Paged mode only: where the route terminates and where it came fromendpointKeyrequiredstring · data[].origin.endpointKey
The endpoint group key: the host, "~none" (no endpoint) or "~blend". Pass it as ?endpoint= to list every route on itkindrequiredstring · data[].origin.kind
sip = voice SIP endpoint, smpp = SMSC bind, http = delivery URL, blend = terminates via its members, none = no endpoint yetOne ofsip,smpp,http,blend,nonehostrequiredstring | null · data[].origin.host
The SIP IP, the SMSC host, or the delivery URL's hostportrequiredinteger | null · data[].origin.port
SIP port (default 5060) or SMPP port (default 2775)systemIdrequiredstring | null · data[].origin.systemId
SMPP only: the System ID bound withlabelrequiredstring | null · data[].origin.label
Your own label for this IP (see GET /routes/my-endpoints), voice onlydeckIdrequiredstring (uuid) | null · data[].origin.deckId
The A-Z deck this route was split out of, when it wasdeckNamerequiredstring | null · data[].origin.deckName
sheetNamerequiredstring | null · data[].origin.sheetName
File name of the latest applied rate sheet behind the deck (or behind the route itself)nextCursorrequiredstring | null
Cursor mode only; always null in paged modehasMorerequiredboolean
totalinteger
Paged mode only: rows matching the filters across all pagesoffsetinteger
Paged mode onlylimitinteger
Paged mode only (max 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Count your SMS routes hidden for lack of an endpoint
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject
countrequiredinteger · data.count
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 one delivery endpoint on all your endpoint-less SMS routes
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 6 requests per minute
An SMPP method runs a real bind first; if it fails nothing changes and error.details carries the reason and the addresses to whitelist.
Request body (application/json)
methodrequiredstring
One ofhttp,smppsmsDeliveryUrlstring
smppHoststring
smppPortinteger
smppSystemIdstring
smppPasswordstring
smppBindTypestring
One oftransceiver,transmittersmppSystemTypestring
routeIdsstring (uuid)[]
Narrow to these routes; never widens the set
Response 200
datarequiredobject
updatedrequiredinteger · data.updated
methodrequiredstring · data.method
One ofhttp,smppbindstring · data.bind
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.
Count your listed routes that are live, and why the rest are hidden
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Answers "why does my route count differ from the marketplace?". listed counts your active, public routes (A-Z deck parents excluded); live counts the ones buyers can see, using the marketplace's own filters, so the two numbers cannot disagree with the board. Each reason carries a count, a label and the fix. The routes behind sms_no_delivery and voice_no_endpoint can be listed with GET /routes/my/list?hiddenReason=<key> and fixed in one call with POST /routes/my/bulk-sms-delivery or /routes/my/bulk-sip-endpoint.
Response 200
datarequiredobject
listedrequiredinteger · data.listed
Your routes that are active, public and not an A-Z deck parent: what you have put on saleliverequiredinteger · data.live
How many of those buyers can actually see on the marketplace (counted with the marketplace's own filters)hiddenrequiredinteger · data.hidden
listed - livereasonsrequiredobject[] · data.reasons
Why the hidden routes are hidden, in the order to fix them. Only reasons with a non-zero count are present.keyrequiredstring · data.reasons[].key
sms_no_delivery and voice_no_endpoint can be listed with GET /routes/my/list?hiddenReason=<key> and fixed in bulk; restricted = a destination the exchange does not carryOne ofsms_no_delivery,voice_no_endpoint,restrictedcountrequiredinteger · data.reasons[].count
labelrequiredstring · data.reasons[].label
The reason in plain wordsfixrequiredstring · data.reasons[].fix
What to do about it
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 one SMS delivery method on many of your SMS routes
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 10 requests per minute
Applies one delivery method (SMPP or HTTP) to a selection of your SMS routes: an explicit routeIds list, or every route matching filter (at most 5,000). Only your own live routes are touched; each route that is not eligible is returned in skipped with a reason. Send dryRun: true first to see how many would change: nothing is probed or written. On a real run the endpoint is checked ONCE for the whole batch: SMPP gets a real bind (no message is sent) and HTTP gets a URL check. If the bind is refused NO route is changed and the call answers 400 VALIDATION_ERROR with error.details = { kind: "smpp_bind_failed", host, port, systemId, bindType, reason, whitelistIps, failoverIps }: whitelistIps is the one SMS source address your SMSC must allow (every bind and message leaves from it); failoverIps are used only while that address is down, so allowing them is optional. A field that fails validation answers 400 with one { path, message } per field. All routes change in one transaction.
Request body (application/json)
routeIdsstring (uuid)[]
An explicit selection of your route ids (max 5000). Send this OR filter, not both.filterobject
"Every route matching this filter", re-derived on the server with the same rules as GET /routes/my/list (scope defaults to listings). Refused when it matches more than 5,000 routes.searchstring · filter.search
max 100 charstypestring · filter.type
One ofvoice,smsstatusstring · filter.status
One ofactive,paused,pending_review,suspendedvisibilitystring · filter.visibility
One ofpublic,privateliveboolean | string · filter.live
hiddenReasonstring · filter.hiddenReason
One ofsms_no_delivery,voice_no_endpointscopestring · filter.scope
One oflistings,decksendpointstring · filter.endpoint
max 255 charsdeckstring (uuid) | string · filter.deck
dryRunboolean
Count and classify only: nothing is probed or written, and the answer carries wouldUpdatedeliveryrequiredobject
The SMS delivery method to set, validated exactly as PUT /routes/{id} validates it. It must be complete: smsDeliveryMethod "smpp" needs smppHost and smppSystemId; "http" needs smsDeliveryUrl. A blank smppPassword keeps each route's stored one; null clears it.smsDeliveryMethodstring · delivery.smsDeliveryMethod
One ofhttp,smppsmsDeliveryUrlstring (uri) | null · delivery.smsDeliveryUrl
smppHoststring | null · delivery.smppHost
smppPortinteger | null · delivery.smppPort
1 to 65535smppSystemIdstring | null · delivery.smppSystemId
smppPasswordstring | null · delivery.smppPassword
max 64 charssmppBindTypestring | null · delivery.smppBindType
One oftransceiver,transmittersmppSystemTypestring | null · delivery.smppSystemType
max 13 chars
Response 200
datarequiredobject
updatedrequiredinteger · data.updated
Routes changed. Always 0 on a dry run.wouldUpdateinteger · data.wouldUpdate
Dry run (or nothing eligible): how many routes the call would changeskippedrequiredobject[] · data.skipped
Routes left untouched, each with the reasonidrequiredstring (uuid) · data.skipped[].id
reasonrequiredstring · data.skipped[].reason
not_found: not one of your live routes. not_sms / not_voice: wrong route type for this action. deck_parent: set it on the deck's own Edit page. blend: a blend has no endpoint of its own. duplicate_listing (SIP only): another of your routes already lists this country and prefixes on that IP and tech prefix.One ofnot_found,not_sms,not_voice,deck_parent,blend,duplicate_listingcheckobject · data.check
The one endpoint check run for the whole batch (an SMPP bind, a URL check or a SIP probe). pass is false only when confirmUnreachable applied a SIP endpoint anyway.passrequiredboolean · data.check.pass
messagerequiredstring · data.check.message
dryRunboolean · data.dryRun
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.
Set one SIP endpoint on many of your voice routes
POST/
- Access
- API key. Scoped keys need
routes:write. - Rate limit
- 10 requests per minute
Applies one SIP endpoint (IP or host, port, technical prefix and optional digest credentials) to a selection of your voice routes: an explicit routeIds list, or every route matching filter (at most 5,000). Only your own live routes are touched; routes that are not eligible, or that would duplicate another of your listings on the same IP and tech prefix (same country and prefixes), are returned in skipped. Send dryRun: true first to see how many would change. An invalid, private or reserved address, or one of our own addresses, is refused outright (400, on jingleSipIp). Otherwise one SIP probe is sent to the endpoint; if it gets no answer the call answers 400 VALIDATION_ERROR with error.details = { kind: "sip_probe_failed", message, checks } and nothing changes. Repeat with confirmUnreachable: true to apply anyway (a single-route edit never probes, so bulk is never stricter). The IP is also added to your saved endpoints. All routes change in one transaction.
Request body (application/json)
routeIdsstring (uuid)[]
An explicit selection of your route ids (max 5000). Send this OR filter, not both.filterobject
"Every route matching this filter", re-derived on the server with the same rules as GET /routes/my/list (scope defaults to listings). Refused when it matches more than 5,000 routes.searchstring · filter.search
max 100 charstypestring · filter.type
One ofvoice,smsstatusstring · filter.status
One ofactive,paused,pending_review,suspendedvisibilitystring · filter.visibility
One ofpublic,privateliveboolean | string · filter.live
hiddenReasonstring · filter.hiddenReason
One ofsms_no_delivery,voice_no_endpointscopestring · filter.scope
One oflistings,decksendpointstring · filter.endpoint
max 255 charsdeckstring (uuid) | string · filter.deck
dryRunboolean
Count and classify only: nothing is probed or written, and the answer carries wouldUpdatedeliveryrequiredobject
The SIP endpoint to set, validated exactly as PUT /routes/{id} validates it. jingleSipIp is required. A blank sipAuthPassword keeps each route's stored one; null clears it.jingleSipIpstring | null · delivery.jingleSipIp
sipPortinteger | null · delivery.sipPort
1 to 65535techPrefixstring | null · delivery.techPrefix
sipAuthUsernamestring | null · delivery.sipAuthUsername
max 128 charssipAuthPasswordstring | null · delivery.sipAuthPassword
max 128 charsconfirmUnreachableboolean
Apply even though the SIP probe got no answer (the first attempt is refused with the probe's diagnosis in error.details)
Response 200
datarequiredobject
Same fields as BulkEndpointResult, 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. - 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.
Group the routes you sell by endpoint or by A-Z deck
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Your routes matching the same filters as GET /routes/my/list (paged mode), grouped by by=endpoint (the SIP IP, SMSC host or delivery URL host, with your label for the IP) or by=deck (the A-Z deck a route was split out of, with the rate sheet behind it). Each group has total, live and hidden counts. List a group's routes with GET /routes/my/list?endpoint=<key> or ?deck=<key>; the bulk actions accept the same keys in filter. Only your own routes are counted.
Parameters
searchquery · string
typequery · string
One of voice, smsstatusquery · string
One of active, paused, pending_review, suspendedvisibilityquery · string
One of public, privatelivequery · boolean | string
hiddenReasonquery · string
One of sms_no_delivery, voice_no_endpointscopequery · string
One of listings, decksendpointquery · string
deckquery · string (uuid) | string
byrequiredquery · string
One of endpoint, deck
Response 200
datarequiredobject
byrequiredstring · data.by
One ofendpoint,deckgroupsrequiredobject[] · data.groups
Largest group first, at most 500keyrequiredstring · data.groups[].key
Pass back as ?endpoint= (by=endpoint) or ?deck= (by=deck) on GET /routes/my/list to page this group's routes. Sentinels: "~none", "~blend", "~single"kindrequiredstring · data.groups[].kind
by=endpoint: how routes on this host are handed over (mixed when a host serves more than one kind). by=deck: deck, or single for routes listed on their ownOne ofsip,smpp,http,mixed,blend,none,deck,singlehostrequiredstring | null · data.groups[].host
labelrequiredstring | null · data.groups[].label
Your label for this IPportrequiredinteger | null · data.groups[].port
The port when every route in the group uses the same onesystemIdrequiredstring | null · data.groups[].systemId
SMPP: the System ID when every route in the group uses the same onedeckIdrequiredstring (uuid) | null · data.groups[].deckId
deckNamerequiredstring | null · data.groups[].deckName
sheetNamerequiredstring | null · data.groups[].sheetName
File name of the deck's latest applied rate sheettotalrequiredinteger · data.groups[].total
liverequiredinteger · data.groups[].live
Visible to buyers, by the marketplace's own filtershiddenrequiredinteger · data.groups[].hidden
total - livetotalrequiredinteger · data.total
Routes across the returned groupstruncatedrequiredboolean · data.truncated
More than 500 groups matched; narrow the filter
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.
Check whether your switches are refusing our calls
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
One entry per SIP endpoint (IP or host) used by your active voice routes. refusing is true when we have evidence your switch is turning our calls away: calls we sent it in the last 6 hours answered with SIP 401, 403 or 407 (at least 3 of them, and at least half of the calls that got an answer), or our own test call to it was barred or refused from some of our addresses (partial, with the refused addresses in refusedIps when known). evidence is that finding in one sentence, routeId is a route on the endpoint you can test from, and since is when the current incident was first seen. allow lists the addresses to allow on your switch: every one of egressIps, for SIP on sipPort (UDP and TCP) and RTP media on the UDP rtpPortRange, the same values GET /sip/network-info publishes. Only your own endpoints and your own calls are counted.
Response 200
datarequiredobject
endpointsrequiredobject[] · data.endpoints
endpointKeyrequiredstring · data.endpoints[].endpointKey
hostrequiredstring · data.endpoints[].host
endpointrequiredstring · data.endpoints[].endpoint
kindrequiredstring · data.endpoints[].kind
One ofvoicerouteCountrequiredinteger · data.endpoints[].routeCount
routeIdrequiredstring (uuid) · data.endpoints[].routeId
refusingrequiredboolean · data.endpoints[].refusing
partialrequiredboolean · data.endpoints[].partial
refusedIpsrequiredstring[] · data.endpoints[].refusedIps
evidencerequiredstring | null · data.endpoints[].evidence
sourcerequiredstring | null · data.endpoints[].source
One oftraffic,probesincerequiredstring (date-time) | null · data.endpoints[].since
ISO-8601 timestamp (UTC)allowrequiredobject · data.allow
egressIpsrequiredstring[] · data.allow.egressIps
sipPortrequiredinteger · data.allow.sipPort
rtpPortRangerequiredstring · data.allow.rtpPortRange
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 the buyers of your route
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Owner only: anyone other than the route's seller gets 403 FORBIDDEN. One row per buyer, identified only by a pseudonym scoped to this route (the same "Buyer #3F2A" that appears on offers for the route), so it cannot be matched to an account or across your other routes. No account id, name, company, email, IP or dialled number is returned. Figures cover the last 30 days; for an A-Z deck they include its per-country listings. status is the buyer's current relationship (ended = cancelled; ended buyers with no traffic in the window are left out). asr30d and calls30d are voice only, counted per call attempt group, and null until a call has been measured. Sorted by revenue.
Parameters
idrequiredpath · string (uuid)
Response 200
datarequiredobject
windowDaysrequiredinteger · data.windowDays
unitrequiredstring · data.unit
One ofminutes,messagesbuyersrequiredobject[] · data.buyers
buyerrequiredstring · data.buyers[].buyer
Pseudonym, stable per routestatusrequiredstring · data.buyers[].status
One ofactive,paused,pending_review,endedvolume30drequirednumber · data.buyers[].volume30d
revenue30drequirednumber · data.buyers[].revenue30d
USD (display figure, 2 decimals)asr30drequirednumber | null · data.buyers[].asr30d
calls30drequiredinteger | null · data.buyers[].calls30d
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.
Show the billing increments your rate sheet sets
GET/
- Access
- API key. Scoped keys need
routes:read. - Rate limit
- 100 requests per second (the default)
Owner only: anyone other than the route's seller gets 403 FORBIDDEN. Groups the route's active rate rows by billing increment (e.g. 1/1 on some destinations, 60/60 on others). Rows with a null increment inherit fallback, the route-level increment.
Parameters
idrequiredpath · string (uuid)
Response 200
datarequiredobject
mixrequiredobject[] · data.mix
incrementrequiredstring | null · data.mix[].increment
e.g. "60/60"; null = the row uses the route fallbackdestinationsrequiredinteger · data.mix[].destinations
Active rate rows with this incrementfallbackrequiredstring | null · data.fallback
The route-level billing increment
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.
Read a rate sheet into a draft listing (no account needed)
POST/
- Access
- Public. No key needed.
- Rate limit
- 6 requests per minute
Multipart upload (field file, optional note). Returns the proposed listing and parsed rates; stores nothing.
Request body (multipart/form-data)
filerequiredstring
CSV or Excel rate sheet (binary)notestring
max 500 chars
Response 200
datarequiredobject
Proposed listing, parsed rates andtruncated
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 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.
Save a draft listing to claim after sign-up
POST/
- Access
- Public. No key needed.
- Rate limit
- 10 requests per 10 minutes
Returns a token; the listing is created only when a signed-in account claims it.
Request body (application/json)
payloadany
ratesobject[]
destinationNamestring · rates[].destinationName
operatorstring | null · rates[].operator
prefixrequiredstring · rates[].prefix
ratePerUnitrequiredstring · rates[].ratePerUnit
billingIncrementstring | null · rates[].billingIncrement
minDurationnumber | null · rates[].minDuration
sourceFilenamestring
max 512 charscontactEmailstring (email)
max 255 charscontactCompanystring
max 255 chars
Response 200
datarequiredobject
tokenrequiredstring · data.token
expiresAtrequiredstring (date-time) · data.expiresAt
ISO-8601 timestamp (UTC)rateCountrequiredinteger · data.rateCount
destinationNamerequiredstring · data.destinationName
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 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.
Look at a saved draft listing
GET/
- Access
- Public. No key needed.
- Rate limit
- 30 requests per minute
Parameters
tokenrequiredpath · string
Response 200
datarequiredobject
alreadyClaimedrequiredboolean · data.alreadyClaimed
routeIdstring (uuid) | null · data.routeId
destinationNamestring · data.destinationName
typestring · data.type
One ofvoice,smscountrystring · data.country
rateCountinteger · data.rateCount
sourceFilenamestring | null · data.sourceFilename
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.
Create a route from a saved draft listing
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 20 requests per minute
Idempotent per token: claiming twice returns the route already created.
Parameters
tokenrequiredpath · string
Response 200
datarequiredobject
routeIdrequiredstring (uuid) | null · data.routeId
rateCountrequiredinteger · data.rateCount
alreadyClaimedrequiredboolean · data.alreadyClaimed
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.