响应格式
所有端点都返回 application/json,编码为 UTF-8,与 Accept 请求头无关。带请求体的调用请发送 Content-Type: application/json。
两种结构,都是刻意的
Section titled “两种结构,都是刻意的”集合类端点把数据包在 data 里,单对象端点则把字段直接放在顶层。这不是疏漏,写解析器之前值得先知道:
{ "data": [ { "id": 47, "slug": "wavalid-realtime" } ] }{ "balance": "5.230000" }GET /v1/products 属于集合类;GET /v1/balance 和 GET /v1/api-key 属于单对象类。实时端点返回的是这次调用自身的对象——request_id、status、results——直接在顶层。
错误一律使用固定的两字段结构:
{ "code": "invalid_realtime_request", "message": "A realtime request cannot mix phone and email products."}| 字段 | 含义 |
|---|---|
code | 稳定的机器可读标识,请按它分支判断 |
message | 给人看的说明,措辞可能变化,不要解析它 |
各端点的 code 取值连同对应的 HTTP 状态码分别写在各页;完整清单见错误码。
金额有两种形式,解析时的差别很重要:
| 位置 | 类型 | 示例 |
|---|---|---|
GET /v1/balance 的 balance | 字符串 | "5.230000" |
实时响应里的 total_charged、charged_amount、refunded_amount | 数字 | 0.004000 |
余额用定点小数字符串返回,这样客户端在把它和某个阈值比较时,永远不会遇到浮点误差。实时金额是保留 6 位小数的数字,超过 6 位请当作近似值。
金额一律以 USD 计价,响应里不带币种符号。请自行格式化后再展示,不要凭分隔符或前缀去猜币种。
时间是 ISO 8601 的 UTC 时间,带 Z 后缀:
2026-09-13T10:00:00Z实时结果的 checked_at、批量任务的时间字段,都遵循这一格式。
HTTP 状态码不等于业务结果
Section titled “HTTP 状态码不等于业务结果”有两种模式,都是刻意为之:
- 实时:HTTP
200表示调用执行了,不表示每个产品都给出了结论。请读status和每条 result 的billing_status。 - 批量:提交只返回任务受理,工作异步继续;只有任务进入终态,结果才存在。
两种情况下的规矩是一样的:状态码告诉你要不要重试,响应体告诉你发生了什么。