API reference
Offers
Propose, counter and accept prices on marketplace routes.
BrowseOffers
List offers you made and received
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
rolequery · string
Default allOne of buyer, seller, allstatusquery · string
One of pending, countered, accepted, rejected, withdrawn, expired
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
routeIdrequiredstring (uuid) · data[].routeId
groupIdrequiredstring (uuid) | null · data[].groupId
Set when the offer is part of a bulk (multi-route) offerlistPricerequiredmoney | null · data[].listPrice
The route list price when the offer was made USD as a decimal string with exactly 6 places, e.g. "0.012500".proposedPricerequiredmoney · data[].proposedPrice
The latest price on the table USD as a decimal string with exactly 6 places, e.g. "0.012500".agreedPricerequiredmoney | null · data[].agreedPrice
Set once accepted USD as a decimal string with exactly 6 places, e.g. "0.012500".statusrequiredstring · data[].status
One ofpending,countered,accepted,rejected,withdrawn,expiredlastActorrequiredstring · data[].lastActor
One ofbuyer,sellermessagerequiredstring | null · data[].message
Cleaned of contact detailsexpiresAtrequiredstring (date-time) | null · data[].expiresAt
ISO-8601 timestamp (UTC)createdAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data[].updatedAt
ISO-8601 timestamp (UTC)rolerequiredstring · data[].role
Your side of this offerOne ofbuyer,selleryourTurnrequiredboolean · data[].yourTurn
counterpartyrequiredstring · data[].counterparty
Pseudonym for the other side, stable per routerouterequiredobject | null · data[].route
idrequiredstring (uuid) · data[].route.id
destinationNamerequiredstring · data[].route.destinationName
The seller reads the name they gave the route; the buyer reads the platform-generated name (see MarketplaceRoute.destinationName)listingRefstring · data[].route.listingRef
Anonymous short reference of the listing (4 characters, e.g. "7K2Q"): stable for the life of the listing, unique enough to tell two same-named listings apart, and derived from the listing alone (it says nothing about the seller). Absent on your own listings.countryrequiredstring · data[].route.country
countryCoderequiredstring · data[].route.countryCode
typerequiredstring · data[].route.type
One ofvoice,smsrouteTyperequiredstring · data[].route.routeType
pricePerUnitrequiredmoney · data[].route.pricePerUnit
USD as a decimal string with exactly 6 places, e.g. "0.012500".
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.
Make an offer on a route
POST/
- Access
- API key. Scoped keys need
offers:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Makes or answers a binding offer on a route.
Opens a negotiation at proposedPrice (6-decimal USD string). The seller can accept, reject or counter.
Parameters
X-Idempotency-Keyheader · string
Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice.
Request body (application/json)
routeIdrequiredstring (uuid)
proposedPricerequiredstring
messagestring
max 500 chars
Response 200
datarequiredobject
Same fields as Offer, 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.
Make offers on several routes at once
POST/
- Access
- API key. Scoped keys need
offers:write. - Rate limit
- 100 requests per second (the default)
One offer per item, grouped. Routes that cannot take an offer (your own, inactive, already negotiating) are skipped and reported back.
Request body (application/json)
itemsrequiredobject[]
routeIdrequiredstring (uuid) · items[].routeId
proposedPricerequiredstring · items[].proposedPrice
messagestring
max 500 chars
Response 200
datarequiredobject
grouprequiredobject · data.group
idrequiredstring (uuid) · data.group.id
messagerequiredstring | null · data.group.message
statusrequiredstring · data.group.status
createdAtrequiredstring (date-time) · data.group.createdAt
ISO-8601 timestamp (UTC)offersrequiredobject[] · data.offers
Same fields as Offer, shown earlier on this page.skippedrequiredobject[] · data.skipped
routeIdrequiredstring (uuid) · data.skipped[].routeId
reasonrequiredstring · data.skipped[].reason
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 bulk offers
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
messagerequiredstring | null · data[].message
statusrequiredstring · data[].status
createdAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)offersrequiredobject[] · data[].offers
Same fields as Offer, shown earlier on this page.totalrequiredinteger · data[].total
countsrequiredobject · data[].counts
Child offers per status
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.
Accept or reject every open offer in a bulk offer
POST/
- Access
- API key. Scoped keys need
offers:write. - Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Request body (application/json)
actionrequiredstring
One ofaccept,rejectmessagestring
max 500 chars
Response 200
datarequiredobject
groupIdrequiredstring (uuid) · data.groupId
appliedrequiredinteger · data.applied
resultsrequiredobject[] · data.results
okrequiredboolean · data.results[].ok
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 an offer with its negotiation history
GET/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
idrequiredstring (uuid) · data.id
routeIdrequiredstring (uuid) · data.routeId
groupIdrequiredstring (uuid) | null · data.groupId
Set when the offer is part of a bulk (multi-route) offerlistPricerequiredmoney | null · data.listPrice
The route list price when the offer was made USD as a decimal string with exactly 6 places, e.g. "0.012500".proposedPricerequiredmoney · data.proposedPrice
The latest price on the table USD as a decimal string with exactly 6 places, e.g. "0.012500".agreedPricerequiredmoney | null · data.agreedPrice
Set once accepted USD as a decimal string with exactly 6 places, e.g. "0.012500".statusrequiredstring · data.status
One ofpending,countered,accepted,rejected,withdrawn,expiredlastActorrequiredstring · data.lastActor
One ofbuyer,sellermessagerequiredstring | null · data.message
Cleaned of contact detailsexpiresAtrequiredstring (date-time) | null · data.expiresAt
ISO-8601 timestamp (UTC)createdAtrequiredstring (date-time) · data.createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data.updatedAt
ISO-8601 timestamp (UTC)rolerequiredstring · data.role
Your side of this offerOne ofbuyer,selleryourTurnrequiredboolean · data.yourTurn
counterpartyrequiredstring · data.counterparty
Pseudonym for the other side, stable per routerouterequiredobject | null · data.route
idrequiredstring (uuid) · data.route.id
destinationNamerequiredstring · data.route.destinationName
The seller reads the name they gave the route; the buyer reads the platform-generated name (see MarketplaceRoute.destinationName)listingRefstring · data.route.listingRef
Anonymous short reference of the listing (4 characters, e.g. "7K2Q"): stable for the life of the listing, unique enough to tell two same-named listings apart, and derived from the listing alone (it says nothing about the seller). Absent on your own listings.countryrequiredstring · data.route.country
countryCoderequiredstring · data.route.countryCode
typerequiredstring · data.route.type
One ofvoice,smsrouteTyperequiredstring · data.route.routeType
pricePerUnitrequiredmoney · data.route.pricePerUnit
USD as a decimal string with exactly 6 places, e.g. "0.012500".eventsrequiredobject[] · data.events
The negotiation timeline, oldest firstidrequiredstring (uuid) · data.events[].id
offerIdrequiredstring (uuid) · data.events[].offerId
actorrequiredstring · data.events[].actor
actionrequiredstring · data.events[].action
pricerequiredmoney | null · data.events[].price
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".messagerequiredstring | null · data.events[].message
createdAtrequiredstring (date-time) · data.events[].createdAt
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.
Accept, reject, counter or withdraw an offer
PATCH/
- Access
- API key. Scoped keys need
offers:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Makes or answers a binding offer on a route.
price is required for counter. Accepting creates or reprices the purchase at the agreed price.
Parameters
idrequiredpath · string
X-Idempotency-Keyheader · string
Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice.
Request body (application/json)
actionrequiredstring
One ofcounter,accept,reject,withdrawpricestring
messagestring
max 500 chars
Response 200
datarequiredobject
Same fields as Offer, 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.