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.
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:
- 1Queue — push activation jobs into Redis/SQS. Each job = country + product + callback URL.
- 2Worker pool — 10–20 concurrent workers. Each handles one activation lifecycle.
- 3Poll — check every 4 seconds. Max 300 polls (20 min timeout).
- 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)
| Endpoint | Bulk usage |
|---|---|
| GET /v1/user/profile | Pre-flight balance check — call before each batch |
| GET /v1/guest/prices | Cache 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.