接码网关API v2.0

接码网关 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. 基础约定

服务地址
https://kaisajm.cc
通信协议
HTTPS(TLS 1.2 及以上)
数据格式
JSON,字符编码 UTF-8
请求方法
GET / POST,详见各接口定义
请求体类型
Content-Type: application/json

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": { }
}
字段类型说明
codeint业务状态码,0 表示成功
msgstring结果描述,失败时为可直接展示的原因文本
dataobject / 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 请求体。

GET/api/games4.1

获取可用项目列表。项目编号用于后续取号与价目查询。本接口无需鉴权。

请求参数

参数类型必填说明
qstring可选按项目名称或别名过滤,省略时返回全部启用项目

响应字段

字段类型说明
data[].game_idint项目编号
data[].game_namestring项目名称
data[].aliasesarray项目别名,可用于 game_name 传参
data[].channelsint该项目当前可用通道数量,为 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 }
  ]
}
GET/api/price4.2

查询指定项目在各通道的单价与优先级,用于取号前的成本预估。

请求参数

参数类型必填说明
game_idint二选一项目编号
game_namestring二选一项目名称或别名

响应字段

字段类型说明
data.game_idint项目编号
data.game_namestring项目名称
data.channels[].platformstring通道标识
data.channels[].pricenumber该通道单价,单位元
data.channels[].priorityint调度优先级,数值小的优先

响应示例

{
  "code": 0,
  "msg": "ok",
  "data": {
    "game_id": 1000,
    "game_name": "Telegram (TG) / (飞机)",
    "aliases": ["TG", "电报", "飞机"],
    "channels": [
      { "platform": "线路1", "price": 1, "priority": 10 }
    ]
  }
}
POST/api/number/get4.3

获取一个可用号码,创建订单并进入等待短信状态。

请求参数(JSON Body)

参数类型必填说明
game_idint二选一项目编号,取值见 4.1
game_namestring二选一项目名称或别名,与 game_id 二者必填其一
countrystring可选国家区号,纯数字字符串,默认 "86"
timeoutint可选订单等待时长,单位秒,默认 300
mobilestring可选指定号码,留空表示由网关分配
seqstring可选指定号段,留空表示不限
request_keystring可选幂等键,长度 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"
  }
}
非幂等:未传幂等键时,每次成功调用均创建新订单并计费。网络超时后不应直接重复调用,应先通过订单查询接口确认是否已创建。
GET/api/code/get4.4

查询订单的短信验证码。支持长轮询:传入 wait 时,网关在等待时长内持续向上游取码,收到验证码即刻返回。

请求参数

GET 请求使用查询参数,POST 请求使用 JSON 请求体,字段一致。

参数类型必填说明
order_idstring二选一取号返回的订单号
pkeystring二选一取号返回的通道侧凭据,与 order_id 二者必填其一
waitint可选最长等待秒数,上限 60;省略时按默认值查询一次

响应字段

字段类型说明
data.order_idstring订单号
data.phonestring号码
data.codestring验证码,未收到时为空字符串
data.smsstring短信内容
data.statusstring订单状态,见 5.2
data.waitingbool是否仍在等待短信,为 true 表示尚未收到
data.pollsint累计向上游查询次数
data.last_errstring最近一次轮询的错误摘要,正常时为空
data.expire_atstring订单到期时间

响应示例

{
  "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 为空表示尚未收到短信,属正常状态,可继续轮询。该接口为只读操作,可安全重复调用。
POST/api/order/release4.5

释放订单占用的号码。未收到短信的订单在等待时长届满后由服务端自动释放,无需主动调用。

请求参数

参数类型必填说明
order_idstring二选一订单号
pkeystring二选一通道侧凭据

响应示例

{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "released": true, "blacked": false } }
说明:该操作幂等,重复释放同一订单不会报错,也不产生额外费用。
POST/api/order/black4.6

将号码标记为无效,避免后续订单复用该号码。

请求参数

参数类型必填说明
order_idstring二选一订单号
pkeystring二选一通道侧凭据

响应示例

{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "released": true, "blacked": true } }
说明:仅在确认号码无接收能力时使用。号码正常但业务方不再使用时,应调用释放接口。该操作同时完成释放。
POST/api/order/send4.7

使用已获取的号码主动下发一条短信。该能力依赖通道支持,不支持时返回 501。

请求参数

参数类型必填说明
order_idstring二选一订单号
pkeystring二选一通道侧凭据
receiverstring必填接收号码
contentstring必填短信正文,非 ASCII 字符由网关统一进行 URL 编码后提交

响应示例

{ "code": 0, "msg": "ok", "data": { "order_id": "o9c301a29ff2bbce5", "sent": true } }
GET/api/orders4.8

查询当前密钥下的订单列表,按创建时间倒序。

请求参数

参数类型必填说明
limitint可选返回条数,默认 50,上限 200

响应字段

返回订单对象数组,字段定义见 5.1。

5. 订单对象与状态机

5.1 订单对象字段

字段类型说明
order_idstring订单号,后续取码、释放、加黑均以此为准
pkeystring通道侧凭据,可用于替代 order_id 定位订单
phonestring分配的号码
game_idint项目编号
game_namestring项目名称
platformstring本次订单实际使用的通道标识
countrystring国家区号
costnumber订单费用,单位元
statusstring订单状态,见 5.2
codestring验证码,未收到时为空字符串
smsstring短信内容,未收到时为空字符串
created_atstring创建时间
expire_atstring到期时间,超时后由服务端自动释放

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│── 号码回收入池 ──────────▶│
  1. 调用项目列表接口获取 game_id,并可按需查询价目。
  2. 调用号码获取接口创建订单,保存 order_id 与 phone;建议传入 Idempotency-Key。
  3. 在业务系统提交号码,随后以长轮询方式调用验证码接口。
  4. 收到 received 后取出 code 完成业务校验;号码不可用时调用加黑接口;放弃使用时调用释放接口。
  5. 未收到短信的订单在 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 密钥管理

  • 密钥等同于账户身份,应存放于服务端配置,不得写入客户端代码或公开仓库。
  • 密钥泄露应立即更换,停用后其历史订单仍可查询。