Create a Quote
Submits a single-sided quote (a bid or an offer) in response to an RFQ. To quote both sides, submit two quotes with distinct client_quote_ids. The response identifies both RFQ participants with pseudonymous participant IDs.
POST
/quotesAuthorization
UDX-Access-KeyAPI key · headerrequiredOpaque API key ID.
UDX-Access-TimestampAPI key · headerrequiredUnix time in milliseconds, within 30 seconds of server time.
UDX-Access-SignatureAPI key · headerrequiredStandard-base64 RSA-PSS/SHA-256 signature with a 32-byte salt. Sign `timestamp + METHOD + path`; for requests with a body, append `hex(SHA256(body))`; append `UDX-Idempotency-Key` when it is present.
or
AuthorizationBearer token (JWT) · headerrequiredBearer token for an active signed-in UDX user.
Header parameters
UDX-VersionstringDated API version (YYYY-MM-DD). Omit to use the oldest supported version. An unknown version returns `400`.
max length 10
UDX-Idempotency-KeystringOptional client-generated key that makes a mutation safe to retry. Reuse it only for a byte-identical retry. When present, it is included in the request signature; omitting it disables UDX idempotency for that request.
min length 1 · max length 255
Request body
requiredapplication/jsonrfq_idobjectrequiredThe RFQ this quote responds to.
Show propertiesHide properties
objecttickerobjectOptional — the RFQ's market is authoritative. Omit it for a combo RFQ, whose synthetic (multi-leg) market is not separately addressable by ticker. When supplied it must equal the RFQ's market, or the quote is rejected.
Show propertiesHide properties
objectclient_quote_idClientIdrequiredA client-supplied correlation identifier: 1–40 URL-safe ASCII characters (letters, digits, hyphen, period, underscore, tilde), unique per resource within the caller's account — reusing one is rejected even after the original resource closes. Distinct from the exchange-assigned public id and from the idempotency key.
min length 1 · max length 40 · matches ^[A-Za-z0-9._~-]+$
sideobjectrequiredThe side of the quote — `buy` bids, `sell` offers.
Show propertiesHide properties
objectpriceobjectrequiredQuote price in YES price space, in dollars.
Show propertiesHide properties
objectquantityobjectrequiredNumber of contracts offered.
Show propertiesHide properties
objectaccount_idobjectAccount to quote from, by its UDX-assigned public entity identifier. Required for an unrestricted API key; an account-restricted key uses its bound account, and an account_id that names a different account is rejected.
Show propertiesHide properties
objectResponses
201The created quote.
quoteQuoterequiredA single-sided quote (a bid or an offer) on the exchange.
Show propertiesHide properties
quote_idobjectrequiredThe exchange-assigned identifier for this quote. Unique across the exchange, unlike client_quote_id, which is unique only within an account.
Show propertiesHide properties
objectclient_quote_idobjectrequiredThe caller's correlation id for this quote.
Show propertiesHide properties
objectquoter_idobjectThe pseudonymous participant identifier of the user who submitted this quote. Stable across that user's quotes; on your own quotes it equals your `rfq_participant_id` from `GET /users/me`.
Show propertiesHide properties
objectrequester_idobjectThe pseudonymous participant identifier of the user who raised the RFQ this quote responds to. Stable across that user's RFQs; it matches the RFQ's `requester_id`.
Show propertiesHide properties
objectrfq_idobjectrequiredThe RFQ this quote responds to.
Show propertiesHide properties
objecttickerTickerrequiredA market identifier (ticker) — a human-meaningful natural-key symbol, not a UUID. Unique per market.
min length 1 · max length 128
sideobjectrequiredThe side of the quote — `buy` bids, `sell` offers.
Show propertiesHide properties
objectpriceobjectrequiredQuote price in YES price space, in dollars.
Show propertiesHide properties
objectquantityobjectrequiredNumber of contracts offered.
Show propertiesHide properties
objectstatusQuoteStatusrequiredA quote's status: `open` (live), `accepted` (a taker accepted it), `confirmed` (the maker confirmed it after acceptance), `executed` (the trade completed), `cancelled` (pulled/expired), or `rejected`.
Allowed:
openacceptedconfirmedexecutedcancelledrejectedcreated_atstring<date-time>When the Quote was created. UDX timestamps use RFC 3339; requests require an explicit UTC offset and zero to six fractional digits; responses use UTC with exactly six fractional digits.
max length 40
400The request doesn't conform to this spec.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
401No valid credential was provided.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
403The credential lacks the `trade` scope.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
409This key is still in use or its response cannot be replayed. The mutation may have run; check `detail` before retrying.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
422This key belongs to a different request.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
429The Member's request rate is exhausted. Wait for `Retry-After`.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
500Something went wrong on UDX's side.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
503Request admission is unavailable. Retry later.
typestring<uri-reference>A stable URI identifying the error's general category. Usually absent (equivalent to "about:blank" per the RFC); documented rate controls use closed URN values so callers can distinguish same-status retry causes without parsing localized prose.
max length 2048
titlestringrequiredA localized, human-readable summary of the error category. Stable for a given status code and resolved language — clients must not use it as a machine-readable discriminator.
max length 40
statusintegerrequiredThe HTTP status code, repeated from the response itself.
detailstringA localized, human-readable explanation specific to this occurrence. Clients must not parse it for machine-readable information.
max length 500
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
max length 100
Request
curl -X POST "https://{hostname}/quotes" \
-H "UDX-Access-Key: API_KEY_ID" \
-H "UDX-Access-Timestamp: UNIX_MILLISECONDS" \
-H "UDX-Access-Signature: BASE64_SIGNATURE" \
-H "Content-Type: application/json" \
-d '{
"rfq_id": "BKA2QM3T4055",
"ticker": "UDX-EXAMPLE-MARKET",
"client_quote_id": "quote-20260804-001",
"side": "sell",
"price": "0.56",
"quantity": "100"
}'const response = await fetch("https://{hostname}/quotes", {
method: "POST",
headers: {
"UDX-Access-Key": "API_KEY_ID",
"UDX-Access-Timestamp": "UNIX_MILLISECONDS",
"UDX-Access-Signature": "BASE64_SIGNATURE",
"Content-Type": "application/json"
},
body: JSON.stringify({
"rfq_id": "BKA2QM3T4055",
"ticker": "UDX-EXAMPLE-MARKET",
"client_quote_id": "quote-20260804-001",
"side": "sell",
"price": "0.56",
"quantity": "100"
})
});import requests
response = requests.post(
"https://{hostname}/quotes",
headers={
"UDX-Access-Key": "API_KEY_ID",
"UDX-Access-Timestamp": "UNIX_MILLISECONDS",
"UDX-Access-Signature": "BASE64_SIGNATURE",
"Content-Type": "application/json"
},
json={
"rfq_id": "BKA2QM3T4055",
"ticker": "UDX-EXAMPLE-MARKET",
"client_quote_id": "quote-20260804-001",
"side": "sell",
"price": "0.56",
"quantity": "100"
},
)Response
{
"quote": {
"quote_id": "BKQ7V2M9T081",
"client_quote_id": "quote-20260804-001",
"requester_id": "4d127cce3bc675c9",
"quoter_id": "9a51f00d21be44c7",
"rfq_id": "BKA2QM3T4055",
"ticker": "UDX-EXAMPLE-MARKET",
"side": "sell",
"price": "0.56",
"quantity": "100",
"status": "open",
"created_at": "2026-01-01T00:00:00.000000Z"
}
}{
"title": "Bad Request",
"status": 400,
"detail": "request did not pass validation",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"title": "Unauthorized",
"status": 401,
"detail": "invalid authentication credentials",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"title": "Forbidden",
"status": 403,
"detail": "insufficient permissions",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"title": "Conflict",
"status": 409,
"detail": "a request with this UDX-Idempotency-Key is already in progress",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"title": "Unprocessable Entity",
"status": 422,
"detail": "UDX-Idempotency-Key was already used for a different request",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:member-rate-limit-exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "this member has temporarily exceeded its request rate",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"title": "Internal Server Error",
"status": 500,
"detail": "internal error",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:request-admission-unavailable",
"title": "Service Unavailable",
"status": 503,
"detail": "request admission is temporarily unavailable",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}