# Polymarket Liquidity Rewards & Book Depth (`datagrit/polymarket-reward-yield-screener`) Actor

Polymarket markets that pay liquidity rewards, joined with the live order book: reward pool, qualifying depth and estimated payout per market.

- **URL**: https://apify.com/datagrit/polymarket-reward-yield-screener.md
- **Developed by:** [datagrit](https://apify.com/datagrit) (community)
- **Categories:** Other, Business
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Polymarket Liquidity Rewards & Book Depth do?

It lists the Polymarket markets that pay liquidity rewards and joins each one with its live order book. For every market you get the daily reward pool, the reward band and minimum order size, the capital already resting inside the band on the bid and ask side, the reward score of that book, and an estimate of what a quote of your own size would earn. It is built for market makers, quant traders and bot builders who want to know where a dollar of liquidity earns the most, without opening hundreds of market pages.

### What can you use the Polymarket reward screener for?

- **Finding under-quoted reward markets.** Sort by estimated daily yield to see the markets where the published reward is large compared with the capital already competing for it.
- **Sizing a quote before you post it.** Set your capital and your distance from the midpoint, and read the estimated share, the daily dollars and the daily yield per market. The row also tells you the minimum capital that qualifies.
- **Crowding checks.** Cap the qualifying depth to skip markets where thousands of dollars of resting liquidity already share the same pool.
- **Daily monitoring.** Schedule the Actor and feed a spreadsheet, a dashboard or a trading script with the best reward markets of the day.
- **Topic screens.** Filter by words in the question, for example Fed, Senate or Bitcoin, to look only at the events you already trade.

### Example output

| question | rewardDailyUsd | midpoint | spreadCents | qualifyingDepthUsd | estimatedSharePct | estimatedDailyRewardUsd | estimatedDailyYieldPct |
|---|---|---|---|---|---|---|---|
| Will Louisiana enact a data center moratorium by December 31, 2027? | 2000 | 0.255 | 1 | 724307.42 | 1.8 | 36.09 | 3.609 |
| Will the Fed increase interest rates by 25 bps after the October 2026 meeting? | 1000 | 0.355 | 1 | 124167.67 | 1.9 | 19.04 | 1.904 |
| Israel accuses Iran/proxies of plane stabbing incident by Oct 31? | 600 | 0.075 | 1 | 12425.53 | 22.8 | 136.77 | 13.677 |

```json
{
  "found": true,
  "conditionId": "0x12aa13b3da17ceae1b0a59b5d5b77121e91bb79b4bb0b52bf6543ed3f8d0953b",
  "question": "Will the Fed increase interest rates by 25 bps after the October 2026 meeting?",
  "sourceUrl": "https://polymarket.com/event/fed-decision-in-october-20260617190323537/will-the-fed-increase-interest-rates-by-25-bps-after-the-october-2026-meeting-20260617190324032",
  "endDate": "2026-10-29T03:59:00.000Z",
  "volume24hUsd": 791285.96,
  "rewardDailyUsd": 1000,
  "rewardMaxSpreadCents": 2.5,
  "rewardMinSizeShares": 200,
  "bestBid": 0.35,
  "bestAsk": 0.36,
  "midpoint": 0.355,
  "spreadCents": 1,
  "qualifyingBidUsd": 65640.07,
  "qualifyingAskUsd": 58527.6,
  "qualifyingDepthUsd": 124167.67,
  "rewardScorePool": 18923.33,
  "rewardPoolEmpty": false,
  "rewardPerDayPer1000QualifyingUsd": 8.05,
  "minQuoteCapitalUsd": 196,
  "quoteSizeUsd": 1000,
  "quoteQualifies": true,
  "estimatedSharePct": 1.9,
  "estimatedDailyRewardUsd": 19.04,
  "estimatedDailyYieldPct": 1.904,
  "scrapedAt": "2026-10-01T09:27:52.510Z"
}
```

Prices are in dollars, so 0.355 is 35.5 cents. Bid and ask fields describe the order book of the first outcome, usually Yes; the book of the second outcome is its mirror, because a bid on one outcome is an ask on the other.

### How much does it cost?

You pay a small fee per run and a price per market returned, lower on paid Apify plans. Rows that only report that nothing matched are not billed and neither are duplicates. Set a maximum spend on the run and the Actor stops when it is reached. A default run reads a few hundred reward markets and their order books in well under a minute.

### Input

- **Search terms** – optional words that must appear in the market question.
- **Minimum daily reward** – smallest published reward pool per day. Raising it shortens the scan.
- **Minimum 24h volume** and **Maximum qualifying depth** – optional filters on traded volume and on the capital already resting inside the band.
- **Quote capital** and **Quote distance from midpoint** – the quote the estimate is calculated for.
- **Sort by** – estimated daily yield, estimated daily reward, daily reward pool, reward per 1,000 dollars already quoting, or 24h volume.
- **Maximum results** – total limit of returned markets.
- **Proxy configuration** – optional; the Polymarket public API does not need one.

### How to screen Polymarket liquidity rewards

1. Set **Minimum daily reward** to the smallest pool worth your attention. The default is 100 dollars per day, which keeps the scan to the markets with a meaningful reward.
2. Optionally add **Search terms**, a minimum 24h volume and a maximum qualifying depth.
3. Enter the **Quote capital** you would commit to a two-sided quote and the **Quote distance** from the midpoint in cents.
4. Choose how to sort and how many markets to return, then run.

#### Reward band, minimum size and qualifying depth

Polymarket pays rewards for resting orders that sit close to the midpoint. Each market publishes a band in cents (`rewardMaxSpreadCents`) and a minimum order size in shares (`rewardMinSizeShares`). The Actor reads the order book of every market that passes your filters and counts the bid and ask price levels that are strictly inside the band and whose size is at least the minimum. A level that sits exactly on the edge of the band scores zero under the documented formula, so it is not counted in any of the qualifying fields or in the scores. `qualifyingBidUsd` and `qualifyingAskUsd` are the capital behind those levels, `qualifyingDepthUsd` is both sides together, and `rewardPerDayPer1000QualifyingUsd` divides the daily pool by that capital. The order book is aggregated per price level, so a level of 500 shares can be one order or ten orders of 50 shares, and only the first qualifies against a minimum of 200. Because of that, the qualifying shares, capital, depth and scores are upper bounds on what really competes for the pool, and the level counts are counts of price levels, not of orders.

#### Reward score and estimated payout

The score of an order follows the formula Polymarket documents for liquidity rewards: ((band - distance) / band) squared, times the order size. `rewardScoreBid` and `rewardScoreAsk` are the sums for each side. `rewardScorePool` combines them the way the documentation combines the two sides of one maker: the smaller side, or one third of the larger side when that is more and the midpoint is between 0.10 and 0.90.

The estimate adds a two-sided quote of your capital at your distance and computes your share as your score divided by your score plus the score of the book. This is an approximation: the visible book is treated as a single competitor, while Polymarket scores every maker separately and samples the book over time. Read the estimate as a ranking aid that compares markets with each other, not as a forecast of income. When no visible order scores inside the band (no level strictly inside it that meets the minimum size, or only levels on its edge), `rewardPoolEmpty` is true and the estimate fields are null instead of a share of 100 percent, because there is no competitor to measure against and the midpoint of such a market depends on the next orders placed. Those markets are listed after all others. When your quote capital buys less than the minimum order size, or your distance is at or beyond the edge of the reward band, `quoteQualifies` is false, the estimate fields are null, and the run status counts those markets; `minQuoteCapitalUsd` shows the capital that would qualify.

### Output fields

Each row contains the identifiers (`conditionId`, `marketId`, `slug`, `eventSlug`, the two token IDs) and the `question` with a link, the market data (`endDate`, `volume24hUsd`, `priceChange1d`), the published reward terms (`rewardDailyUsd`, `rewardMaxSpreadCents`, `rewardMinSizeShares`, `rewardStartDate`), the book (`bestBid`, `bestAsk`, `midpoint`, `spreadCents`), the qualifying depth (shares, capital and number of price levels per side, plus `qualifyingDepthUsd`, all upper bounds), the scores (`rewardScoreBid`, `rewardScoreAsk`, `rewardScorePool`), `rewardPoolEmpty`, `rewardPerDayPer1000QualifyingUsd`, and the estimate for your quote (`minQuoteCapitalUsd`, `quoteQualifies`, `estimatedSharePct`, `estimatedDailyRewardUsd`, `estimatedDailyYieldPct`). A run that matches nothing returns one status row with `found` set to false.

### FAQ

#### Is it legal to scrape Polymarket data?

The Actor reads only the public market data endpoints of the Polymarket CLOB API, which need no account. It does not log in and does not place orders. You are responsible for using the data in line with applicable laws and the platform's terms.

#### Which markets are listed?

Only markets that currently publish a liquidity reward and have a non-zero daily pool above your minimum. Markets whose order book has no bids or no asks are skipped and counted in the run status, because a midpoint cannot be computed for them. The status also says for how many books at least one visible order sits inside the reward band.

#### What unit is the daily reward in?

The pool is the daily rate Polymarket publishes for the market, shown as published and read as dollars. The Actor does not verify the reward token on chain.

#### How accurate is the estimated payout?

It is an approximation for comparing markets. The visible book is treated as one competitor and the book is read once per run, while the real reward is split between all makers and sampled over time. Use it to rank markets and to size a quote, then watch the real payouts.

#### How fresh is the data?

Every run reads the reward list and the order books live. Schedule runs as often as you need.

#### Why did a run fail with a message about the source?

The run stops, and bills nothing, when the reward list is no longer sorted by daily reward, when the reward list is empty, when the order book endpoint returns no usable book for any market, when none of several readable books has a level inside its reward band, or when every record fails validation. This protects you from paying for empty or wrong rows after a change at the source.

### Related Actors

See other data Actors from the same publisher on the Store profile.

# Changelog

This Actor's version history is a separate document: https://apify.com/datagrit/polymarket-reward-yield-screener/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Optional. Keep markets whose question contains at least one of these words or phrases (case-insensitive), for example Fed, Bitcoin or Senate. Leave empty to screen every market that pays rewards.

## `minDailyRewardUsd` (type: `number`):

Keep markets whose total published liquidity reward is at least this many dollars per day. Raising it shortens the scan. 0 turns the filter off.

## `minVolume24hUsd` (type: `number`):

Keep markets with at least this much traded volume in the last 24 hours. 0 turns the filter off.

## `maxQualifyingDepthUsd` (type: `number`):

Keep markets where the capital already resting inside the reward band, on both sides together, is at most this many dollars. Use it to skip crowded markets. 0 turns the filter off.

## `quoteSizeUsd` (type: `number`):

Total capital you would commit to a two-sided quote in each market, bid and ask together. The estimate of your payout and yield is calculated for this amount.

## `quoteDistanceCents` (type: `number`):

How far from the midpoint your bid and ask would rest. Closer scores higher; a quote beyond the market's reward band earns nothing. 1 means one cent on each side.

## `sortBy` (type: `string`):

Order of the results before "Maximum results" is applied.

## `maxItems` (type: `integer`):

Stop after this many markets.

## `proxyConfiguration` (type: `object`):

Optional. The Polymarket public API does not need a proxy; leave it disabled.

## Actor input object example

```json
{
  "searchTerms": [],
  "minDailyRewardUsd": 100,
  "minVolume24hUsd": 0,
  "maxQualifyingDepthUsd": 0,
  "quoteSizeUsd": 1000,
  "quoteDistanceCents": 1,
  "sortBy": "estimatedDailyYieldPct",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All extracted records as a dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [],
    "minDailyRewardUsd": 100,
    "minVolume24hUsd": 0,
    "maxQualifyingDepthUsd": 0,
    "quoteSizeUsd": 1000,
    "quoteDistanceCents": 1,
    "sortBy": "estimatedDailyYieldPct",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datagrit/polymarket-reward-yield-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": [],
    "minDailyRewardUsd": 100,
    "minVolume24hUsd": 0,
    "maxQualifyingDepthUsd": 0,
    "quoteSizeUsd": 1000,
    "quoteDistanceCents": 1,
    "sortBy": "estimatedDailyYieldPct",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("datagrit/polymarket-reward-yield-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [],
  "minDailyRewardUsd": 100,
  "minVolume24hUsd": 0,
  "maxQualifyingDepthUsd": 0,
  "quoteSizeUsd": 1000,
  "quoteDistanceCents": 1,
  "sortBy": "estimatedDailyYieldPct",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call datagrit/polymarket-reward-yield-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datagrit/polymarket-reward-yield-screener"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0N9psKVZd6gmJnfTx/builds/Ks4EdrXzVbW3FqGUO/openapi.json
