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:
The combined
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
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.