SmsBuyz Instant SMS Verification Numbers
API

Bulk SMS Verification for Developers — Automate 1000+ Activations

Bulk SMS verification API guide for developers — Python examples, rate limits, webhooks, and SmsBuyz endpoints for mass activations.

· 9 min read

Manual verification doesn't scale past about 30 activations a day. I've been there — clicking buy, copying a number, pasting a code, repeat until your wrist hurts. If you're running a signup pipeline, affiliate network, or account provisioning service, you need a bulk SMS verification API. Not "bulk" as in one endpoint that buys 500 numbers at once (that doesn't exist). Bulk means automating the loop fast enough to process 1000+ activations per day.

SmsBuyz uses the same REST pattern as 5sim and SMS-Activate: buy → poll → finish/cancel. Base URL: https://smsbuyz.com/v1. Bearer token auth. JSON responses. This guide covers production patterns I actually run — rate limits, concurrency, error handling, webhook-style callbacks.

Architecture for 1000+ daily activations

Don't hammer the API with 500 simultaneous buy requests. You'll hit rate limits and burn balance on numbers that timeout. The pattern that works:

  1. 1Queue — push activation jobs into Redis/SQS. Each job = country + product + callback URL.
  2. 2Worker pool — 10–20 concurrent workers. Each handles one activation lifecycle.
  3. 3Poll — check every 4 seconds. Max 300 polls (20 min timeout).
  4. 4Webhook — POST result to your callback on success or failure.

Python — production bulk worker

import time, requests, logging
from concurrent.futures import ThreadPoolExecutor

BASE = "https://smsbuyz.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_TOKEN", "Accept": "application/json"}
POLL_INTERVAL = 4
MAX_POLLS = 300

def activate(country, product, callback_url=None):
    try:
        r = requests.get(
            f"{BASE}/user/buy/activation/{country}/any/{product}",
            headers=HEADERS, timeout=30
        )
        if r.status_code == 402:
            logging.error("Insufficient balance")
            return {"status": "error", "code": 402}
        r.raise_for_status()
        order = r.json()
        order_id, phone = order["id"], order["phone"]

        for _ in range(MAX_POLLS):
            check = requests.get(
                f"{BASE}/user/check/{order_id}", headers=HEADERS, timeout=15
            ).json()
            if check.get("sms"):
                code = check["sms"][0]["code"]
                requests.get(f"{BASE}/user/finish/{order_id}", headers=HEADERS)
                result = {"status": "ok", "phone": phone, "code": code}
                if callback_url:
                    requests.post(callback_url, json=result, timeout=10)
                return result
            time.sleep(POLL_INTERVAL)

        requests.get(f"{BASE}/user/cancel/{order_id}", headers=HEADERS)
        return {"status": "timeout", "phone": phone}

    except requests.RequestException as e:
        logging.exception("API error: %s", e)
        return {"status": "error", "message": str(e)}

# Process 50 jobs with 10 workers
jobs = [("us", "instagram"), ("ru", "telegram")] * 25
with ThreadPoolExecutor(max_workers=10) as pool:
    results = list(pool.map(lambda j: activate(*j), jobs))

Endpoint reference (June 2026)

EndpointBulk usage
GET /v1/user/profilePre-flight balance check — call before each batch
GET /v1/guest/pricesCache prices hourly — no auth, safe to prefetch
GET /v1/user/buy/activation/{c}/{op}/{product}One number per call — queue these, don't burst
GET /v1/user/check/{id}Poll every 3–5s — faster triggers throttling
GET /v1/user/cancel/{id}Always cancel timeouts — balance returns automatically

Rate limits and error handling

401 — bad token. Rotate from profile settings. Don't retry blindly.

402 — balance empty. Pause workers, alert ops, top up. At $0.26/Instagram, 1000 activations = ~$260.

429 / throttling — back off exponentially. Drop concurrency from 20 to 5. I've never needed more than 20 parallel workers anyway.

Timeout (no SMS in 20 min) — cancel and retry with a different country. Indonesia and Russia routes are reliable for Telegram ($0.51). Don't leave zombie orders — they tie up nothing but your tracking.

Webhook pattern (roll your own)

SmsBuyz doesn't push webhooks natively — you poll. But your system should. When a worker finishes, POST to your internal endpoint:

POST https://your-app.com/hooks/sms-verified
{"job_id": "abc123", "phone": "+1234567890", "code": "482910", "product": "instagram"}

Store job_id → order_id mapping in your DB. On timeout, POST {"status": "timeout"} so downstream can retry or alert. Idempotency keys prevent duplicate account creation if a worker crashes mid-finish.

Full single-activation examples in our API quickstart. Migrating from 5sim? Same loop — see the 5sim comparison. Pricing for bulk math: cheapest SMS verification breakdown. Non-VoIP routes matter for WhatsApp batches — read why here.

Ready to get started?

Create your free account and get +20% bonus on your first deposit.