API documentation

Funding, open interest and liquidations from Bybit, OKX, Hyperliquid and Gate (Binance and Bitget rolling out), one schema, five-minute snapshots. Base URL https://api.perpdata.dev. No SDK needed — it's plain JSON over HTTPS.

Authentication and limits

The free tier needs no key: 200 requests per day per IP across /v1/* and MCP tool calls. Pro ($29/month) raises that to 50,000/day with commercial use — send your key as Authorization: Bearer pd_.... Get one at perpdata.dev; manage or cancel via GET /billing/portal with the same header.

curl "https://api.perpdata.dev/v1/funding/current?symbol=BTC" \
  -H "Authorization: Bearer pd_your_key"

Endpoints

EndpointParamsReturns
GET /v1/funding/currentsymbolLatest funding per venue with annualized apr and the min/max spread
GET /v1/funding/historysymbol, venue?, limit?5-minute snapshots, newest first (cap 1000)
GET /v1/funding/spreadslimit?Symbols ranked by cross-venue apr spread: richest venue vs cheapest
GET /v1/oi/currentsymbolOpen interest per venue (base units + USD) and the cross-venue total
GET /v1/liquidations/recentsymbol?, limit?Recent liquidation prints, newest first
GET /v1/symbolsEvery tracked symbol
GET /v1/venuesEvery tracked venue
GET /healthRow counts and latest timestamps per table

Rates are decimals (0.0001 = 1 bp per interval); apr annualizes across different funding intervals so venues compare directly. Timestamps are Unix ms.

MCP server

Streamable-HTTP MCP at https://api.perpdata.dev/mcp — six tools with terse schemas: list_symbols, get_funding_rates, get_funding_history, get_funding_spreads, get_open_interest, get_liquidations. Discovery calls (initialize, tools/list) are never metered.

claude mcp add --transport http perpdata https://api.perpdata.dev/mcp

For other clients, paste the URL directly. Pro keys go in the same Authorization header on the POST.

Errors

401 — key unknown, malformed, or its subscription lapsed. 429 — daily limit reached; the body says which tier and where to upgrade. 404 — no data for that symbol. Errors are JSON: {"error": "..."}.

Tracked symbols