{"openapi":"3.1.0","info":{"title":"PerpFinder Public Data API","version":"1.0.0","description":"Free, keyless, CORS-open crypto-derivatives data: perp volume, open interest, funding rates, options/IV, volume quality, fees. Missing values are null, never 0. Attribution requested: \"Data: PerpFinder\" linking to perpfinder.com. Rate limits: 30–60 req/min per IP depending on endpoint.","termsOfService":"https://perpfinder.com/terms","contact":{"url":"https://perpfinder.com/docs/api"},"license":{"name":"PerpFinder data-use terms","url":"https://perpfinder.com/terms"}},"servers":[{"url":"https://perpfinder.com"}],"security":[],"tags":[{"name":"Costs","description":"Execution cost: fee, half-spread and price impact, live and stored."},{"name":"Funding","description":"Funding rates, stored funding history, forecast accuracy and the spot-perp premium."},{"name":"Volume","description":"Perpetual volume, open interest, volume quality and venue history."},{"name":"Fees","description":"Protocol fees and the builder fees that trading apps add."},{"name":"Options","description":"BTC and ETH options and implied volatility."},{"name":"Liquidations","description":"Liquidation totals and the stored hourly liquidation history."},{"name":"MiCA","description":"EU MiCA authorization register of tracked venues."},{"name":"Meta","description":"Market enrichment, RWA markets and market sentiment."}],"externalDocs":{"description":"PerpFinder API documentation","url":"https://perpfinder.com/docs/api"},"x-ai-discovery":{"llms":"https://perpfinder.com/llms.txt","fullCatalogue":"https://perpfinder.com/llms-full.txt","manifest":"https://perpfinder.com/api-manifest","definitions":"https://perpfinder.com/data-definitions"},"paths":{"/api/data/perps":{"get":{"operationId":"getApiDataPerps","tags":["Volume"],"summary":"Perp DEX volume overview (24h/7d/30d, change %, per protocol).","description":"Stable public dataset. Key response fields: protocols[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: protocols[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/slippage":{"get":{"operationId":"getApiDataSlippage","tags":["Costs"],"summary":"Live perp execution-cost ladder from order books and supported oracle/pool models. Total cost is fee + half-spread + size-dependent impact beyond the best quote. A venue that cannot fill the order publishes totalBps null and keeps its partial-fill numbers under partial. depthConfidence low marks displayed depth the plausibility gate could not confirm; such rows rank after confirmed rows. An oracle venue has no book: GMX publishes the size-dependent GMX v2 position impact read from the on-chain DataStore through the GMX Reader, in priceImpactBps, with slippageModel onchain-position-impact-v2 and slippageConfidence medium; slippageSourceUrl names the contract that was read. Caching: a healthy answer carries Cache-Control public, max-age=10, s-maxage=25, must-revalidate, so one measurement serves every reader for the engine TTL; partial and stale answers use max-age=0, s-maxage=5, must-revalidate so readers see a completed background refresh before its fresh window expires. X-Cache states where the answer came from: HIT (this instance), SHARED (the shared result store, inside the TTL), STALE-SHARED or STALE (a labelled older result, with staleAgeSeconds, refreshed behind the response), MISS (measured now) or UNAVAILABLE (nothing inside the stale cap).","description":"Stable public dataset. Key response fields: asset, sizeUsd, side, results[].{exchange,feeBps,feeBpsMin,feeBpsMax,feeModel,slippageBps,halfSpreadBps,spreadBps,totalBps,midPrice,vwap,sufficient,fillStatus,depthFetchedUsd,depthConfidence,depthConfidenceReason,rankingEligible,partial,quoteStatus,maxExecutableSizeUsd}, coverage, referenceMidSource, meta, dataStatus, generatedAt, schemaVersion, sources, ETag","parameters":[{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC"},"description":"Example: BTC"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":100000},"description":"Example: 100000"},{"name":"feeType","in":"query","required":false,"schema":{"type":"string","enum":["taker","maker"],"example":"taker"},"description":"Example: taker|maker"},{"name":"side","in":"query","required":false,"schema":{"type":"string","enum":["buy","sell"],"example":"buy"},"description":"Example: buy|sell"}],"responses":{"200":{"description":"JSON. Key fields: asset, sizeUsd, side, results[].{exchange,feeBps,feeBpsMin,feeBpsMax,feeModel,slippageBps,halfSpreadBps,spreadBps,totalBps,midPrice,vwap,sufficient,fillStatus,depthFetchedUsd,depthConfidence,depthConfidenceReason,rankingEligible,partial,quoteStatus,maxExecutableSizeUsd}, coverage, referenceMidSource, meta, dataStatus, generatedAt, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/slippage-spot":{"get":{"operationId":"getApiDataSlippageSpot","tags":["Costs"],"summary":"Live spot execution-cost ladder using venue order books, pair-specific fees, spread, VWAP impact and explicit depth coverage.","description":"Stable public dataset. Key response fields: asset, sizeUsd, side, results[].{exchange,baseAsset,quoteAsset,feeBps,slippageBps,halfSpreadBps,spreadBps,totalBps,midPrice,vwap,sufficient,fillStatus,depthFetchedUsd,depthConfidence,depthConfidenceReason,partial}, coverage, meta, dataStatus, generatedAt, schemaVersion, sources, ETag","parameters":[{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC"},"description":"Example: BTC"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":10000},"description":"Example: 10000"},{"name":"feeType","in":"query","required":false,"schema":{"type":"string","enum":["taker","maker"],"example":"taker"},"description":"Example: taker|maker"},{"name":"side","in":"query","required":false,"schema":{"type":"string","enum":["buy","sell"],"example":"buy"},"description":"Example: buy|sell"}],"responses":{"200":{"description":"JSON. Key fields: asset, sizeUsd, side, results[].{exchange,baseAsset,quoteAsset,feeBps,slippageBps,halfSpreadBps,spreadBps,totalBps,midPrice,vwap,sufficient,fillStatus,depthFetchedUsd,depthConfidence,depthConfidenceReason,partial}, coverage, meta, dataStatus, generatedAt, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/dex-enrichment":{"get":{"operationId":"getApiDataDexEnrichment","tags":["Meta"],"summary":"Direct DEX market enrichment: OI, volume, funding, prices, protocol stats and venue coverage. fetchedAt is the time the upstreams were read — cross-venue funding predictions are judged against it, not the serve clock.","description":"Stable public dataset. Key response fields: protocols[], crossVenueFunding, fetchedAt, coverage.{requested,succeeded,failed,rejected,retired}, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: protocols[], crossVenueFunding, fetchedAt, coverage.{requested,succeeded,failed,rejected,retired}, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/perps-chart":{"get":{"operationId":"getApiDataPerpsChart","tags":["Volume"],"summary":"Aggregate daily perp-volume time series (DefiLlama) plus total open interest per day from our own snapshots. oi is absent on days with no capture — never zero-filled.","description":"Stable public dataset. Key response fields: chart[{date,volume,oi?}], oiCoverage.{daysWithOi,days,note}, dataStatus, generatedAt, schemaVersion, sources","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":90},"description":"Example: 90"}],"responses":{"200":{"description":"JSON. Key fields: chart[{date,volume,oi?}], oiCoverage.{daysWithOi,days,note}, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/volume":{"get":{"operationId":"getApiDataVolume","tags":["Volume"],"summary":"24h volume per venue from direct venue-reported perp tickers (CEX) and perp-DEX protocol APIs, with top symbols. Each row carries venueType so consumers can split CEX from DEX. exchanges[] is sorted by volume24h and holds the CEX rows plus Hyperliquid and dYdX (both venueType dex); every other perp DEX sits in dexVenues[], and dexTotalVolume is the sum of dexVenues[] only. Two hold-out rules keep a row visible while keeping its figure out of totalVolume. spikeFlagged[] names venues whose reported 24h volume is above 3x their own 7-day median (row carries volumeSpike true; the hold-out ends when the print holds). unverified[] names venues whose reported turnover PerpFinder cannot verify against an open-interest feed or an order book of matching size (row carries volumeUnverified true; the hold-out is permanent until an editorial review removes the entry). heldOut[] is the union, one {name, reason} per excluded venue, and each row carries heldOut set to the string unverified, the string spike, or null. change_1d is the day-over-day change of our captured snapshot total between the two newest calendar-adjacent captures, with every heldOut venue removed from both days, so it sits on the same basis as totalVolume; null when the two captures are not one day apart.","description":"Stable public dataset. Key response fields: exchanges[].{name,volume24h,symbolCount,topSymbols[],venueType,volumeSpike?,volumeUnverified?,heldOut}, totalVolume, spikeFlagged[], unverified[], heldOut[].{name,reason}, dexVenues[], dexTotalVolume, noFeed[], change_1d, failed[], venueSlugs, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: exchanges[].{name,volume24h,symbolCount,topSymbols[],venueType,volumeSpike?,volumeUnverified?,heldOut}, totalVolume, spikeFlagged[], unverified[], heldOut[].{name,reason}, dexVenues[], dexTotalVolume, noFeed[], change_1d, failed[], venueSlugs, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/open-interest":{"get":{"operationId":"getApiDataOpenInterest","tags":["Volume"],"summary":"Open interest per venue and the aggregate total. byExchange[] keeps the historical CEX list (plus Hyperliquid and dYdX); other perp DEXes are additive under dexVenues[]. Three totals, all in USD: totalOI is the sum of byExchange[] only (unchanged for existing consumers), cexTotalOI is the sum of the byExchange[] rows tagged venueType cex, and totalOIAllVenues is totalOI + dexTotalOI. coverage.cex and coverage.dex count the venues in THIS response; the /open-interest page replaces its initial server snapshot with this feed on each successful refresh.","description":"Stable public dataset. Key response fields: totalOI, cexTotalOI, totalOIAllVenues, byExchange[].{name,oi,venueType}, dexVenues[], dexTotalOI, failed[], venueSlugs, coverage.{cex,dex,failed,noFeed,rejected,symbolCoverage}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: totalOI, cexTotalOI, totalOIAllVenues, byExchange[].{name,oi,venueType}, dexVenues[], dexTotalOI, failed[], venueSlugs, coverage.{cex,dex,failed,noFeed,rejected,symbolCoverage}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/oi-long-short":{"get":{"operationId":"getApiDataOiLongShort","tags":["Volume"],"summary":"DEX long vs short open-interest split per protocol.","description":"Stable public dataset. Key response fields: protocols[], totalLong, totalShort, updatedAt, dataStatus, generatedAt, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: protocols[], totalLong, totalShort, updatedAt, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/funding-rates":{"get":{"operationId":"getApiDataFundingRates","tags":["Funding"],"summary":"Live funding-rate matrix: asset × exchange (normalized 1h). Missing OI/price are null with per-venue field support and explicit feed coverage. Venues that report a per-market interval (Binance, Bybit, OKX, Bitget, MEXC, Gate.io, BingX, KuCoin, Phemex, HTX, BloFin, Orderly, Aster) keep the raw rate and that interval; a market with no reported interval gets no rate. When only the interval request fails, the last reported interval of the market (at most 24 h old) is used and marked intervalSource \"last-known\" with intervalAgeMs. Optional asset/venue/limit filters narrow the matrix; a venue filter recomputes the per-row aggregates.","description":"Stable public dataset. Key response fields: rows[].exchanges.{rate1h,rawRate?,intervalHours?,intervalSource?,intervalAgeMs?,oi,price}, exchanges[], coverage, updatedAt, meta.fieldSupport, meta.venueSlugs, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","parameters":[{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC,ETH"},"description":"Example: BTC,ETH"},{"name":"venue","in":"query","required":false,"schema":{"type":"string","example":"Binance,Bybit"},"description":"Example: Binance,Bybit"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":50},"description":"Example: 50"}],"responses":{"200":{"description":"JSON. Key fields: rows[].exchanges.{rate1h,rawRate?,intervalHours?,intervalSource?,intervalAgeMs?,oi,price}, exchanges[], coverage, updatedAt, meta.fieldSupport, meta.venueSlugs, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/fees":{"get":{"operationId":"getApiDataFees","tags":["Fees"],"summary":"Protocol fees (DEX, 24h/7d/30d per protocol) — aggregator-reported protocol fees, one row per Derivatives protocol. Fees paid and protocol-retained revenue are different measures. It carries no CEX rows: a CEX figure on /fees/generated is that venue’s 24h volume from /api/data/volume multiplied by a maker/taker rate. The volume rule therefore decides the CEX estimate too — a venue that /api/data/volume holds out, either as volumeSpike (24h volume above 3x its own 7-day median) or as volumeUnverified (reported turnover we cannot verify), keeps its row and its chip on /fees/generated, and stays out of the 24h fee total and the share bars, exactly as it stays out of totalVolume.","description":"Stable public dataset. Key response fields: protocols[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: protocols[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/liquidations":{"get":{"operationId":"getApiDataLiquidations","tags":["Liquidations"],"summary":"Liquidations 24h/4h/1h, long vs short split. Binance and Bybit come from our own capture of their forced-close WebSockets; OKX, Gate.io, HTX and GMX come from their public REST feeds. meta.coverage states how much of the last 24 hours the capture actually covered and which venues have no continuous capture. Captured-venue windows are summed from stored five-minute slots, so a window edge includes the slot it falls inside.","description":"Stable public dataset. Key response fields: events[], summary, meta.{venues,missingVenues,windowHours,coverage.{status,collector24h,collectorPerVenue,venuesWithoutCollector,collectorSince}}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: events[], summary, meta.{venues,missingVenues,windowHours,coverage.{status,collector24h,collectorPerVenue,venuesWithoutCollector,collectorSince}}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/liquidations-history":{"get":{"operationId":"getApiDataLiquidationsHistory","tags":["Liquidations"],"summary":"Hourly liquidation history for Binance and Bybit from our own socket capture. Ledger v2 uses Bybit position sides and observed heartbeat windows; v1 remains separate. An hour with no capture returns null totals, never 0, and every bucket carries its coverage share.","description":"Stable public dataset. Key response fields: collectorVersion, methodologyNote, series[].{t,longUsd,shortUsd,events,coverage,byVenue}, coverage.{fraction,perVenue,hoursWithCoverage,hoursRequested}, collectorSince, observedTotalUsd, hours, venues[], updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"string","enum":["24","168"],"example":"24"},"description":"Example: 24|168"},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"example":"json"},"description":"Example: json|csv"}],"responses":{"200":{"description":"JSON. Key fields: collectorVersion, methodologyNote, series[].{t,longUsd,shortUsd,events,coverage,byVenue}, coverage.{fraction,perVenue,hoursWithCoverage,hoursRequested}, collectorSince, observedTotalUsd, hours, venues[], updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/options":{"get":{"operationId":"getApiDataOptions","tags":["Options"],"summary":"BTC/ETH options market state: mark IV per strike/expiry, ATM term structure, put/call, Deribit DVOL (attributed), expiries.","description":"Stable public dataset. Key response fields: status, updatedAt, assets.{BTC,ETH}.{asset,venue,status,updatedAt,spotIndex,dvol,summary,termStructure[],skew[],skewExpiry,expiries[]}, dataStatus, generatedAt, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: status, updatedAt, assets.{BTC,ETH}.{asset,venue,status,updatedAt,spotIndex,dvol,summary,termStructure[],skew[],skewExpiry,expiries[]}, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/options-history":{"get":{"operationId":"getApiDataOptionsHistory","tags":["Options"],"summary":"Self-collected options time series (no synthetic backfill); allowlisted metrics; maturity + methodologyVersion in every response.","description":"Stable public dataset. Key response fields: series[], maturity, methodologyVersion, firstObservedAt, observations, start, end, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","parameters":[{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC"},"description":"Example: BTC"},{"name":"metric","in":"query","required":false,"schema":{"type":"string","example":"dvol"},"description":"Example: dvol"},{"name":"interval","in":"query","required":false,"schema":{"type":"string","enum":["15m","1d"],"example":"15m"},"description":"Example: 15m|1d"},{"name":"days","in":"query","required":false,"schema":{"type":"string","example":"N"},"description":"Example: N"}],"responses":{"200":{"description":"JSON. Key fields: series[], maturity, methodologyVersion, firstObservedAt, observations, start, end, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/volume-quality":{"get":{"operationId":"getApiDataVolumeQuality","tags":["Volume"],"summary":"Reported vs observable CEX volume signals with separate data-confidence scoring. sweepsInWindow counts the last sweepWindowDays UTC days, not the lifetime total — use volume-quality-history for a longer count. unassessedTopVenues names the top-20-by-reported-volume venues that no sweep measures, with the reason.","description":"Stable public dataset. Key response fields: sweep.venues[], maturity, methodologyVersion, datasetStart, firstSweepAt, sweepsInWindow, sweepWindowDays, sweepCountScope, unassessedTopVenues[].{venue,reportedVolume24hUsd,rankByReportedVolume,reason}, unassessedRankSource, dataStatus, generatedAt, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: sweep.venues[], maturity, methodologyVersion, datasetStart, firstSweepAt, sweepsInWindow, sweepWindowDays, sweepCountScope, unassessedTopVenues[].{venue,reportedVolume24hUsd,rankByReportedVolume,reason}, unassessedRankSource, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/rwa-markets":{"get":{"operationId":"getApiDataRwaMarkets","tags":["Meta"],"summary":"RWA perp markets: stocks / forex / commodities across venues. platforms[].funding is an hourly rate fraction; null when the venue or its interval is unknown.","description":"Stable public dataset. Key response fields: markets[], updatedAt","responses":{"200":{"description":"JSON. Key fields: markets[], updatedAt. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/mica":{"get":{"operationId":"getApiDataMica","tags":["MiCA"],"summary":"Committed ESMA MiCA register snapshot joined to PerpFinder venue status, service permissions, EU-derivatives scope and fee context.","description":"Stable public dataset. Key response fields: register, scope, coverage, authorized[], tracked[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag","responses":{"200":{"description":"JSON. Key fields: register, scope, coverage, authorized[], tracked[], dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/premium":{"get":{"operationId":"getApiDataPremium","tags":["Funding"],"summary":"Binance USDT-M perpetual premium index — (mark − index) / index, single venue. indexPrice is Binance’s own index, not an independent spot reference.","description":"Stable public dataset. Key response fields: entries[].{symbol,venue,markPrice,indexPrice,premium,fundingRate}, avgPremium, venue, updatedAt, dataStatus, generatedAt, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: entries[].{symbol,venue,markPrice,indexPrice,premium,fundingRate}, avgPremium, venue, updatedAt, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/fear-greed":{"get":{"operationId":"getApiDataFearGreed","tags":["Meta"],"summary":"Fear & Greed index (alternative.me, attributed). current is null when the index is unavailable.","description":"Stable public dataset. Key response fields: current.{value,classification,timestamp}, history[], updatedAt, staleSince, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources","responses":{"200":{"description":"JSON. Key fields: current.{value,classification,timestamp}, history[], updatedAt, staleSince, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/funding-history":{"get":{"operationId":"getApiDataFundingHistory","tags":["Funding"],"summary":"Self-collected funding history: aggregates, per-venue sweeps, or the append-only realized-settlement ledger. Rate types never mixed; no synthetic backfill. Sweep history defaults to one joined series: v2 sweeps up to the first v3 sweep (2026-09-23), then v3 up to the first v4 sweep (2026-09-25), then v4 (selectionMode \"joined\", methodologyVersions [2,3,4], seriesNote, excludedFields). Hourly rates are comparable across the join; v2 Aster and Crypto.com rawRate/rawIntervalMinutes are null; v2/v3 Hyperliquid predicted nextSettlementAt is the venue-reported start of the running hour, v4 points at the next settlement. methodologyVersion=1, 2, 3 or 4 selects one stored version only. Each version has its own dataset start.","description":"Stable public dataset. Key response fields: series[]/entries[], coverage, maturity, methodologyVersion, methodologyVersions, selectionMode, seriesNote?, excludedFields?, datasetStart, dataStatus, generatedAt, schemaVersion, sources, ETag","parameters":[{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC"},"description":"Example: BTC"},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["aggregates","venue","realized"],"example":"aggregates"},"description":"Example: aggregates|venue|realized"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":7},"description":"Example: 7"},{"name":"venue","in":"query","required":false,"schema":{"type":"string","example":"Binance"},"description":"Example: Binance"},{"name":"rateType","in":"query","required":false,"schema":{"type":"string","enum":["current","predicted"],"example":"current"},"description":"Example: current|predicted"},{"name":"methodologyVersion","in":"query","required":false,"schema":{"type":"string","enum":["1","2","3","4"],"example":"1"},"description":"Example: 1|2|3|4"},{"name":"format","in":"query","required":false,"schema":{"type":"string","example":"csv"},"description":"Example: csv"}],"responses":{"200":{"description":"JSON. Key fields: series[]/entries[], coverage, maturity, methodologyVersion, methodologyVersions, selectionMode, seriesNote?, excludedFields?, datasetStart, dataStatus, generatedAt, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/funding-prediction-accuracy":{"get":{"operationId":"getApiDataFundingPredictionAccuracy","tags":["Funding"],"summary":"Funding prediction accuracy per venue and asset: stored predicted rates matched to the append-only realized-settlement ledger over one shared window per venue and asset (after the first usable stored prediction, up to the furthest targeted settlement, inside a 30-day read window). Accuracy (MAE and bias in bps per hour of the hourly-normalized rate, sign hit rate, median lead) is returned only when the publication gate passes (>=3 venues x >=30 settlements x >=7 days, <=30% missing); otherwise publication \"withheld\", accuracy null and the CSV returns 409. Hyperliquid v1-v3 predictions carry a labelled +1 interval settlement-time correction (horizonCorrection).","description":"Stable public dataset. Key response fields: publication, gate.{ready,missing}, requirements, readWindow, methodologyVersions, method[], units, readiness[], accuracy[]|null, csv|null, dataStatus, generatedAt, schemaVersion, sources, ETag","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"example":"json"},"description":"Example: json|csv"},{"name":"detail","in":"query","required":false,"schema":{"type":"string","example":"pairs"},"description":"Example: pairs"}],"responses":{"200":{"description":"JSON. Key fields: publication, gate.{ready,missing}, requirements, readWindow, methodologyVersions, method[], units, readiness[], accuracy[]|null, csv|null, dataStatus, generatedAt, schemaVersion, sources, ETag. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/volume-quality-history":{"get":{"operationId":"getApiDataVolumeQualityHistory","tags":["Volume"],"summary":"Volume-quality sweep history per venue (reported vs observable signals over time). Measurements, never accusations.","description":"Stable public dataset. Key response fields: series[], maturity, methodologyVersion, datasetStart, updatedAt, dataStatus, generatedAt, schemaVersion, sources","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":7},"description":"Example: 7"},{"name":"venue","in":"query","required":false,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","example":"csv"},"description":"Example: csv"}],"responses":{"200":{"description":"JSON. Key fields: series[], maturity, methodologyVersion, datasetStart, updatedAt, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/volume-ranking":{"get":{"operationId":"getApiDataVolumeRanking","tags":["Volume"],"summary":"Perpetual volume ranking of CEX and DEX venues, reported and adjusted. Adjusted is the reported figure with held-out venues removed (unverified tier, 3x spike rule, failed depth test); it is not a modelled estimate. Each held-out venue keeps its reported figure and a dated reason. view=share gives the daily DEX share, raw and adjusted; view=share-monthly the volume-weighted monthly share. date pins one stored day file for citation. Measurements, not accusations.","description":"Stable public dataset. Key response fields: ranking.{window,dates,capturedAt,reported,adjusted,gapUsd,gapShare,venues[].{name,type,reportedUsd,adjustedUsd,reportedRank,adjustedRank,holdOuts[].{rule,reason},spikeMultiple,depth}}, share[], monthly[], dayFile, permalink, depthSweepAt, datasetStart, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources","parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","enum":["ranking","share","share-monthly"],"example":"ranking"},"description":"Example: ranking|share|share-monthly"},{"name":"window","in":"query","required":false,"schema":{"type":"string","enum":["24h","7d"],"example":"24h"},"description":"Example: 24h|7d"},{"name":"date","in":"query","required":false,"schema":{"type":"string","example":"YYYY-MM-DD"},"description":"Example: YYYY-MM-DD"},{"name":"format","in":"query","required":false,"schema":{"type":"string","example":"csv"},"description":"Example: csv"}],"responses":{"200":{"description":"JSON. Key fields: ranking.{window,dates,capturedAt,reported,adjusted,gapUsd,gapShare,venues[].{name,type,reportedUsd,adjustedUsd,reportedRank,adjustedRank,holdOuts[].{rule,reason},spikeMultiple,depth}}, share[], monthly[], dayFile, permalink, depthSweepAt, datasetStart, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/venue-history":{"get":{"operationId":"getApiDataVenueHistory","tags":["Volume"],"summary":"Per-venue daily volume/OI history from the committed snapshot series (since 2026-06-05) — venue-reported figures, normalized; null never zero-filled. The window is a calendar window, and every day with no capture is listed.","description":"Stable public dataset. Key response fields: series[].{date,observedAt,backfilled,volume24h,volume7d,volume30d,openInterestUsd,perpPairs}, venueSlug, datasetStart, windowStart, windowEnd, windowDays, missingDays, gaps[], missingDates[], note, updatedAt, dataStatus, generatedAt, schemaVersion, sources","parameters":[{"name":"venue","in":"query","required":false,"schema":{"type":"string","example":"Binance"},"description":"Example: Binance"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":30},"description":"Example: 30"},{"name":"format","in":"query","required":false,"schema":{"type":"string","example":"csv"},"description":"Example: csv"}],"responses":{"200":{"description":"JSON. Key fields: series[].{date,observedAt,backfilled,volume24h,volume7d,volume30d,openInterestUsd,perpPairs}, venueSlug, datasetStart, windowStart, windowEnd, windowDays, missingDays, gaps[], missingDates[], note, updatedAt, dataStatus, generatedAt, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/builder-fees":{"get":{"operationId":"getApiDataBuilderFees","tags":["Fees"],"summary":"Builder fees that wallets and trading apps add to Hyperliquid perps fills, summed from the public Hyperliquid builder-fill files over the newest stored window of up to 7 UTC days. Each row gives the app, its builder addresses, notional, builder fees, the added fee in bps, and the base-tier taker total against a direct Hyperliquid order on $10,000. The same rows as the /trading-apps table. A missing value is null in JSON and empty in the CSV.","description":"Stable public dataset. Key response fields: window.{from,to,dates}, directTakerBps, costModel, rows[].{app,builderAddresses,daysCaptured,fills,notionalUsd,builderFeesUsd,addedFeeBps,takerTotalBps,taker10kUsd,premiumOverDirectPct}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"example":"json"},"description":"Example: json|csv"}],"responses":{"200":{"description":"JSON. Key fields: window.{from,to,dates}, directTakerBps, costModel, rows[].{app,builderAddresses,daysCaptured,fills,notionalUsd,builderFeesUsd,addedFeeBps,takerTotalBps,taker10kUsd,premiumOverDirectPct}, updatedAt, dataStatus, generatedAt, upstreamTimestamp, schemaVersion, sources. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}},"/api/data/cost-history":{"get":{"operationId":"getApiDataCostHistory","tags":["Costs"],"summary":"Execution-cost history by methodology version. While the active version has fewer than 7 days of stored sweeps, the default merges every stored version (selectionMode \"merged\"); each point still carries its own methodologyVersion and the boundary sweeps are flagged. methodologyVersion=active is the strict active-only series. Use endDate to page an older window.","description":"Stable public dataset. Key response fields: series[].{attemptId,ingestedAt,collectedAt,methodologyVersion,versionBoundary,side,feeType,feeTierAssumption,engineDataStatus,coverage,venues[].{halfSpreadBps,priceImpactBps,quoteStatus,slippageModel,executionModel,fillStatus,depthConfidence,depthFetchedUsd}}, lastSampleAgeMinutes, collectorStale, selectionMode, methodologySelectionNote, activeMethodologyMinDays, selectedMethodologyVersions, availableMethodologyVersions, versionBoundaries, globalDatasetStart, datasetStart, maturity, maturityByMethodology, venueCoverage, updatedAt, generatedAt","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","example":"perp"},"description":"Example: perp"},{"name":"asset","in":"query","required":false,"schema":{"type":"string","example":"BTC"},"description":"Example: BTC"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":100000},"description":"Example: 100000"},{"name":"days","in":"query","required":false,"schema":{"type":"string","enum":["7","all"],"example":"7"},"description":"Example: 7|all"},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","example":"YYYY-MM-DD"},"description":"Example: YYYY-MM-DD"},{"name":"methodologyVersion","in":"query","required":false,"schema":{"type":"string","enum":["1","2","3","4","5","6","7","8","active","all"],"example":"1"},"description":"Example: 1|2|3|4|5|6|7|8|active|all"},{"name":"venue","in":"query","required":false,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"example":"json"},"description":"Example: json|csv"}],"responses":{"200":{"description":"JSON. Key fields: series[].{attemptId,ingestedAt,collectedAt,methodologyVersion,versionBoundary,side,feeType,feeTierAssumption,engineDataStatus,coverage,venues[].{halfSpreadBps,priceImpactBps,quoteStatus,slippageModel,executionModel,fillStatus,depthConfidence,depthFetchedUsd}}, lastSampleAgeMinutes, collectorStale, selectionMode, methodologySelectionNote, activeMethodologyMinDays, selectedMethodologyVersions, availableMethodologyVersions, versionBoundaries, globalDatasetStart, datasetStart, maturity, maturityByMethodology, venueCoverage, updatedAt, generatedAt. Missing values are null, never 0.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or unsupported query parameter."},"429":{"description":"Rate limited — respect Retry-After."},"503":{"description":"No trustworthy fresh or stale upstream data was available."}}}}}}