Polymarket Scraper — Resolved Markets & Price Before Close
Pricing
from $2.00 / 1,000 market rows
Polymarket Scraper — Resolved Markets & Price Before Close
Polymarket scraper for resolved markets: the outcome plus the Yes price 1h/6h/24h/72h/7d before close, final price, min/max, volume and tags. Filter by tag, date range, event or market slug; optional full price series. Public APIs, no proxy, no login. For backtests and calibration studies.
Pricing
from $2.00 / 1,000 market rows
Rating
0.0
(0)
Developer
Viktor Dubnytskiy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
A Polymarket scraper for markets that have already closed: what the outcome was, and what the market priced 1 hour, 6 hours, 1 day, 3 days and 7 days before it closed. Filter by tag (weather, sports, politics, crypto …), date window, event or market slug — the Polymarket UI shows none of this once a market resolves.
What you get (example output)
Real rows from the example dataset (weather tag, markets closed after 20 August):
| Field | Example value | What it is |
|---|---|---|
marketId / slug | 1360605 / will-any-month-of-2026-be-the-hottest-on-record | Polymarket market id and slug (url is the full link) |
question | Will any month of 2026 be the hottest on record? | Market question |
winner / yesResolved | Yes / true | The outcome that resolved true |
pricesBefore | {"1h": 0.9995, "6h": 0.948, "24h": 0.954, "72h": 0.965, "168h": 0.93} | Yes price at each hour offset before close (null where there were no trades) |
priceFinal | 0.9995 | Last Yes price before the market closed |
priceMin / priceMax | 0.9195 / 0.9995 | Range of the Yes price over the retrieved history |
volume | 154744.66 | Traded volume in USD |
closedTime / endDate | 2026-08-11T17:03:27+00:00 / 2027-01-10T00:00:00Z | When the market actually closed, and its scheduled end |
historyPoints | 180 | How many price points backed the snapshots |
Every row also carries eventSlug, eventTitle, tags[], outcomes[], winnerIndex, resolved, startDate, liquidity, negRisk, yesTokenId, historyFrom / historyTo, series (with includeSeries), resolutionSource, umaResolutionStatus and scrapedAt.
Use cases
- Backtesting a strategy — join the outcome with the price 24 or 72 hours before close and measure what a rule would have earned.
- Calibration studies — the classic "is 80% really 80%?" question, answered over thousands of resolved markets at a fixed offset before close.
- Research and dashboards — a permanent archive of resolutions, prices and volumes for markets that have vanished from the Polymarket front end.
How it works
Market metadata and resolutions come from Polymarket's public Gamma API, filtered by tag, closing-date window, event slug or market slug. For each market the actor pulls the CLOB price history for the Yes token at the chosen fidelity and reads off the price at every offset in hoursBefore, plus the final, minimum and maximum price. Everything is a public HTTP API — no proxy, no login, no anti-bot. In monitor mode a saved Task returns only markets that resolved since the previous run.
Input
| Field | Meaning | Default |
|---|---|---|
tagId | Gamma tag id, e.g. 84 = weather, 1 = sports, 2 = politics, 21 = crypto | 84 |
tagSlug | Tag by name instead of id, e.g. weather, nba, fed-rates; used only when tagId is empty | weather |
closedAfter | Keep markets ending on or after this ISO date, e.g. 2026-08-20 | 2026-08-20 |
closedBefore | Keep markets ending on or before this ISO date, e.g. 2026-09-01 | empty |
marketSlugs | Specific markets by slug (polymarket.com/market/<slug>) | empty |
eventSlugs | Every market of these events (polymarket.com/event/<slug>) | empty |
onlyResolved | Skip markets that are closed but not yet resolved, and open markets | true |
hoursBefore | Hour offsets before close at which to snapshot the Yes price | [1, 6, 24, 72, 168] |
fidelityMinutes | Resolution of the CLOB price history, in minutes | 60 |
includeSeries | Attach the complete [[timestamp, price], …] series to each row (large) | false |
minVolume | Skip markets below this USD volume | empty |
maxItems | Stop after this many pushed rows | 20 |
mode | scrape = every match; monitor = only markets resolved since the previous run of this Task | scrape |
monitorKey | State key for monitor mode when not running as a saved Task | empty |
webhookUrl | URL that receives a POST with the change summary in monitor mode | empty |
telegramBotToken / telegramChatId | Optional Telegram destination for monitor-mode summaries | empty |
Pricing
| Event | Price |
|---|---|
| result | $0.002 per market ($2 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.002 per newly resolved market |
Charged only for markets actually pushed. No proxy needed.
Why this actor
- Data the Polymarket UI deletes — once a market resolves, its price history disappears from the front end; this returns it as a flat row.
- Price before close at your own offsets —
hoursBeforeis configurable, so a backtest at 12 h or 48 h needs no re-scraping of the raw series. - Outcome and price in one row — no joining resolutions to a separate price export.
- No proxy, no login, no anti-bot — public APIs only, so runs are cheap and reliable.
- $2 per 1,000 markets, and no charge for empty runs — you pay per pushed row.
- Every run leaves a
RUN_SUMMARYrecord in the key-value store with the reason for an empty result, so a zero-row run is diagnosable.
Limits
- Price points come from Polymarket's CLOB history at the chosen fidelity; a market with no trades at an offset returns
nullfor that offset (thin markets often returnnullat 72 h and 168 h). - Gamma lists at most 5,000 markets per filter (50 pages × 100), so narrow the date window for large tags.
- Multi-outcome (neg-risk) events appear as one row per market, because each market is itself a Yes/No pair.
liquidityandresolutionSourceare oftennullon closed markets — Polymarket stops reporting them.- No trader, wallet or person-level data is collected.
FAQ
How do I get historical Polymarket prices after a market closed? Filter by tagId/tagSlug and a closedAfter / closedBefore window, or pass exact marketSlugs. Each row carries pricesBefore, priceFinal, priceMin and priceMax; set includeSeries: true for the full series.
Can I check whether Polymarket odds are calibrated? That is what the actor is built for: take pricesBefore["24h"] as the forecast and yesResolved as the outcome over a few thousand markets, then bucket by price.
Which tag ids are available? Any Gamma tag. Common ones are 84 (weather), 1 (sports), 2 (politics) and 21 (crypto); if you only know the name, put it in tagSlug and leave tagId empty.
Changelog
- 0.1: initial release.
If this actor is useful, a review on its Apify Store page genuinely helps other buyers find it. Found a bug or need a field that is missing? Open a ticket on the Issues tab of the actor and it will be looked at.