文档

有了 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 — with no date filter you get the newest day your key reaches
curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?asset=btc&dataset=prices"

# 4. download it — every file in that listing carries its own url
URL=$(curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?asset=btc&dataset=prices" \
  | jq -er '.files[0].url')

curl -L -H "Authorization: Bearer $OT_KEY" "$URL" -o btc-prices.csv.gz

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

在 Python 里一行读入

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

import pandas as pd, requests

KEY  = "ck_a1b2c3d4e5f6.xxxxxxxxxxxxxxxxxxxxxxxx"
auth = {"Authorization": f"Bearer {KEY}"}

r = requests.get("https://outcometick.com/v1/files", headers=auth,
                 params={"asset": "btc", "dataset": "prices"})

# the download endpoint also takes ?api_key=, for clients that cannot set a header
df = pd.read_csv(r.json()["files"][0]["url"] + "?api_key=" + KEY)
print(df.head())

不想先把文件下下来?同一份归档可以在密闭沙箱里直接对策略重放,成交按当时真实的盘口深度撮合——见 策略 SDK 参考

常见任务

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

所有筛选条件都可选。date 只要一天;要范围就用 from / to。下面的例子都不写死日期,而是从 /v1/meta 读——它返回的正是你这把 key 够得到的窗口。

# the newest day your key reaches
DAY=$(curl -s -H "Authorization: Bearer $OT_KEY" \
  https://outcometick.com/v1/meta | jq -r .lastDay)

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

5 分钟市场的全套数据:盘口 + 结算流

结算流(prices / twap30s / twap60s)是连续的,本身没有周期,所以 interval=5m 不含它们。加上 none 才能一次拿全——判定 5 分钟市场的输赢要用 twap60s,光有盘口不够。

DAY=$(curl -s -H "Authorization: Bearer $OT_KEY" \
  https://outcometick.com/v1/meta | jq -r .lastDay)

# everything a 5-minute market needs: the 5m slices AND the settlement streams
curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?date=$DAY&asset=btc&interval=5m,none"

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

每个文件都带 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"

# 30 days back from the newest day you can reach, clamped to the oldest —
# one call covers at most 92 days, and your window may be shorter than either
read -r FROM TO < <(curl -s -H "Authorization: Bearer $OT_KEY" \
  https://outcometick.com/v1/meta \
  | jq -r '((.lastDay | strptime("%Y-%m-%d") | mktime) - 29*86400
            | strftime("%Y-%m-%d")) as $back
           | "\(if $back < .firstDay then .firstDay else $back end) \(.lastDay)"')

curl -s -H "Authorization: Bearer $OT_KEY" \
  "https://outcometick.com/v1/files?asset=btc&dataset=prices&from=$FROM&to=$TO" \
| 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
from datetime import date, timedelta

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

meta  = requests.get(f"{BASE}/v1/meta", headers=auth).json()
last  = date.fromisoformat(meta["lastDay"])
first = max(date.fromisoformat(meta["firstDay"]), last - timedelta(days=6))

# every 1-minute kline for BTC over the last week your key reaches
r = requests.get(f"{BASE}/v1/files", headers=auth, params={
    "asset": "btc", "dataset": "klines", "interval": "1m",
    "from": first.isoformat(), "to": last.isoformat(),
})
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")

参考

数据下载接口文档全部筛选参数、两种返回结构,以及每个状态码到底是什么意思。
字段规格逐数据集、逐平台的列与字段。两个平台并不共用一套。
市场怎么判定输赢由哪条流决定结果,以及怎么自己重算一遍。
取消订阅用付款邮箱登录 Stripe 客户门户。取消在已付周期结束时生效,到期前 key 照常可用;换卡、下载发票也在那里。区间买断和稳定币付款是一次性的,不需要取消。