Friends Data API独立数据服务

FRIENDS DATA API · V1

开发者文档 / 从第一条请求到 Agent 接入

按成熟 API 平台的阅读顺序组织:快速开始、认证、端点、分页、PIT、错误、SDK、CLI、MCP、Codex 和 Claude Code。数据含义与逐表字段单独放在数据字典。

7只读端点
294公开数据集
7443字段条目
7MCP 工具
v1稳定主版本

OVERVIEW

一个独立、只读的数据边界

HTTPS ONLY

Base URL 是 https://api.alphahubs.uk。Friends Data API 只借用 alphahubs.uk 域名,不复用 AlphaHub 账号、Cookie、会话或数据权限。浏览器登录负责管理 Key,程序只用 Bearer Key 调用七个公开端点。

“七个端点 / 七个 MCP 工具”不等于只有七张表:HTTP 通用 rows、Python get_dataset_rows、CLI get-dataset-rows 和 MCP get_dataset_rows 都能读取同一份 294 数据集完整目录;另外几个方法只是常用行情和事件的便捷入口。

API 文档教你如何认证、请求、分页、重试和接入 Agent。
数据字典解释每张表是什么、能回答什么、粒度、时间、字段、关联和限制。
OpenAPI / JSON Schema供程序生成客户端、校验 HTTP 和读取机器数据契约。

QUICK START

60 秒发出第一条请求

READ ONLY
  1. 1
    白名单登录Owner 把 Google 邮箱加入白名单后即可登录;不需要密码、邀请或 Key 审批。
  2. 2
    创建命名 Key在控制台填写设备或用途名称。明文只显示一次,每个账号最多保留 5 把有效 Key。
  3. 3
    发送 Bearer 请求Authorization: Bearer $FRIENDS_DATA_API_KEY
TERMINAL
export FRIENDS_DATA_API_KEY="fds_live_…"

curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/catalog"

AUTHENTICATION

只支持 Bearer Key

所有 /api/v1/data/ 请求必须发送下面的 Header。Key 不放在 URL、请求体或 Cookie 中。

HTTP HEADER
Authorization: Bearer fds_live_…
  • 浏览器 session Cookie 不能调用数据 API。
  • API Key 不能登录网页或访问 Owner 页面。
  • Key 无效、已删除或所属账号被停用时返回 401。

KEY LIFECYCLE

创建、轮换与删除

  1. 命名:使用“MacBook Codex”“Claude Code”“研究脚本”等可识别名称。
  2. 保存:创建后立即复制;平台只保存摘要和前缀,不能再次显示明文。
  3. 轮换:先创建新 Key,更新程序并验证,再删除旧 Key,避免停机。
  4. 删除:删除立即生效且不可恢复;历史名称、前缀和用量仍可审计。
白名单登录

LIVE EXPLORER

直接验证真实 Key

仅页面内存

Key 不写 Cookie 或 localStorage。Explorer 只允许当前域名下的只读 /api/v1/data/ GET 请求。

等待请求
{
  "提示": "粘贴 Key 后发送;这里显示真实响应"
}

API REFERENCE

七个公开端点

每个端点都使用相同认证、成功响应和错误响应。未列出的路径或参数不会被转发。

7 endpoints
GET/api/v1/data/catalog数据目录

返回当前 Friends Key 可调用的数据集、筛选字段和分页能力。

该端点没有路径或查询参数。

返回
当前 Key 可见的数据集、filters、页大小、排序、Cursor 与 PIT 能力。
注意
程序应先调用它做能力发现;字段级说明请读数据字典 JSON。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/catalog"
GET/api/v1/data/datasets/{namespace}/{dataset}/rows通用数据集读取

读取目录内的数据集;大结果集使用响应中的 next_cursor 继续翻页。

参数位置类型必填说明
namespacepathstring是数据集命名空间,例如 market
datasetpathstring是数据集名称,例如 ohlcv_1d
startquerystring否含起点的日期或 UTC 时间边界
endquerystring否含终点的日期或 UTC 时间边界
limitqueryinteger 1–5000否单页行数;实际上限以 catalog 为准
orderqueryasc | desc否返回顺序;默认以 catalog 契约为准
cursorquerystring否上一页的 next_cursor,最长 4096 字符
catalog filtersqueryscalar否仅发送该 asset 在 catalog 声明的筛选项
返回
数据集业务行;meta.dataset 为 namespace.dataset。
注意
Cursor 绑定原查询,变更筛选、顺序或页大小后必须从第一页重新开始。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/datasets/ref/instrument/rows?limit=3"
GET/api/v1/data/instruments/search标的搜索

按代码或名称检索可用标的。

参数位置类型必填说明
qquerystring ≤60否股票代码或公司名称;空字符串返回默认候选
limitqueryinteger 1–50否最多返回条数,默认 12
返回
匹配的规范证券,包含 instrument_id、symbol、name 等可用字段。
注意
后续数据集支持 instrument_id 时优先使用该统一标识。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/instruments/search?q=AAPL&limit=5"
GET/api/v1/data/market/quotes最新行情

读取一个或多个标的的最新报价。

参数位置类型必填说明
symbolsquerycomma-separated是1–50 个代码;每个只允许 A-Z 0-9 . _ -,最长 20
返回
每个可解析标的的最新标准化报价。
注意
这是最新快照,不是历史时间序列;历史价格使用 candles 或 OHLCV 数据集。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/market/quotes?symbols=AAPL,MSFT"
GET/api/v1/data/market/candlesK 线

读取指定标的和周期的标准化 K 线。

参数位置类型必填说明
symbolquerystring是市场代码,字符规则同 quotes
timeframequery1H | 4H | 1D | 1W | 1M否K 线周期,默认 1D
limitqueryinteger 1–2000否返回条数,默认 360
返回
按时间排序的 OHLCV K 线。
注意
如需可复现的原始表读取或更多筛选,使用 market 数据集 rows。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/market/candles?symbol=AAPL&timeframe=1D&limit=20"
GET/api/v1/data/pit/{namespace}/{dataset}/rowsPoint-in-time 数据

按 as_of 边界读取可复现的 PIT 数据集。

参数位置类型必填说明
namespacepathstring是支持 PIT 的数据集命名空间
datasetpathstring是支持 PIT 的数据集名称
as_ofquerydate or UTC timestamp是只返回该时点前已经可知的版本
start / endquerystring否业务时间范围;与 as_of 的可知时间含义不同
limitqueryinteger 1–1000否单页行数
cursorquerystring否上一页的 next_cursor
instrument_id / code / marketqueryscalar否证券筛选,以 catalog 声明为准
metric / source / period / period_typequeryscalar否数据集专用筛选,以 catalog 声明为准
返回
以 as_of 为可知边界的可复现数据页。
注意
as_of 不等于 report_date;前者冻结信息可得性,后者是业务报告期。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/pit/fundamental/income_statement/rows?as_of=2026-08-01&code=AAPL&limit=10"
GET/api/v1/data/event-context/sec-earningsSEC 盈利事件上下文

读取经过 Friends 边界裁剪的 SEC earnings 事件上下文。

参数位置类型必填说明
event_ts_fromqueryUTC timestamp否事件时间含起点
event_ts_toqueryUTC timestamp否事件时间含终点
symbolquerystring ≤30否股票代码
sourcequerystring 1–40否事件来源
limitqueryinteger 1–1000否单页条数,默认 100
cursorquerystring否上一页的 next_cursor
返回
SEC earnings 相关的标准化事件上下文。
注意
固定按 event_ts DESC、source ASC、event_id ASC 稳定分页。
HTTP
curl --fail-with-body \
  -H "Authorization: Bearer $FRIENDS_DATA_API_KEY" \
  "https://api.alphahubs.uk/api/v1/data/event-context/sec-earnings?symbol=AAPL&limit=10"

DECISION MODEL DATA

决策模型数据

交易数据与决策模型数据共用 Friends Data API、同一把 API Key 和相同的响应信封。按十个分类浏览家族、产品与字段,再用通用 rows 端点读取。

decision_model/catalog
每个产品一行。可按 category、product、family 筛选;limit 最多 500。
decision_model/records
必填 product。可选 period_from、period_to、entity、scope、cursor;limit 最多 500。业务期间按字符串比较,具体口径见产品说明。

scope=all 默认读取全部可用快照;scope=latest 读取各来源最新快照。来源不支持该语义时返回 scope_unsupported。行中的 native 是原生对象,native_additions 是字段补充,resolution 标明原生、引用已解析或未解析原因。

CATALOG · HTTP GET
/api/v1/data/datasets/decision_model/catalog/rows?category=sports&limit=100

从目录取一个 productId,替换下面的 PRODUCT_ID;家族详情页提供已填好产品的示例。

RECORDS · HTTP GET
/api/v1/data/datasets/decision_model/records/rows?product=PRODUCT_ID&scope=all&limit=100

认证仍使用 Authorization: Bearer <你的 API Key>。响应有 next_cursor 时,用 cursor 继续翻页,保持产品、筛选条件和页大小一致。

SUCCESS ENVELOPE

每个 2xx 响应都长一样

STABLE
object
固定为 list
data
当前页的业务记录数组
has_more
是否还有下一页
next_cursor
下一页 opaque cursor;没有时为 null
request_id
定位本次调用;排障时必须保留
meta
dataset、count、as_of 与 timezone
200 RESPONSE
{
  "object": "list",
  "data": [{"instrument_id": 1, "symbol": "AAPL"}],
  "has_more": true,
  "next_cursor": "eyJ2IjoxLC…",
  "request_id": "req_01…",
  "meta": {
    "dataset": "ref.instrument",
    "count": 1,
    "as_of": "2026-08-13T00:21:09Z",
    "timezone": "UTC"
  }
}

PAGINATION

Cursor 分页

  1. 第一页不传 cursor。
  2. has_more=true 时读取 next_cursor。
  3. 下一次请求保持其他参数完全不变,只增加该 cursor。
  4. has_more=false 时结束。

Cursor 是不透明且绑定查询的令牌。不要解码、拼接、修改或跨数据集复用。

POINT IN TIME

回测时冻结“当时可知”

as_of 控制信息何时已经可知,start/end 控制业务数据日期。两者不是同一概念。

PIT EXAMPLE
GET /api/v1/data/pit/fundamental/income_statement/rows
    ?as_of=2026-08-01
    &code=AAPL
    &limit=100

只有数据字典标记 PIT 支持的表可以调用;普通 rows 不能被描述为无前视偏差快照。

ERRORS

稳定错误格式与状态码

JSON ONLY
HTTP典型 code怎么处理
400invalid_cursor修正业务参数或从第一页重新开始。
401unauthorized检查 Bearer Key 是否缺失、错误或已删除。
403forbidden当前 Key 无权读取该数据。
404not_found检查公开路径、namespace 和 dataset。
422invalid_parameter按 param 修正类型、范围或格式。
429rate_limit_exceeded等待 Retry-After,不要并发重试。
503dependency_unavailable仅在 retryable=true 时指数退避重试。
ERROR RESPONSE
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_cursor",
    "message": "cursor 无效或已损坏",
    "param": "cursor",
    "request_id": "req_01…",
    "docs_url": "https://api.alphahubs.uk/api/docs#errors",
    "retryable": false
  }
}

RATE LIMITS

限流、Header 与重试

X-RateLimit-Limit当前 Key 每分钟窗口的总额度。
X-RateLimit-Remaining当前窗口剩余额度。
X-RateLimit-Reset窗口重置时间。
Retry-After429 或可重试依赖错误的等待秒数。

通过 Key admission 的响应带 Key 级限流 Header。认证前的 IP 防滥用 429 不代表某把 Key 用尽,因此可能没有 Key 级 Header。客户端最多自动重试两次,并加入抖动。

PYTHON SDK

异步、类型化客户端

PEP 561
INSTALL
python3 -m venv .venv-friends
# 先按已发布的 artifact-manifest.json 校验摘要,再安装。
curl --fail -o /tmp/verify-install.sh \
  https://api.alphahubs.uk/static/downloads/verify_and_install_friends_artifact.sh
bash /tmp/verify-install.sh wheel 1.1.0 .venv-friends/bin/python
export FRIENDS_DATA_API_KEY="fds_live_…"
QUERY
import asyncio
from friends_data_api import FriendsDataClient, Settings

async def main():
    async with FriendsDataClient(Settings.from_env()) as client:
        page = await client.get_market_quotes(["AAPL", "MSFT"])
        print(page.data, page.request_id)

asyncio.run(main())

SDK 对应七个公开方法,保留完整成功/错误契约,并把网络、HTTP、响应校验错误统一为 FriendsDataError。

CLI

终端覆盖全部七种调用

FRIENDS-DATA
friends-data list-datasets
friends-data search-instruments --query "Apple" --limit 5
friends-data get-market-quotes AAPL MSFT
friends-data get-market-candles AAPL --timeframe 1D --limit 100
friends-data get-dataset-rows market ohlcv_1d \
  --filter instrument_id=1 --limit 100
friends-data get-point-in-time-rows fundamental income_statement \
  --as-of 2026-08-01 --filter instrument_id=1
friends-data get-sec-earnings-context --symbol AAPL --limit 20

CLI 把成功 envelope 输出到 stdout,把结构化错误输出到 stderr;错误退出码为 2,适合脚本和 Agent fallback。

MODEL CONTEXT PROTOCOL

七个只读 MCP 工具

MCP SDK V2
工具用途
list_datasets发现数据集、filters、上限和 PIT/Cursor 能力。
search_instruments把代码或名称解析为规范标的。
get_market_quotes获取一组标的最新行情。
get_market_candles获取标准周期 K 线。
get_dataset_rows读取普通数据集并分页。
get_point_in_time_rows按 as_of 读取可复现数据。
get_sec_earnings_context读取 SEC earnings 事件上下文。

所有工具声明为只读、非开放世界,只访问公开 HTTPS,不导入 AlphaHub 或内部 ClickHouse/Redis 客户端。

CODEX

连接 Codex CLI、桌面版与 IDE

STDIO MCP
  1. 1
    安装公开 wheel使用上方 Python 安装命令,记住虚拟环境的绝对路径。
  2. 2
    注册 MCPCodex CLI、桌面版和 IDE 共用同一份 MCP 配置。
  3. 3
    验证工具运行 codex mcp list,进入 Codex 后用 /mcp 查看七个工具。
CODEX MCP
export FRIENDS_DATA_API_KEY="fds_live_…"

codex mcp add friends-data \
  --env FRIENDS_DATA_API_KEY="$FRIENDS_DATA_API_KEY" \ 
  -- /absolute/path/.venv-friends/bin/friends-data-mcp

codex mcp list

测试问题:“先列出可用数据集,再查 AAPL 最近 20 根日线;报告 dataset、as_of、timezone、行数和 request_id。”

CLAUDE CODE

连接 Claude Code

USER SCOPE
  1. 1
    复用同一个 wheelFriends MCP server 与宿主无关,不需要 Claude 专用后端。
  2. 2
    按 user scope 注册让项目外也能使用;如只想在当前项目启用可改为 local scope。
  3. 3
    检查连接运行 claude mcp get friends-data 或在会话中执行 /mcp。
CLAUDE CODE MCP
export FRIENDS_DATA_API_KEY="fds_live_…"

claude mcp add --scope user \
  --env FRIENDS_DATA_API_KEY="$FRIENDS_DATA_API_KEY" \ 
  --transport stdio friends-data -- \
  /absolute/path/.venv-friends/bin/friends-data-mcp

claude mcp get friends-data

测试问题:“使用 Friends 数据工具查 AAPL 的规范 instrument_id,再读取可用的 PIT 基本面;不要猜字段。”

AGENT SKILL

给 Agent 一套可靠查询流程

Skill 不替代 MCP;它告诉 Agent 先发现目录、再解析标的、选择普通或 PIT、正确分页,并在答案中保留 provenance 与 request_id。

CODEX SKILL · ~/.agents/skills
mkdir -p ~/.agents/skills
# 校验摘要 + 原子替换;unzip -o 会就地覆盖正在使用的 Skill 目录。
curl --fail -o /tmp/verify-install.sh \
  https://api.alphahubs.uk/static/downloads/verify_and_install_friends_artifact.sh
bash /tmp/verify-install.sh skill 1.1.0 ~/.agents/skills
test -f ~/.agents/skills/query-friends-data/SKILL.md
CLAUDE CODE SKILL · ~/.claude/skills
mkdir -p ~/.claude/skills
# 校验摘要 + 原子替换;unzip -o 会就地覆盖正在使用的 Skill 目录。
curl --fail -o /tmp/verify-install.sh \
  https://api.alphahubs.uk/static/downloads/verify_and_install_friends_artifact.sh
bash /tmp/verify-install.sh skill 1.1.0 ~/.claude/skills
test -f ~/.claude/skills/query-friends-data/SKILL.md

Codex 可用 $query-friends-data 或 /skills;Claude Code 可用 /query-friends-data。如果 MCP 不可用,Skill 才回退到 friends-data CLI。

DATA CONTRACTS

数据字典、Catalog、OpenAPI 各管什么

入口用途权威范围
人类数据字典理解每张表、问题、粒度、时间、更新、关键字段、关联和限制。业务语义
GET /catalog运行时发现当前 Key 可调用的 asset、filters、limit、cursor 与 PIT。当前能力
字典索引 JSONAgent 和程序发现 294 表、7,443 字段及 11 个分片。数据发现
完整字典 JSON.gz一次下载全部字段、中文业务说明、关联、限制和调用示例。离线数据 Schema
字典 JSON Schema校验总索引、分片或解压后的完整字典。字典格式
OpenAPI 3.1生成 HTTP 客户端、查看七个端点和公共响应模型。HTTP 契约

有冲突时:能否调用以实时 catalog 为准,字段结构以版本化字典 JSON 为准,HTTP 参数与响应以 OpenAPI 为准。不要从字段名猜业务含义。

TIME & PROVENANCE

时间和来源口径

  • API envelope 的 meta.timezone 明确默认时区,通常为 UTC。
  • 具体表若使用市场时区,数据字典的 timeSemanticsCn 和 caveatsCn 会明确说明。
  • 保留 source、provider、publish_ts、ingested_at 等 provenance 字段。
  • 空 data 只代表该筛选没有行,不等于系统故障。

VERSIONING

兼容性策略

  • /api/v1 内只增加兼容字段或能力,不改变已有字段含义。
  • 破坏性 HTTP 变更使用新的主版本路径并提前公告。
  • Cursor 仅在生成它的查询契约内有效,不承诺跨主版本复用。
  • 下载物使用版本化文件名;更新后重新安装 wheel 或 Skill。

CHANGELOG

Catalog 2026.08.13 · API v1 · Dictionary 2.0

CURRENT · 兼容更新

这次是数据目录扩展,不是破坏性 API 升级。现有 Key、/api/v1 路径、响应 envelope、Python/CLI/MCP 命令继续有效;当前客户端与 Agent Skill 为 1.1.0,历史 1.0.0 下载仍保留。

指标原版本当前版本变化
公开金融数据集106294+169(+159.4%)
逐表字段条目2,6557,443+4,250(+160.1%)
唯一字段名未单列1,885首次完整统计
命名空间1112兼容保留
Cursor / PIT 数据集未单列196 / 9机器契约明确化
  • 白名单用户无需审批即可创建最多 5 把命名 API Key;明文一次显示,支持无停机轮换和删除历史。
  • 目录由 106 扩展到 294 个数据集,覆盖 A 股、盘中行情、实时与历史期权、基本面、资金流、持仓、新闻事件、宏观、加密与舆情。
  • 数据字典 2.0 发布 7,443 个字段的中文用途、粒度、时间、更新、关联、查询与限制,并提供 11 个命名空间分片和完整压缩下载。
  • 通用 rows / CLI / MCP 覆盖完整目录;quotes、candles、SEC context 只是便捷入口,不代表全部数据。
  • 补齐 Python、CLI、MCP、Codex、Claude Code 与双宿主 Skill 的可复制接入步骤。
  • 现有客户端无需改代码;缓存目录的调用方应刷新 catalog,wheel / Skill 用户建议从 1.0.0 升级到 1.1.0。
  • 本次不改 ClickHouse schema、权限、采集器、Redis、cron 或写入任务,只滚动替换无状态读取服务,无需停机维护。
  • 真实期权翻页验收发现并修复时区 continuation 问题;生产两页零重复。A 股已有日线、基本面、资金流和事件,但当前不宣称尚不存在的 A 股盘中源。
同一目录,六种接入。HTTP、Python、CLI、MCP、Codex 和 Claude Code 看到的是同一份 294 数据集目录;七个 endpoint / tool 是调用方式,不是数据表数量。