Skip to main content
GET
Retired sports edge endpoint
GET /api/v1/sports-edge-observations has been retired. With a valid live credential, it returns 410 Gone with error.code and error.reason set to endpoint_retired; it no longer returns signals or observations. Use Edge Hunter at GET /api/v1/edge-hunter. It supports the quoted board, ranked signals, and observation cohorts. Every view requires a Max credential. The response includes Deprecation, Sunset, and a Link naming /api/v1/edge-hunter as the successor. Browser clients can read all 3 headers.

Migrate your client

Change the path to /api/v1/edge-hunter?view=observations and keep the required cohort: wider_holder, in_play, or emerging_pile. Keep supported category and limit filters. Pages default to 20 rows; limit clamps to 1 to 100. The response remains a list envelope with rows in data, and adds view: "observations". It retains token IDs, price marks, observation and holder clocks, provider and directional status, completeness, snapshot_as_of, degraded, and the per-sport funnel. Pagination and conditional reads remain available. Start from page one; retired-route cursors cannot be reused. in_play requires provider-confirmed live games and fresh provider, holder, and directional evidence. emerging_pile overlaps wider_holder; it is a projection, not an independent population or holder-arrival history. backed_price remains an aggregate market midpoint at observed_at, not the wallets’ executed entry price. Omitting view returns the quoted board in data.rows, with a 30-row limit and B floor by default. Select the advanced view to retain the former feed capabilities; changing the path without selecting a view changes the response shape. For the field contract and request examples, see Edge Hunter. A Pro credential returns 403 forbidden with error.reason: max_plan_required on every replacement view. The replacement supports shared market selection in every view. Use verified league and market identities; a category alias still selects its whole canonical sport bucket.

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

Response

Bad request. On this cursor-paginated route a 400 has TWO distinct causes; branch on error.reason. (1) error.reason="cursor_expired" (with error.param="cursor"): the pagination cursor was invalidated by an upstream data change mid-walk (e.g. the ranking snapshot behind the page refreshed). It is NOT a malformed parameter and NOT a reason to stop: recovery is mechanical -- re-request the first page and walk forward again. There is deliberately no Retry-After and no error.retry_at, because waiting changes nothing. (2) no error.reason: an ordinary invalid request parameter -- check error.param when present, otherwise error.message. Both carry error.code="bad_request" (a FROZEN contract value), so error.reason is the discriminator.

object
string
required
Allowed value: "error"
error
object
required
meta
object
required