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,直接拿去下载即可。
| 筛选参数(都可选) | |
|---|---|
| asset | btc / eth / … 逗号分隔可多选,如 asset=btc,eth |
| dataset | prices / twap30s / twap60s / book / price_change / last_trade_price / markets / klines |
| interval | 市场类用 5m、15m;K 线用 1m、1h、1d 等 |
| venue | polymarket / 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 或任何会自动跟随跳转的客户端。
遇到问题
| 401 | key 不对、已吊销,或订阅过期了。先用第 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,不要按日期推——同一天里两种市场是并存的。
帧是按收到的样子存的
乱序也照存,我们不在归档期做重排。要按时间顺序处理,请在查询时自己排序。断档同样不隐藏,付费数据集附带每日覆盖报告。