Começo rápido
- Pegue uma chaveEntre na conta, abra Painel → API e clique em Generate API key. Copie a chave: ela só aparece uma vez.
- Adicione saldoA API usa o seu saldo normal. Recarregue por cartão ou USDC / SOL no painel.
- Compre, leia, prontoCompre um número, coloque no app que está verificando, consulte o código (ou use um webhook) e depois finalize ou cancele.
curl -X POST https://noirsms.com/api/v1/numbers \
-H "Authorization: Bearer nsk_live_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"service": "wa", "country": "us", "max_price": 1.50}'Autenticação
Toda requisição precisa da sua chave de API, como token Bearer ou no cabeçalho X-API-Key. As chaves começam com nsk_live_. Uma chave por conta; gerar outra no painel desativa a antiga na hora. Nunca coloque a chave num navegador ou app: chame a API a partir do seu servidor.
Authorization: Bearer nsk_live_SUA_CHAVE
# or
X-API-Key: nsk_live_SUA_CHAVEURL base: https://noirsms.com/api/v1. Todos os corpos são JSON, todos os preços são em dólares americanos e todos os horários em ISO 8601 (UTC).
Especificação para máquinas: /api/openapi.json (OpenAPI 3.1). Importe no Postman ou no Insomnia, ou gere um cliente na sua linguagem.
Como funciona uma compra
- waiting: o número é seu por 20 minutos (
expires_at). Digite no app e aguarde o SMS. - received: chegou pelo menos um SMS; o código está em
sms[].codee o texto completo emsms[].text. Enquanto o número estiver aberto, você pode pedir outro SMS com/resend. - canceled: você cancelou (permitido a partir de
cancelable_at, 2 minutos após a compra) e o valor voltou para o seu saldo. - expired: nenhum SMS em 20 minutos; o valor voltou para o seu saldo automaticamente.
O preço é calculado do nosso lado no momento da compra; envie max_price para recusar a compra se o preço atual for maior do que você espera.
Endpoints
GET/balance
Seu saldo atual.
curl https://noirsms.com/api/v1/balance -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "balance": 24.37, "currency": "USD", "status": "active" }GET/countries
Países com números em estoque agora e quantos serviços cada um tem.
curl https://noirsms.com/api/v1/countries -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "server": 1, "countries": [ { "country": "gb", "services": 382 }, { "country": "us", "services": 264 } ] }GET/services?country=us
Serviços em estoque num país, com o preço que você paga por número e o estoque.
Use o código service (por exemplo wa = WhatsApp, tg = Telegram, go = Google) na compra.
| Parâmetro | Tipo | Descrição |
|---|---|---|
country | string | Código ISO de 2 letras, padrão us. |
curl "https://noirsms.com/api/v1/services?country=us" -H "Authorization: Bearer nsk_live_SUA_CHAVE"{
"server": 1, "country": "us", "currency": "USD",
"services": [
{ "service": "wa", "name": "Whatsapp", "price": 0.73, "stock": 91562 },
{ "service": "tg", "name": "Telegram", "price": 0.65, "stock": 40211 }
]
}POST/numbers
Compra um número.
O preço é debitado do seu saldo e reembolsado automaticamente se nenhum SMS chegar. Responde 201 com o número.
| Parâmetro | Tipo | Descrição |
|---|---|---|
service | string | Código do serviço vindo de /services. Obrigatório. |
country | string | Código ISO de 2 letras. Obrigatório. |
max_price | number | Opcional. Recusa a compra (HTTP 409 price_above_max) se o preço atual for maior. |
curl -X POST https://noirsms.com/api/v1/numbers \
-H "Authorization: Bearer nsk_live_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"service": "wa", "country": "us", "max_price": 1.50}'{
"id": "6026e15f-088d-45b5-bf22-70ed0b417afa",
"phone": "12025550147",
"service": "wa",
"country": "us",
"server": 1,
"price": 0.73,
"currency": "USD",
"status": "waiting",
"created_at": "2026-10-14T07:05:10Z",
"expires_at": "2026-10-14T07:25:10Z",
"cancelable_at": "2026-10-14T07:07:10Z",
"sms": []
}GET/numbers/{id}
Status de um número e todos os SMS que ele recebeu.
Consulta a operadora em tempo real enquanto o número está aberto. Consulte a cada 3 a 5 segundos até status ser received.
curl https://noirsms.com/api/v1/numbers/6026e15f-088d-45b5-bf22-70ed0b417afa \
-H "Authorization: Bearer nsk_live_SUA_CHAVE"{
"id": "6026e15f-088d-45b5-bf22-70ed0b417afa",
"phone": "12025550147", "service": "wa", "country": "us",
"status": "received", "price": 0.73, "currency": "USD",
"expires_at": "2026-10-14T07:25:10Z",
"sms": [ { "code": "482915", "text": "Your WhatsApp code: 482-915", "received_at": "2026-10-14T07:06:02Z" } ]
}GET/numbers
Números que você comprou pela API, do mais novo para o mais antigo.
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | string | active (padrão: números abertos), waiting, received, canceled, expired ou all. |
limit | integer | De 1 a 100, padrão 50. |
before | timestamp | Paginação: números criados antes desse horário (use o último created_at). |
curl "https://noirsms.com/api/v1/numbers?status=active&limit=20" -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "data": [ { "id": "…", "status": "waiting", "sms": [] } ], "has_more": false }POST/numbers/{id}/cancel
Cancela um número que não recebeu SMS e devolve o valor.
Permitido a partir de cancelable_at (2 minutos após a compra). Se o SMS chegou nesse meio-tempo, nada é reembolsado e o código é devolvido.
curl -X POST https://noirsms.com/api/v1/numbers/{id}/cancel -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "id": "…", "status": "canceled", "refunded": true, "sms": [] }POST/numbers/{id}/resend
Pede outro SMS no mesmo número, grátis, enquanto ele está aberto.
Só depois que o primeiro SMS chegou. Algumas operadoras recusam; nesse caso você recebe resend_refused.
curl -X POST https://noirsms.com/api/v1/numbers/{id}/resend -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "id": "…", "status": "received", "sms": [ … ] }POST/numbers/{id}/finish
Avisa que você terminou de usar um número que recebeu o código.
Opcional, mas libera o número mais cedo.
curl -X POST https://noirsms.com/api/v1/numbers/{id}/finish -H "Authorization: Bearer nsk_live_SUA_CHAVE"{ "id": "…", "status": "received", "sms": [ … ] }Webhooks
Configure uma URL HTTPS na página API do painel e enviamos um POST sms.received assim que detectamos um SMS num número que você comprou pela API (tentamos de novo uma vez após 3 segundos se o seu servidor falhar). Responda com qualquer status 2xx.
{
"type": "sms.received",
"created_at": "2026-10-14T07:06:03Z",
"data": {
"number_id": "6026e15f-088d-45b5-bf22-70ed0b417afa",
"phone": "12025550147", "service": "wa", "country": "us",
"status": "received", "expires_at": "2026-10-14T07:25:10Z",
"sms": { "code": "482915", "text": "Your WhatsApp code: 482-915", "received_at": "2026-10-14T07:06:02Z" }
}
}Todo webhook traz X-NoirSMS-Signature: t=<unix time>,v1=<assinatura>, onde a assinatura é o HMAC-SHA256 em hexadecimal de "<t>.<corpo bruto>" com o seu segredo de webhook (mostrado no painel). Valide a assinatura e rejeite timestamps com mais de 5 minutos.
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}import hmac, hashlib, time
def verify(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300:
return False
expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"])Erros
Os erros usam o status HTTP e um corpo JSON com um code estável, que você pode usar para decidir o que fazer:
{ "error": { "code": "insufficient_balance", "message": "Insufficient balance. You need $0.73.", "needed": 0.73 } }| HTTP | code | Significado |
|---|---|---|
| 401 | invalid_api_key | Chave ausente, errada ou revogada. |
| 402 | insufficient_balance | Saldo insuficiente; needed traz o preço. |
| 409 | price_above_max | O preço atual está acima do seu max_price. |
| 400 | no_numbers | Sem estoque para esse serviço e país agora. Você não foi cobrado. |
| 400 | too_early | O cancelamento só é permitido 2 minutos após a compra; veja waitSeconds. |
| 400 | already_closed | O número já foi cancelado ou expirou. |
| 400 | invalid_request / invalid_country | Confira os códigos de serviço e país. |
| 403 | account_suspended | A conta está suspensa. Fale com o suporte. |
| 429 | rate_limited | Mais de 120 requisições em um minuto. |
| 502 / 503 | provider_error / restocking | Problema temporário na operadora. Você não foi cobrado; tente de novo em instantes. |
Limites e regras
- 120 requisições por minuto por chave. Consulte um número a cada 3 a 5 segundos, não mais rápido que isso.
- Cada número serve para uma verificação e fica reservado por 20 minutos. Só SMS: sem chamadas e sem envio de mensagens.
- Os preços seguem oferta e demanda e podem mudar durante o dia; sempre leia em
/servicesou usemax_price. - Use a API só para as suas próprias contas legítimas ou, como revendedor, para clientes que sigam a mesma Política de Uso Aceitável. Criação de contas em massa ou automatizada, spam, burlar banimentos e burlar verificações de bancos, fintechs ou de identidade (KYC) são proibidos e levam ao encerramento da conta.
Volume alto
Sua plataforma, painel ou bot compra números todos os dias? Abra um ticket no Suporte do painel com o seu volume mensal aproximado, os serviços e países que você usa e o que a sua plataforma faz. Analisamos cada pedido e podemos oferecer condições especiais para volume médio e alto.
Perguntas frequentes sobre a API
Quanto custa a API?
Nada a mais. Cada número custa o mesmo que no painel e sai do mesmo saldo. Se nenhum SMS chegar em 20 minutos, o valor volta automaticamente para o seu saldo.
Posso revender números com a API?
Sim. Você pode oferecer verificação por SMS na sua própria plataforma ou painel e definir os seus preços. Seus clientes precisam seguir a mesma Política de Uso Aceitável, e você é responsável por abusos na sua plataforma.
Existe sandbox?
Não existe um sandbox separado. Use os endpoints GET (saldo, serviços, países) à vontade; uma compra usa saldo real, mas é reembolsada automaticamente se nenhum SMS chegar, e você pode cancelar 2 minutos após a compra.
Em quanto tempo o código chega?
Normalmente em segundos depois que o app envia. Consulte GET /numbers/{id} a cada 3 a 5 segundos, ou configure um webhook no painel para receber sms.received assim que detectarmos o SMS.
Qual é o limite de requisições?
120 requisições por minuto por chave de API. Acima disso você recebe HTTP 429 com o código rate_limited; espere alguns segundos e tente de novo.
Existem condições especiais para volume alto?
Sim, sob consulta. Se você compra volume médio ou alto, abra um ticket no Suporte do painel com o seu volume mensal, serviços e países, e analisamos condições especiais para a sua conta.
Existe especificação OpenAPI?
Sim, em https://noirsms.com/api/openapi.json (OpenAPI 3.1). Importe no Postman, no Insomnia ou num gerador de código para ter um cliente pronto.