List RFQ Stats by Series
Returns, per series, how your member answered the RFQs it was asked to quote over a window of up to 30 days, with the time a quote last arrived and when the current run of unanswered RFQs began. Sorted by unanswered RFQs, most first, then series. A multi-leg RFQ counts once under each of its leg series. An RFQ counts when it was routed to your member or your member quoted it, and only your member’s quotes count as answers. Available to members that quote.
/rfq-stats/seriesAuthorization
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.
AuthorizationBearer token (JWT) · headerrequiredBearer token for an active signed-in UDX user.
Header parameters
UDX-VersionstringDated API version (YYYY-MM-DD).
fromstring<date-time>Inclusive start of the UTC window. Defaults to 24 hours before the window end.
tostring<date-time>Exclusive end of the UTC window. Defaults to the time of the request. The window may span at most 30 days.
sidestringOnly RFQs of this side.
buysell200Your member's quoting figures per series.
windowRfqStatsWindowrequiredThe half-open UTC window the figures cover.
Show propertiesHide properties
fromstring<date-time>requiredInclusive start.
tostring<date-time>requiredExclusive end.
seriesRfqStatsSeriesRow[]requiredSeries, most unanswered RFQs first, then by series name.
Show propertiesHide properties
RfqStatsSeriesRowseriesstringrequiredSeries, the ticker text before the first underscore or hyphen.
figuresRfqStatsFiguresrequiredCounts of RFQs your member was asked to quote, or quoted, over a window. answered_pct is quoted over submitted. Cash figures cover sell RFQs, which ask to cash out a position for a dollar amount rather than a number of contracts.
Show propertiesHide properties
submittedinteger<int64>requiredRFQs routed to your member, or quoted by it, in the window.
quotedinteger<int64>requiredOf those, RFQs your member quoted.
unquotedinteger<int64>requiredOf those, RFQs your member did not quote.
answered_pctnumber<double>requiredquoted as a percentage of submitted; 0 when nothing was routed.
acceptedinteger<int64>requiredRFQs on which your member's quote traded.
accept_requestedinteger<int64>requiredRFQs on which the requester lifted your member's quote.
accept_failedinteger<int64>requiredLifted, but no trade completed.
liveinteger<int64>requiredRFQs whose event had already started when submitted.
unquoted_liveinteger<int64>requiredLive RFQs your member did not quote.
sell_cash_usdstringrequiredDollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.
sell_cash_unquoted_usdstringrequiredDollars requested by sell RFQs your member did not quote, truncated to the cent.
latencyRfqStatsLatencyrequiredquote is RFQ submission to your member's first quote; accept is the requester lifting your quote to the trade completing. The requester's own time between them is not included in either.
Show propertiesHide properties
quoteRfqStatsQuantilesrequiredLatency percentiles in milliseconds. Between 1 ms and 60 s each is the upper edge of a histogram bucket, never below the true value and at most about 32% above it; below 1 ms it reads 1, at or above 60 s it reads 60000. Null when no sample exists.
Show propertiesHide properties
countinteger<int64>requiredSamples behind the percentiles.
p50_msinteger<int64> | nullrequiredMedian.
p90_msinteger<int64> | nullrequired90th percentile.
p99_msinteger<int64> | nullrequired99th percentile.
acceptRfqStatsQuantilesrequiredLatency percentiles in milliseconds. Between 1 ms and 60 s each is the upper edge of a histogram bucket, never below the true value and at most about 32% above it; below 1 ms it reads 1, at or above 60 s it reads 60000. Null when no sample exists.
Show propertiesHide properties
countinteger<int64>requiredSamples behind the percentiles.
p50_msinteger<int64> | nullrequiredMedian.
p90_msinteger<int64> | nullrequired90th percentile.
p99_msinteger<int64> | nullrequired99th percentile.
last_quoted_atstring<date-time> | nullrequiredStart of the newest five-minute bucket in which your member quoted; null when it never did.
first_unquoted_atstring<date-time> | nullrequiredStart of the oldest bucket with an RFQ your member did not quote; null when it quoted every one.
last_unquoted_atstring<date-time> | nullrequiredStart of the newest bucket with an RFQ your member did not quote.
onset_atstring<date-time> | nullrequiredStart of the current run of unanswered RFQs: the oldest unquoted bucket after the last one your member quoted. Equals first_unquoted_at when nothing was quoted; null when the newest activity was quoted.
coverageRfqStatsCoveragerequiredWhether the exchange's RFQ history covers the whole window. A gap means the history may be incomplete for part of the window, so figures there may understate activity; a quiet window is never silently reported as "no RFQs".
Show propertiesHide properties
completebooleanrequiredTrue when no gap overlaps the window.
gapsobject[]requiredGaps overlapping the window, oldest first; the earliest are kept when the cap is reached.
Show propertiesHide properties
objectstarted_atstring<date-time>requiredWhen the gap began.
ended_atstring<date-time> | nullrequiredWhen it ended; null while it is still open.
400The request doesn't conform to this spec.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
401No valid credential was provided.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
403The credential lacks the read scope.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
429The member rate limit was exceeded.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
500Something went wrong on UDX's side.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
503Request admission or account setup is unavailable, or the read could not be completed in time; retry.
typestring<uri-reference>requiredA stable URN identifying the kind of problem, for example urn:udx:problem:insufficient-permissions. Branch on it rather than on the localized detail. It is an identifier, not a URL to dereference.
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.
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.
instancestring<uri-reference>An identifier for this specific occurrence, so it can be correlated with server-side logs if you need to report it.
curl -X GET "https://api.underdogexchange.com/rfq-stats/series" \
-H "UDX-Access-Key: API_KEY_ID" \
-H "UDX-Access-Timestamp: UNIX_MILLISECONDS" \
-H "UDX-Access-Signature: BASE64_SIGNATURE"{
"window": {
"from": "2026-10-06T00:00:00.000000Z",
"to": "2026-10-07T00:00:00.000000Z"
},
"series": [
{
"series": "UDXNFLTOTAL",
"figures": {
"submitted": 1240,
"quoted": 5,
"unquoted": 1235,
"answered_pct": 0.4,
"accepted": 0,
"accept_requested": 0,
"accept_failed": 0,
"live": 0,
"unquoted_live": 0,
"sell_cash_usd": "310000.00",
"sell_cash_unquoted_usd": "308750.00"
},
"latency": {
"quote": {
"count": 5,
"p50_ms": 15,
"p90_ms": 15,
"p99_ms": 15
},
"accept": {
"count": 0,
"p50_ms": null,
"p90_ms": null,
"p99_ms": null
}
},
"last_quoted_at": "2026-10-06T13:55:00.000000Z",
"first_unquoted_at": "2026-10-06T14:00:00.000000Z",
"last_unquoted_at": "2026-10-06T23:55:00.000000Z",
"onset_at": "2026-10-06T14:00:00.000000Z"
}
],
"coverage": {
"complete": true,
"gaps": []
}
}{
"type": "urn:udx:problem:invalid-request-parameters",
"title": "Bad Request",
"status": 400,
"detail": "invalid request parameters",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:unknown-version",
"title": "Bad Request",
"status": 400,
"detail": "unknown UDX-Version \"1999-01-01\"; supported versions: 2026-07-15",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:invalid-authentication-credentials",
"title": "Unauthorized",
"status": 401,
"detail": "invalid authentication credentials",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:insufficient-permissions",
"title": "Forbidden",
"status": 403,
"detail": "insufficient permissions",
"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"
}{
"type": "urn:udx:problem:internal-error",
"title": "Internal Server Error",
"status": 500,
"detail": "internal error",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}{
"type": "urn:udx:problem:projection-unavailable",
"title": "Service Unavailable",
"status": 503,
"detail": "account setup is still being completed; retry later",
"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"
}{
"type": "urn:udx:problem:could-not-process-retry",
"title": "Service Unavailable",
"status": 503,
"detail": "could not process request, please retry",
"instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
}