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.

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

Path parameters

All path parameters are required.

NameTypeDescription
exchangestringpolymarket or chainlink.
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 or Chainlink instrument symbol. Identifiers are case-sensitive.

Available data types

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

Chainlink downloads require a paid plan. Supported symbols are listed in Chainlink 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

Response

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

For Polymarket trades and onchain_fills, if the requested file is unavailable but the corresponding L2 file exists, the API returns a valid Parquet file with zero rows. Otherwise, unavailable files return 404 Not Found.

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 UpDown 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/06/21.
assetstringbtc, eth, sol, xrp, bnb, hype, doge or zec, 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/06/21/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
5m144
15m48
1h12

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
403 ForbiddenThe account is blocked from downloading, or a free account requested Chainlink data.
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. For example, an exhausted download quota returns:

{
  "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.