PMData LogoPMDataDocs
Data sets

Chainlink TWAP

TWAP data direct from Chainlink, not Polymarket proxy. Available since 2026-08-01.

After August 7, 2026, Polymarket Up/Down markets use Chainlink TWAP data as their resolution source.

Data type: streams_twap30s or streams_twap60s

Format: Daily Parquet file.

import requests

api_key = "<YOUR_API_KEY>"
symbol = "BTCUSD"
data_type = "streams_twap30s"  # or "streams_twap60s"
data_date = "2026-08-01"

file_name = f"{symbol}_{data_type}_{data_date}.parquet"
url = f"https://api.pmdata.dev/chainlink/{symbol}/{data_type}/{file_name}"

response = requests.get(
    url,
    headers={"api_key": api_key},
    timeout=300,
)

Schema

FieldTypeDescription
observationsTimestamptimestamp[us]Source observation timestamp.
receiveMicrosecondTimestamptimestamp[us]PMData receive timestamp.
pricelarge_stringChainlink-computed TWAP price, scaled by 10^18.
bidlarge_stringAlways the literal string "none"; TWAP reports do not provide a bid value.
asklarge_stringAlways the literal string "none"; TWAP reports do not provide an ask value.
validFromTimestamptimestamp[us]Stream report validity start timestamp.
expiresAttimestamp[us]Stream report expiration timestamp.
versionlarge_stringStream report version.

Price scaling

The price value is stored as an integer in a string column and is scaled by 10^18. Divide it by 10^18 to get the decimal TWAP price. The bid and ask columns are not scaled prices: every row contains the literal string "none".

Convert scaled prices

Use Python's Decimal type to preserve the full price precision:

from decimal import Decimal

import pandas as pd

df = pd.read_parquet("BTCUSD_streams_twap30s_2026-08-01.parquet")
scale = Decimal(10) ** 18

df["price"] = df["price"].map(lambda value: Decimal(value) / scale)

print(df[["price", "bid", "ask"]].head())