Get RFQ Stats
Returns how your member answered the RFQs it was asked to quote over a window of up to 30 days: counts, answered share and quote latency, in total and split by side and by whether the event had started. An RFQ counts when it was routed to your member or your member quoted it, and only your member’s quotes count as answers; no other maker’s activity is visible. Figures are final about three minutes after the fact, so the newest minutes of a window are not yet included. Available to members that quote.
/rfq-statsAuthorization
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 for the window.
windowRfqStatsWindowrequiredThe half-open UTC window the figures cover.
Show propertiesHide properties
fromstring<date-time>requiredInclusive start.
tostring<date-time>requiredExclusive end.
totalRfqStatsSegmentrequiredFigures and latency for one slice of the window.
Show propertiesHide properties
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.
by_sideobjectrequiredSplit by RFQ side.
Show propertiesHide properties
buyRfqStatsSegmentrequiredFigures and latency for one slice of the window.
Show propertiesHide properties
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.
sellRfqStatsSegmentrequiredFigures and latency for one slice of the window.
Show propertiesHide properties
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.
by_eventobjectrequiredSplit by whether the event had started at submission.
Show propertiesHide properties
pregameRfqStatsSegmentrequiredFigures and latency for one slice of the window.
Show propertiesHide properties
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.
liveRfqStatsSegmentrequiredFigures and latency for one slice of the window.
Show propertiesHide properties
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.
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" \
-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"
},
"total": {
"figures": {
"submitted": 12840,
"quoted": 11212,
"unquoted": 1628,
"answered_pct": 87.32,
"accepted": 41,
"accept_requested": 44,
"accept_failed": 3,
"live": 310,
"unquoted_live": 290,
"sell_cash_usd": "1884200.00",
"sell_cash_unquoted_usd": "101350.00"
},
"latency": {
"quote": {
"count": 11212,
"p50_ms": 14,
"p90_ms": 110,
"p99_ms": 560
},
"accept": {
"count": 41,
"p50_ms": 31,
"p90_ms": 90,
"p99_ms": 410
}
}
},
"by_side": {
"buy": {
"figures": {
"submitted": 2400,
"quoted": 1900,
"unquoted": 500,
"answered_pct": 79.17,
"accepted": 39,
"accept_requested": 41,
"accept_failed": 2,
"live": 120,
"unquoted_live": 110,
"sell_cash_usd": "0.00",
"sell_cash_unquoted_usd": "0.00"
},
"latency": {
"quote": {
"count": 1900,
"p50_ms": 20,
"p90_ms": 140,
"p99_ms": 600
},
"accept": {
"count": 39,
"p50_ms": 31,
"p90_ms": 90,
"p99_ms": 410
}
}
},
"sell": {
"figures": {
"submitted": 10440,
"quoted": 9312,
"unquoted": 1128,
"answered_pct": 89.2,
"accepted": 2,
"accept_requested": 3,
"accept_failed": 1,
"live": 190,
"unquoted_live": 180,
"sell_cash_usd": "1884200.00",
"sell_cash_unquoted_usd": "101350.00"
},
"latency": {
"quote": {
"count": 9312,
"p50_ms": 14,
"p90_ms": 100,
"p99_ms": 500
},
"accept": {
"count": 2,
"p50_ms": 40,
"p90_ms": 40,
"p99_ms": 40
}
}
}
},
"by_event": {
"pregame": {
"figures": {
"submitted": 12530,
"quoted": 11192,
"unquoted": 1338,
"answered_pct": 89.32,
"accepted": 41,
"accept_requested": 44,
"accept_failed": 3,
"live": 0,
"unquoted_live": 0,
"sell_cash_usd": "1860000.00",
"sell_cash_unquoted_usd": "90000.00"
},
"latency": {
"quote": {
"count": 11192,
"p50_ms": 14,
"p90_ms": 110,
"p99_ms": 560
},
"accept": {
"count": 41,
"p50_ms": 31,
"p90_ms": 90,
"p99_ms": 410
}
}
},
"live": {
"figures": {
"submitted": 310,
"quoted": 20,
"unquoted": 290,
"answered_pct": 6.45,
"accepted": 0,
"accept_requested": 0,
"accept_failed": 0,
"live": 310,
"unquoted_live": 290,
"sell_cash_usd": "24200.00",
"sell_cash_unquoted_usd": "11350.00"
},
"latency": {
"quote": {
"count": 20,
"p50_ms": 90,
"p90_ms": 400,
"p99_ms": 400
},
"accept": {
"count": 0,
"p50_ms": null,
"p90_ms": null,
"p99_ms": null
}
}
}
},
"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"
}