API_SPEC.md Base URL: https://api.example.com/api/v1
The English specification is still being translated, so the Chinese original is shown below. Endpoint names, field names and examples are authoritative.

FastTick 行情分发接口协议规范 (API Specification)

本文档面向接入 FastTick 行情分发系统的下游商业客户、量化交易员及技术团队。协议版本 v1。


1. 通用约定

项目 约定
基础地址 REST:https://api.example.com/api/v1;WebSocket:wss://api.example.com/ws/v1
时间戳 除 K 线的 open_time 为 UTC 秒外,其余一律为 UTC 毫秒
价格与数量 字符串,已按品种精度格式化(如 "67520.50"),客户端不要用浮点解析后再格式化
涨跌幅 change_24h 为百分比,带符号的字符串,"+1.65" 表示上涨 1.65%
字符编码 UTF-8
数据格式 默认 JSON;可通过 ?format=msgpack(REST)或鉴权帧 "format":"msgpack"(WS)切换为 MessagePack,字段名与结构和 JSON 完全相同
版本与弃用 路径带版本号 /v1。接口变更不破坏兼容;必须破坏时发布 /v2,旧版本至少保留 90 天,并在响应头返回 Sunset 日期

1.1 每次响应都携带的字段

{
  "code": 0,
  "msg": "success",
  "data": {},
  "request_id": "6f1c2a9e-7d4b-4a1e-9c2f-1b3d5e7a9c01",
  "timestamp": 1700000000123
}

request_id 用于排查问题,客户反馈时请提供。

1.2 限流响应头

所有 REST 响应都带有:

响应头 说明
X-RateLimit-Limit 套餐的 QPS 上限
X-RateLimit-Remaining 当前这一秒剩余可用次数
X-RateLimit-Reset 配额重置的毫秒时间戳
Retry-After 仅 429 时返回,建议等待的秒数

限流按订阅统计(同一订阅下的所有 Token 共享套餐配额)。


2. 认证鉴权:Token 接入

2.1 凭证体系

购买套餐后,客户只拿到一个 Token,直接在请求里使用,没有换取步骤:

项目 说明
形态 不透明随机字符串,形如 ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2
有效期 不设过期时间,长期有效,直到被吊销或所属订阅终止
用途 请求行情接口、资讯接口,或建立 WebSocket 连接
数量 每个订阅可创建多个 Token(如生产、测试各一个),数量受套餐限制
获取 购买成功后在控制台「接入凭证」中查看、复制;也可随时重置

为什么 Token 不设过期时间:行情接入是长期运行的服务端程序,让客户每隔几小时刷新一次凭证,会显著增加对接成本,而且客户往往把凭证写死在配置里,定时刷新反而更容易写错。因此 FastTick 采用「凭证长期有效 + 服务端实时控制」的模式:能不能用,不取决于 Token 自身的有效期,而取决于它所属订阅的当前状态。

代价是 Token 一旦泄露就是长期有效,所以必须配合 2.6 节的重置、白名单与告警机制。

2.2 获取 Token

  1. 支付成功、订阅开通后,系统自动生成一个名为 default 的 Token,并邮件通知客户到控制台查看。
  2. 客户在控制台「接入凭证」页面可以随时查看完整 Token(需要两步验证),支持一键复制。
  3. 客户也可以为不同用途创建多个 Token 并分别命名。

Token 属于订阅,订阅终止后全部 Token 同时失效。

2.3 使用 Token 访问 REST

GET /api/v1/ticker?symbol=BTC/USDT HTTP/1.1
Host: api.example.com
Authorization: Bearer ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2

也可以是专门的请求头(二选一):

X-API-Token: ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2
  • 只接受请求头传递。不支持 ?token=、?apikey= 等 URL 参数,出现即返回 401,避免凭证进入网关日志和浏览器历史。
  • Token 错误时统一返回 token_invalid,不区分"不存在"与"已删除",避免被用于探测。

权限范围(scopes)分为两条独立产品线,令牌上可以同时签入,但每个接口只认自己那一个:

scope 覆盖接口 说明
ticker /api/v1/ticker、/api/v1/tickers、/api/v1/symbols 实时快照
kline /api/v1/klines 历史与实时 K 线
depth /api/v1/depth、WS depth 流 L2 盘口,套餐需 depth_levels > 0
news /api/v1/news/flash、WS 无 7x24 快讯,套餐需 news_enabled = 1
calendar /api/v1/news/calendar 财经日历,套餐需 calendar_enabled = 1

资讯类 scope 与行情类 scope 互不影响:

  • 只买行情的套餐只能签 ticker / kline / depth,打资讯接口返回 403 scope_not_allowed;
  • 只买资讯的套餐只能签 news / calendar,打行情接口同样 403;
  • 同一订阅可签发多个 Token(如「生产行情」「内部资讯」分开),各自最小授权。

两层判定:接口权限 = Token 上的 scope 且 订阅快照里的套餐开关。套餐降级或后台关闭资讯后,旧 Token 上残留的 news/calendar 立即失效(403 scope_not_allowed),无需客户重置 Token。

2.4 WebSocket 接入

连接 wss://api.example.com/ws/v1 后,在 5 秒内发送鉴权帧,否则服务端以 4001 关闭:

{
  "action": "auth",
  "token": "ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2",
  "format": "json"
}

服务端确认:

{
  "event": "auth",
  "code": 0,
  "msg": "Authenticated",
  "subscription_id": 88,
  "plan": "forex_pro",
  "scopes": ["ticker", "kline", "depth"],
  "subscription_expire_time": 1798761600000,
  "seq_epoch": 1792800000000
}

subscription_expire_time 是订阅到期时间,仅供客户端展示和提前提醒,服务端不依赖客户端遵守它。

seq_epoch 表示本条连接上的序列号从该值开始计数,客户端可用它识别连接是否重建。

2.5 到期与停用控制

这是「Token 不设过期」能够成立的关键。控制分四层,任何一层生效都能停止服务。

第一层:每个请求都校验订阅状态

引擎不在每个请求上查库,而是在本地内存中维护一份凭证状态表:

token_hash → { subscription_id, status, expire_time, grace_endtime, scopes, ip_whitelist, version }

校验链(全部在内存中完成,无网络往返):

  1. Token 格式合法 → 否则 401 token_invalid
  2. 哈希命中状态表 → 未命中则 401 token_invalid(可能是已删除或从未存在)
  3. 状态为 normal → 为 disabled 则 401 token_disabled
  4. now < expire_time + grace → 否则 402 subscription_expired
  5. 订阅状态属于 trial / active / grace → 否则 402 subscription_expired
  6. scopes 包含本次所需权限 → 否则 403 scope_not_allowed
  7. IP 在白名单内 → 否则 403 ip_not_allowed

第二层:订阅到期时主动断开已建立的连接

引擎加载凭证时已经知道 expire_time,因此为每个订阅在本地注册一个到期定时器:

  • 到达 expire_time:进入宽限期(默认 24 小时),期间正常服务,但推送帧中带 expiring: true,提示客户端续费。
  • 到达 grace_endtime:立即执行
    • 该订阅下所有 WebSocket 连接以 4004 关闭
    • 该订阅下所有 Token 从状态表中标记为过期,之后任何 REST 请求返回 402
  • 这一步不依赖 phpback 通知,也不依赖数据库可用性,即使业务库暂时不可用,到期也会在秒级内准时生效。

第三层:后台操作即时生效(事件驱动)

客户续费、升级、退款、被后台停用时,phpback 在事务提交后向 Redis 发布变更:

{"type": "subscription", "subscription_id": 88, "op": "upsert", "version": 1793059200123}

引擎收到后立即更新状态表。需要立刻断开的场景(停用、退款终止、重置 Token)会附带 op: "revoke",引擎在收到后立即断开对应连接,延迟通常在 100 毫秒以内。

第四层:兜底轮询

Redis Pub/Sub 不保证送达(节点重启、网络抖动期间的消息会丢),因此引擎另外每 30 秒按 updatetime 增量拉取一次变更,并用全局 config_version 比对。任何一层遗漏都会在 30 秒内被纠正。

整体时效

事件 生效延迟 说明
订阅自然到期 ≤ 1 秒 本地定时器,最可靠
后台停用 / 退款终止 / 重置 Token ≤ 100 毫秒 Redis 通知
通知丢失时的纠正 ≤ 30 秒 兜底轮询
续费后恢复服务 ≤ 100 毫秒 同上

边界情况

情况 处理
引擎节点与 Redis 同时失联 状态表仍按本地 expire_time 正常到期,服务不会超期提供数据
引擎刚启动、状态表尚未加载完成 先全量加载再开放流量;加载完成前返回 503,不会放行
客户修改本机时间 无影响,时间判断全部在服务端
客户在到期前一刻建立连接 连接建立后仍受本地定时器约束,到期照样断开
续费发生在宽限期内 恢复为 active,已断开的连接需客户端重连,无需更换 Token

2.6 重置、吊销与安全

因为 Token 长期有效,泄露后的处置必须简单可靠:

操作 效果 建议场景
重置 Token 生成新 Token,旧 Token 立即失效(递增 token_version) 怀疑泄露、员工离职、更换对接程序
停用 Token 保留记录但停止使用,可随时恢复 临时下线某个环境
删除 Token 记录软删除,立即失效 清理不再使用的凭证
订阅终止 该订阅下所有 Token 失效 退款、封禁

其他安全措施

  • IP 白名单:Token 可绑定单个 IP 或 CIDR 网段,非白名单来源直接 403。
  • 域名白名单(可选):如果客户要在浏览器里直连 WebSocket,可绑定来源域名,服务端校验 Origin 头,降低 Token 被复制到其他网站的风险。但仍然强烈建议 Token 只放服务端,因为长期 Token 放进前端等于对所有人公开。
  • 异常使用告警:同一 Token 在短时间内出现多个地理位置、或调用量突增时,控制台与后台都会显示风险提示,并可一键停用。
  • 查看完整 Token 需要两步验证,避免后台账号被盗后直接获取凭证。
  • 日志脱敏:FastTick 自己的访问日志只记录 Token 前 12 位(如 ft_live_9f2c…),不记录完整值。

Token 长度固定为 40 字符:ft_live_(8 字符)+ 16 字节随机值的 32 位小写十六进制。其他文档中的示例若与此不一致,以本节为准。

泄露后的标准处置(文档中会提供给客户的应急步骤):

  1. 控制台重置 Token,旧 Token 立即失效;
  2. 检查用量与在线连接记录,确认是否有异常调用;
  3. 绑定 IP 白名单,缩小可用范围;
  4. 如产生超额调用,按服务协议处理。

2.7 鉴权失败

{
  "code": 401,
  "msg": "Unauthorized: token invalid",
  "reason": "token_invalid",
  "data": null,
  "request_id": "…",
  "timestamp": 1700000000000
}
reason code 含义 处理建议
token_missing 401 未携带 Token 补充请求头或 auth 帧
token_invalid 401 Token 不存在、已删除或格式错误 到控制台核对并复制完整 Token
token_disabled 401 Token 被停用 启用或重置 Token
subscription_expired 402 订阅已过期、宽限期结束或已停用 续费后即可恢复,无需更换 Token
ip_not_allowed 403 IP 不在白名单 检查白名单与出口 IP
symbol_not_allowed 403 套餐不含该品种 检查套餐权益
scope_not_allowed 403 Token 权限范围不含该接口;或套餐未开通快讯/日历 检查 Token scopes 与套餐权益(news_enabled / calendar_enabled)
rate_limited 429 超过 QPS 参考 Retry-After

注意 subscription_expired 与凭证无关:客户续费后,原来的 Token 立刻恢复可用,不需要重新生成,这是长期 Token 方案的重要体验优势。


3. HTTP REST API

3.1 单个品种实时快照

GET /api/v1/ticker?symbol=BTC/USDT

{
  "code": 0,
  "msg": "success",
  "data": {
    "symbol": "BTC/USDT",
    "category": "crypto",
    "digits": 2,
    "bid": "67520.50",
    "ask": "67521.10",
    "last": "67520.80",
    "bid_size": "2.40",
    "ask_size": "1.85",
    "volume_24h": "12845.62",
    "high_24h": "68100.00",
    "low_24h": "66400.00",
    "change_24h": "+1.65",
    "source": "binance",
    "ts": 1700000000123,
    "server_ts": 1700000000125,
    "stale": false,
    "seq": 918273645
  },
  "request_id": "…",
  "timestamp": 1700000000126
}
字段 说明
digits 价格小数位,客户端据此自行格式化(接口已格式化为字符串,此字段供客户端做计算用)
ts 该笔行情在上游的产生时间。注意口径:快照由多路流合并而成,ts 取「最近一笔有交易所时间戳的更新」(成交/统计),而 bid/ask 来自不带上游时间戳的盘口流,其接收时间记在 server_ts。因此对成交稀疏的品种,server_ts - ts 会显著大于真实链路延迟,不要用它做延迟监控,判断数据新鲜度请用 stale
server_ts FastTick 收到并处理最新一次更新(任意流)的时间
stale 上游超过阈值无更新时为 true,此时字段仍是最后一次有效价格,客户端应据此提示“行情延迟/暂停”,不要当成实时价
seq 该品种的全局递增序列号,用于发现丢帧

3.2 批量快照

GET /api/v1/tickers?symbols=BTC/USDT,ETH/USDT,EUR/USD&compact=1

  • symbols 省略时返回套餐权限内的全部品种。
  • compact=1 时只返回 symbol、bid、ask、last、ts、stale、seq,用于行情列表页。
  • 响应为 data: [ … ] 数组,单个品种的字段与 3.1 相同。
  • 单次请求最多 200 个品种,超出返回 400。

3.3 L2 深度

GET /api/v1/depth?symbol=BTC/USDT&limit=10

{
  "code": 0,
  "msg": "success",
  "data": {
    "symbol": "BTC/USDT",
    "bids": [["67520.50", "1.520"], ["67519.80", "2.100"]],
    "asks": [["67521.10", "0.950"], ["67522.00", "3.240"]],
    "ts": 1700000000123,
    "stale": false,
    "last_update_id": 88213
  }
}
  • limit 默认 10,最大 50,同时受套餐 depth_levels 限制(套餐无深度权益时返回 403)。
  • 数组元素为 [价格, 数量],均为字符串。
  • 深度数据依赖上游提供 L2,并非所有品种都有;无深度数据的品种返回 404。

3.4 K 线(历史与实时)

GET /api/v1/klines?symbol=BTC/USDT&interval=1m&limit=100&end_time=1700000000000

参数 必填 说明
symbol 是 标准品种代码
interval 是 1m 5m 15m 30m 1h 4h 1d
limit 否 返回根数,默认 100,最大 1000
end_time 否 毫秒时间戳,返回该时间及之前的 K 线;省略时返回最新的 limit 根。向前翻页时传入上一页最早一根的 open_time
{
  "code": 0,
  "msg": "success",
  "data": {
    "symbol": "BTC/USDT",
    "interval": "1m",
    "digits": 2,
    "bars": [
      {
        "open_time": 1700000000,
        "open": "67500.00",
        "high": "67530.00",
        "low": "67490.00",
        "close": "67520.50",
        "volume": "12.8400",
        "tick_count": 214,
        "closed": true
      }
    ]
  },
  "request_id": "…",
  "timestamp": 1700000001000
}
  • open_time 为 UTC 秒,即该 K 线的开盘时间;4h、1d 按品种所属市场的交易日起点对齐,因此不一定是 14400 或 86400 的整数倍。
  • K 线按 open_time 升序返回。
  • closed 为 false 表示这是当前尚未收盘的 K 线(从内存实时合成,不经数据库)。
  • 历史深度受套餐 history_days 限制,超出范围返回 400 并在 msg 中说明可查询的最早时间。
  • 周期 4h 和 1d 在部分套餐中不可用,见定价页;套餐的 allowed_intervals 为空表示全部周期可用。

3.5 品种列表

GET /api/v1/symbols?category=forex

{
  "code": 0,
  "msg": "success",
  "data": [
    {
      "symbol": "EUR/USD",
      "category": "forex",
      "display_name": "Euro / US Dollar",
      "digits": 5,
      "volume_digits": 0,
      "intervals": ["1m", "5m", "15m", "30m", "1h", "4h", "1d"],
      "has_depth": true
    }
  ]
}

只返回当前套餐权限内的品种。此接口的 QPS 与其他接口共享套餐配额。

3.6 资讯:7x24 快讯

GET /api/v1/news/flash?lang=zh-cn&limit=20&before_time=1700000000

需要 scope news。lang 只支持 zh-cn / en;limit 上限 200,同时受套餐 news_max_limit 收紧;before_time 用于翻页。

{
  "code": 0,
  "msg": "success",
  "data": {
    "lang": "zh-cn",
    "items": [
      {"id": 1002433844, "time": 1793288641, "title": "…", "content": "…", "important": false, "tags": []}
    ],
    "updated_at": 1793288641,
    "stale": false,
    "count": 20
  },
  "request_id": "…",
  "timestamp": 1793288641000
}

stale=true 表示上游超过 5 分钟没有新内容,前端应提示"延迟",不要当成实时流。

3.7 资讯:财经日历

GET /api/v1/news/calendar?lang=zh-cn&start=2026-10-01&end=2026-10-31&tabs=4

需要 scope calendar。start / end 为 YYYY-MM-DD,区间不超过 31 天;tabs 只支持 2,3,4,5,6。

{
  "code": 0,
  "msg": "success",
  "data": {
    "lang": "zh-cn",
    "days": [
      {"date": "2026-10-29", "items": [{"id": "…", "time": "20:30", "title": "…", "importance": 3, "actual": "", "forecast": "…", "previous": "…"}]}
    ],
    "updated_at": 1793288635,
    "stale": false,
    "count": 38
  }
}

资讯接口同样共享套餐 QPS:资讯与行情合计扣减同一个令牌桶,429 与 X-RateLimit-* 响应头口径和行情接口一致。

冷启动(进程刚启动、首轮抓取未完成)返回 503,客户端应退避重试,不要当成"没有数据"。

3.8 资讯:服务状态

GET /api/v1/news/status

运维接口:内部网关 Token,或任意持有 news / calendar 的客户 Token 可读。返回各语言的快讯/日历条数、最近更新时间与各条抓取线路的健康度。


4. WebSocket 实时分发

4.1 连接与鉴权

wss://api.example.com/ws/v1

流程:连接 → 5 秒内发送 auth 帧(见 2.4)→ 收到 auth 确认 → 发送 subscribe。

Token 长期有效,连接建立后不需要定期更换凭证。订阅到期时服务端会主动以 4004 关闭连接。

4.2 客户端指令

所有指令都带 id,服务端回复会原样带回,便于匹配请求与响应。

订阅

{
  "action": "subscribe",
  "id": "req-1001",
  "symbols": ["BTC/USDT", "ETH/USDT", "EUR/USD"],
  "streams": ["ticker", "kline"],
  "interval": "1m"
}
字段 说明
symbols 本次订阅的品种;单连接累计订阅数受套餐 max_sub_symbols 限制
streams 可订阅 ticker(默认)、depth、kline
interval 仅 kline 流使用
{
  "event": "subscribe",
  "id": "req-1001",
  "code": 0,
  "msg": "Subscribed successfully",
  "subscribed": ["BTC/USDT", "ETH/USDT", "EUR/USD"],
  "rejected": [{"symbol": "XAU/USD", "code": 403, "msg": "not allowed by plan"}]
}
  • 订阅成功后,服务端会立即为每个品种推送一次当前快照(snapshot: true),随后是增量推送。客户端不必再调用 REST 初始化。
  • 部分品种无权限时,其余品种照常订阅,被拒绝的放在 rejected 中。

取消订阅

{ "action": "unsubscribe", "id": "req-1002", "symbols": ["ETH/USDT"] }

查询当前订阅

{ "action": "list", "id": "req-1003" }

心跳

{ "action": "ping", "timestamp": 1700000000123 }
{ "event": "pong", "timestamp": 1700000000124 }
  • 客户端应在 30 秒内至少发送一次 ping 或任意指令;超过 60 秒无任何数据交互,服务端以 4008 关闭。
  • 浏览器无法发送原生 ping 帧,因此业务层 ping 是必需的。
  • 服务端也会定期发送协议层 Ping,客户端库通常会自动回复 Pong。

4.3 行情推送帧

Ticker

{
  "stream": "ticker",
  "symbol": "BTC/USDT",
  "snapshot": false,
  "seq": 918273646,
  "data": {
    "symbol": "BTC/USDT",
    "digits": 2,
    "bid": "67520.50",
    "ask": "67521.10",
    "last": "67520.80",
    "bid_size": "2.40",
    "ask_size": "1.85",
    "volume_24h": "12845.62",
    "high_24h": "68100.00",
    "low_24h": "66400.00",
    "change_24h": "+1.65",
    "source": "binance",
    "ts": 1700000000123,
    "server_ts": 1700000000125,
    "stale": false,
    "expiring": false
  }
}

expiring 为 true 表示该订阅已过期并处于宽限期,服务即将停止。客户端收到后应提示客户续费;宽限期结束后连接会被以 4004 关闭。该字段只出现在订阅进入宽限期期间,正常情况恒为 false。

序列号(seq)规则:seq 是每个品种的全局递增整数,与连接无关。

  • 客户端发现 seq 不连续,说明中间有帧丢失(正常只会发生在慢客户端被合并的情况下)。
  • 丢失后应主动发一次 {"action":"subscribe","symbols":["BTC/USDT"]} 重新获取快照,或调用 REST 快照。
  • 服务端对慢客户端只保留每个品种的最新一帧,因此 seq 跳号是预期行为,不会影响价格正确性,但会丢掉中间的 tick。

K 线推送(订阅 kline 流时)

{
  "stream": "kline",
  "symbol": "BTC/USDT",
  "interval": "1m",
  "seq": 918273647,
  "data": {
    "open_time": 1700000000,
    "open": "67500.00",
    "high": "67530.00",
    "low": "67490.00",
    "close": "67520.50",
    "volume": "12.8400",
    "tick_count": 214,
    "closed": false
  }
}
  • 未收盘的 K 线按套餐 push_interval_ms 节流推送;收盘时推送一次 closed: true 的最终值,此后该 open_time 不再推送。

深度推送(订阅 depth 流时,需要套餐含深度权益)

{
  "stream": "depth",
  "symbol": "BTC/USDT",
  "seq": 918273648,
  "data": {
    "bids": [["67520.50", "1.520"]],
    "asks": [["67521.10", "0.950"]],
    "last_update_id": 88214,
    "ts": 1700000000123,
    "stale": false
  }
}

深度为全量快照推送(不做增量),档数等于套餐的 depth_levels。

4.4 服务端错误帧

{
  "event": "error",
  "id": "req-1004",
  "code": 429,
  "msg": "rate limit exceeded",
  "timestamp": 1700000000124
}

业务错误(如订阅超限)返回错误帧后连接保持不断开;严重错误才关闭连接。

4.5 关闭码

关闭码 含义 客户端处理
1000 正常关闭 无需重连
4001 5 秒内未完成鉴权 / Token 无效 到控制台核对 Token 后重连
4002 鉴权后 Token 被停用、删除或重置 停止重连,到控制台查看凭证状态
4003 IP 不在白名单 停止重连,检查出口 IP
4004 订阅已过期或已停用 停止重连,续费后重连(Token 不用换)
4008 心跳超时 立即重连,并确保按时发 ping
4029 超出套餐并发连接数 关闭冗余连接后再重连
1011 服务端内部错误 指数退避重连

重连建议:4001~4004 属于凭证或权限问题,不要盲目重连,应先到控制台核实;4008、1011 使用指数退避(1s、2s、4s…上限 30s),并带随机抖动。4004 在客户续费后即可重连成功,无需更换 Token。


5. 状态码与异常

5.1 HTTP 状态码

HTTP 状态 说明
200 请求已处理,业务结果看响应体里的 code
400 参数错误
401 未认证(Token 缺失、无效、已停用或已重置)
403 无权限(IP、品种、深度、周期)
404 品种不存在或无该数据
429 超出 QPS
500 / 502 / 503 服务端异常,请带 request_id 联系客服

5.2 业务错误码(响应体 code)

code 含义 处理建议
0 成功 正常处理
400 参数错误(品种不存在、周期不支持、limit 超限、超出历史天数) 按 msg 修正参数
401 Token 缺失、无效、已停用或已重置(具体看 reason) 到控制台核对 Token;见 2.7
402 订阅已过期或已停用 在客户控制台续费,或联系客服
403 IP 被拒绝 / 套餐无该品种、深度、周期权限 / scope 不足 检查白名单与套餐权益
404 品种不存在 用 /symbols 确认可用品种
429 超过套餐 QPS 降低频次,参考 Retry-After
430 WS 并发连接数超限 关闭冗余连接或升级套餐
500 服务端错误 带 request_id 联系客服

5.3 数据质量约定

项目 约定
时间戳 一律 UTC,客户端负责转换本地时区
汇率/外汇周末 休市期间无 Tick,stale 为 true,K 线不生成空 bar(与 MT4/MT5 一致)
深度 仅部分品种提供;依赖上游 L2 数据
24 小时字段 volume_24h、high_24h、low_24h、change_24h 基于滚动 24 小时计算,外汇为最近 24 个交易小时
数据修正 若上游出现异常数据,FastTick 会重算受影响的 K 线。客户端如发现历史 K 线变化,属于修正而非错误