Polymarket Markets Scraper avatar

Polymarket Markets Scraper

Pricing

from $2.10 / 1,000 results

Go to Apify Store
Polymarket Markets Scraper

Polymarket Markets Scraper

Prediction markets from Polymarket's public API: every active event and its Yes/No markets with live prices, bid/ask, spread, volume, liquidity, end date and resolution state, plus event tags. Walk by tag, search by text, or fetch specific events. Flags markets that have already ended.

Pricing

from $2.10 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Prediction markets from Polymarket, straight from its public Gamma API: every active event and each of its Yes/No markets with live prices (outcome prices, best bid/ask, spread, last trade, 1-day and 1-week change), volume (total, 24h, 1-week), liquidity, start/end dates, resolution state, CLOB token ids, and the event's title, slug, tags and market count on every row.

HTTP only, no key, no login, no browser. One request per 100 events.

What it is for

  • Odds monitoring — run on a schedule, keep yesPrice by marketId.
  • Category dashboards — walk politics, crypto, sports, … by tag.
  • Arbitrage / research feedsclobTokenIds and conditionId on every row link straight to the order book.

Input

fieldwhat it does
tagsTag slugs to walk (politics, crypto, nba, …). Empty = every active event.
searchTermsFree-text search over event titles.
eventSlugsSpecific events, by slug or URL.
includeClosed, excludeEndedStatus filters — see below.
sortBy, ascending, minVolume, minLiquidity, endingAfter, endingBeforeOrdering and filters.
includeEventRowsAlso emit one EVENT row per event.
maxItems, maxConcurrency, minRequestInterval, proxyConfigurationLimits.

Each tag, search term and event slug is its own target with its own SEARCH_SUMMARY.

Four things about this API worth knowing before you trust a run

1. "Active" includes markets that have already ended

active=true&closed=false is the API's live set — and 17 of the top 100 markets by 24-hour volume on the day this was built had an endDate in the past: the day's Fed-decision markets, ended, awaiting resolution, still trading. A monitor that reads "active" as "open question" reports settled questions as live odds. Every row carries hasEnded and acceptingOrders; excludeEnded drops them and the summary counts them.

2. A multi-outcome question is N binary markets, not one market

Every Polymarket market has exactly two outcomes. "Fed Decision in September?" is an event with seven Yes/No markets ("50+ bps decrease", "25 bps decrease", …) whose Yes prices sum to ~1. Read flat, they look like seven unrelated questions. Every MARKET row carries eventId, eventTitle, eventSlug, outcomeLabel and eventMarketCount so you can regroup; includeEventRows adds an EVENT row with the outcome/price summary in one place.

3. Page size is capped at 100 and offset stops at 2,000 — silently, then loudly

Ask for limit=5000, get 100 with HTTP 200. Ask for offset=2001, get a 422. This Actor uses the API's keyset cursor instead, which walks all ~21,000 active events (210 pages, measured), so a tag walk is never truncated.

4. Nine fields are JSON inside JSON

outcomes, outcomePrices and clobTokenIds arrive as strings: "[\"0.115\", \"0.885\"]". Read naively, the first outcome price is the character [. Parsed here; outcomePrices is a list of floats, yesPrice and noPrice are floats, and a row whose price list does not parse is refused and counted rather than shipped with a probability of [.

Other things measured

  • sortBy takes only the seven fields the API accepts; anything else is answered with a 422 upstream and refused here.
  • An unknown tag returns nothing (no_matches), not everything.
  • The API's own liquidity_min parameter answers HTTP 500; minLiquidity is applied locally instead. volume_min, end_date_min/max work upstream.
  • On the search endpoint the active parameter is silently ignored (16 of 20 results came back closed); events_status=active is what narrows it, and the Actor also drops any closed event the search still returns.
  • volume and liquidity arrive as 18-decimal strings beside float twins; floats are emitted. volume is null on brand-new markets with no trades.
  • bestBid/bestAsk are null on ~10% of rows (no order book).

Output

  • MARKETmarketId, conditionId, question, slug, url, outcomeLabel, outcomes, outcomePrices, yesPrice, noPrice, impliedProbability, bestBid, bestAsk, spread, lastTradePrice, oneDayPriceChange, oneWeekPriceChange, volume, volume24hr, volume1wk, liquidity, startDate, endDate, hasEnded, acceptingOrders, active, closed, negRisk, resolutionSource, umaResolutionStatus, clobTokenIds, description, eventId, eventTitle, eventSlug, eventUrl, eventMarketCount, eventVolume, eventVolume24hr, eventLiquidity, eventEndDate, eventTags.
  • EVENT (optional) — eventId, title, slug, url, marketCount, outcomes (label + yesPrice per market), volume, volume24hr, liquidity, startDate, endDate, hasEnded, negRisk, tags.
  • SEARCH_SUMMARY — one per target: eventsSeen, eventsReturned, marketsReturned, pagesFetched, stoppedReason, filteredOut, endedRows, negRiskRows, rowsWithoutOrderBook, rowsRefusedUnparsablePrices, totalClaimedBySite (search only).
  • ERRORinvalid_input, bad_request, payload_shape_changed, fetch_failed, with detail.

Known limits

  • Prices are the API's snapshot at fetch time; no order-book depth or price history (the CLOB API has both — a natural follow-up).
  • Search is Polymarket's own title search; it does not search descriptions.
  • Closed markets are walkable with includeClosed but there are far more of them than active ones; set maxItems accordingly.