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
| Field | Type | Description |
|---|---|---|
observationsTimestamp | timestamp[us] | Source observation timestamp. |
receiveMicrosecondTimestamp | timestamp[us] | PMData receive timestamp. |
price | large_string | Chainlink-computed TWAP price, scaled by 10^18. |
bid | large_string | Always the literal string "none"; TWAP reports do not provide a bid value. |
ask | large_string | Always the literal string "none"; TWAP reports do not provide an ask value. |
validFromTimestamp | timestamp[us] | Stream report validity start timestamp. |
expiresAt | timestamp[us] | Stream report expiration timestamp. |
version | large_string | Stream 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())