Data download API
One bearer key for all three. Everything is GET, everything is rate-limited the same way, and nothing here is paginated — you narrow with filters instead.
GET /v1/meta — See what you can get
The dimensions come back already narrowed to your tier — a Polymarket plan never sees Predict.fun. Note the two venues do not cover the same assets, so read assets rather than assuming one list. assets and intervals hold real values only; filterTokens.appliesTo names the dimensions some files leave empty, which you select with none.
{
"firstDay": "2026-06-06", "lastDay": "2026-08-12", "days": 68,
"venues": ["polymarket"],
"assets": ["BNB","BTC","DOGE","ETH","HYPE","SOL","XRP"],
"intervals": ["1s","1m","3m","5m","15m","30m","1h","2h","4h","6h","8h","12h","1d","3d","1w","1mo"],
"datasets": { "prices": "…", "book": "…", "klines": "…" },
"filterTokens": { "noValue": "none", "appliesTo": ["asset","interval"] }
}GET /v1/files — Find files
Every file in the response carries its own url; hand it straight to your downloader.
| Filters (all optional) | |
|---|---|
| asset | btc / eth / … comma-separated for several, e.g. asset=btc,eth |
| dataset | prices / twap30s / twap60s / book / orderbook / best_bid_ask / price_change / last_trade_price / tick_size_change / markets / klines. book is Polymarket full depth, orderbook is the Predict.fun tree; best_bid_ask is unthrottled top of book — prices only, no sizes |
| interval | 5m and 15m for Polymarket markets; Predict.fun also has 1h and 1d. 1m, 1h, 1d … for klines. The settlement streams (prices / twap30s / twap60s) have no interval of their own — name them with none |
| none | Any filter takes none for "this dimension is empty". interval=5m,none reads as "5m market data plus every period-less dataset"; on its own, interval=5m returns only files actually sliced at 5m |
| venue | polymarket / predict |
| date | a single day — same as from=to=that day |
| from / to | a range, at most 92 days per call. Omit both for the latest day |
What each dataset actually contains: Polymarket order book data · Chainlink settlement data · Predict.fun historical data · Compared with other providers
{
"from": "2026-08-12", "to": "2026-08-12", "days": 1,
"count": 1, "bytes": 1655751,
"files": [{
"date": "2026-08-12",
"name": "BTCUSD-prices-2026-08-12.csv.gz",
"asset": "BTC",
"dataset": "prices",
"interval": null,
"bytes": 1655751,
"sha256": "a8b4f866772578e4…",
"url": "https://outcometick.com/v1/dl/2026-08-12/BTCUSD-prices-2026-08-12.csv.gz"
}]
}GET /v1/dl/:date/:name — Download one file
Answers 302 to a short-lived object-storage URL (valid 15 minutes). Use curl -L, or any client that follows redirects.
When something goes wrong
| 401 | Read the body — the two cases mean opposite things. missing API key: the request carried no credential at all. The header must be named Authorization and its value must begin with Bearer (apikey:, X-API-Key:, or the bare key without Bearer all land here). invalid or expired API key: wrong key, revoked key, or a lapsed subscription. Do not mistake the first for the second — re-issuing the key will not change anything. |
| 403 | The body reads date outside subscription coverage or from is outside your coverage: that day is outside your range. The floor field is the earliest date you can request and ceiling the latest — take them from the response rather than working out your tier window. |
| 404 | The body reads file not found in your scope: either the file does not exist for that day, or it is not part of your tier (e.g. a Polymarket plan asking for a Predict.fun file). List /v1/files for the day to see what is actually there. |
| 200 with an empty files array | Filters too narrow or misspelled. Drop a filter, or check /v1/meta for the valid values. A common one: adding interval makes prices / twap30s / twap60s disappear — they have no interval, so ask for interval=5m,none. |
| 429 | Too many requests — back off and retry. |
| 5xx | Temporary; retrying is safe. |
Not covered above? ask in the support group on Telegram