短信验证 API
最后修改于 2026/11/03
运行 API 查询
两个 API 共享一个密钥:一个支持 JSON 的 REST API,以及许多工具已使用的短信激活格式。在控制台的 API 密钥 页面创建密钥;密钥仅显示一次。限制:每个密钥每分钟 300 次请求。每个订单有 20 分钟的验证码接收窗口,与控制台相同。
# REST API (JSON) curl https://virtualsns.com/api/v1/balance -H "Authorization: Bearer YOUR_KEY" # SMS activation format curl "https://virtualsns.com/stubs/handler_api.php?api_key=YOUR_KEY&action=getBalance"
服务和国家代码
服务代码是我们服务页面地址中的名称,例如 kakaotalk、line、wechat、zalo、naver、shopee 和 whatsapp。国家代码为小写的 ISO 代码:kr、jp、id、ph、vn、th、us。GET /services 和 GET /countries 返回完整列表。
典型流程
- 使用服务和国家订购一个号码。保存 id。
- 在应用中输入号码并请求发送短信。
- 每4秒读取一次订单,直到收到验证码。
- 需要再收一条短信?请求另一个验证码,然后再次读取。完成:结束订单。
- 没有收到验证码?取消订单可获得全额退款。如果没有来电,窗口结束后会自动退款。
Python
import os, time, requests
API = "https://virtualsns.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['VIRTUALSNS_KEY']}"}
order = requests.post(f"{API}/orders", headers=H,
data={"service": "kakaotalk", "country": "kr"}).json()["order"]
print("Use this number:", order["phone"])
while True:
o = requests.get(f"{API}/orders/{order['id']}", headers=H).json()["order"]
if o["code"] or o["status"] in ("refunded", "canceled"):
break
time.sleep(4)
print("Code:", o["code"])Node.js
const API = "https://virtualsns.com/api/v1";
const H = { Authorization: `Bearer ${process.env.VIRTUALSNS_KEY}` };
const { order } = await fetch(`${API}/orders`, {
method: "POST", headers: H,
body: new URLSearchParams({ service: "line", country: "jp" }),
}).then((r) => r.json());
console.log("Use this number:", order.phone);
let o = order;
while (!o.code && !["refunded", "canceled"].includes(o.status)) {
await new Promise((r) => setTimeout(r, 4000));
({ order: o } = await fetch(`${API}/orders/${order.id}`, { headers: H }).then((r) => r.json()));
}
console.log("Code:", o.code);返回错误代码
REST API
错误以JSON格式返回:{"error":{"code","message"}},并附带以下HTTP状态码:
| 400 | 缺少或错误的字段(missing_filter, bad_json)。 |
| 401 | 没有密钥或密钥错误(no_key, bad_key)。 |
| 402 | 余额不足(no_balance)。 |
| 404 | 未知的服务、国家、订单或端点。 |
| 409 | 订单当前无法执行该操作(has_code, not_ready, too_many_open, no_numbers)。 |
| 429 | 一分钟内请求超过300次(rate_limited)。 |
短信激活格式
| BAD_KEY | 缺少或错误的API密钥。 |
| BAD_ACTION | 未知操作。 |
| BAD_SERVICE | 未知服务代码。 |
| BAD_COUNTRY | 该服务在该国家不提供。 |
| NO_BALANCE | 余额不足。 |
| NO_NUMBERS | 目前没有可用的号码。请稍后再试。 |
| NO_ACTIVATION | 未知的激活ID,或不属于您。 |
| EARLY_CANCEL_DENIED | 验证码已到达,因此无法取消激活。 |
| TOO_MANY_REQUESTS | 一分钟内请求超过300次。 |
| NO_ACTIVATIONS | 已有20个激活订单。 |
REST API方法
https://virtualsns.com/api/v1
GET/services
每个服务代码及其名称、类型和最低价格。无需密钥。
curl "https://virtualsns.com/api/v1/services"
{"services":[{"code":"kakaotalk","name":"KakaoTalk","category":"social","from":"0.06"}]}GET/countries
每个国家代码(ISO,小写)及其名称和拨号代码。无需密钥。
curl "https://virtualsns.com/api/v1/countries"
{"countries":[{"code":"kr","name":"South Korea","dial_code":"82"}]}GET/prices
以美元计价的价格。添加服务、国家或两者。无需密钥。
curl "https://virtualsns.com/api/v1/prices?service=line&country=jp"
{"prices":[{"service":"line","country":"jp","price":"5.40"}]}GET/balance
您的余额(美元)。
curl "https://virtualsns.com/api/v1/balance" \ -H "Authorization: Bearer YOUR_KEY"
{"balance":"25.00","currency":"USD"}POST/orders
购买一个号码(201)。返回订单,包含电话号码和窗口结束时间。
curl -X POST https://virtualsns.com/api/v1/orders \ -H "Authorization: Bearer YOUR_KEY" \ -d service=kakaotalk -d country=kr
{"order":{"id":"AC-7K2M9QX4PB","service":"kakaotalk","country":"kr","phone":"+821023456789","status":"waiting","code":null,"expires_at":"2026-11-03T12:20:00.000Z"},"window_minutes":20}GET/orders/AC-7K2M9QX4PB
一个订单及其状态和收到的所有验证码。状态包括:等待中、已收到、已完成、已退款、已取消。
curl "https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB" \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"id":"AC-7K2M9QX4PB","status":"received","code":"482193","sms":"[Kakao] Verification code [482193]"}}GET/orders
您的未完成订单(status=all可查看最近100条)。
curl "https://virtualsns.com/api/v1/orders?status=open" \ -H "Authorization: Bearer YOUR_KEY"
{"orders":[...]}POST/orders/AC-7K2M9QX4PB/resend
在同一号码上请求另一个验证码,在第一个验证码之后且窗口仍开放时。不额外收费。
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/resend \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"received","waiting_for_resend":true}}POST/orders/AC-7K2M9QX4PB/finish
关闭已收到验证码的订单。
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/finish \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"finished"}}POST/orders/AC-7K2M9QX4PB/cancel
在收到验证码前取消订单。全额退款至您的余额。
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/cancel \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"canceled","refunded":"8.40"}}短信激活格式方法
https://virtualsns.com/stubs/handler_api.php
方法 getBalance
您的余额(美元)。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getBalance
ACCESS_BALANCE:12.50
方法 getServicesList
您可以购买的服务代码(JSON)。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getServicesList
{"status":"success","services":[{"code":"line","name":"LINE"}]}方法 getCountries
国家代码(ISO,小写)和拨号代码(JSON)。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getCountries
{"jp":{"name":"Japan","dial":"81"}}方法 getPrices
按国家和服务的美元价格。两个过滤器均为可选。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getPrices&service=line&country=jp
{"jp":{"line":{"cost":5.4,"count":100}}}方法 getNumber
购买一个号码。返回激活ID和号码及其国家代码。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getNumber&service=line&country=jp
ACCESS_NUMBER:AC-7K2M9QX4PB:819012345678
方法 getStatus
STATUS_WAIT_CODE(尚未收到验证码),STATUS_OK:<code>(已收到验证码),STATUS_WAIT_RETRY:<last code>(已请求再次发送验证码),STATUS_CANCEL(已取消或退款)。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getStatus&id=AC-7K2M9QX4PB
STATUS_OK:482913
方法 setStatus
status=1 准备就绪(ACCESS_READY),3 再次发送验证码(ACCESS_RETRY_GET),6 完成(ACCESS_ACTIVATION),8 在未收到验证码时取消并全额退款(ACCESS_CANCEL)。
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=setStatus&id=AC-7K2M9QX4PB&status=3
ACCESS_RETRY_GET