outcome·tick

API

有了 API key 之后,三条命令就能把文件下到本地。下面第一段可以直接复制运行。

60 秒上手

把第 1 行的 key 换成你自己的(结账那一页显示过一次),其余原样粘进终端。

# 1. your key, from the page you saw right after paying
export OT_KEY="ck_a1b2c3d4e5f6.xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. what can I get?
curl -s -H "Authorization: Bearer $OT_KEY" \
  https://outcometick.com/v1/meta

# 3. find a file, then download it
curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?asset=btc&dataset=prices"

curl -L -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/dl/2026-08-12/BTCUSD-prices-2026-08-12.csv.gz" \
  -o BTCUSD-prices-2026-08-12.csv.gz

第 3 步的 -L 不能省:下载接口返回的是 302 跳转,指向对象存储上的短时效链接。文件直接从存储下发,不经过我们的服务器。

在 Python 里一行读入

pandas、DuckDB、wget 这类工具没法给 URL 加请求头,所以下载接口也接受 ?api_key=。注意:key 出现在 URL 里会进浏览器历史和代理日志,能用请求头的地方还是用请求头。

import pandas as pd

KEY = "ck_a1b2c3d4e5f6.xxxxxxxxxxxxxxxxxxxxxxxx"
df = pd.read_csv(
    "https://outcometick.com/v1/dl/2026-08-12/"
    "BTCUSD-prices-2026-08-12.csv.gz?api_key=" + KEY
)
print(df.head())

常见任务

某一天、某个币、某个周期的盘口

所有筛选条件都可选。date 只要一天;要范围就用 from / to。

# every BTC 5-minute order book for one day
curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?date=2026-08-12&asset=btc&interval=5m&dataset=book"

一整月的结算价,下完自动校验

每个文件都带 sha256,与归档 manifest 里的值一致。校验通过说明你拿到的与我们发布的完全一致,而不只是「传输没报错」。

#!/usr/bin/env bash
# a month of BTC settlement prices, downloaded and checksum-verified
set -euo pipefail
export OT_KEY="ck_a1b2c3d4e5f6.xxxxxxxxxxxxxxxxxxxxxxxx"

curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?asset=btc&dataset=prices&from=2026-07-14&to=2026-08-12" \
| jq -r '.files[] | "\(.url) \(.name) \(.sha256)"' \
| while read -r url name sha; do
    curl -sL -H "Authorization: Bearer $OT_KEY" "$url" -o "$name"
    echo "$sha  $name" | sha256sum -c -
  done

直接拼成一个 DataFrame

import pandas as pd, requests

KEY  = "ck_a1b2c3d4e5f6.xxxxxxxxxxxxxxxxxxxxxxxx"
BASE = "https://outcometick.com"
auth = {"Authorization": f"Bearer {KEY}"}

# every 1-minute kline for BTC over a week
r = requests.get(f"{BASE}/v1/files", headers=auth, params={
    "asset": "btc", "dataset": "klines", "interval": "1m",
    "from": "2026-08-06", "to": "2026-08-12",
})
files = r.json()["files"]

df = pd.concat(
    pd.read_csv(f["url"] + "?api_key=" + KEY) for f in files
).sort_values("ts_ms")
print(len(df), "rows")

三个接口

GET /v1/meta看看能拿什么

返回的维度已经按你的档位收窄了——买 Polymarket 档就看不到 Predict.fun 的东西。两个场子的币种也不一样(Polymarket 8 个,Predict.fun 3 个)。

{
  "firstDay": "2026-06-06", "lastDay": "2026-08-12", "days": 68,
  "venues":    ["polymarket"],
  "assets":    ["BNB","BTC","DOGE","ETH","HYPE","SOL","XRP","ZEC"],
  "intervals": ["1s","1m","3m","5m","15m","30m","1h","2h","4h","6h","8h","12h","1d","3d","1w","1mo"],
  "datasets":  { "prices": "…", "book": "…", "klines": "…" }
}

GET /v1/files按条件找文件

返回的每个文件都自带 url,直接拿去下载即可。

筛选参数(都可选)
assetbtc / eth / … 逗号分隔可多选,如 asset=btc,eth
datasetprices / twap30s / twap60s / book / price_change / last_trade_price / markets / klines
interval市场类用 5m、15m;K 线用 1m、1h、1d 等
venuepolymarket / predict
date只要某一天,等价于 from=to=该日
from / to日期范围,一次最多 92 天。都不填则取最新一天
{
  "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下载一个文件

返回 302,跳到对象存储的短时效链接(15 分钟内有效)。用 curl -L 或任何会自动跟随跳转的客户端。

遇到问题

401key 不对、已吊销,或订阅过期了。先用第 2 步那条 /v1/meta 试一下——它能通就说明 key 没问题。
403 date outside…这天超出了你的订阅范围。响应里的 floor 就是你能取到的最早日期——不用自己算档位窗口,以它为准。
404 file not found in your scope要么这天没有这个文件,要么它不属于你的档位(比如 Polymarket 档去取 Predict.fun 的文件)。先用 /v1/files 看看这天到底有什么。
files 返回空数组筛选条件太窄或拼错了。去掉几个条件再试,或者用 /v1/meta 看看有哪些合法取值。
429请求太密,退避后重试即可。
5xx临时故障,重试是安全的。

字段怎么读

feed_ts_ms事件时间:上游给这条报价打的时间戳(UTC 毫秒)
server_ts_ms上游服务端发出的时间
recv_ms我们收到的时间。三个分开存,从不合并——延迟链路你可以自己量
value浮点价格,查询方便用
full_accuracy_value同一个价格的定点整数串(1e18)。要重算输赢就用这个,别用 value
strike_value这一局的「要超越的价格」。无法诚实确定时为空,不会拿邻近 tick 猜
outcome_prices结算结果。["1","0"] 表示 Up 赢,["0","1"] 表示 Down 赢

两个必须知道的口径

结算规则 2026-08-07 变过

之前用瞬时 Chainlink 流判定,之后改用 TWAP 流(5 分钟市场用 30 秒回看,15 分钟用 60 秒)。判断该用哪条规则,要看这个市场自己的 raw.cryptoMarketConfig.twapEnabled,不要按日期推——同一天里两种市场是并存的。

帧是按收到的样子存的

乱序也照存,我们不在归档期做重排。要按时间顺序处理,请在查询时自己排序。断档同样不隐藏,付费数据集附带每日覆盖报告。