API 文档 · v1

租号接码 API

返回 JSON,错误遵循 problem+json 标准。每个请求都需要账户页面中的 API 令牌。

最后更新:2026年9月28日OpenAPI 规范(JSON)
您的令牌 · 每个请求都需携带
登录后查看您的 API 令牌
登录

快速开始

  1. 在账户页面获取 API 令牌。账户需要开通 API 权限。
  2. 调用 GET /v1/services 获取服务 id 和价格。
  3. 带上 serviceId 调用 POST /v1/rentals 租号,并保存返回的 id。
  4. 每 5 秒调用一次 GET /v1/rentals/{id},直到 status 不再是 0。status 1 表示验证码已在 code 字段中;status 2 表示 4–7 分钟内没收到验证码,费用已退回。
curl -X POST "https://api.otpvn.com/v1/rentals" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":1}'

curl "https://api.otpvn.com/v1/rentals/1234122" -H "Authorization: Bearer YOUR_API_TOKEN"

通用约定

基础地址
https://api.otpvn.com
请求方式
读取数据用 GET,租号用 POST,请求体为 JSON。
认证
每个请求都要带 Authorization: Bearer <token> 请求头,令牌为账户页面中的 32 位令牌。不要把令牌放在 URL 里。
返回结果
成功返回 HTTP 200(租号为 201),数据以 JSON 放在响应体中。错误返回 HTTP 4xx 或 5xx,格式为 application/problem+json:用 code 字段判断,原因在 detail 中。
语言
在 URL 后加上 ?lang=en 或 ?lang=zh,或发送 X-Lang: en 请求头,错误的 detail 即以英文或中文返回。默认为越南语;code 和数据不变。
手机号
phoneLocal 开头没有 0 和国家代码(如 987654321),用于填入 App。phone 是完整号码,重新租用时使用。
金额
价格和余额均为整数,单位越南盾(VND)。
时间
createdAt 为 ISO 8601 格式,带越南时区(+07:00)。
限制
每个账户每秒最多 100 个请求,最多连续租号 15 次(每次与上一次间隔不足 3 秒);超出返回 429 too_many_requests。每个账户同时等待验证码的租用数量有限,超出返回 429 waiting_limit。
数据更新
等待验证码的租用每秒更新一次,余额最多 2 秒内更新,服务列表最多 30 秒内更新;更频繁地调用也不会得到更新的数据。
Zalo
Zalo 暂时不能通过 API 租用。

接口列表

1

查询账户余额

账户当前余额。

GEThttps://api.otpvn.com/v1/balance
返回字段
balanceinteger
当前余额,单位越南盾
可能的错误(HTTP · code)
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
返回示例(HTTP 200)
{
  "balance": 186500
}
2

运营商列表

租号时 carriers 字段使用的运营商名称。越南:MOBIFONE、VINAPHONE、VIETTEL、VIETNAMOBILE、ITELECOM、WINTEL、GTEL。老挝:UNITEL、ETL、BEELINE、LAOTEL。列表中还有其他市场的运营商,暂未使用。

GEThttps://api.otpvn.com/v1/carriers
返回数组中的每一项
idinteger
运营商 id
namestring
运营商名称,用于 carriers 字段
可能的错误(HTTP · code)
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
返回示例(HTTP 200)
[
  {
    "id": 1,
    "name": "MOBIFONE"
  },
  {
    "id": 2,
    "name": "VINAPHONE"
  },
  {
    "id": 3,
    "name": "VIETTEL"
  },
  {
    "id": 4,
    "name": "VIETNAMOBILE"
  },
  {
    "id": 5,
    "name": "ITELECOM"
  },
  {
    "id": 6,
    "name": "VODAFONE_RO"
  },
  {
    "id": 7,
    "name": "WINTEL"
  },
  {
    "id": 8,
    "name": "METFONE"
  },
  {
    "id": 9,
    "name": "UNITEL"
  },
  {
    "id": 10,
    "name": "ETL"
  },
  {
    "id": 11,
    "name": "BEELINE"
  },
  {
    "id": 12,
    "name": "LAOTEL"
  },
  {
    "id": 13,
    "name": "GTEL"
  }
]
3

服务列表

支持 API 的服务的 id、名称和价格。价格可能变动,请定期重新获取列表。

GEThttps://api.otpvn.com/v1/services?country=vn
参数
countryquery · string
vn:越南(默认)· la:老挝
返回数组中的每一项
idinteger
服务 id,用作 serviceId
namestring
服务名称
priceinteger
每次租用的价格,单位越南盾
可能的错误(HTTP · code)
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
返回示例(HTTP 200)
[
  {
    "id": 7,
    "name": "Facebook",
    "price": 800
  },
  {
    "id": 1,
    "name": "Momo",
    "price": 350
  }
]
4

租号

为服务租一个新号码。立即扣费,4–7 分钟内没收到验证码自动退款。

POSThttps://api.otpvn.com/v1/rentals
参数
serviceIdbody · integer · 必填
服务 id,从服务列表获取
countrybody · string
la 表示租用老挝号码 · 省略则租用越南号码
carriersbody · array
想要的运营商。不填则该国家所有运营商都可以。
includePrefixesbody · array
想要的号段,带开头的 0(如 096)。不填则任何号段都可以。
excludePrefixesbody · array
不想要的号段,带开头的 0(如 097)。
返回字段
idinteger
租号 id,用于获取验证码
phonestring
系统保存的完整号码,重新租用时填入 phone 字段
phoneLocalstring
填入应用的号码,不带开头的 0 和国家码
countryIsostring
国家代码:VN 或 LA
countryCodestring
国际区号:84 或 856
balanceinteger
扣费后的余额,单位越南盾
可能的错误(HTTP · code)
400 · invalid_body
请求体不是有效的 JSON,或缺少必填字段
400 · invalid_carrier
运营商不属于所选国家
400 · invalid_prefix
号段不属于所选运营商
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
422 · api_not_supported
该服务不支持 API 租号
422 · insufficient_balance
余额不足
422 · out_of_stock
暂无合适的号码,请稍后再试
422 · service_closed
该服务暂时关闭
429 · waiting_limit
同时等码的号码已达上限,detail 中写明上限
503 · maintenance
系统短暂维护中,请几分钟后再试
503 · busy
系统繁忙,请稍后再试
请求体示例
{
  "serviceId": 1,
  "carriers": [
    "VINAPHONE",
    "VIETTEL"
  ],
  "includePrefixes": [
    "096",
    "097",
    "098"
  ]
}
返回示例(HTTP 201)
{
  "id": 1234122,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "balance": 185300
}
5

再次租用旧号码

为同一服务重新租用同一个号码,例如 App 要求再次验证时。仅限上次租号后约 15–30 分钟内,且该 SIM 仍在系统中。

POSThttps://api.otpvn.com/v1/rentals/rerent
参数
serviceIdbody · integer · 必填
服务 id,从服务列表获取
phonebody · string · 必填
上次租号的 phone 字段
返回字段
idinteger
租号 id,用于获取验证码
phonestring
系统保存的完整号码,重新租用时填入 phone 字段
phoneLocalstring
填入应用的号码,不带开头的 0 和国家码
countryIsostring
国家代码:VN 或 LA
countryCodestring
国际区号:84 或 856
balanceinteger
扣费后的余额,单位越南盾
可能的错误(HTTP · code)
400 · invalid_body
请求体不是有效的 JSON,或缺少必填字段
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
422 · api_not_supported
该服务不支持 API 租号
422 · insufficient_balance
余额不足
422 · service_closed
该服务暂时关闭
422 · service_unavailable
该服务暂时无法重新租用,请联系客服
422 · rerent_unavailable
要再次租用的号码暂时不可用
422 · rerent_forbidden
无法再次租用:距上次租用已超过 15–30 分钟,或 SIM 卡已不在系统中
422 · rerent_taken
该号码正被他人租用
422 · out_of_stock
暂无合适的号码,请稍后再试
429 · waiting_limit
同时等码的号码已达上限,detail 中写明上限
503 · maintenance
系统短暂维护中,请几分钟后再试
503 · busy
系统繁忙,请稍后再试
请求体示例
{
  "serviceId": 1,
  "phone": "0987654321"
}
返回示例(HTTP 201)
{
  "id": 1234190,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "balance": 184700
}
6

获取租号的验证码

某次租号的状态和验证码。每 5 秒调用一次,直到 status 不再是 0。

GEThttps://api.otpvn.com/v1/rentals/1234122
参数
idpath · integer · 必填
租号时返回的 id
返回字段
idinteger
租号 id
serviceIdinteger
服务 id
serviceNamestring
服务名称
priceinteger
每次租用的价格,单位越南盾
statusinteger
0:等待短信 · 1:已完成 · 2:已过期,已退款
contentstring
短信内容。语音验证码则为录音文件链接。未收到短信时不返回此字段
codestring
已提取的验证码。未收到验证码时不返回此字段
isAudioboolean
验证码通过来电送达时为 true
phonestring
系统保存的完整号码,重新租用时填入 phone 字段
phoneLocalstring
填入应用的号码,不带开头的 0 和国家码
countryIsostring
国家代码:VN 或 LA
countryCodestring
国际区号:84 或 856
createdAtstring
租号时间,ISO 8601 格式,带越南时区(+07:00)
可能的错误(HTTP · code)
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
404 · rental_not_found
账户中没有这次租号
返回示例(HTTP 200)
{
  "id": 1234122,
  "serviceId": 1,
  "serviceName": "Momo",
  "price": 600,
  "status": 1,
  "content": "486460 la ma xac thuc Momo cua ban",
  "code": "486460",
  "isAudio": false,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "createdAt": "2026-09-27T10:15:24.88+07:00"
}
7

租号记录

按服务、状态和日期范围筛选的租号记录,最新的在前。5 个参数都必填。

GEThttps://api.otpvn.com/v1/rentals?serviceId=1&status=1&limit=100&from=2026-09-01&to=2026-09-27
参数
serviceIdquery · integer · 必填
服务 id
statusquery · integer · 必填
0:等待短信 · 1:已完成 · 2:已过期
limitquery · integer · 必填
最多返回的记录数
fromquery · string · 必填
开始日期,格式 yyyy-MM-dd
toquery · string · 必填
结束日期,格式 yyyy-MM-dd
返回数组中的每一项
idinteger
租号 id
serviceIdinteger
服务 id
serviceNamestring
服务名称
priceinteger
每次租用的价格,单位越南盾
statusinteger
0:等待短信 · 1:已完成 · 2:已过期,已退款
contentstring
短信内容。语音验证码则为录音文件链接。未收到短信时不返回此字段
codestring
已提取的验证码。未收到验证码时不返回此字段
isAudioboolean
验证码通过来电送达时为 true
phonestring
系统保存的完整号码,重新租用时填入 phone 字段
phoneLocalstring
填入应用的号码,不带开头的 0 和国家码
countryIsostring
国家代码:VN 或 LA
countryCodestring
国际区号:84 或 856
createdAtstring
租号时间,ISO 8601 格式,带越南时区(+07:00)
可能的错误(HTTP · code)
400 · invalid_query
URL 参数错误或缺失
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
返回示例(HTTP 200)
[
  {
    "id": 1234101,
    "serviceId": 1,
    "serviceName": "Momo",
    "price": 600,
    "status": 1,
    "content": "https://audio.otpvn.com/20260927101215_7f3c2a.wav",
    "code": "731905",
    "isAudio": true,
    "phone": "0987654321",
    "phoneLocal": "987654321",
    "countryIso": "VN",
    "countryCode": "84",
    "createdAt": "2026-09-27T10:12:03.51+07:00"
  }
]

错误代码

400 · invalid_body
请求体不是有效的 JSON,或缺少必填字段
400 · invalid_query
URL 参数错误或缺失
400 · invalid_carrier
运营商不属于所选国家
400 · invalid_prefix
号段不属于所选运营商
401 · invalid_token
缺少令牌、令牌错误或已失效
401 · api_disabled
账户未开通 API 权限
404 · rental_not_found
账户中没有这次租号
422 · api_not_supported
该服务不支持 API 租号
422 · insufficient_balance
余额不足
422 · out_of_stock
暂无合适的号码,请稍后再试
422 · service_closed
该服务暂时关闭
422 · service_unavailable
该服务暂时无法重新租用,请联系客服
422 · rerent_unavailable
要再次租用的号码暂时不可用
422 · rerent_forbidden
无法再次租用:距上次租用已超过 15–30 分钟,或 SIM 卡已不在系统中
422 · rerent_taken
该号码正被他人租用
429 · waiting_limit
同时等码的号码已达上限,detail 中写明上限
429 · too_many_requests
请求过快:超过账户每秒请求数,或连续租号次数过多;请按 Retry-After 等待后重试
503 · maintenance
系统短暂维护中,请几分钟后再试
503 · busy
系统繁忙,请稍后再试
500 · internal
系统错误,请稍后重试
租号状态(status)
0
等待短信
1
已完成
2
已过期,费用已退回
错误示例
{
  "type": "https://otpvn.com/errors/insufficient_balance",
  "title": "Unprocessable Entity",
  "status": 422,
  "code": "insufficient_balance",
  "detail": "Số dư quý khách không đủ !"
}