Datasource 2 · Truthful API Guide
Tested data contracts · updated 2026-08-25

What can this Space actually give you?

This page distinguishes multi-year history, upstream-limited history, forward archives and live-only data. Empty HTTP 200 responses are never treated as usable data.

Consumer trap

Always check success, dataState, count and the array length. Legacy routes may return HTTP 200 while the underlying provider is unavailable.

Coverage matrix

OHLCVREAL HISTORICAL

On-demand Binance pagination. Up to 200,000 rows, 1,000 per upstream page.

FundingREAL HISTORICAL

Gate.io provides real funding with about 180 days of retention in the current HF runtime. Binance and Bybit are geo-blocked there; the Bybit path remains usable in regions where reachable.

Open interest180-DAY + FORWARD

Gate.io supplies the real ~180-day production window; daily SQLite upsert preserves observations forward. Binance/Bybit are geo-blocked from the current HF runtime.

Fear & GreedREAL HISTORICAL

Alternative.me full available history; the former 30-row cap is removed.

NewsFORWARD ONLY

Authenticated NewsData latest feed, archived from first production collection. No pre-deployment archive.

Whale flowFORWARD ONLY

Real large native ETH/BNB transfers scanned from public chain RPCs; no wallet-owner labels and no pre-deployment archive.

Historical endpoints

GET

/api/ohlcv · /api/klines · /api/history · /api/crypto/history/{symbol}

One canonical paginated Binance implementation. Use epoch milliseconds. since, start, startTime are aliases; likewise end/endTime.

curl "$BASE/api/ohlcv?symbol=BTCUSDT&timeframe=4h&start=1640995200000&end=1735689599999&limit=10000"
const r = await fetch(`${base}/api/ohlcv?symbol=BTCUSDT&timeframe=4h&start=1640995200000&end=1735689599999&limit=10000`);
const body = await r.json();
if (!r.ok || !body.success || !body.data.length) throw new Error('OHLCV unavailable');
Captured verification response
{"success":true,"source":"binance","providerEndpoint":"https://data-api.binance.vision/api/v3","dataState":"REAL","coverage":{"mode":"REAL_HISTORICAL","earliestTimestamp":1640995200000,"latestTimestamp":1735675200000},"count":6576}
GET

/api/apex/funding/{symbol}

Real funding observations. Tested BTCUSDT from 2022-01-01 through 2024-12-31.

curl "$BASE/api/apex/funding/BTCUSDT?start=1640995200000&end=1735689599999&limit=20000"
const funding = await fetch(`${base}/api/apex/funding/BTCUSDT?start=${start}&end=${end}&limit=20000`).then(r=>r.json());
Captured response summary
{"count":3288,"source":"binance_futures","dataState":"REAL","coverage":{"mode":"REAL_HISTORICAL","earliestTimestamp":1640995200006,"latestTimestamp":1735660800000}}
GET / POST

/api/apex/open-interest/{symbol} · /api/apex/open-interest-archive/{symbol} · /api/apex/open-interest/archive/collect

The live endpoint tries Binance and Bybit, then uses Gate.io's real contract statistics. Bybit returned January 2022 OI locally but is geo-blocked from the current HF runtime; production depth is therefore about 180 days. At startup and every 24 hours, the collector upserts rows for APEX_TRACKED_SYMBOLS (default BTC, ETH, BNB, SOL, XRP), deduped by symbol + timestamp. archiveStartedAt describes only the local cache, not the upstream historical depth. /api/apex/coverage reports PERSISTENT_VOLUME only when APEX_ARCHIVE_PATH is under mounted /data; otherwise it loudly reports ephemeral storage.

curl "$BASE/api/apex/open-interest/BTCUSDT?period=1h&limit=500"
curl "$BASE/api/apex/open-interest-archive/BTCUSDT?limit=10000"
curl -X POST "$BASE/api/apex/open-interest/archive/collect?period=1h"
const archivedOI = await fetch(`${base}/api/apex/open-interest-archive/BTCUSDT?limit=10000`).then(r=>r.json());
Captured live verification
{"trackedSymbols":5,"rowsPerSymbol":500,"dedupeKey":["symbol","timestamp"],"BTCUSDT":{"earliestTimestamp":1785816000000,"latestTimestamp":1787612400000},"secondRunDuplicateRows":0}
GET

/api/fear-greed?limit=0

limit=0 requests the full Alternative.me series. Values are dated upstream observations, not generated sentiment.

curl "$BASE/api/fear-greed?limit=0"
const fg = await fetch(`${base}/api/fear-greed?limit=0`).then(r=>r.json());
Captured upstream coverage
{"source":"alternative.me","count":3123,"coverage":{"mode":"REAL_HISTORICAL","earliestTimestamp":"1517443200","latestTimestamp":"1787529600"}}
GET / POST

/api/apex/news · /api/apex/whale-flow · /api/apex/archive/collect

News uses authenticated NewsData every 15 minutes. Whale flow is a working no-signup DIY scanner every 2 minutes: it reads 15 Ethereum and 200 BSC recent blocks by default, keeps native transfers above WHALE_ETH_MIN_NATIVE (default 50 ETH) or WHALE_BNB_MIN_NATIVE (default 500 BNB), and dedupes by chain + transaction hash. These are real large transfers, not inferred wallet identity. Both datasets remain forward-only.

curl -X POST "$BASE/api/apex/archive/collect"
curl "$BASE/api/apex/news?limit=500"
curl "$BASE/api/apex/whale-flow?limit=500"
const news = await fetch(`${base}/api/apex/news?limit=500`).then(r=>r.json());
console.assert(news.coverage.mode === 'FORWARD_COLLECTING_ONLY');
Captured provider verification
NewsData: HTTP 200, fetched=10, first saved=10, second saved=0
CryptoCompare configured candidate: HTTP 401
NewsAPI.org configured candidate: HTTP 401
BitQuery legacy/current without token: HTTP 401
CryptoPanic/Reddit public from this egress: HTTP 403
DIY live test: 12 ETH blocks, 2,645 transactions, 4 matches ≥50 ETH; 12 BSC blocks, 759 transactions, 0 matches ≥500 BNB
BitQuery signup: https://ide.bitquery.io (current official offer: time-limited free trial, not a permanent free production plan)
Whale source: public_evm_rpc_large_native_transfers; pre-deployment history unavailable

All live routes

The list below is generated from this deployment's OpenAPI, so registered routes cannot drift silently from this help page.

Loading OpenAPI…