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)
assetbtc / eth / … comma-separated for several, e.g. asset=btc,eth
datasetprices / 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
interval5m 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
noneAny 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
venuepolymarket / predict
datea single day — same as from=to=that day
from / toa 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

401Read 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.
403The 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.
404The 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 arrayFilters 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.
429Too many requests — back off and retry.
5xxTemporary; retrying is safe.

Not covered above? ask in the support group on Telegram