Desenvolvedores · API REST v1

Noir SMS API

Compre números temporários e leia códigos de verificação SMS pelo seu próprio sistema, app ou painel de revenda. Mesmos preços, saldo e reembolsos automáticos do painel.

English →

Resposta rápida

Crie uma conta na Noir SMS, adicione saldo e gere uma chave de API na página API do painel. Depois chame POST /api/v1/numbers com um serviço e um país para receber um número, e GET /api/v1/numbers/{id} para ler o código SMS. Números sem SMS são reembolsados automaticamente depois de 20 minutos.

Começo rápido

  1. Pegue uma chaveEntre na conta, abra Painel → API e clique em Generate API key. Copie a chave: ela só aparece uma vez.
  2. Adicione saldoA API usa o seu saldo normal. Recarregue por cartão ou USDC / SOL no painel.
  3. 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
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.

http
Authorization: Bearer nsk_live_SUA_CHAVE
# or
X-API-Key: nsk_live_SUA_CHAVE

URL 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[].code e o texto completo em sms[].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.

request
curl https://noirsms.com/api/v1/balance -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "balance": 24.37, "currency": "USD", "status": "active" }

GET/countries

Países com números em estoque agora e quantos serviços cada um tem.

request
curl https://noirsms.com/api/v1/countries -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "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âmetroTipoDescrição
countrystringCódigo ISO de 2 letras, padrão us.
request
curl "https://noirsms.com/api/v1/services?country=us" -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{
  "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âmetroTipoDescrição
servicestringCódigo do serviço vindo de /services. Obrigatório.
countrystringCódigo ISO de 2 letras. Obrigatório.
max_pricenumberOpcional. Recusa a compra (HTTP 409 price_above_max) se o preço atual for maior.
request
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}'
response
{
  "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.

request
curl https://noirsms.com/api/v1/numbers/6026e15f-088d-45b5-bf22-70ed0b417afa \
  -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{
  "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âmetroTipoDescrição
statusstringactive (padrão: números abertos), waiting, received, canceled, expired ou all.
limitintegerDe 1 a 100, padrão 50.
beforetimestampPaginação: números criados antes desse horário (use o último created_at).
request
curl "https://noirsms.com/api/v1/numbers?status=active&limit=20" -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "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.

request
curl -X POST https://noirsms.com/api/v1/numbers/{id}/cancel -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "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.

request
curl -X POST https://noirsms.com/api/v1/numbers/{id}/resend -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "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.

request
curl -X POST https://noirsms.com/api/v1/numbers/{id}/finish -H "Authorization: Bearer nsk_live_SUA_CHAVE"
response
{ "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.

json
{
  "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.

node.js
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));
}
python
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:

json
{ "error": { "code": "insufficient_balance", "message": "Insufficient balance. You need $0.73.", "needed": 0.73 } }
HTTPcodeSignificado
401invalid_api_keyChave ausente, errada ou revogada.
402insufficient_balanceSaldo insuficiente; needed traz o preço.
409price_above_maxO preço atual está acima do seu max_price.
400no_numbersSem estoque para esse serviço e país agora. Você não foi cobrado.
400too_earlyO cancelamento só é permitido 2 minutos após a compra; veja waitSeconds.
400already_closedO número já foi cancelado ou expirou.
400invalid_request / invalid_countryConfira os códigos de serviço e país.
403account_suspendedA conta está suspensa. Fale com o suporte.
429rate_limitedMais de 120 requisições em um minuto.
502 / 503provider_error / restockingProblema 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 /services ou use max_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.

Pedir condições para volume

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.

Comece a construir com a Noir SMS

Crie uma conta grátis, adicione saldo e gere a sua chave de API em um minuto.