Skip to main content
GET
cURL
Use this endpoint to catch up on settlements after your server was down, or to poll for them instead of receiving the market_settled webhook. Each row is the data object that webhook sends. To read one game’s markets and their current settlement, use List game markets. Every plan with an API key can read it. The webhook, which pushes the same rows to your server, is Pro and Max only.

Parameters

The filters work like the webhook’s settlement_filters, without event_slugs and condition_ids. A row whose league is null, such as a golf event slug that starts with a year, never matches a league filter.

Key response fields

A page can hold fewer than limit rows, or none, while has_more is true: a page that has not filled up after about 120 ms of reading stops and continues on the next page. Keep reading next_cursor until has_more is false. If the first read of a page misses our 200 ms read deadline, the response is a 503 with error.reason read_model_warming and Retry-After: 1. Send the same request again after it.

Example

Every moneyline that settled in the NBA or the Premier League since 18:00 UTC on November 7, 2026:
Then read the next page with the cursor alone:
The list_settled_markets MCP tool calls this endpoint with the same parameters. The TypeScript SDK’s listSettledMarkets() arrives in its next release. The settlement notifier recipe uses this endpoint to catch up after downtime.

What it does not return

  • Markets that are not part of a sports or esports game. The list holds the game markets we record settlements for.
  • Settlements before November 7, 2026, 16:48 UTC, when we started recording them. A market that settled earlier appears only if a later read recorded it, with that read’s time as observed_at.
  • The market’s question or label. Read it from List game markets by event_slug.
  • Settlements newer than complete_through. Read next_cursor again later for them.

Caching

The response carries a weak semantic ETag. Send it back as If-None-Match for a 304 with an empty body. request_id and cost are excluded from the validator.

Authorizations

Authorization
string
header
required

Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).

Headers

X-Query-Validation
enum<string>

Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs.

Available options:
strict
If-None-Match
string

Conditional GET using a weak semantic ETag from an earlier response. A matching payload returns 304 with an empty body; request_id and cost are excluded from the validator.

Query Parameters

since
string<date-time>

RFC 3339 time, required without cursor. Rows whose settlement.observed_at is at or after it. With cursor, the cursor's position replaces it.

sports_market_type
string

Comma-separated provider market types to keep, case-insensitive: moneyline, spreads, totals, a prop type; at most 64. Omitted: moneyline, or with cursor the cursor's filter. * keeps every type, including markets with no stored type.

Maximum string length: 2048
league
string

Comma-separated league prefixes to keep, as the rows' league reports them (nba, epl); at most 32, each starting with a letter and holding no hyphen. Omitted: every league, or with cursor the cursor's filter.

Maximum string length: 1024
limit
integer
default:20

Page size. Out-of-range values are clamped to 1..100.

Required range: 1 <= x <= 100
cursor
string

Opaque stl_v1_ cursor from next_cursor. It replaces since and keeps the filters it was issued for: a sports_market_type or league sent with it must match them, or the read answers 400 with error.reason cursor_expired. A cursor this endpoint did not issue returns 400 with error.param=cursor.

Response

One page of recorded settlements

complete_through
string<date-time>
required
data
object[]
required
has_more
boolean
required
meta
object
required
next_cursor
string
required
object
string
required