The Polymarket CLOB pays maker rewards on a curated set of markets. Each rewarded market carries one or more reward configs (Documentation Index
Fetch the complete documentation index at: https://docs.struct.to/llms.txt
Use this file to discover all available pages before exploring further.
clob_rewards[]), each with a daily rate, a max spread, and a min order size. Struct exposes these through the markets list (filter has_rewards=true, sort sort_by=rewards) and via the markets stream and CLOB rewards rooms for live updates.
When to use this
- Market-maker tooling: a leaderboard of “where can I earn the most rebates today?”
- Reward eligibility checks: filter to markets with
rewards_max_spreadyour strategy can hit. - Sponsor monitoring: track new sponsors joining or rates changing on a watched market.
Step 1: list reward-bearing markets
has_rewards=true keeps only markets with at least one active reward config; sort_by=rewards orders the response by combined daily rate descending.
Step 2: read the reward fields
Each market row carries a top-leveltotal_daily_rate (the combined daily rate across all sponsors on that market) and a clob_rewards[] array with the per-config breakdown:
| Field | Type | Description |
|---|---|---|
total_daily_rate | number | null | Top-level: combined daily rate across sponsors. |
clob_rewards[].rewards_daily_rate | number | null | Daily rate for this config. |
clob_rewards[].native_daily_rate | number | null | Polymarket native rate. |
clob_rewards[].sponsored_daily_rate | number | null | Sponsor-funded rate. |
clob_rewards[].rewards_max_spread | number | null | Max eligible spread (probability units). |
clob_rewards[].rewards_min_size | number | null | Min eligible order size (USD). |
clob_rewards[].start_date | string | null | ISO date the reward starts. |
clob_rewards[].end_date | string | null | ISO date the reward ends. |
clob_rewards[].sponsors_count | integer | null | Active sponsor count. |
total_daily_rate is the right number for the dashboard’s primary sort. The per-config breakdown is what you show on the row’s expanded view.
Step 3: keep the dashboard fresh
Two paths, depending on freshness needs:Coarse: re-poll on an interval
Live: subscribe to the markets stream
polymarket_markets_stream accepts the same has_rewards filter and pushes full market rows whenever they change.
total_daily_rate runs in bounded time per tick.
Step 4: stream raw reward config changes
For sponsor-level events (a new sponsor joining a market, a rate change, an end date hit) subscribe topolymarket_clob_rewards. Each clob_rewards_update carries the full reward config so you can merge into a per-market reward map.
Common combinations
| Goal | Parameters |
|---|---|
| Top reward markets right now | has_rewards=true&sort_by=rewards&limit=50 |
| High-liquidity rewarded markets only | has_rewards=true&min_liquidity=50000&sort_by=rewards |
| Crypto rewards only | has_rewards=true&categories=crypto&sort_by=rewards |
| High-volume rewarded markets | has_rewards=true&min_volume=100000&timeframe=24h |
| Track specific markets | polymarket_markets_stream with mode=ids and condition_ids=[...] |
Follow-on
To check whether your own quotes are inside the reward band on the markets you maker on, subscribe topolymarket_order_book for the same condition_ids. Compare the live spread to each market’s rewards_max_spread and flag rows where you’re out of band.