Compre números e receba códigos SMS direto do seu sistema, usando o mesmo saldo da sua conta no site.
Entre na sua conta para gerar a sua chave de API.
Entrar / Criar contaEndereço base: https://sms-verification-2fa.com/wp-json/blazerd-api/v1
X-API-Key. Nunca coloque a chave na URL.Content-Type: application/json.GET /countries e GET /services?country=ID devolvem os ids e o preço atual.POST /orders com service, country e max_price (o máximo que você aceita pagar). Você recebe o número.GET /orders/{id} a cada 5 segundos até o status virar FINISHED. O código vem em code.cancelable_at (2 min), chame POST /orders/{id}/cancel e o valor volta ao saldo. Se você não fizer nada, o reembolso é automático após expires_at (20 min).Troque SUA_CHAVE pela sua chave. Respostas de sucesso são JSON; erros seguem o formato da seção Erros.
Seu saldo em USD.
curl -s "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/balance" -H "X-API-Key: SUA_CHAVE"{"balance": 12.5, "currency": "USD"}Lista de países. Use o id no parâmetro country.
curl -s "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/countries" -H "X-API-Key: SUA_CHAVE"[{"id": 73, "name": "Brazil"}, {"id": 187, "name": "USA"}, ...]Serviços disponíveis no país, com preço atual em USD (price) e quantidade aproximada em estoque (stock). A lista é atualizada a cada ~3 minutos.
curl -s "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/services?country=73" -H "X-API-Key: SUA_CHAVE"[{"id": "wa", "name": "Whatsapp", "price": 0.35, "stock": 1520}, {"id": "tg", "name": "Telegram", "price": 0.42, "stock": 870}, ...]Compra um número. Campos do JSON:
| Campo | Obrigatório | Descrição |
|---|---|---|
service | sim | id do serviço (de /services), ex.: "wa". |
country | sim | id do país (de /countries), ex.: 73. |
max_price | sim | Preço máximo em USD que você aceita pagar (entre 0.20 e 100). Você nunca paga mais que isso; normalmente paga o price de /services. Seu saldo precisa cobrir esse valor. |
ref | recomendado | Identificador único seu (até 64 caracteres: letras, números, _ . : -). Se a conexão cair, repita a mesma requisição com o mesmo ref: você recebe o mesmo pedido, sem comprar de novo (válido por 24 h). |
curl -s -X POST "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/orders" \
-H "X-API-Key: SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"service": "wa", "country": 73, "max_price": 0.35, "ref": "pedido-0001"}'Resposta 201 (ou 200 quando é a repetição de um ref já usado):
{
"id": "635468024",
"phone": "5511987654321",
"service": "wa",
"service_name": "Whatsapp",
"country": 73,
"country_name": "Brazil",
"price": 0.35,
"status": "PENDING",
"code": null,
"created_at": 1790000000,
"cancelable_at": 1790000120,
"expires_at": 1790001200,
"ref": "pedido-0001"
}phone vem só com dígitos, já com o código do país (sem o +). Use um timeout de pelo menos 60 segundos na compra.Consulta o pedido (mesmo formato acima). Enquanto estiver PENDING, consulte a cada 5 segundos. Quando chegar o SMS, status vira FINISHED e code traz o código.
curl -s "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/orders/635468024" -H "X-API-Key: SUA_CHAVE"{"id": "635468024", "phone": "5511987654321", ..., "status": "FINISHED", "code": "123456", ...}Cancela um pedido sem SMS e devolve o valor ao saldo. Só é permitido depois de cancelable_at (2 min após a compra). Resposta: o pedido com status CANCELLED. Se o SMS chegou antes do cancelamento, você recebe o erro 409 not_cancelable com o pedido (e o código) em data.order.
curl -s -X POST "https://sms-verification-2fa.com/wp-json/blazerd-api/v1/orders/635468024/cancel" -H "X-API-Key: SUA_CHAVE"| Status | Significado |
|---|---|
PENDING | Aguardando o SMS. Consulte a cada 5 s. |
FINISHED | SMS recebido; o código está em code. Valor cobrado, não pode ser cancelado. |
CANCELLED | Cancelado sem SMS; o valor voltou ao saldo (cancelado por você ou automaticamente após expires_at). |
Todo erro tem o status HTTP abaixo e este formato. Use o campo code no seu programa; message é só para leitura humana.
{"code": "no_funds", "message": "Saldo insuficiente: seu saldo precisa cobrir o max_price.", "data": {"status": 402}}| code | HTTP | Quando acontece | O que fazer |
|---|---|---|---|
invalid_request | 400 | Parâmetro ausente ou inválido. | Corrija a requisição (veja a mensagem). |
invalid_key | 401 | Chave ausente, errada, revogada ou enviada na URL. | Envie o header X-API-Key; gere uma nova chave se preciso. |
no_funds | 402 | Saldo menor que o max_price. | Adicione saldo no site. |
forbidden | 403 | API desativada ou conta bloqueada. | Fale com o suporte. |
not_found | 404 | Pedido não existe ou não é seu. | Confira o id. |
no_stock | 409 | Sem números agora para esse serviço/país. | Tente de novo em 10–30 s ou use outro país. |
price_above_max | 409 | O preço atual passou do seu max_price. data.current_price traz o preço atual, quando conhecido. | Aumente o max_price ou tente mais tarde. |
locked | 409 | Outra compra sua ainda está em andamento (é uma por vez). | Aguarde 2 s e repita com o mesmo ref. |
too_early | 409 | Cancelamento antes de 2 minutos. | Aguarde data.retry_after segundos. |
not_cancelable | 409 | O SMS já chegou. | Use o código em data.order.code. |
rate_limited | 429 | Muitas requisições. | Aguarde data.retry_after segundos. |
too_many_active | 429 | Você já tem 20 números aguardando SMS. | Espere chegarem ou cancele alguns. |
purchases_paused | 429 | Muitas compras sem SMS nas últimas 24 h (50 ou mais pedidos encerrados — recebidos ou cancelados — com menos de 5% recebidos). | Aguarde; se precisar, fale com o suporte. |
provider_error | 502 | Falha temporária no fornecedor. Na compra, nada foi cobrado. No cancelamento, o pedido continua PENDING (sem estorno ainda). | Repita após data.retry_after segundos (na compra, com o mesmo ref). |
internal_error | 500 | Erro interno. | Tente de novo (se data.retry_after vier, aguarde esse tempo); se continuar, fale com o suporte. |
rest_no_route | 404 | URL ou método errado. | Confira o endereço e se é GET ou POST. |
/services: até 20 por minuto (a lista muda a cada ~3 min; não precisa consultar mais que 1 vez por minuto por país).GET /orders/{id} devolve o último status conhecido. Com muitos pedidos ao mesmo tempo, consulte cada um a cada max(5, nº de pedidos ÷ 2) segundos.purchases_paused).Compra um número de WhatsApp do Brasil, espera o SMS por até 3 minutos e cancela (com reembolso) se não chegar. Instale com pip install requests e defina a variável de ambiente BLZ_API_KEY com a sua chave.
import os
import time
import uuid
import requests
API = "https://sms-verification-2fa.com/wp-json/blazerd-api/v1"
KEY = os.environ["BLZ_API_KEY"] # nunca escreva a chave direto no código
class ApiError(Exception):
def __init__(self, status, body):
self.status = status
self.code = body.get("code")
self.data = body.get("data") or {}
super().__init__(f"{status} {self.code}: {body.get('message')}")
def api(method, path, **kwargs):
r = requests.request(
method,
API + path,
headers={"X-API-Key": KEY},
timeout=60, # a compra pode levar alguns segundos
allow_redirects=False, # sempre https; redirecionamento = URL errada
**kwargs,
)
try:
body = r.json()
except ValueError:
body = {"code": f"http_{r.status_code}", "message": r.text[:200]}
if r.status_code >= 300: # erro (ou redirecionamento = URL errada)
raise ApiError(r.status_code, body)
return body
# 1) Saldo e preço do serviço (WhatsApp = "wa", Brasil = 73)
print("Saldo: $", api("GET", "/balance")["balance"])
servicos = api("GET", "/services", params={"country": 73})
wa = next(s for s in servicos if s["id"] == "wa")
print(f"{wa['name']}: ${wa['price']} ({wa['stock']} disponíveis)")
# 2) Comprar. Em queda de conexão ou erro temporário, repete com o MESMO ref
# (assim nunca compra duas vezes).
ref = str(uuid.uuid4())
pedido = None
for tentativa in range(10):
try:
pedido = api("POST", "/orders", json={
"service": "wa",
"country": 73,
"max_price": wa["price"],
"ref": ref,
})
break
except ApiError as e:
if e.code in ("no_stock", "locked", "rate_limited", "provider_error"):
time.sleep(e.data.get("retry_after", 10))
continue
raise # no_funds, price_above_max, invalid_request...
except requests.RequestException:
time.sleep(5)
if pedido is None:
raise SystemExit("Não foi possível comprar agora.")
print("Número: +" + pedido["phone"])
# 3) Consultar a cada 5 s por até 3 minutos
limite = time.time() + 180
while pedido["status"] == "PENDING" and time.time() < limite:
time.sleep(5)
pedido = api("GET", f"/orders/{pedido['id']}")
if pedido["status"] == "FINISHED":
print("Código recebido:", pedido["code"])
else:
# 4) Não chegou: cancela e o valor volta para o saldo
try:
api("POST", f"/orders/{pedido['id']}/cancel")
print("Cancelado e reembolsado.")
except ApiError as e:
if e.code == "not_cancelable": # o SMS chegou no último instante
print("Código recebido:", e.data["order"]["code"])
else:
raise