变更日志
每条都标注了「是否需要你动手」。 标「需要」的,不做会在某一天出问题;
标「不需要」的是纯增量,你不改代码也不会坏。
我方对枚举值的承诺:新增状态值会提前在这里登记。所以你的 default
分支应当按「未知」处理并告警,而不是假装认识它 —— 见各端点页的状态说明。
这份变更日志从 2026-08-12 开始维护。在此之前的变更没有逐条记录。
「余额不足」「报价过期」「该方向未启用」「地址校验和不对」这类合法的业务拒绝
此前走对外码目录的缺省分支,以 500 api_error 返回。现在逐条有明确的 4xx code。
需要你动手:如果你为此写过「对 500 也重试」的绕行代码,请拆掉并改成按 code 分支。
新增对外码 amount_out_of_range(金额超出产品区间)——
它与 limit_exceeded 的处置相反:那条是额度用完了要等,这条改个数就能过。
同时删掉了目录里 21 个零发射点的死键,并加了守卫
(内部码没登记、或登记了却没人发,提交期就红)。
GET /v1/cards/{id} · GET /v1/cards/{id}/transactions ·
GET /v1/earn/products/{id} · POST /v1/cards/{id}/replacements。
卡消费流水新增 direction 出参 —— amount 是绝对值,
只看金额的话一笔退款与一笔消费长得一模一样。
GET /v1/remittances/{id} 此前可能返回 pending_merchant_funds
(列表与下单口都折叠成 pending),且 source_amount 是未插小数点的
定点整数串 —— 同一笔单在两个端点上差 10^ledger_scale 倍。
需要你动手:如果你为「详情与列表金额对不上」写过换算,请拆掉。
现在两边都是十进制串并随行下发 ledger_scale。
GET /v1/merchant/custody 随行下发 ledger_scale
不需要动手对账用的两个数是定点整数串,此前不下发位数,而同一条线的
/v1/merchant/statements 一直下发 —— 商户在一个端点上能正确定标、
在另一个上只能猜。null 表示该资产已从目录下架(对账表会留历史行)。
此前 spec 里只有「方法 + 路径 + 一句话 + scope」,没有任何字段声明。
现在每个端点一页,含参数表、请求体字段、响应示例、三种语言的调用样例。
接口行为没有变化,变的只是文档。
新增 /errors 页,逐条写明含义与你该怎么处置(该重试的、
不能重试的、需要人介入的)。
需要你动手:如果你的实现里有「按 HTTP 状态码分支」的重试逻辑,
请改成按 code 分支。几个反直觉的:service_unavailable、
limit_exceeded、asset_not_allowed、state_invalid 都是 400 不是 5xx。
新增 /events 页,含事件体示例与投递语义。
需要你动手:目录里逐条标注了 data.id 的真实形态与
status_version 是否可用 —— 有 9 条事件的 status_version 恒为 0。
如果你写了「version 不大于当前值就跳过」的合并器,这 9 条只有第一条会生效。
在我方修好之前,请对这几条改用「按到达时间 + 回查确认」。
{ data, next_cursor, has_more }
不需要动手静态清单端点(如 GET /v1/transfers/recipient-types)也返回同一个信封,
你的通用翻页器不需要为它们开特例。
⚠ 一处例外尚未收口:GET /v1/balances 仍返回 { balances: [...] }。
端点页上已标注,修好后会在这里登记。
按商户 × 桶计:入金上报 60/分钟、建会员 300/分钟、其余写 120/分钟、
读 1200/分钟。超出返回 429 + Retry-After。
需要你动手:把 429 当正常路径处理并按 Retry-After 退避。
收到 429 不代表你被封了。详见 限流。
此前「一个 2xx 就算全成功」:配了三个端点、一个通两个 500 时,
那两个永远不会重试而记录显示已送达。现在一行 = 一个(事件, 端点),
各自退避;新增 no_subscriber 一档(零行看起来像「还没有事件」而不是「坏了」)。