短信验证API
通过HTTP GET/POST请求购买号码并读取短信验证码。响应采用通用短信激活工具的文本格式,专属号码接口返回JSON。
快速开始
- 接口地址
- https://snscodes.com/stubs/handler_api.php
- 身份验证
- api_key 参数。在您账户的 API 页面创建密钥;它只显示一次。
- 速率限制
- 每个密钥每分钟 300 次请求
- 资金
- 价格和余额以美元计,与网站使用同一余额。
curl "https://snscodes.com/stubs/handler_api.php?api_key=$KEY&action=getNumber&service=telegram&country=us" # ACCESS_NUMBER:N-7KQ2M9XWD4:14155550123 curl "https://snscodes.com/stubs/handler_api.php?api_key=$KEY&action=getStatus&id=N-7KQ2M9XWD4" # STATUS_OK:482913
import time, requests
BASE = "https://snscodes.com/stubs/handler_api.php"
KEY = "YOUR_KEY"
r = requests.get(BASE, params={"api_key": KEY, "action": "getNumber", "service": "telegram", "country": "us"}).text
_, num_id, phone = r.split(":")
print("number", phone)
while True:
s = requests.get(BASE, params={"api_key": KEY, "action": "getStatus", "id": num_id}).text
if s.startswith("STATUS_OK"):
print("code", s.split(":")[1]); break
if s == "STATUS_CANCEL":
break
time.sleep(5)const BASE = "https://snscodes.com/stubs/handler_api.php";
const KEY = process.env.SNSCODES_KEY;
const call = async (q) => (await fetch(BASE + "?" + new URLSearchParams({ api_key: KEY, ...q }))).text();
const [, id, phone] = (await call({ action: "getNumber", service: "telegram", country: "us" })).split(":");
console.log("number", phone);
for (;;) {
const s = await call({ action: "getStatus", id });
if (s.startsWith("STATUS_OK")) { console.log("code", s.split(":")[1]); break; }
if (s === "STATUS_CANCEL") break;
await new Promise((r) => setTimeout(r, 5000));
}获取余额 action=getBalance
返回您账户的美元余额。
回答
ACCESS_BALANCE:42.50
BAD_KEY密钥缺失或错误。
验证码价格 action=getPrices
按国家和服务的每验证码价格。两个过滤器均为可选。
| 参数 | 必填 | 描述 |
|---|---|---|
| service | 否 | 服务代码,例如 telegram |
| country | 否 | us、gb 或 au |
回答
{"us":{"telegram":{"cost":3,"count":100}}}购买验证码号码 action=getNumber
为一个应用购买一个号码。价格立即从您的余额中扣除,如果 20 分钟内未收到验证码则退还。
| 参数 | 必填 | 描述 |
|---|---|---|
| service | 是 | 来自 getPrices 的服务代码 |
| country | 是 | us、gb 或 au |
回答
ACCESS_NUMBER:N-7KQ2M9XWD4:14155550123
BAD_SERVICE未知的服务代码。BAD_COUNTRY该服务不在此国家销售。NO_BALANCE余额不足。未扣款。NO_NUMBERS目前没有可用号码。未扣款。NO_ACTIVATIONS您已有 20 个未完成的验证码号码。
读取验证码 action=getStatus
每 5 到 10 秒轮询一次,直到验证码到达。
| 参数 | 必填 | 描述 |
|---|---|---|
| id | 是 | 来自 getNumber 的 id |
回答
STATUS_OK:482913
STATUS_WAIT_CODE尚未收到短信。STATUS_WAIT_RETRY:482913等待另一个验证码;显示最后一个。STATUS_CANCEL已取消或退款。NO_ACTIVATION未知 id。
取消、重试或完成 action=setStatus
status=8 取消未收到验证码的号码(全额退款),status=3 在同一号码上请求另一个验证码,status=6 完成它。
| 参数 | 必填 | 描述 |
|---|---|---|
| id | 是 | 来自 getNumber 的 id |
| status | 是 | 8、3 或 6 |
回答
ACCESS_CANCEL
EARLY_CANCEL_DENIED验证码已到达;请完成而不是取消。ACCESS_RETRY_GET等待另一个验证码。ACCESS_ACTIVATION已完成。
专属号码价格 action=getRentPrices
按国家和租期的整个租期价格。返回 JSON。
| 参数 | 必填 | 描述 |
|---|---|---|
| country | 否 | 两位国家代码 |
回答
{"us":{"sixMonths":35.99,"twelveMonths":59.99}}购买私人号码 action=getRentNumber
购买一个私人号码,租用一段时间。返回JSON。
| 参数 | 必填 | 描述 |
|---|---|---|
| country | 是 | 两位国家代码 |
| period | 是 | oneMonth, threeMonths, sixMonths, twelveMonths, twoYears 或 threeYears |
回答
{"status":"success","id":"N-3HV8QZ2K5M","phone":"14155550123","until":"2027-05-02T10:00:00.000Z"}BAD_PERIOD该国家不支持此租用时长。NO_BALANCE余额不足。
读取私人号码的短信 action=getRentStatus
该私人号码至今收到的所有短信。返回JSON。
| 参数 | 必填 | 描述 |
|---|---|---|
| id | 是 | 来自 getRentNumber 的 id |
回答
{"status":"success","state":"active","messages":[{"code":"482913","text":"Your code is 482913","from":"Telegram","at":"..."}]}取消私人号码 action=setRentStatus
status=2 可在未收到短信且号码使用时间少于20分钟时取消私人号码并全额退款。
| 参数 | 必填 | 描述 |
|---|---|---|
| id | 是 | 来自 getRentNumber 的 id |
| status | 是 | 2 |
回答
{"status":"success"}EARLY_CANCEL_DENIED已收到短信或已超过20分钟。