Polymarket Markets Scraper & Monitor - Prices, Volume, New
Pricing
from $4.00 / 1,000 market returneds
Polymarket Markets Scraper & Monitor - Prices, Volume, New
Polymarket Markets in one table: question, price per outcome, best bid and ask, volume, liquidity, end date, tags and URL. Filter by keyword, tag, volume or days to close. Monitoring returns only new markets, price moves past your threshold and resolved markets.
Pricing
from $4.00 / 1,000 market returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
Get Polymarket markets as one clean row per market: the question, every outcome and its price, best bid and ask, last trade, total and 24-hour volume, liquidity, end date, tags, the event it belongs to and its URL. Find markets by keyword, tag, minimum volume or liquidity and days until the end date. A monitoring mode returns only what changed since the last run: new markets, markets whose price moved past your threshold, and markets that resolved.
It reads Polymarket's official public market-data API (gamma-api.polymarket.com), the one Polymarket's own documentation points developers and AI agents to. No login, no API key, no wallet, no proxy. It only reads; it never places orders.
Why this Actor
- A monitor with your own threshold. Run it on a schedule with
monitoringModeandpriceChangePoints(for example 5): you get only the markets where the price of any outcome moved 5 percentage points or more, withpreviousOutcomePricesandpriceChangePointsnext to the new price. Small moves add up, because each market is compared with the price you last received, not with the previous run. - New and resolved markets in the same feed. A market that appears under your filters comes back once as
new-market. A market you were watching that closes comes back once asresolved, with the final prices andwinningOutcome. - Says whose number each price is.
outcomePricesis Polymarket's order-book midpoint (checked against Polymarket's order-book midpoint for 6 markets on 2026-10-05: identical). The "Buy" price on a Polymarket page is the best ask, which is a different number, sobestBid,bestAskandlastTradePriceare separate columns and nothing is blended. - Filters are applied twice. Volume, liquidity and end-date filters are sent to Polymarket and checked again on every row, so a market outside your filters is never returned or charged.
- Honest empty results. An unknown tag, a search with no match, a refusal, a rate limit and a list cut off part-way each come back as a separate free row that says what happened. A value Polymarket does not give is
null, never 0.
Sister Actors: Kalshi Markets Scraper for the same table from Kalshi, and Polymarket Weather Markets for temperature markets with the weather forecast on the same row.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
keywords | list | (none; prefilled: bitcoin) | Words sent to Polymarket's own search, one per line. The search matches events; every open market of a matching event is returned. |
tags | list | (none) | Polymarket tag slugs: crypto, politics, sports, economy, geopolitics ... (the last part of a topic page address). A market is returned when it carries any of them. |
minVolumeUsd | integer | (none) | Only markets with at least this total volume. |
minLiquidityUsd | integer | (none) | Only markets with at least this liquidity. |
endsWithinDays | integer | (none) | Only markets whose end date is between now and this many days from now. |
sortBy | select | volume24hr | volume24hr, volume, liquidity, newest or endingSoon. Used when no keyword is given. |
maxResults | integer | 1000 | The most market rows returned and charged in one run (up to 50,000). |
monitoringMode | boolean | false | Return only new markets, price moves past the threshold and resolved markets. See below. |
priceChangePoints | integer | 5 | Monitoring: the move, in percentage points, that makes a market come back (1 to 100). |
resetMonitoringState | boolean | false | Forget the remembered markets for these exact filters. |
With every field empty the Actor lists all open markets, most traded in the last 24 hours first, up to maxResults.
Example: crypto markets ending this week with real volume
{ "tags": ["crypto"], "minVolumeUsd": 50000, "endsWithinDays": 7, "sortBy": "endingSoon" }
Example: alert when any politics market over $1M moves 5 points
{ "tags": ["politics"], "minVolumeUsd": 1000000, "monitoringMode": true, "priceChangePoints": 5 }
Output
One row per market:
{"source": "polymarket-gamma-api","status": "ok","change": "price-moved","marketId": "573656","question": "Will Bitcoin hit $150k by December 31, 2026?","outcomes": ["Yes", "No"],"outcomePrices": [0.0235, 0.9765],"bestBid": 0.02,"bestAsk": 0.027,"lastTradePrice": 0.028,"spread": 0.007,"oneDayPriceChange": -0.002,"previousOutcomePrices": [0.075, 0.925],"priceChangePoints": 5.15,"volumeUsd": 2863045.46,"volume24hUsd": 18250.11,"volume1wkUsd": 96113.5,"liquidityUsd": 51422.07,"endDate": "2027-01-01T05:00:00.000Z","closed": false,"winningOutcome": null,"eventTitle": "When will Bitcoin hit $150k?","eventSlug": "when-will-bitcoin-hit-150k","tags": ["Crypto", "Bitcoin", "Crypto Prices"],"tagSlugs": ["crypto", "bitcoin", "crypto-prices"],"url": "https://polymarket.com/event/when-will-bitcoin-hit-150k/will-bitcoin-hit-150k-by-december-31-2026","conditionId": "0x02deb9538f5c123373adaa4ee6217b01745f1662bc902e46ac92f3fe6f8741e8","clobTokenIds": ["9369...6213", "5511...0538"],"scrapedAt": "2026-10-05T09:00:00.000Z"}
(The example is shortened and its monitoring values are illustrative. Rows also carry startDate, createdAt, updatedAt, active, closedTime, acceptingOrders, resolutionStatus, eventId, groupItemTitle, negRisk, slug, resolutionSource and the full description with the resolution rules.)
- Prices are between 0 and 1: 0.62 means 62¢, an implied chance near 62%.
changeisnulloutside monitoring mode, andnew-market,price-movedorresolvedinside it.winningOutcomeis filled only when the market is closed and exactly one outcome is priced at 1. Otherwise it isnull.tagscome from the market, or from its event when the row was found by keyword.
Rows whose status is not ok are free and explain themselves in note: invalid-input, unknown-tag, no-markets-matched, blocked, unreadable, incomplete, baseline-recorded, no-change-since-last-run, budget-reached.
Monitoring mode
- First run for a set of filters: the matching open markets and their prices are remembered. No market row is returned and nothing is charged; one free row says how many markets were remembered. Run once without monitoring mode if you also want the full list.
- Every later run reads all matching open markets again and returns only:
new-market: a market that matches now and was not remembered;price-moved: the price of any outcome ispriceChangePointsor more away from the remembered price (exactly the threshold counts);resolved: a remembered market that has closed, looked up by its ID.
- The remembered price of a market changes only when that market is returned to you. A market that drifts 2 points per run comes back at the run where the total reaches your threshold.
- A run that finds nothing returns one free row (
no-change-since-last-run) and is charged onescan-checkedevent. - Changed markets that did not fit under
maxResultsor your maximum charge are not remembered as returned: the next run returns them.
The memory is kept per set of filters (keywords, tags, minimums, end-date window and threshold), in a named key-value store on your account. Two schedules with different filters do not disturb each other. Two runs with the same filters at the same moment can overwrite each other's memory, so schedule them apart.
Pricing
Pay per event, no start fee:
market-returned: one per market row. Free rows (anything whosestatusis notok) are never charged.scan-checked: one per monitoring run that compared the markets and found nothing to return. The first monitoring run and runs that could not read the list are not charged.
Set a maximum charge per run in Apify and the Actor stops inside it and says so.
Notes and limits
- Freshness. Polymarket serves this API through a cache of up to 5 minutes (
cache-control: max-age=300), so a price can be up to about 5 minutes old. For tick-by-tick data use Polymarket's WebSocket feeds; this Actor is for lists, screening and alerts on a schedule of minutes or hours. - Only open markets are listed. Closed markets appear only as
resolvedrows in monitoring mode. - A market that leaves your filters while still open (for example its end date passes before it resolves) is kept in memory and reported as
resolvedwhen it closes. - Keyword search is Polymarket's own search and matches events, so a market is returned because its event matched the word.
- A monitoring scan reads every matching market (100 per request). Narrow filters make it faster; the hard ceiling is 60,000 markets per tag or 5,000 events per keyword, and a list cut by the ceiling says so in a free row.
- The Actor sends at most about 8 requests per second; Polymarket's published limit for this endpoint is 300 requests per 10 seconds.
- Not affiliated with Polymarket. Prices are set by traders and change continuously; nothing here is financial advice.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
- Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.