Skip to content
UDX
2026-07-15

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.

GET/rfq-stats
Authorization
Authorization
UDX-Access-KeyAPI key · headerrequired

Opaque API key ID.

UDX-Access-TimestampAPI key · headerrequired

Unix time in milliseconds, within 30 seconds of server time.

UDX-Access-SignatureAPI key · headerrequired

Standard-base64 RSA-PSS/SHA-256 signature with a 32-byte salt.

or
AuthorizationBearer token (JWT) · headerrequired

Bearer token for an active signed-in UDX user.

Header parameters
Header parameters
UDX-Versionstring

Dated API version (YYYY-MM-DD).

min length 10 · max length 10
Query parameters
fromstring<date-time>

Inclusive start of the UTC window. Defaults to 24 hours before the window end.

max length 40
tostring<date-time>

Exclusive end of the UTC window. Defaults to the time of the request. The window may span at most 30 days.

max length 40
sidestring

Only RFQs of this side.

Allowed:buysell
Responses
200Your member's quoting figures for the window.
windowRfqStatsWindowrequired

The half-open UTC window the figures cover.

Show properties
fromstring<date-time>required

Inclusive start.

max length 40
tostring<date-time>required

Exclusive end.

max length 40
totalRfqStatsSegmentrequired

Figures and latency for one slice of the window.

Show properties
figuresRfqStatsFiguresrequired

Counts 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 properties
submittedinteger<int64>required

RFQs routed to your member, or quoted by it, in the window.

quotedinteger<int64>required

Of those, RFQs your member quoted.

unquotedinteger<int64>required

Of those, RFQs your member did not quote.

answered_pctnumber<double>required

quoted as a percentage of submitted; 0 when nothing was routed.

acceptedinteger<int64>required

RFQs on which your member's quote traded.

accept_requestedinteger<int64>required

RFQs on which the requester lifted your member's quote.

accept_failedinteger<int64>required

Lifted, but no trade completed.

liveinteger<int64>required

RFQs whose event had already started when submitted.

unquoted_liveinteger<int64>required

Live RFQs your member did not quote.

sell_cash_usdstringrequired

Dollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
sell_cash_unquoted_usdstringrequired

Dollars requested by sell RFQs your member did not quote, truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
latencyRfqStatsLatencyrequired

quote 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 properties
quoteRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

acceptRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

by_sideobjectrequired

Split by RFQ side.

Show properties
buyRfqStatsSegmentrequired

Figures and latency for one slice of the window.

Show properties
figuresRfqStatsFiguresrequired

Counts 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 properties
submittedinteger<int64>required

RFQs routed to your member, or quoted by it, in the window.

quotedinteger<int64>required

Of those, RFQs your member quoted.

unquotedinteger<int64>required

Of those, RFQs your member did not quote.

answered_pctnumber<double>required

quoted as a percentage of submitted; 0 when nothing was routed.

acceptedinteger<int64>required

RFQs on which your member's quote traded.

accept_requestedinteger<int64>required

RFQs on which the requester lifted your member's quote.

accept_failedinteger<int64>required

Lifted, but no trade completed.

liveinteger<int64>required

RFQs whose event had already started when submitted.

unquoted_liveinteger<int64>required

Live RFQs your member did not quote.

sell_cash_usdstringrequired

Dollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
sell_cash_unquoted_usdstringrequired

Dollars requested by sell RFQs your member did not quote, truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
latencyRfqStatsLatencyrequired

quote 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 properties
quoteRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

acceptRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

sellRfqStatsSegmentrequired

Figures and latency for one slice of the window.

Show properties
figuresRfqStatsFiguresrequired

Counts 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 properties
submittedinteger<int64>required

RFQs routed to your member, or quoted by it, in the window.

quotedinteger<int64>required

Of those, RFQs your member quoted.

unquotedinteger<int64>required

Of those, RFQs your member did not quote.

answered_pctnumber<double>required

quoted as a percentage of submitted; 0 when nothing was routed.

acceptedinteger<int64>required

RFQs on which your member's quote traded.

accept_requestedinteger<int64>required

RFQs on which the requester lifted your member's quote.

accept_failedinteger<int64>required

Lifted, but no trade completed.

liveinteger<int64>required

RFQs whose event had already started when submitted.

unquoted_liveinteger<int64>required

Live RFQs your member did not quote.

sell_cash_usdstringrequired

Dollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
sell_cash_unquoted_usdstringrequired

Dollars requested by sell RFQs your member did not quote, truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
latencyRfqStatsLatencyrequired

quote 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 properties
quoteRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

acceptRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

by_eventobjectrequired

Split by whether the event had started at submission.

Show properties
pregameRfqStatsSegmentrequired

Figures and latency for one slice of the window.

Show properties
figuresRfqStatsFiguresrequired

Counts 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 properties
submittedinteger<int64>required

RFQs routed to your member, or quoted by it, in the window.

quotedinteger<int64>required

Of those, RFQs your member quoted.

unquotedinteger<int64>required

Of those, RFQs your member did not quote.

answered_pctnumber<double>required

quoted as a percentage of submitted; 0 when nothing was routed.

acceptedinteger<int64>required

RFQs on which your member's quote traded.

accept_requestedinteger<int64>required

RFQs on which the requester lifted your member's quote.

accept_failedinteger<int64>required

Lifted, but no trade completed.

liveinteger<int64>required

RFQs whose event had already started when submitted.

unquoted_liveinteger<int64>required

Live RFQs your member did not quote.

sell_cash_usdstringrequired

Dollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
sell_cash_unquoted_usdstringrequired

Dollars requested by sell RFQs your member did not quote, truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
latencyRfqStatsLatencyrequired

quote 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 properties
quoteRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

acceptRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

liveRfqStatsSegmentrequired

Figures and latency for one slice of the window.

Show properties
figuresRfqStatsFiguresrequired

Counts 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 properties
submittedinteger<int64>required

RFQs routed to your member, or quoted by it, in the window.

quotedinteger<int64>required

Of those, RFQs your member quoted.

unquotedinteger<int64>required

Of those, RFQs your member did not quote.

answered_pctnumber<double>required

quoted as a percentage of submitted; 0 when nothing was routed.

acceptedinteger<int64>required

RFQs on which your member's quote traded.

accept_requestedinteger<int64>required

RFQs on which the requester lifted your member's quote.

accept_failedinteger<int64>required

Lifted, but no trade completed.

liveinteger<int64>required

RFQs whose event had already started when submitted.

unquoted_liveinteger<int64>required

Live RFQs your member did not quote.

sell_cash_usdstringrequired

Dollars requested by sell RFQs, as a fixed-point decimal string truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
sell_cash_unquoted_usdstringrequired

Dollars requested by sell RFQs your member did not quote, truncated to the cent.

max length 24 · matches ^[0-9]+\.[0-9]{2}$
latencyRfqStatsLatencyrequired

quote 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 properties
quoteRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

acceptRfqStatsQuantilesrequired

Latency 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 properties
countinteger<int64>required

Samples behind the percentiles.

p50_msinteger<int64> | nullrequired

Median.

p90_msinteger<int64> | nullrequired

90th percentile.

p99_msinteger<int64> | nullrequired

99th percentile.

coverageRfqStatsCoveragerequired

Whether 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 properties
completebooleanrequired

True when no gap overlaps the window.

gapsobject[]required

Gaps overlapping the window, oldest first; the earliest are kept when the cap is reached.

max items 100
Show properties
Array of object
started_atstring<date-time>required

When the gap began.

max length 40
ended_atstring<date-time> | nullrequired

When it ended; null while it is still open.

max length 40
400The request doesn't conform to this spec.
typestring<uri-reference>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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 read scope.
typestring<uri-reference>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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 rate limit was exceeded.
typestring<uri-reference>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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 or account setup is unavailable, or the read could not be completed in time; retry.
typestring<uri-reference>required

A 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.

max length 2048
titlestringrequired

A 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
statusintegerrequired

The HTTP status code, repeated from the response itself.

detailstring

A 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 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"
Response
{
  "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": []
  }
}