Polymarket Markets Scraper avatar

Polymarket Markets Scraper

Pricing

from $0.02 / 1,000 markets

Go to Apify Store
Polymarket Markets Scraper

Polymarket Markets Scraper

Scrape Polymarket prediction markets: odds, prices, volume, liquidity, order book, price history and trades. Search by keyword, category or market URL. Export to JSON, CSV or Excel.

Pricing

from $0.02 / 1,000 markets

Rating

0.0

(0)

Developer

Nice Dev

Nice Dev

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

9 hours ago

Last modified

Share

🔎 What is Polymarket Markets Scraper?

Polymarket Markets Scraper extracts prediction markets from Polymarket: question, outcome prices (the implied probability), best bid and ask, spread, 24h / 7d / 30d / all-time volume, liquidity, open interest, price moves, opening and closing dates — plus the live order book, the price history, the latest trades and the biggest holders when you ask for them. It works as a Polymarket API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a keyword (bitcoin), pick a category, paste a market URL — or ask for nothing at all and walk the whole catalogue, over 40,000 open markets. Click Start and download the markets in JSON, CSV or Excel. No login, nothing to set up, and it is fast: a market costs no request of its own (100 per API page), and the order books of 100 markets cost a single extra request — 500 markets, with their order book, in seconds.

📋 What data can you extract from Polymarket?

One item per market, 74 fields:

CategoryWhat you get
🎯 Marketthe question, the resolution rules in full, the page link, the site's id — Will United Russia (ER) gain the most seats…?
📈 Odds and pricesevery outcome with its price (the implied probability), yes / no shortcuts, best bid and ask, spread, last trade — Yes 0.815 / No 0.185
💵 Money24h, 7-day, 30-day, 1-year and all-time volume, liquidity, open interest — $1,601,129 traded in 24h
📊 Price movesthe move over 1 hour, 24 hours, a week and a month, in probability points — +8 points in 24h
🕒 Dates and stateopening, closing, creation and update dates, open / closed / archived / accepting orders — ends 2026-09-30
🏁 Resolutionresolved or not, the outcome that paid out, the source of truth, how it was settled and by which contract, bonds, rewards — winner: Yes
💸 Feesmaker and taker base fees, the fee category and its schedule (taker rate, maker rebate) — politics_fees, 4 %
🔗 On-chain idscondition id, question id, one token per outcome, the negative-risk flag and group ids
🗂️ Event and categoriesthe parent event (title, volume, open interest, comments) and the tags — Politics
📖 Order book (option)bids and asks with price and size for both outcomes, ten levels a side
💬 Comments (option)the comments of the market's event: text, author, date, reactions, replies with their thread, GIFs
📉 Price history, trades, holders (options)the price series, the latest trades with wallet, pseudonym and user name, the biggest positions per outcome (up to 500) with the verified badge
🧾 Runthe search the market was found by, the timestamp

Every field, with an example, is listed under Output below (All 74 fields).

✅ Why use Polymarket Markets Scraper?

  • 🚀 Fast: 100 markets per API request, and the order books of 100 markets in one more — 500 markets with their order book in seconds.
  • 🗺️ The whole catalogue, not the first page: over 40,000 open markets, walked to the end — leave the keyword empty and set maxItems: 0.
  • 🏁 Resolved markets with their winner: status: "resolved" gives the settled markets, the outcome that paid out and when they closed — a ready-made backtesting dataset.
  • 📖 Order book in the same run: bids and asks with price and size for both outcomes, when you tick includeOrderBook (order book option: $0.40 per 1,000 markets on the Free plan, $0.37 on Gold, plus order books read: $0.79 per 1,000 requests on the Free plan, $0.53 on Gold — up to 100 markets per request, ≈ $0.005 to ≈ $0.008 per 1,000 markets).
  • 🐋 Whale trades: includeRecentTrades with minTradeSizeUsd returns the trades above your threshold, wallet and pseudonym included.
  • 🔔 Monitoring built in: tick Only new markets, schedule the Actor, and each run returns (and charges) only the markets it has never delivered.
  • 🎯 Filters for next to nothing: volume, liquidity, open interest, fee category, spread, 24h price move, "ending within the next hour", opening and closing dates — a filtered-out market is never charged, and a filter Polymarket cannot apply itself costs $0.37 to $0.40 per 1,000 results pages read.
  • 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

🚀 How to scrape Polymarket

  1. Create a free Apify account.
  2. Open Polymarket Markets Scraper and type a Search keyword (e.g. bitcoin), or pick a Category (politics, crypto, sports).
  3. Or paste Polymarket URLs into Start URLs: an event page, a single market page, or a category page.
  4. Set Max markets (100 by default, 0 = no limit) — and Max markets per search when you run several searches — then click Start.
  5. Download the dataset in JSON, CSV, Excel or via API.

💰 How much does it cost to scrape Polymarket?

This Actor uses pay per event pricing: $0.029 per 1,000 markets on the Free plan (all 74 fields but the options), $0.37 to $2.69 per 1,000 markets for each option you tick — order book, price history, trades, holders, comments, each at its own price in the table below — and $0.01 per run start (a dollar per 100 runs). Higher Apify plans pay less: $0.026 (Bronze), $0.019 (Silver) and $0.015 (Gold) per 1,000 markets, the options and the pages cost a little less on each plan too, and the requests of order books read go from $0.79 (Free) to $0.71 (Bronze), $0.62 (Silver) and $0.53 (Gold) per 1,000 requests. The tables after this one are at the Gold price. Platform usage (compute, proxy) is included in the price.

Per 1,000 markets, pages or requestsFreeBronzeSilverGold
Market$0.029$0.026$0.019$0.015
Order book option$0.40$0.39$0.38$0.37
Price history option$2.69$2.29$1.89$1.49
Recent trades option$0.79$0.78$0.77$0.76
Top holders option$0.49$0.48$0.47$0.46
Comments option$1.29$1.28$1.27$1.26
Extra option page$0.06$0.055$0.05$0.045
Filtered page$0.40$0.39$0.38$0.37
Order books read$0.79$0.71$0.62$0.53
What you ask forPrice per 1,000 markets (Gold)Example
Markets only (every option off)$0.015the whole catalogue of ≈ 200,000 open markets ≈ $3.00
Markets + order book (option ticked, full pages of 100 markets)≈ $0.39 ($0.385 + 10 requests of books)the whole catalogue with its order books ≈ $78 ($77.00 + 2,000 requests); a daily monitor of 200 new markets ≈ $0.078
Markets + the 5 options, each on its first page≈ $4.36 ($4.355 + 10 requests of books)1,000 markets with book, price history, trades, holders and comments ≈ $4.36

An option is charged only to the markets that get it: a closed market has no order book, and an option whose page fails, or that Polymarket answers without data, is not charged for that market. The order book has one more event, Order books read (order-book-page-read): $0.79 (Free), $0.71 (Bronze), $0.62 (Silver) or $0.53 (Gold) per 1,000 requests, $0.00053 a request at the Gold price. One request reads the open markets of ONE results page (up to 100) and is charged whether it finds a book for them or not. On full pages that is about $0.005 per 1,000 markets (10 requests), included in the tables on this page at the Gold price (Free: $0.00026 more a request); a short search pays a whole request for few markets — measured on the platform, 20 searches of 3 markets each are 20 requests, ≈ $0.011 for 60 markets at the Gold price.

Two options can go past their first page, and each page after it is $0.045 per 1,000 extra option pages ($0.000045 a page at the Gold price, $0.00006 on the Free plan): a price history over a range of dates (one page per 15 days, counted from the day the market was created) and more than 100 comment threads (one page per 100 threads). Trades (up to 1,000), holders (up to 500 per outcome) and a price history interval are always one page. The most a market can cost, with the order book's request counted as a share of 1/100 ($0.0000053) on a full page, or whole ($0.00053) for a market alone on its page (Gold price; the Free plan costs more, see the first table):

InputOptionsExtra option pages, at mostMost a market costs (full page of books)Alone on its page
Markets only (every option off)00$0.000015$0.000015
Order book ticked10$0.0003903$0.000915
Every option on its first page50$0.0043603$0.004885
Order book + priceHistoryStartDate: "180 days"211$0.0023753$0.0029
Order book + maxCommentsPerEvent: 100029$0.0020553$0.00258
Every option at its maximum (750 days of history, 1,000 comment threads)558$0.0069703$0.007495

Filtered pages cost $0.37 per 1,000 results pages ($0.00037 a page at the Gold price, $0.0004 on the Free plan). Polymarket applies the volume, liquidity, date and status filters itself on the catalogue: they cost nothing more. The other filters — 24h volume, open interest, spread, fee category, 24h price move, excluded words, status: "resolved" — and every filter of a keyword search (the status of its markets included) are checked here, on pages of 100 markets of which only a few may pass: each results page read for them is one filtered page, whether its markets pass or not. Example: the whole open catalogue (≈ 200,000 markets) filtered by open interest reads ≈ 2,000 pages ≈ $0.74. A list of exact identifiers and onlyNew alone never charge a page.

The log says, before the run starts, the options charged, the most extra pages a market of your input can take and which filters charge their pages, and at the end how many of each were charged. A page that fails is never charged. A maximum cost per run counts each market at its dearest — the order book's request as its share of 1/100 of one, after keeping one whole request aside — and pays each filtered page before it is read. Then the run stops at the market the maximum cost no longer pays (a request counts whole on the market that carries it, so a market alone on its page can stop the run earlier than the estimate): it never goes past the maximum cost, no market is saved half paid, and the log and the last message say that the maximum cost stopped it.

⚙️ Input

{
"query": "bitcoin",
"maxItems": 200,
"includeOrderBook": true
}

Several searches, a cap per search, only the markets that move, only the ones not delivered before:

{
"searchQueries": ["bitcoin", "election"],
"categories": ["crypto", "politics"],
"maxItemsPerQuery": 50,
"minVolume24h": 10000,
"minPriceChangePct": 5,
"onlyNew": true,
"stateKey": "crypto-daily"
}

Resolved markets with their winner, for a backtest:

{
"status": "resolved",
"sortBy": "endDate",
"maxItems": 5000,
"includePriceHistory": true,
"priceHistoryInterval": "max",
"priceHistoryFidelity": 1440
}

Or with your own URLs:

{
"startUrls": [
{ "url": "https://polymarket.com/event/which-party-will-gain-most-seats-in-russian-parliamentary-election" },
{ "url": "https://polymarket.com/markets/crypto" }
],
"maxItems": 500
}
FieldNotes
query, searchQueriesFree-text search; searchQueries adds more keywords (one search each). Ignored when startUrls is set.
categories, tagIdsCategory slugs as in the site URL (politics, crypto, sports) and numeric tag ids; a category typed as the site shows it (Pop Culture) is looked up as its slug (pop-culture). Every keyword × every category (max 500 searches per run).
marketSlugs, eventSlugs, conditionIds, marketIds, outcomeTokenIdsExact identifiers, fetched directly — no search, no pagination. An outcome token (clobTokenIds) finds its market whichever outcome it stands for.
startUrlsEvent, market, category or search pages of the site; the status, sort, filters and monitoring apply to them too.
statusOpen, closed, resolved (settled, with the winning outcome) or all.
sortBy, sortDescending24h volume, total volume, liquidity, start date, end date, creation date, spread or competitiveness (catalogue and category searches; a keyword search comes in the site's relevance order). With a date bound or the monitoring mode, the default sort becomes the newest markets first.
maxItems, maxItemsPerQueryStop after this many markets for the run (0 = unlimited), and a cap for EACH search.
includeEvent, includeTagsThe parent event and the categories: both on by default, and they cost no extra request.
includeOrderBook, orderBookDepthLive bids and asks per outcome, off by default, cut to ten levels per side (zero = the whole book). $0.00037 to $0.0004 per market, plus $0.53 to $0.79 per 1,000 requests of books read (up to 100 markets each).
includePriceHistory, priceHistoryInterval, priceHistoryFidelityThe price series per outcome, over the last hour, 6 hours, day, week, month or since the market opened, one point per hour by default (Polymarket's floor: 5 minutes for a week, 10 minutes for a month, 720 minutes for the whole life of a market). $0.00149 to $0.00269 per market (the option).
priceHistoryStartDate, priceHistoryEndDateOr ANY range of dates instead (2026-08-01 to 2026-08-31, or 30 days back to now), at any resolution — even one point a minute — up to 750 days and 10,080 points per outcome. One request per 15 days of range per market, from the day the market was created; each after the first is an extra option page ($0.000045 to $0.00006).
includeRecentTrades, recentTradesLimit, minTradeSizeUsdThe latest trades of each market (side, size, price, time, wallet, trader name and picture), up to 1,000 trades per market, worth at least the USD amount you set for a whale run. $0.00076 to $0.00079 per market (the option).
includeTopHolders, maxHoldersPerOutcomeThe biggest position holders, 20 per outcome by default, up to 500 (wallet, pseudonym, user name, verified badge, picture, size) — in one request per market whatever the number. $0.00046 to $0.00049 per market (the option).
includeComments, maxCommentsPerEventThe comments of the market's event (text, author, date, reactions, replies), 100 threads by default, up to 1,000 — one request per 100 threads per market, each after the first an extra option page ($0.000045 to $0.00006); the markets of one event carry the same comments. Switches includeEvent on. $0.00126 to $0.00129 per market (the option).
minVolume24h, minVolume, minLiquidity, minOpenInterestMoney floors in USD (open interest = the value of every open position of the market's event); zero means no floor.
minSpread, maxSpreadBid-ask spread bounds in probability points: 0.05 is 5 cents.
minPriceChangePctOnly markets that moved by at least this many percentage points over 24 hours, up or down.
endingWithinMinutesOnly markets closing within the next N minutes.
postedAfter, postedBeforeOpening date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month, 24 hours).
endingAfter, endingBeforeClosing date range: 2026-12-31, or a period AHEAD of now (30 days in endingBefore = closing in the next 30 days).
excludeKeywordsDrop the markets whose question contains one of these words (case and accents ignored).
feeTypesOnly the markets of these fee categories (politics_fees, sports_fees_v3, crypto_fees_v2, zero_fees…); none = the markets without one.
onlyNew, stateKey, resetStateMonitoring: only the markets never delivered under this memory key; resetState forgets the memory.
AdvancedproxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, minRequestIntervalMs, maxRequestRetries, debugLog.

📦 Output

A real item, shortened (the description, the event description and the book of the second outcome are cut here):

{
"id": "1130012",
"url": "https://polymarket.com/event/which-party-will-gain-most-seats-in-russian-parliamentary-election/will-united-russia-er-gain-the-most-seats-in-the-next-russian-parliamentary-election",
"slug": "will-united-russia-er-gain-the-most-seats-in-the-next-russian-parliamentary-election",
"question": "Will United Russia (ER) gain the most seats in the next Russian parliamentary election?",
"description": "Parliamentary elections are to be scheduled to be held in Russia in September 2026…",
"conditionId": "0x502a94e5c525766d5ee7f16c6568131ba1b2cbadb69c703af05a6ef00336ed64",
"questionId": "0xc194d621e2ef9468b86ed0db1328fd8d56ae8fba1e21b94c5c515e96ecbfc400",
"clobTokenIds": ["20915769520649892253891152116814645067070024223185517956799957803974344024878", "115351075585746600277716377744935410125916932950844626289798775482755919708780"],
"outcomes": ["Yes", "No"],
"outcomePrices": [0.815, 0.185],
"yesPrice": 0.815,
"noPrice": 0.185,
"bestBid": 0.81,
"bestAsk": 0.82,
"spread": 0.01,
"volume": 16144126.59,
"volume24hr": 1601129.41,
"liquidity": 478206.56,
"openInterest": 5728158.26,
"priceChange24h": 0.08,
"startDate": "2026-01-07T21:34:52.537Z",
"endDate": "2026-09-30T00:00:00.000Z",
"closedTime": null,
"active": true,
"closed": false,
"archived": false,
"acceptingOrders": true,
"resolved": false,
"winningOutcome": null,
"competitive": 0.9097,
"groupItemTitle": "United Russia (ER)",
"event": { "id": "149589", "slug": "which-party-will-gain-most-seats-in-russian-parliamentary-election", "title": "Which party will gain most seats in Russian Parliamentary Election?", "openInterest": 5728158.26, "commentCount": 12 },
"tags": [{ "id": "2", "label": "Politics", "slug": "politics" }],
"orderBook": { "Yes": { "bids": [{ "price": 0.81, "size": 41447.61 }], "asks": [{ "price": 0.82, "size": 12000 }] } },
"priceHistory": null,
"recentTrades": null,
"topHolders": null,
"comments": null,
"searchUrl": "https://gamma-api.polymarket.com/markets/keyset?include_tag=true&limit=100&closed=false&order=volume24hr&ascending=false",
"scrapedAt": "2026-09-20T05:12:00.000Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

All 74 fields

FieldExample
id, slug, url, question, description1130012, will-united-russia-er-gain…, the market page, the question, the resolution rules
outcomes, outcomePrices, yesPrice, noPrice["Yes","No"], [0.815, 0.185], 0.815, 0.185
bestBid, bestAsk, spread, lastTradePrice, competitive0.81, 0.82, 0.01, 0.82, 0.91
volume, volume24hr, volume1wk, volume1mo, volume1yrall-time and rolling volumes in USD
liquidity, openInterest478206.56, 5728158.27
priceChange1h, priceChange24h, priceChange1wk, priceChange1mothe move in probability points (0.08 = 8 points)
startDate, endDate, createdAt, updatedAt, closedTimeISO 8601 UTC (startDate is what the date filters read)
active, closed, archived, acceptingOrders, acceptingOrdersTimestamp, enableOrderBookthe state of the market, and when its order book opened
resolved, winningOutcome, resolutionSource, umaResolutionStatus, automaticallyResolved, resolvedBytrue, Yes, the source of truth, how it was settled, the resolver contract
umaBond, umaReward, makerBaseFee, takerBaseFee, feeType, feeSchedule500, 5, fees, the fee category (politics_fees) and its rate / maker rebate
rewardsMinSize, rewardsMaxSpread, orderMinSize, orderPriceMinTickSizeliquidity rewards and order limits
conditionId, questionId, clobTokenIds, negRisk, negRiskMarketId, negRiskRequestIdthe on-chain ids (one token per outcome), the negative-risk group
groupItemTitle, line, featured, restricted, fundedUnited Russia (ER), the handicap line of a sports market, flags
imageUrl, iconUrlthe market picture
event, tagsthe parent event (title, slug, url, volume, open interest, comments) and the categories
orderBook, priceHistory, recentTrades, topHolders, commentsfilled by the options below, null otherwise
searchUrl, scrapedAtthe query it was found by, ISO timestamp

outcomes, outcomePrices and clobTokenIds are real arrays (Polymarket sends them as text), and winningOutcome names the outcome that paid out on a resolved market.

💡 Tips

How to get more results

Leave Search keyword empty and set maxItems to 0: the Actor then walks the whole catalogue, over 40,000 open markets, page after page. status: "all" adds the closed ones — that is where the history lives.

How to reduce costs

The levers are maxItems, maxItemsPerQuery, the filters (a filtered-out market is free; a filter Polymarket cannot apply itself costs $0.00037 to $0.0004 per results page read, so combine it with one it can — minVolume, minLiquidity, the dates), onlyNew for recurring runs (you never pay twice for the same market) and the options: each one ticked adds from $0.37 per 1,000 markets (order book option, Gold) to $2.69 per 1,000 markets (price history option, Free) — leave includeOrderBook unticked (the default) for the markets alone, $0.015 (Gold) to $0.029 (Free) per 1,000. Only a price history range and more than 100 comment threads add extra option pages: a shorter range, or fewer threads, costs less — a coarser resolution does not (a page covers 15 days whatever the number of points).

Several searches in one run

Fill searchQueries and / or categories: the Actor runs one search per keyword × category (3 keywords × 4 categories = 12 searches, up to 500 per run). The single query field still works and is added to the list. A market found by several searches is saved — and charged — once. Set maxItemsPerQuery to give every search its own cap: without it the first searches can use up the whole maxItems budget.

Monitoring: only the new markets

Tick Only new markets (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the markets already delivered: they are not saved, not charged, and their order book is not even fetched. The memory lives in a named key-value store of your account (polymarket-markets-scraper-seen, up to 150,000 markets per key) and is only updated with markets that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey, and tick resetState once to start over. Searches are then sorted by newest, and a search stops once it meets 500 markets in a row you already have.

Filter by date

postedAfter and postedBefore read the date a market OPENED; endingAfter, endingBefore and endingWithinMinutes read the date it closes. All take a date (2026-09-01, the whole day is included, UTC) or a period (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time): before now for the opening dates, ahead of now for the closing dates (1 month on 31 January = 28 February). endingBefore alone also keeps the open markets already past their end date but not settled yet; endingWithinMinutes starts from now. A market without the date a filter reads is dropped as soon as that bound is set. Filtered-out markets are never charged and do not count in maxItems.

Track the whales

includeRecentTrades with minTradeSizeUsd: 10000 returns, for each market, only the trades worth at least $10,000 — with the wallet, the trader's pseudonym, the side, the size, the price and the transaction hash. Add includeTopHolders for the biggest open positions of each outcome.

🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per Polymarket market. Actor id: nice_dev/polymarket-markets-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/polymarket-markets-scraper.

Smallest input, for a cheap first call:

{
"query": "bitcoin",
"maxItems": 10
}

Key output fields: url, question, outcomes, outcomePrices, volume24hr, liquidity, endDate and orderBook (with includeOrderBook).

Cost: $0.029 per 1,000 markets on the Free plan, down to $0.015 on Gold, plus, for each option ticked, from $0.37 per 1,000 markets (order book option, Gold) to $2.69 per 1,000 markets (price history option, Free) — the order book is $0.37 per 1,000 at the Gold price, plus order books read: $0.53 to $0.79 per 1,000 requests, ≈ $0.005 to ≈ $0.008 per 1,000 markets on full pages; plus $0.01 per run start. Filtered pages and extra option pages cost extra, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.

❓ FAQ

The Actor only reads what Polymarket shows publicly to any anonymous visitor. It logs in to nothing, places no order and holds no funds. Results can contain personal data — a trade or a holding carries the trader's wallet address and pseudonym, which are public on the blockchain, and the user name and picture of the trader's Polymarket profile (a holder who keeps the name private gets null; the trade feed has no such setting and gives the name as Polymarket's API does); the comments (includeComments) carry their authors the way the holders are — and personal data is protected by GDPR: those fields are off by default (includeRecentTrades, includeTopHolders, includeComments), and you should not store them without a legitimate reason. You are responsible for using the data in compliance with Polymarket's Terms of Use and applicable law; prediction markets are restricted in several countries, and reading prices is not trading. This Actor is not affiliated with Polymarket.

Why can a market cost more than $0.000015?

Each option you tick adds $0.00037 to $0.00149 to the markets that get it at the Gold price (the order book: $0.000385 a market, plus its share of a request of books read: about $0.0000053 on a full page of 100 markets, up to $0.00053 for a market alone on its page). An option can also go past its first page: a price history over a range of dates longer than 15 days, or more than 100 comment threads. Each page after the first is one more request to Polymarket, and is charged $0.000045 (extra-option-page, $0.00006 on the Free plan) — so 750 days of history, 50 pages, add $0.0022 to the market. A page that fails, or that Polymarket answers without data, is never charged. A run that is stopped and resumed reads again the pages it lost, and charges them once.

Does it need a login or a proxy?

No login, no account, no API key. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session, up to 10 times on top of the retries (without a proxy, after a pause of 5 seconds, doubled at each retry up to 60 seconds).

Is the data safe to open in Excel or to show on a web page?

Every URL field (url, imageUrl, iconUrl, event.url, profileImageUrl of a trade, a holder or a comment, url of a comment's picture) holds an http(s) URL or null. A comment's body is plain text: any HTML tag is removed. Questions and descriptions are written by the market creators and copied as they are: a text can begin with -, +, = or @, which Excel and Google Sheets may read as a formula in a CSV file — import those columns as text. Prices and volumes are numbers, never text. On a web page, escape every field like any text written by a stranger.

Known limitations

  • tags only names the categories of the market; the full category tree of the site is not exposed.
  • priceChange1h is not sent for every market: it is null there.
  • The price history has a floor set by Polymarket: 5 minutes between two points for a week, 10 minutes for a month, 720 minutes (two points a day) since the market opened — finer, Polymarket only serves the last 31 days; a finer priceHistoryFidelity is refused before the run starts. For a fine series further back, use priceHistoryStartDate / priceHistoryEndDate.
  • onlyNew remembers market ids, not their content: a market whose price changed is not returned again, nor a market delivered open that has since closed or resolved — give a status: "resolved" schedule its own stateKey.
  • The order book is the live one at the moment of the run: two runs a minute apart give two different books.
  • Two runs sharing the same stateKey at the same time may both return the same new market.

A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

A run the platform stops without warning (out of memory)

  • Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the markets already saved are skipped: none is delivered or charged twice, and maxItems still counts them.
  • With onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the markets it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the markets of its last 2 seconds once more.

Something doesn't work?

The last line of the log counts the markets saved and filtered out, and the requests that failed after every retry. Those requests are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause. A run that saved some markets fails too when at least as many requests failed for good as were read, or when at least as many option pages (order book, price history, trades, holders, comments) failed for good as were answered: a green run of bare markets would hide an outage. One failed request among many is only a warning.

If Polymarket changes its pages, you are told instead of paying for blank rows. A results page that counts markets but gives none the Actor can read is an error (listed in FAILED_REQUESTS), never a quiet "No markets found". If the first 20 markets read all lack their question, slug, outcomes, prices, ids or dates, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first markets are charged. A run of fewer markets (a scheduled onlyNew run that finds a few new ones, a small Max markets) is checked at its end, from 5 markets: its markets are already saved, and the run fails with the missing field instead of ending green.

🛟 Support

Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.