API Reference
Historical market data downloads — daily Parquet files and UpDown ZIP archives.
Base API Endpoint: https://api.pmdata.dev/v1
V1 Parquet API
https://api.pmdata.dev/v1/{exchange}/{data_type}/{YYYY}/{MM}/{DD}/{symbol}.parquetReturns 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.
| Name | Type | Description |
|---|---|---|
exchange | string | polymarket or chainlink. |
data_type | string | Data type to download. See the supported values below. |
YYYY/MM/DD | string | Valid UTC date with a four-digit year and two-digit month and day, e.g. 2026/08/08. |
symbol | string | Polymarket market slug or Chainlink instrument symbol. Identifiers are case-sensitive. |
Available data types
| Exchange | Data types |
|---|---|
polymarket | l2, trades, onchain_fills |
chainlink | streams, 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.parquetResponse
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
https://api.pmdata.dev/v1/polymarket/{data_type}/{YYYY}/{MM}/{DD}/{asset}-{timeframe}.zipReturns 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.
| Name | Type | Description |
|---|---|---|
data_type | string | l2, trades or onchain_fills. Each archive contains one data type. |
YYYY/MM/DD | string | Valid UTC date with a four-digit year and two-digit month and day, e.g. 2026/06/21. |
asset | string | btc, eth, sol, xrp, bnb, hype, doge or zec, subject to data availability. |
timeframe | string | 5m, 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.zipResponse 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:
| Timeframe | Download quota units |
|---|---|
5m | 144 |
15m | 48 |
1h | 12 |
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
| Status | Meaning |
|---|---|
403 Forbidden | The account is blocked from downloading, or a free account requested Chainlink data. |
404 Not Found | The path or parameters are invalid, or the requested file is unavailable. |
416 Range Not Satisfiable | The requested ZIP byte range is invalid or out of bounds. |
429 Too Many Requests | The 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.
