208 apps154 countries

API v12026-11-04

A JSON API for ordering verification numbers and reading SMS codes.

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

HTTPMeaning
400Missing or bad field (missing_filter, bad_json).
401No key or a wrong key (no_key, bad_key).
402Not enough credit (no_balance).
404Unknown service, country, order or endpoint.
409The order cannot do that now (has_code, not_ready, too_many_open, no_numbers).
429More 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

  • waiting The number is open and no code has arrived yet.
  • received At least one code arrived; ask for another with resend while the window is open.
  • finished Closed after a code, by you or at the end of the window.
  • refunded The window ended without a code; the full price went back to your credit.
  • canceled You 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"}}
SMS Verification API: REST JSON for WhatsApp, Telegram and Google Numbers | SNSVerify