---
title: "List ranked pre-game sports-edge signals"
method: GET
path: "/api/v1/sports-edge-signals"
tags: ["Markets"]
---

# List ranked pre-game sports-edge signals

`GET /api/v1/sports-edge-signals`

Insider-tier. Ranked list of upcoming pre-game sports markets (moneyline + props) where graded (S/A/B) smart money is piled on one side, each row carrying the piled side, its grade distribution (S/A/B counts, dollar concentration, top grade), the kickoff time, and the piled-side Polymarket CLOB token id. Eligibility is a market with recent graded whale FLOW in the kickoff window; ranking is the current graded HOLDER pile. Deliberately NOT the editorial Pick of the Day ranker. Served from a shared server-side snapshot cache (TTL ~180s) computed once per category window at the maximum 48h horizon and filtered to the requested horizon_hours at request time (so every horizon shares one cache entry); the cursor pins to that snapshot and a stale cursor is rejected. Polymarket only (Kalshi lacks kickoff + graded-holder data).

## Query parameters

- `category` string
- `limit` integer
- `cursor` string
- `horizon_hours` integer
- `min_grade` 'S' | 'A' | 'B'

## Headers

- `If-None-Match` string

## Response `200`

Ranked pre-game sports-edge signals

- object
  - `object` 'list', required
  - `data` SportsEdgeSignal[], required
    - `condition_id` string, required — Polymarket condition id.
    - `token_id` string, nullable — Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable.
    - `category` string, nullable — Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping.
    - `raw_category` string, nullable — Raw provider category as stored (e.g. NBA, EPL).
    - `title` string, nullable
    - `event_slug` string, nullable
    - `game_start_time` string, date-time, nullable — Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started.
    - `piled_side` string, nullable — Human piled-side label (never a bare Yes/Over); null when the provider outcome label is missing.
    - `piled_outcome_index` integer, required — 0 = first outcome (yes/home), 1 = second outcome (no/away).
    - `sharp_pct` number, nullable — Piled-side dollar concentration backed_usd / (yes_usd + no_usd), in (0.5, 1] for a real pile; null when there is no sharp USD.
    - `backed_sharp_usd` number, required — Raw piled-side smart-money USD.
    - `s_count` integer, required — S-grade graded holders on the piled side.
    - `a_count` integer, required — A-grade graded holders on the piled side.
    - `b_count` integer, required — B-grade graded holders on the piled side.
    - `graded_holders` integer, required — Piled-side graded holder count (s_count + a_count + b_count).
    - `top_grade` 'S' | 'A' | 'B', nullable — Best grade present on the piled side; null when none.
    - `smart_score` number, nullable — Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); the ranking tiebreak.
    - `volume` number, nullable — Market volume (USD).
    - `net_side` 'BUY' | 'SELL', nullable — Aggregate recent flow direction on the market; null when unavailable.
    - `conviction_score` number, required — Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the default ranking key, descending.
    - `rank` integer, required — 1-based rank within the (min_grade-filtered) ranked result.
  - `has_more` boolean, required
  - `next_cursor` string, nullable
  - `total` integer, nullable
  - `meta` ResponseMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix).
    - `cached` boolean, required
    - `cache_age_s` integer, nullable — Cache age in seconds, null if not cached.

## Other responses

- `304` — Not Modified. Returned when If-None-Match matches the current payload.
- `400` — Invalid request parameter
- `401` — Missing or invalid API key
- `402` — Active Insider subscription required
- `403` — Account access denied
- `408` — Request exceeded the server's 30-second transport timeout. The timeout response has an empty body because it is generated before handler-level JSON error shaping.
- `423` — Account is locked
- `429` — Rate limit exceeded (100 req/min; batch endpoints also reserve 100 batch item units/min before execution)
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

## Changes

- **2026-07-06** `137fa0fd3297` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/0xinsider/apis/0xinsider-api/changes/api/v1/sports-edge-signals/get.md)

---

[API](https://skmtc.dev/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.dev/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc.dev/0xinsider/apis/0xinsider-api/revisions/137fa0fd3297?raw)
