Skip to main content
GET
cURL
Use this to rank moneyline and prop markets before kickoff. Every row is a market where graded wallets sit heavily on one side, and every raw number behind that reading is in the row, so you can re-rank them yourself. It is not the Pick of the Day selector, and the markets it turns away are measured on Pre-game side observations. GET /api/v1/sports-edge-signals is the deprecated spelling of this path. It stays live and answers the same body, and its responses carry Deprecation and Link headers that name this path as the successor.

Parameters

Key response fields

Rows are sorted by directional_rank_score, then backing_score, then side_share, then condition_id. A healthy response comes from a snapshot cached for about 180 seconds. When meta.ranking_source or meta.directional_source reports a degraded input, that snapshot is cached for about 30 seconds instead, so it recovers faster.

When a cursor expires

A cursor stops working once the snapshot it came from is replaced. It then answers 400 with error.reason cursor_expired and error.param cursor. Request the first page again, and expect no Retry-After, because waiting does not fix it. A cursor the server cannot read at all is a different 400. It carries error.param cursor and no error.reason.

Example

What it does not return

  • A game that had already started when the snapshot was computed. Live markets are on Pre-game side observations.
  • A market where the money is split near 50/50. A market with no clear heavy side is left out.
  • Reconstructed history. Coverage starts at launch and counts only the taker buys that crossed 0xinsider’s whale-alert size thresholds.
  • The Pick of the Day. That ranker is editorial and separate from this one.

Caching

Send the ETag from a response back in an If-None-Match header. If the list has not changed, you get 304 Not Modified with an empty body.

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, including when its percent escape is incomplete.

Available options:
strict
If-None-Match
string

Conditional GET validator from a previous ETag. Matching values return 304 Not Modified with an empty body.

Query Parameters

category
string

Optional canonical sport bucket filter (e.g. Basketball, Tennis, Soccer). A raw provider value (NBA) resolves to its canonical bucket. A non-sport category returns an empty list.

limit
integer
default:20

Page size.

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

Opaque cursor from a previous response's next_cursor. Encodes the snapshot anchor plus the last row's directional_rank_score, conviction_score, smart_score and condition_id. A cursor from an expired snapshot returns 400.

horizon_hours
integer
default:12

Kickoff ceiling in hours from now; the floor is now (only games not yet started). Clamped to 1..48.

Required range: 1 <= x <= 48
min_grade
enum<string>
default:B

Minimum trader grade required on the piled side. Only S, A, B are accepted (the piled-side grade distribution is S/A/B only; C, D, F return 400). Default B means at least one S/A/B holder is piled; S requires an S holder, A requires an S or A holder.

Available options:
S,
A,
B

Response

Upcoming games ranked by the side profitable wallets hold

object
string
required
Allowed value: "list"
data
object[]
required
has_more
boolean
required
meta
object
required
next_cursor
string
total
integer