BusySMS

短信网关 API

短信网关 API:在你自己的号码上接收验证码

BusySMS API 是短信网关的接收端。你自己的手机捕获各自 SIM 卡收到的验证码,你的代码用一个普通的 HTTP 请求加一个密钥来获取它们。本页是实用参考:认证、接口、返回内容,以及可能出现的问题。

每个已验证号码每月 $5 · 7 天免费试用 · 在网页端通过 Stripe 计费

本页内容

这个 API 能做什么,不能做什么

大多数短信网关 API 是为发送而设计的:你提交一条短信,运营商负责投递。这个 API 是为接收而设计的。它把一个问题回答好:我的号码刚收到了什么验证码?——针对你已注册并验证的手机上的号码。

  • 能:读取验证码和一次性密码,等待下一条,列出你的网关手机和号码,读取最近捕获的短信。
  • 不能:发送短信、群发或营销推广,以及租用或购买号码。BusySMS 不提供号码;SIM 卡由你自备。

如果你需要发送短信,请使用短信服务商。如果你需要网站发到你号码上的验证码,用的就是这个 API。手机端的设置见 Android 短信网关指南。

认证

在控制台的 REST API 下创建密钥。密钥以 bsk_live_ 开头且只显示一次,请作为机密保存,例如存为 BUSYSMS_API_KEY。每个请求都要在以下任一请求头中携带它:

HTTP
Authorization: Bearer bsk_live_xxxxxxxx
# or
X-API-Key: bsk_live_xxxxxxxx

密钥属于某个人,只能看到这个人的手机,以及共享给他的号码。在控制台创建的密钥可以读取验证码、列出你的手机和号码、读取账户状态,以及唤醒已暂停的手机;它不能删除设备或管理你的账户,所以密钥泄露也无法改变你的账单。尽管如此,仍请把密钥留在服务器端:任何持有密钥的人都能读取你的验证码。

接口

基础 URL 为 https://busysms.net/api/v1。请求都是普通的 GET,响应为 JSON。

  • GET /codes:你所有号码中最新的验证码。带上 timeoutMs 时会等待下一条,最长 90 秒。过滤参数:service、phone、deviceId。
  • GET /devices:你的网关手机,包含 id、名称、号码、平台,以及在线、已验证和暂停状态,另外还有共享给你的号码。
  • GET /numbers:仅列出你的号码,每个都带有 canReceive,无法接收时还会附上 reason:unverified、verification_pending、inactive、gateway_off 或 phone_unreachable。
  • GET /devices/:id/messages:某台手机最近捕获的短信,按时间倒序排列。支持 service、limit(默认 50,最多 200)和 since。
  • GET /account:你的账户及其试用和订阅状态。

等待验证码:curl、Node.js 和 Python

大多数集成最需要的调用,是在触发短信的操作之后立即发起长轮询。先开始等待,再触发登录,一旦匹配的验证码到达,请求就会返回。

curl -s -H "Authorization: Bearer $BUSYSMS_API_KEY" \
  "https://busysms.net/api/v1/codes?service=exampleapp&timeoutMs=60000"

顺序没有你担心的那么要紧:在请求开始前约一秒内到达的验证码仍算作新的,更早的则不算。在测试中,先发起请求,再触发短信;OTP 自动化指南演示了如何在 Playwright、Selenium 和 Cypress 中这样做。

返回内容

每个 /codes 响应的结构都相同(此处 message 对象有删减):

JSON
{
  "code": "482913",
  "message": {
    "otpCode": "482913",
    "phone": "+447700900123",
    "sender": "ExampleApp",
    "service": "exampleapp",
    "serviceLabel": "ExampleApp",
    "bodyPreview": "Your ExampleApp verification code is 482913",
    "receivedAt": 1792674000000,
    "deviceName": "Test phone"
  }
}

如果在时限内没有新验证码到达,code 为 null:等待期间,API 绝不会退回到旧的验证码。receivedAt 是以毫秒为单位的 Unix 时间戳。service 是 BusySMS 为每条短信分配的简短 id:已知品牌如 google、telegram 或 microsoft,否则为发件人名称的 slug。把它作为 service= 传入,就只等待该发件人的验证码。

错误及处理方式

  • 401:密钥缺失、格式错误或已被吊销。已吊销的密钥会返回 key_revoked。
  • 402 payment_required:试用已结束且没有有效订阅。读取验证码会停止,但 /devices 仍会响应,方便你查看问题所在,响应体中还带有 billingUrl。
  • 403:设备属于其他账户,或密钥没有该路由的权限范围(insufficient_scope)。
  • 404:设备不存在。
  • 409 number_unverified:该手机的号码尚未验证,因此无法读取其短信。
  • 429:触发了频率限制。请等待 retryAfterMs 后再重试。

限制与最佳实践

  • 单次等待最长 90 秒。如果验证码可能需要更久,请用新的超时时间再次调用,而不是一直保持同一个请求。
  • 有多个号码时请加过滤条件:用 phone= 指定接收号码,或用 deviceId= 指定你的某台手机,以免返回本属于另一次登录的验证码。
  • 如果等待开始时你的手机都没有在捕获,BusySMS 会向手机发送通知,请求重新开启网关。它绝不会远程开启捕获;必须有人亲手轻点。
  • 捕获的短信最多保留 7 天,之后删除。
  • 读取验证码需要有效的试用或订阅:7 天免费试用结束后,每个已验证号码每月 $5。不按请求次数收费。

REST API 之外

同样的验证码,AI 智能体可以通过 BusySMS MCP 服务器获取(参见面向 AI 智能体的短信验证码),人则可以通过 Chrome 扩展获取,扩展会替你把验证码填进网站。

共享给你的号码也包括在内。当同事共享某个号码的验证码后,/codes 会把它们和你自己的验证码一起返回,用 phone= 即可单独筛选出该号码。

常见问题

常见问题解答

有免费的短信网关 API 吗?

每个账户都从 7 天免费试用开始,可完整使用 API。之后每个已验证手机号每月 $5。按号码计费,而不是按短信条数或请求次数计费。

可以用这个 API 发送短信吗?

不可以。BusySMS 只负责接收:读取发到你自己号码上的验证码。发送短信请使用短信服务商。

BusySMS 会给我分配手机号吗?

不会,BusySMS 不提供号码。在插有目标 SIM 卡的手机上安装应用并验证号码,之后它的验证码就可以由你读取。iPhone 也可以,通过快捷指令自动化实现。

同事能读取同一个号码的验证码吗?

可以。把号码共享给最多五位其他 BusySMS 用户;对方接受后,该号码上的新验证码会送达他们的控制台、应用、Chrome 扩展、API 和 MCP,对他们免费。

可以从浏览器或移动应用中调用 API 吗?

请把密钥放在服务器上:任何持有密钥的人都能读取你的验证码。在浏览器中请使用 Chrome 扩展,它用你的 BusySMS 账户登录,而不是使用密钥。

博客

更多博客文章

全部文章

继续阅读

相关指南

全部指南

用你自己的号码试一试

安装应用、验证号码,今天就能读到第一条验证码。每个账户都从 7 天免费试用开始;之后每个已验证号码每月 $5,可随时取消。