PMDataDocs

API Reference

Historical market data downloads — daily Parquet files and UpDown ZIP archives.

Base API Endpoint: https://api.pmdata.dev/v1

V1 Parquet API

GEThttps://api.pmdata.dev/v1/{exchange}/{data_type}/{YYYY}/{MM}/{DD}/{symbol}.parquet

Returns one market or instrument's historical data for one data type and UTC date as a Parquet file. For Polymarket, symbol is the market_slug; for Chainlink, it is the instrument symbol, such as BTCUSD; for Predict.fun, it is the numeric market_id for l2 and onchain_fills, and markets_lifecycle for lifecycle (one file per day with every market).

See historical data details for availability and data schemas for file contents.

To find Polymarket markets and the dates PMData has data for, see the markets catalog.

Path parameters

All path parameters are required.

NameTypeDescription
exchangestringpolymarket, chainlink or predict_fun.
data_typestringData type to download. See the supported values below.
YYYY/MM/DDstringValid UTC date with a four-digit year and two-digit month and day, e.g. 2026/08/08.
symbolstringPolymarket market_slug, Chainlink instrument symbol, or Predict.fun market_id (markets_lifecycle for lifecycle). Identifiers are case-sensitive.

Available data types

ExchangeData types
polymarketl2, trades, onchain_fills
chainlinkstreams, streams_twap30s, streams_twap60s
predict_funl2, onchain_fills, lifecycle

Chainlink downloads require a paid plan (Plus: Polymarket or Plus: Predict.fun). Free accounts can download Polymarket data older than 3 weeks (21 days). Supported symbols are listed in Chainlink historical data details.

Predict.fun is a separate product with its own allowance: free accounts can download Predict.fun data older than 3 weeks, and data from the last 3 weeks needs Plus: Predict.fun (Plus: Polymarket does not include it). Predict.fun files hold the order book of each market's first outcome only; the outcome parameter returns 400. See Predict.fun historical data details.

Example

Request one market's L2 data:

https://api.pmdata.dev/v1/polymarket/l2/2026/08/08/will-jd-vance-win-the-2028-us-presidential-election.parquet

Request one day of Predict.fun market lifecycle updates:

https://api.pmdata.dev/v1/predict_fun/lifecycle/2026/10/01/markets_lifecycle.parquet

Response

A successful request returns 200 OK with a Parquet file and consumes one download quota unit. Repeated downloads consume quota again.

Unavailable files return 404 Not Found and do not consume quota. For Polymarket trades and onchain_fills, a 404 on a day the market was recorded means it had no trades that day; the markets catalog lists which markets were recorded on which days.

This endpoint returns the complete file; byte-range requests are supported by the ZIP API below.

ZIP API

GEThttps://api.pmdata.dev/v1/polymarket/{data_type}/{YYYY}/{MM}/{DD}/{asset}-{timeframe}.zip

Returns a ZIP archive of Parquet files for one UpDown asset and timeframe, one data type and one UTC day. This lets you download a day's recorded markets in one request.

ZIP archives use the UpDown dataset. The dated .parquet endpoint uses the full-market dataset. See Polymarket historical data details for coverage.

Path parameters

All path parameters are required.

NameTypeDescription
data_typestringl2, trades or onchain_fills. Each archive contains one data type.
YYYY/MM/DDstringValid UTC date with a four-digit year and two-digit month and day, e.g. 2026/08/08.
assetstringbtc, eth, sol, xrp, bnb, hype or doge, subject to data availability.
timeframestring5m, 15m or 1h.

Example

Download one UTC day of BTC 5-minute UpDown L2 data:

https://api.pmdata.dev/v1/polymarket/l2/2026/08/08/btc-5m.zip

Response and download quota

A successful request returns 200 OK with Content-Type: application/zip. The archive contains the available market Parquet files for the requested series and date. An unavailable archive returns 404 Not Found.

Quota is charged per archive and data type:

TimeframeDownload quota units
5m72
15m24
1h6

Resuming downloads

ZIP downloads support a single byte range. Send Range: bytes=START- to resume an interrupted download, or Range: bytes=START-END to request a specific portion. A valid range returns 206 Partial Content with a Content-Range header.

Requests starting after byte 0 do not consume additional download quota. A full download or a range starting at byte 0 consumes the archive's normal quota. Suffix ranges and multiple ranges are not supported; invalid or out-of-bounds ranges return 416 Range Not Satisfiable.

Errors

StatusMeaning
401 UnauthorizedThe API key is missing, invalid, or expired.
400 Bad RequestAn invalid outcome value, outcome on a data type that does not support it, or any outcome on Predict.fun.
403 ForbiddenThe account is blocked from downloading, a free account requested Chainlink data or Polymarket data from the last 3 weeks, or an account without Plus: Predict.fun requested Predict.fun data from the last 3 weeks.
404 Not FoundThe path or parameters are invalid, or the requested file is unavailable.
416 Range Not SatisfiableThe requested ZIP byte range is invalid or out of bounds.
429 Too Many RequestsThe account's download quota has been used up.

Error responses generally contain a JSON error field and may include a message. A free account requesting Chainlink data receives 403 Forbidden:

{
  "error": "Chainlink data is not included in the free tier. Please upgrade at https://pmdata.dev/pricing"
}

A free account requesting Polymarket data from the last 3 weeks receives 403 Forbidden:

{
  "error": "Data from the last 3 weeks is not included in the free tier. Please upgrade at https://pmdata.dev/pricing"
}

An account without Plus: Predict.fun requesting Predict.fun data from the last 3 weeks receives 403 Forbidden:

{
  "error": "Predict.fun data from the last 3 weeks requires the Plus: Predict.fun plan. Please upgrade at https://pmdata.dev/pricing"
}

When a free account has insufficient download quota, the API returns 429 Too Many Requests:

{
  "error": "You have used up all your free download quota. Please upgrade at https://pmdata.dev/pricing",
  "message": "You have used up all your free download quota. Please upgrade at https://pmdata.dev/pricing"
}

Paid accounts with insufficient download quota receive 429 Too Many Requests:

{
  "error": "Too Many Requests",
  "message": "Download quota has been used up."
}

An invalid ZIP range returns an empty body with a Content-Range: bytes */FILE_SIZE header.

Deprecated endpoints

These endpoints still work and return the same data as the V1 API. Use the V1 endpoints above for new code.

GEThttps://api.pmdata.dev/download/{data_type}/{market_slug}.parquet

Supports UpDown 5m, 15m and 1h markets only.

GEThttps://api.pmdata.dev/polymarket/{asset}-{timeframe}/{data_type}/{asset}-{timeframe}_{data_type}_{YYYY}-{MM}-{DD}.zip

Returns the same file as the ZIP API.

GEThttps://api.pmdata.dev/chainlink/{symbol}/{data_type}/{symbol}_{data_type}_{YYYY}-{MM}-{DD}.parquet

Returns the same file as the V1 Parquet API for Chainlink.

/get-download-url, /get-download-urls and the poly_snapshot and snapshot data types return 410 Gone. To get order book snapshots, download l2 data and generate them with l2_to_snapshot.py.