Base URL https://snsverify.com/api/v1
Every path on this page is relative to it. Amounts are in US dollars as strings with two decimals, times are UTC (ISO 8601).
Two formats, one account
This page describes the REST API with JSON. If your tool already speaks the common SMS activation format (handler_api.php with action= parameters), use the SMS activation API. Both share your API key, prices, open activations and refunds.
Overview
An SMS verification API lets your own software buy a phone number for an app, wait for the verification SMS and read the code, without opening the website. Each order is one activation: one service, one country, one number and a 20 minute window. Orders without a code are refunded in full at the end of the window.
Requests use GET for reading and POST for actions. POST bodies can be form fields or JSON. Successful answers are JSON objects; errors have the same shape everywhere: {"error":{"code":"...","message":"..."}}.
Authentication
Make an API key in the console under API key. It is shown once; we keep only a scrambled copy. Send it in the Authorization header as a bearer token. A key parameter is also accepted for tools that cannot set headers.
Authorization: Bearer vfk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Making a new key replaces the old one at once. The services, countries and prices endpoints work without a key.
Errors
| HTTP | Meaning |
|---|---|
| 400 | Missing or bad field (missing_filter, bad_json). |
| 401 | No key or a wrong key (no_key, bad_key). |
| 402 | Not enough credit (no_balance). |
| 404 | Unknown service, country, order or endpoint. |
| 409 | The order cannot do that now (has_code, not_ready, too_many_open, no_numbers). |
| 429 | More than 300 requests in a minute (rate_limited). |
Quickstart
Order a UK WhatsApp number with curl, then poll the order every few seconds until the code is there.
curl -X POST https://snsverify.com/api/v1/orders \ -H "Authorization: Bearer $SNSVERIFY_KEY" \ -d service=whatsapp -d country=gb
Python
import os, time, requests
API = "https://snsverify.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['SNSVERIFY_KEY']}"}
order = requests.post(f"{API}/orders", headers=H,
data={"service": "whatsapp", "country": "gb"}).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://snsverify.com/api/v1";
const H = { Authorization: `Bearer ${process.env.SNSVERIFY_KEY}` };
const { order } = await fetch(`${API}/orders`, {
method: "POST", headers: H,
body: new URLSearchParams({ service: "telegram", country: "nl" }),
}).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);Rate limits
300 requests per minute per key, and up to 20 open orders per account. Polling an order every 3 to 5 seconds is plenty: most codes arrive within a minute.
Order statuses
waitingThe number is open and no code has arrived yet.receivedAt least one code arrived; ask for another with resend while the window is open.finishedClosed after a code, by you or at the end of the window.refundedThe window ended without a code; the full price went back to your credit.canceledYou canceled before a code; the full price went back to your credit.
Endpoints
GET/services
Every service code with its name, category and lowest price. No key needed.
{"services":[{"code":"whatsapp","name":"WhatsApp","category":"social","from":"0.31"}]}GET/countries
Every country code (ISO, lower case) with name and dial code. No key needed.
{"countries":[{"code":"gb","name":"United Kingdom","dial_code":"44"}]}GET/prices?service=whatsapp&country=gb
Prices in USD. Filter by service, country or both. No key needed.
{"prices":[{"service":"whatsapp","country":"gb","price":"0.94"}]}GET/balance
Your credit in USD.
{"balance":"25.00","currency":"USD"}POST/orders
Buys a number (HTTP 201). Returns the order with the phone number and the time the window ends.
Body: service=whatsapp&country=gb
{"order":{"id":"AC-7K2M9QX4PB","service":"whatsapp","country":"gb","phone":"+447700900123","price":"0.94","status":"waiting","code":null,"expires_at":"2026-11-04T12:20:00.000Z"},"window_minutes":20}GET/orders/AC-7K2M9QX4PB
One order with its status and every code received. Statuses: waiting, received, finished, refunded, canceled.
{"order":{"id":"AC-7K2M9QX4PB","status":"received","code":"482915","sms":"Your WhatsApp code: 482-915"}}GET/orders?status=open
Your open orders; status=all returns the last 100.
{"orders":[{"id":"AC-7K2M9QX4PB","status":"waiting"}]}POST/orders/AC-7K2M9QX4PB/resend
Asks for another code on the same number after the first code, while the window is open. No extra charge.
{"order":{"status":"received","waiting_for_resend":true}}POST/orders/AC-7K2M9QX4PB/finish
Closes an order that received its code.
{"order":{"status":"finished"}}POST/orders/AC-7K2M9QX4PB/cancel
Cancels before a code arrives. The full price returns to your credit.
{"order":{"status":"canceled","refunded":"0.94"}}