Create an RFQ
Creates a request for quote, soliciting pricing from market makers for one or more legs. Omit side for a two-sided quote.
POST
/rfqsAuthorization
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/jsonclient_rfq_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._~-]+$
tickerobjectMarket to request a quote for (single market, or an existing combo by its ticker). Provide exactly one of ticker or legs.
Show propertiesHide properties
objectlegsRfqLeg[]Component legs of the RFQ. A single leg is one market; multiple legs request the combined strategy. Provide exactly one of ticker or legs.
min items 1 · max items 100
Show propertiesHide properties
Array of
RfqLegtickerTickerrequiredA market identifier (ticker) — a human-meaningful natural-key symbol, not a UUID. Unique per market.
min length 1 · max length 128
opposing_sidebooleanWhether this leg takes the side opposite the RFQ (true) or the same side (false, the default).
default: false
quantityobjectNumber of contracts to quote, as a whole number. Provide exactly one of quantity or cash_quantity.
Show propertiesHide properties
objectcash_quantityobjectSize of the RFQ in dollars. Provide exactly one of quantity or cash_quantity.
Show propertiesHide properties
objectsideobjectThe side the customer wants to execute. Omit for a two-sided quote.
Show propertiesHide properties
objectaccount_idobjectAccount to create the RFQ under, 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 RFQ.
rfqRfqrequiredA request for quote (RFQ) on the exchange.
Show propertiesHide properties
rfq_idobjectrequiredExchange-assigned RFQ identifier.
Show propertiesHide properties
objectrequester_idobjectThe pseudonymous participant identifier of the user who raised this RFQ. Stable across that user's RFQs so makers can correlate repeat requesters; on your own RFQs it equals your `rfq_participant_id` from `GET /users/me`.
Show propertiesHide properties
objectclient_rfq_idobjectThe requester's correlation id for this RFQ. Present only on RFQs raised by the caller's member; it is the requester's private correlation id on RFQs soliciting the caller.
Show propertiesHide properties
objectlegsRfqLeg[]requiredThe component legs of the RFQ.
min items 1 · max items 100
Show propertiesHide properties
Array of
RfqLegtickerTickerrequiredA market identifier (ticker) — a human-meaningful natural-key symbol, not a UUID. Unique per market.
min length 1 · max length 128
opposing_sidebooleanWhether this leg takes the side opposite the RFQ (true) or the same side (false, the default).
default: false
sideobjectThe side the customer wants to execute. Absent for a two-sided RFQ.
Show propertiesHide properties
objectquantityobjectNumber of contracts requested. Present when sized in contracts.
Show propertiesHide properties
objectcash_quantityobjectSize of the RFQ in dollars. Present when sized in cash.
Show propertiesHide properties
objectstatusRfqStatusrequiredAn RFQ's status. `open` is still soliciting quotes; `rejected` was rejected by the exchange; `closed` is otherwise terminal (the RFQ was accepted, expired, canceled, or otherwise concluded without a trade).
Allowed:
openclosedrejectedcreated_atstring<date-time>When the RFQ 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
expires_atstring<date-time>When the RFQ stops soliciting quotes. A quote must be submitted, accepted, and confirmed within this deadline. UDX timestamps use RFC 3339; 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}/rfqs" \
-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 '{
"client_rfq_id": "rfq-20260804-001",
"ticker": "UDX-EXAMPLE-MARKET",
"quantity": "100",
"side": "buy"
}'const response = await fetch("https://{hostname}/rfqs", {
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({
"client_rfq_id": "rfq-20260804-001",
"ticker": "UDX-EXAMPLE-MARKET",
"quantity": "100",
"side": "buy"
})
});import requests
response = requests.post(
"https://{hostname}/rfqs",
headers={
"UDX-Access-Key": "API_KEY_ID",
"UDX-Access-Timestamp": "UNIX_MILLISECONDS",
"UDX-Access-Signature": "BASE64_SIGNATURE",
"Content-Type": "application/json"
},
json={
"client_rfq_id": "rfq-20260804-001",
"ticker": "UDX-EXAMPLE-MARKET",
"quantity": "100",
"side": "buy"
},
)Response
{
"rfq": {
"rfq_id": "BKA2QM3T4055",
"client_rfq_id": "rfq-20260804-001",
"legs": [
{
"ticker": "UDX-EXAMPLE-MARKET",
"opposing_side": false
}
],
"side": "buy",
"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"
}