接码网关 API
版本 v2.0 · 协议 HTTPS · 数据格式 JSON
本文档定义接码网关对外提供的 HTTP 接口,包括鉴权方式、统一响应结构、错误码、各接口的请求与响应字段以及订单状态机。调用方应依据本文档完成接入,不应依赖未在本文档中声明的字段或行为。
1. 文档说明
1.1 服务概述
本服务提供号码获取与短信验证码接收能力。网关内部聚合多个上游号码资源通道,对调用方呈现为单一 API 入口:调用方无需感知通道差异,由网关依据项目渠道配置、通道优先级与可用状态完成调度,并在主通道不可用时按优先级自动降级至备用通道。
1.2 阅读约定
- 文中 必填 表示该参数缺失将直接返回参数错误;可选 表示可省略并使用默认值。
- 接口路径、字段名、枚举值均区分大小写。
- 示例中的密钥、订单号与号码均为示例值,不可用于实际调用。
- 金额单位为人民币元(CNY),以数值或字符串形式返回。
- 时间字段采用 RFC 3339 格式并携带时区偏移,示例:
2026-10-31T11:47:46+08:00。
1.3 路径别名
除本文档列出的 /api/* 路径外,网关同时提供 /v1/* 前缀的等价路径(/v1/number、/v1/code、/v1/release、/v1/black、/v1/orders、/v1/projects、/v1/health),请求参数与响应结构完全一致。
2. 基础约定
2.1 鉴权
除特别说明外,所有接口均需携带 API 密钥,以下三种方式任选其一:
X-API-Key: <your_api_key> Authorization: Bearer <your_api_key> # 查询参数方式(仅建议临时验证使用) ?key=<your_api_key>
401。2.2 请求示例
# 取号 curl -X POST https://kaisajm.cc/api/number/get \ -H "X-API-Key: <your_api_key>" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: req-20261031-0001" \ -d '{"game_id": 1000, "country": "86", "timeout": 300}' # 取码(长轮询) curl "https://kaisajm.cc/api/code/get?order_id=<order_id>&wait=20" \ -H "X-API-Key: <your_api_key>"
3. 响应结构与错误码
3.1 统一响应结构
{
"code": 0,
"msg": "ok",
"data": { }
}
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 业务状态码,0 表示成功 |
| msg | string | 结果描述,失败时为可直接展示的原因文本 |
| data | object / array | 业务数据,失败时可能缺失或为 null |
code 字段为准。仅当 code=0 时 data 有效,不应以 HTTP 状态码单独判定业务成功。3.2 错误码定义
| 状态码 | 含义 | 典型场景 | 处置建议 |
|---|---|---|---|
| 400 | 请求参数错误 | 缺少必填参数、请求体非合法 JSON、项目不存在 | 按 msg 修正请求后重试 |
| 401 | 鉴权失败 | 未携带密钥或密钥无效 | 检查密钥配置 |
| 404 | 资源不存在 | 订单号不存在或不属于当前密钥 | 核对订单号,视为终态 |
| 405 | 方法不允许 | 接口要求 POST,请求使用了其他方法 | 调整请求方法 |
| 410 | 订单已释放 | 对已释放订单再次取码 | 重新取号 |
| 429 | 请求过于频繁 | 账户级并发或未结束订单数达到上限 | 按 msg 提示的间隔重试 |
| 501 | 能力不支持 | 当前通道不支持主动发送短信 | 更换通道或改用其他接口 |
| 502 | 上游通道异常 | 全部通道取号失败或上游返回异常 | 延迟后退避重试 |
| 503 | 通道不可用 | 订单所属通道已停用 | 重新取号 |
502)时,data.attempts 给出本次各通道的尝试结果,platform 为通道标识,err 为失败原因摘要。4. 接口定义
公开接口共 8 个。除订单查询与验证码查询外,其余接口使用 POST 与 JSON 请求体。
获取可用项目列表。项目编号用于后续取号与价目查询。本接口无需鉴权。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| q | string | 可选 | 按项目名称或别名过滤,省略时返回全部启用项目 |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| data[].game_id | int | 项目编号 |
| data[].game_name | string | 项目名称 |
| data[].aliases | array | 项目别名,可用于 game_name 传参 |
| data[].channels | int | 该项目当前可用通道数量,为 0 时不可取号 |
响应示例
{
"code": 0,
"msg": "ok",
"data": [
{ "game_id": 1000, "game_name": "Telegram (TG) / (飞机)", "aliases": ["TG", "电报", "飞机"], "channels": 1 },
{ "game_id": 1018, "game_name": "小红书", "aliases": ["xhs"], "channels": 1 }
]
}
查询指定项目在各通道的单价与优先级,用于取号前的成本预估。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| game_id | int | 二选一 | 项目编号 |
| game_name | string | 二选一 | 项目名称或别名 |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| data.game_id | int | 项目编号 |
| data.game_name | string | 项目名称 |
| data.channels[].platform | string | 通道标识 |
| data.channels[].price | number | 该通道单价,单位元 |
| data.channels[].priority | int | 调度优先级,数值小的优先 |
响应示例
{
"code": 0,
"msg": "ok",
"data": {
"game_id": 1000,
"game_name": "Telegram (TG) / (飞机)",
"aliases": ["TG", "电报", "飞机"],
"channels": [
{ "platform": "线路1", "price": 1, "priority": 10 }
]
}
}
获取一个可用号码,创建订单并进入等待短信状态。
请求参数(JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| game_id | int | 二选一 | 项目编号,取值见 4.1 |
| game_name | string | 二选一 | 项目名称或别名,与 game_id 二者必填其一 |
| country | string | 可选 | 国家区号,纯数字字符串,默认 "86" |
| timeout | int | 可选 | 订单等待时长,单位秒,默认 300 |
| mobile | string | 可选 | 指定号码,留空表示由网关分配 |
| seq | string | 可选 | 指定号段,留空表示不限 |
| request_key | string | 可选 | 幂等键,长度 8–100 位;亦可改用请求头 Idempotency-Key |
幂等
传入 request_key 或 Idempotency-Key 时,相同键的重复请求返回原订单,不会重复取号与计费,响应 msg 标记为重放。
响应字段
返回订单对象,字段定义见 5.1;取号成功时 status 为 active。
响应示例
{
"code": 0,
"msg": "ok",
"data": {
"order_id": "o9c301a29ff2bbce5",
"pkey": "8f21c0d3",
"phone": "17105060528",
"game_id": 1018,
"game_name": "小红书",
"platform": "线路1",
"country": "86",
"cost": 1,
"status": "active",
"code": "",
"sms": "",
"created_at": "2026-10-31T11:47:46+08:00",
"expire_at": "2026-10-31T11:52:46+08:00"
}
}
查询订单的短信验证码。支持长轮询:传入 wait 时,网关在等待时长内持续向上游取码,收到验证码即刻返回。
请求参数
GET 请求使用查询参数,POST 请求使用 JSON 请求体,字段一致。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| order_id | string | 二选一 | 取号返回的订单号 |
| pkey | string | 二选一 | 取号返回的通道侧凭据,与 order_id 二者必填其一 |
| wait | int | 可选 | 最长等待秒数,上限 60;省略时按默认值查询一次 |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| data.order_id | string | 订单号 |
| data.phone | string | 号码 |
| data.code | string | 验证码,未收到时为空字符串 |
| data.sms | string | 短信内容 |
| data.status | string | 订单状态,见 5.2 |
| data.waiting | bool | 是否仍在等待短信,为 true 表示尚未收到 |
| data.polls | int | 累计向上游查询次数 |
| data.last_err | string | 最近一次轮询的错误摘要,正常时为空 |
| data.expire_at | string | 订单到期时间 |
响应示例
{
"code": 0,
"msg": "ok",
"data": {
"order_id": "o9c301a29ff2bbce5",
"phone": "17105060528",
"code": "",
"sms": "",
"status": "active",
"platform": "线路1",
"game_id": 1018,
"polls": 3,
"waiting": true,
"last_err": "",
"expire_at": "2026-10-31T11:52:46+08:00"
}
}
waiting=true 且 code 为空表示尚未收到短信,属正常状态,可继续轮询。该接口为只读操作,可安全重复调用。释放订单占用的号码。未收到短信的订单在等待时长届满后由服务端自动释放,无需主动调用。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| order_id | string | 二选一 | 订单号 |
| pkey | string | 二选一 | 通道侧凭据 |
响应示例
{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "released": true, "blacked": false } }
将号码标记为无效,避免后续订单复用该号码。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| order_id | string | 二选一 | 订单号 |
| pkey | string | 二选一 | 通道侧凭据 |
响应示例
{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "released": true, "blacked": true } }
使用已获取的号码主动下发一条短信。该能力依赖通道支持,不支持时返回 501。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| order_id | string | 二选一 | 订单号 |
| pkey | string | 二选一 | 通道侧凭据 |
| receiver | string | 必填 | 接收号码 |
| content | string | 必填 | 短信正文,非 ASCII 字符由网关统一进行 URL 编码后提交 |
响应示例
{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "sent": true } }
5. 订单对象与状态机
5.1 订单对象字段
| 字段 | 类型 | 说明 |
|---|---|---|
| order_id | string | 订单号,后续取码、释放、加黑均以此为准 |
| pkey | string | 通道侧凭据,可用于替代 order_id 定位订单 |
| phone | string | 分配的号码 |
| game_id | int | 项目编号 |
| game_name | string | 项目名称 |
| platform | string | 本次订单实际使用的通道标识 |
| country | string | 国家区号 |
| cost | number | 订单费用,单位元 |
| status | string | 订单状态,见 5.2 |
| code | string | 验证码,未收到时为空字符串 |
| sms | string | 短信内容,未收到时为空字符串 |
| created_at | string | 创建时间 |
| expire_at | string | 到期时间,超时后由服务端自动释放 |
5.2 订单状态
| status | 含义 | 是否终态 |
|---|---|---|
| requesting | 正在向通道请求号码 | 否 |
| active | 号码已分配,等待短信到达 | 否 |
| received | 已收到验证码 | 是 |
| timeout | 等待时长届满仍未收到短信 | 是 |
| released | 号码已释放 | 是 |
| failed | 全部通道取号失败 | 是 |
| unknown | 与通道通信中断,实际结果待核实 | 否 |
状态由 requesting 单向流转至终态,不存在回退。调用方轮询时收到 received、timeout、released、failed 任一状态即可停止;unknown 表示结果未知,应通过订单查询接口核实后再决定后续动作。
6. 接入流程
调用方 网关 上游通道 │ │ │ │── GET /api/games ───────▶│ │ │◀──── 项目列表 ───────────│ │ │ │ │ │── POST /api/number/get ─▶│── 按优先级选择通道 ──────▶│ │◀─ order_id + phone ──────│◀──── 号码 ────────────────│ │ │ │ │── GET /api/code/get ────▶│── 长轮询取码 ────────────▶│ │ (wait=20,可重复) │◀──── 验证码 / 无 ─────────│ │◀─ status=received ───────│ │ │ │ │ │── POST /api/order/release│── 号码回收入池 ──────────▶│
- 调用项目列表接口获取
game_id,并可按需查询价目。 - 调用号码获取接口创建订单,保存
order_id与phone;建议传入Idempotency-Key。 - 在业务系统提交号码,随后以长轮询方式调用验证码接口。
- 收到
received后取出code完成业务校验;号码不可用时调用加黑接口;放弃使用时调用释放接口。 - 未收到短信的订单在
expire_at到期后由服务端自动释放。
7. 调用约束
7.1 账户级限制
| 项 | 取值 | 超限返回 |
|---|---|---|
| 新建订单频率 | 每账户每秒 1 单 | 429 |
| 未结束订单上限 | 100 单 | 429 |
| 订单默认等待时长 | 300 秒 | 到期自动释放 |
| 验证码长轮询上限 | 60 秒 | 按实际等待返回 |
7.2 请求约定
- 验证码查询应使用长轮询,不得以固定短间隔高频轮询同一订单。
- 同一订单的轮询间隔不应小于 3 秒。
- 不得对同一项目发起高并发批量取号。
- 网关对通道实施分级限速,请求可能因排队产生额外等待,属正常现象。
7.3 重试策略
| 场景 | 是否可重试 | 建议 |
|---|---|---|
502 通道异常 | 可 | 指数退避,起始间隔 2 秒,最多 3 次 |
429 限流 | 可 | 按 msg 提示的毫秒数等待后重试 |
400 / 401 / 404 | 不可 | 修正参数或核对订单号后重新发起 |
| 取号连接超时 | 谨慎 | 先查询订单列表确认是否已创建,勿直接重复取号 |
| 取码连接超时 | 可 | 只读接口,可安全重试 |
7.4 密钥管理
- 密钥等同于账户身份,应存放于服务端配置,不得写入客户端代码或公开仓库。
- 密钥泄露应立即更换,停用后其历史订单仍可查询。