中文(香港)

短信驗證 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 返回完整列表。

典型流程
  1. 使用服務和國家訂購號碼。保存 id。
  2. 在應用程式中輸入號碼並請求發送短信。
  3. 每 4 秒讀取一次訂單,直到收到驗證碼。
  4. 需要再收一次 SMS?要求另一個驗證碼,然後再次讀取。完成:結束訂單。
  5. 沒有收到驗證碼?取消訂單可獲全額退款。若無來電,當窗口結束時會自動退款。

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)。

SMS 激活格式

BAD_KEY缺少或錯誤的 API 密鑰。
BAD_ACTION未知的操作。
BAD_SERVICE未知的服務代碼。
BAD_COUNTRY該服務在該國家不提供。
NO_BALANCE餘額不足。
NO_NUMBERS目前沒有可用的號碼。請稍後再試。
NO_ACTIVATION未知的激活 ID,或該 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"}}

SMS 激活格式方法

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
KakaoTalk、LINE 和 WeChat 號碼的 SMS 驗證 API