Meu SMSNúmeros virtuais
Para desenvolvedores

Documentação da API

Compre números virtuais e receba SMS de verificação direto no seu sistema, bot ou software de automação. Duas interfaces com a mesma chave e o mesmo saldo: o protocolo handler_api (compatível com SMS-Activate — basta trocar a URL e a chave) e uma API REST em JSON. Os três servidores de números estão disponíveis.

Atualizada em 13/10/2026 às 21:31 (horário de Brasília).

Como obter sua chave de API

1. Crie sua conta · 2. Faça o primeiro depósito via Pix · 3. No painel, abra API e clique em Gerar minha chave.

1. Início rápido

Comprar um número e receber o código são três chamadas: comprar, consultar até o SMS chegar e concluir. Se o SMS não vier, cancele e o valor volta para o saldo.

Os três passos (handler_api)
1) Comprar um número de WhatsApp no Brasil
GET https://meusms.com/stubs/handler_api.php?api_key=SUA_API_KEY&action=getNumber&service=wa&country=73
→ ACCESS_NUMBER:12345:5511999998888      (12345 = id da ativação)

2) Consultar a cada 3–5 segundos até o código chegar
GET https://meusms.com/stubs/handler_api.php?api_key=SUA_API_KEY&action=getStatus&id=12345
→ STATUS_WAIT_CODE … STATUS_OK:384720

3) Concluir (ou cancelar com status=8 se o SMS não vier)
GET https://meusms.com/stubs/handler_api.php?api_key=SUA_API_KEY&action=setStatus&id=12345&status=6
→ ACCESS_ACTIVATION

2. Autenticação e URLs

Há duas formas de integrar, com a mesma chave, o mesmo saldo e os mesmos preços do site. Valores sempre em reais (BRL).

InterfaceURL baseComo enviar a chavePara quem
handler_apihttps://meusms.com/stubs/handler_api.phpparâmetro api_key (ou header X-Api-Key)bots e softwares que já falam o protocolo SMS-Activate
RESThttps://meusms.com/api/v1header X-Api-Key (ou Authorization: Bearer)integrações próprias, respostas em JSON
Como conseguir a chave
Crie sua conta, faça o primeiro depósito via Pix e gere a chave no painel, em API. Ela aparece uma única vez: guarde em local seguro.
Trate a chave como senha
Ela compra com o saldo da sua conta. Se vazar, revogue e gere outra no painel — a antiga para de funcionar na hora.
GET ou POST
O handler_api aceita GET com query string ou POST com formulário. O REST usa GET para consultas e POST para ações.

3. Os três servidores

Cada número vem de um servidor, e eles têm preços, estoque e operadoras diferentes. Todos os endpoints aceitam server=1, server=2 ou server=3. Sem informar, vale o Servidor 1.

ServidorPaísesEscolha de operadora / DDDCancelamento
1 (padrão)Brasil + extras (ver Países)Operadora: no WhatsApp, pela API · DDD: nãoa partir de ~2 min após a compra
2Brasil + extras (ver Países)Linha: no WhatsApp, pela API · DDD: nãona hora
3Só BrasilOperadora: sim · DDD: sim (11–99, +30% no preço)na hora
Consulte o preço do servidor certo
O mesmo serviço custa valores diferentes em cada servidor: peça o catálogo com o mesmo server que vai usar na compra.
Sem número em um servidor?
"Sem números" vale só para o servidor consultado. Tente outro antes de desistir do serviço.
WhatsApp
Disponível nos Servidores 1 e 2. Não é vendido no Servidor 3.

4. Operadoras

Sem informar nada, escolhemos por você a operadora que mais entrega SMS para cada serviço — e, se ela estiver sem número, a compra cai automaticamente em outra. É o recomendado para a maioria das integrações. Para fixar a operadora, envie operator com um dos valores abaixo. Nos Servidores 1 e 2 a escolha está disponível para o WhatsApp, pela API; no Servidor 3, para todos os serviços.

ServidorServiçoValores aceitos em operator
1WhatsApptim, surf, links_field, algartelecom
2WhatsAppvirtual66, virtual51 — linhas do Servidor 2, não o nome de uma operadora
3todosclaro, oi, tim, vivo, nlt (e ddd de 11 a 99, com +30% no preço)
Escolheu, é só ela
Com operator, a compra usa apenas aquela operadora. Sem número nela, a resposta é "sem números" — tente outra ou envie sem operator.
Só os nomes da tabela
No WhatsApp dos Servidores 1 e 2, outro valor é recusado sem cobrança: 400 no REST e WRONG_OPERATOR no handler_api. No Servidor 3: 400 e WRONG_COUNTRY.
Estoque varia
Nem todo serviço tem número em todas as operadoras, e o estoque muda ao longo do dia.
Qual veio?
O campo operator do pedido (REST) mostra a operadora ou linha do número entregue — inclusive quando você não escolheu.
Escolhendo a operadora
handler_api — Servidor 1, operadora surf:
GET https://meusms.com/stubs/handler_api.php?api_key=SUA_API_KEY&action=getNumber&service=wa&country=73&server=1&operator=surf

handler_api — Servidor 2, linha virtual51:
GET ...&action=getNumber&service=wa&country=73&server=2&operator=virtual51

REST — Servidor 1, operadora tim:
curl -X POST -H "X-Api-Key: SUA_API_KEY" -H "Content-Type: application/json" \
  -d '{"product": "whatsapp", "server": 1, "operator": "tim"}' https://meusms.com/api/v1/orders
→ 201 {"id": 12345, "operator": "tim", "server": 1, ...}

5. Países

Sem informar o país, o número é do Brasil. Alguns serviços aceitam outros países, e a lista muda por servidor. Cada país tem preço e estoque próprios: consulte antes de comprar em vez de fixar o país no seu código.

ServiçoServidor 1Servidor 2Servidor 3
GoogleColômbia, Tailândia, TurquiaColômbia, Tailândia, Turquia—
ChatGPT (openai)EUA, México, Turquia, Nova Zelândia, AngolaEUA, México—
Instagram—EUA—
Demais serviçossó Brasilsó Brasilsó Brasil
PaísREST (country)handler_api (country)
Brasil (padrão)brazil73
EUAusa187
Colômbiacolombia33
Tailândiathailand52
Turquiaturkey62
Méxicomexico54
Nova Zelândianewzealand67
Angolaangola76
Quais países e preços um serviço tem?
REST — só responde para serviços com mais de um país (os demais devolvem 404):
curl -H "X-Api-Key: SUA_API_KEY" "https://meusms.com/api/v1/services/instagram/countries?server=2"
→ [{"country": "brazil", "price": "2.02", "count": 10511405},
   {"country": "usa",    "price": "2.15", "count": 71830}]

handler_api — preços de um país (só os serviços liberados nele):
GET ...&action=getPrices&country=187&server=2
→ {"187": {"ig": {"cost": 2.15, "count": 71830}, "dr": {"cost": 1.49, "count": 25962}}}

Comprar nos EUA:
REST:        -d '{"product": "instagram", "country": "usa", "server": 2}'
handler_api: ...&action=getNumber&service=ig&country=187&server=2

Pedir um país que o serviço (ou aquele servidor) não tem é recusado: 400 no REST e WRONG_COUNTRY no handler_api. Nada é cobrado.

6. Códigos de serviço

No REST o serviço vai pelo nome (whatsapp). No handler_api vale o código do protocolo (wa) ou o próprio nome. A lista completa, com preços e estoque, vem de GET /api/v1/services ou action=getServicesList — sempre com o server que você vai usar.

ServiçoNome (REST)Código (handler_api)
WhatsAppwhatsappwa
Telegramtelegramtg
Instagraminstagramig
Google / Gmail / YouTubegooglego
ChatGPTopenaidr
Facebookfacebookfb
TikToktiktoklf
Kwaikwaivp
Discorddiscordds
Mercado Livre / Mercado Pagomercadocq
Nubanknubankaaa
PicPaypicpayev
iFoodifoodpd
Uberuberub
Shopeeshopeeka
Outros (qualquer serviço não listado)anyotherot

7. Protocolo handler_api

Compatível com o padrão SMS-Activate: qualquer bot ou software que já usa esse protocolo funciona trocando só a URL e a chave. Respostas em texto puro (ou JSON nas consultas de catálogo), sempre com HTTP 200 — leia o corpo, não o código HTTP. Extensões nossas: server, operator e ddd.

URL da API (cole no seu software)
https://meusms.com/stubs/handler_api.php
actionParâmetrosResposta
getBalance—ACCESS_BALANCE:42.50
getNumberservice, country (padrão 73), server, operator*, ddd*ACCESS_NUMBER:id:telefone
getStatusidSTATUS_WAIT_CODE · STATUS_OK:código · STATUS_WAIT_RETRY:código · STATUS_CANCEL
setStatusid, status (1, 3, 6 ou 8)ACCESS_READY · ACCESS_RETRY_GET · ACCESS_ACTIVATION · ACCESS_CANCEL
getExtraActivationactivationId (só Servidor 3)ACCESS_NUMBER:novo_id:telefone
getPricesserver, country, service (opcional)JSON com preço (cost, em R$) e estoque (count)
getNumbersStatusserver, countryJSON com estoque por serviço
getServicesListserverJSON com código e nome de cada serviço
getCountries—JSON com os países e seus IDs

* operator: WhatsApp nos Servidores 1 e 2, todos os serviços no 3 (ver Operadoras); ddd, só no Servidor 3.

Comprar
GET https://meusms.com/stubs/handler_api.php?api_key=SUA_API_KEY&action=getNumber&service=wa&country=73
→ ACCESS_NUMBER:12345:5511999998888

Pelo Servidor 2:
GET ...&action=getNumber&service=wa&country=73&server=2

Servidor 3, escolhendo operadora e DDD (DDD = +30% no preço):
GET ...&action=getNumber&service=tg&country=73&server=3&operator=vivo&ddd=11
Aguardar o código (a cada 3–5s)
GET ...&action=getStatus&id=12345
→ STATUS_WAIT_CODE      ainda sem SMS
→ STATUS_OK:384720      código recebido
→ STATUS_CANCEL         cancelado, expirado ou concluído sem SMS

Se o SMS não tem código numérico (ex.: um link), STATUS_OK traz o texto inteiro.
setStatusEfeitoResposta
status=1Avisa que está pronto para receber o SMS (opcional)ACCESS_READY
status=3Pede OUTRO SMS no mesmo número, depois do 1º código, sem custo extraACCESS_RETRY_GET
status=6Conclui a ativação (código usado)ACCESS_ACTIVATION
status=8Cancela e estorna (só sem SMS recebido)ACCESS_CANCEL
Outro SMS e reutilização do número
Pedir outro SMS (depois do 1º código):
GET ...&action=setStatus&id=12345&status=3   → ACCESS_RETRY_GET
GET ...&action=getStatus&id=12345            → STATUS_WAIT_RETRY:384720 … STATUS_OK:novo

Nova ativação no MESMO número (só Servidor 3; cobra o preço do serviço de novo):
GET ...&action=getExtraActivation&activationId=12345 → ACCESS_NUMBER:12346:5511999998888
Catálogo (aceita &server=1|2|3)
GET ...&action=getPrices&server=1
→ {"73": {"wa": {"cost": 15.45, "count": 26049}, "tg": {"cost": 3.50, "count": 280114}, ...}}

GET ...&action=getNumbersStatus&server=1   → {"wa_0": 26049, "tg_0": 280114, ...}
GET ...&action=getServicesList&server=1    → {"status": "success", "services": [{"code": "wa", "name": "whatsapp"}, ...]}
GET ...&action=getCountries                → {"73": {"id": 73, "eng": "brazil", ...}, "187": {...}}

Com &country=ID, getPrices e getNumbersStatus trazem o preço e o estoque daquele país.
No Servidor 3 o preço listado é sem DDD; com &ddd o valor sobe 30%.
Resposta de erroSignificado
NO_KEY / BAD_KEYchave ausente, inválida ou revogada
BAD_ACTIONaction desconhecida
BAD_SERVICEserviço inexistente ou indisponível nesse servidor
WRONG_COUNTRYpaís não liberado para o serviço/servidor (ou operadora inválida no Servidor 3)
WRONG_OPERATORoperadora fora da lista no WhatsApp do Servidor 1 ou 2
NO_BALANCEsaldo insuficiente
NO_NUMBERSsem números agora (ou limite de 500 compras por minuto atingido)
NO_ACTIVATIONid de ativação não encontrado nesta conta
BAD_STATUSação inválida para o estado atual (ex.: cancelar depois do SMS)
EARLY_CANCEL_DENIEDcancelamento cedo demais (Servidor 1, ~2 min) — tente de novo
NEW_ACTIVATION_IMPOSSIBLEreutilização fora do Servidor 3 ou sem SMS recebido
SERVER_ERRORfalha temporária — tente de novo

8. API REST

API JSON em https://meusms.com/api/v1. Envie a chave no header X-Api-Key. Nas consultas o servidor vai na query (?server=2); na compra, no corpo JSON.

Método e rotaO que faz
GET /balanceSaldo disponível e congelado (em pedidos abertos)
GET /services?server=&search=Catálogo: preço (R$) e estoque de cada serviço
GET /services/{serviço}/countries?server=Preço e estoque por país (serviços com mais de um país)
POST /ordersCompra um número
GET /orders?limit=&offset=Seus pedidos, mais recentes primeiro (limit 1–100, padrão 50)
GET /orders/{id}Estado do pedido e SMS recebidos — consulte a cada 3–5s
POST /orders/{id}/finishConclui (código usado)
POST /orders/{id}/cancelCancela e estorna (só sem SMS)
POST /orders/{id}/banReporta número já usado/bloqueado e o devolve (estorna se o SMS não chegou)
POST /orders/{id}/resendPede outro SMS no mesmo número (depois do 1º código, sem custo)
POST /orders/{id}/reuseNova ativação no mesmo número (só Servidor 3, cobra de novo)
Saldo e catálogo
curl -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/balance
→ {"balance": "42.50", "frozen": "0.00", "currency": "BRL"}

curl -H "X-Api-Key: SUA_API_KEY" "https://meusms.com/api/v1/services?server=1&search=whats"
→ [{"product": "whatsapp", "price": "15.45", "count": 26049, "rate": null, "countries": []}]
Comprar
curl -X POST -H "X-Api-Key: SUA_API_KEY" -H "Content-Type: application/json" \
  -d '{"product": "whatsapp", "server": 1}' https://meusms.com/api/v1/orders
→ 201 {"id": 12345, "phone": "5511999998888", "status": "PENDING", "price": "15.45", "server": 1, ...}

Servidor 3 com operadora e DDD:
  -d '{"product": "telegram", "server": 3, "operator": "vivo", "ddd": 11}'
Campo da compraObrigatórioValores
productsimnome do serviço (ver Códigos de serviço)
servernão1, 2 ou 3 — padrão 1
countrynãopadrão brazil; outros só nos serviços da seção Países
operatornãopadrão any (escolhemos a que mais entrega); WhatsApp nos Servidores 1 e 2 e todos no 3 — ver Operadoras
dddnãosó Servidor 3, de 11 a 99 (+30% no preço)
Aguardar, concluir, cancelar
curl -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/orders/12345
→ {"id": 12345, "status": "RECEIVED",
   "messages": [{"code": "384720", "text": "Seu código é 384720", "sender": "...", "received_at": "..."}], ...}

curl -X POST -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/orders/12345/finish
curl -X POST -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/orders/12345/cancel
curl -X POST -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/orders/12345/resend
curl -X POST -H "X-Api-Key: SUA_API_KEY" https://meusms.com/api/v1/orders/12345/reuse
HTTPQuandoCorpo
401chave ausente, inválida ou revogada{"detail": "..."}
402saldo insuficiente{"detail": "Saldo insuficiente"}
404serviço inexistente/indisponível no servidor, ou pedido não encontrado{"detail": "..."}
400país não liberado, operadora fora da lista, ou ação fora de hora (ex.: cancelar no Servidor 1 antes de ~2 min){"detail": "..."}
409sem números disponíveis nesse servidor agora{"detail": "Sem números disponíveis..."}
422corpo inválido (campo faltando ou fora do formato){"detail": [...]}
429mais de 500 compras por minuto{"detail": "..."}
502provedor indisponível no momento — tente de novo{"detail": "..."}

9. O pedido e seus status

CampoDescrição
idIdentificador do pedido (o mesmo id do handler_api)
productServiço comprado
phoneNúmero em formato internacional (55 + DDD + número). Pode vir com ou sem "+" — remova-o se precisar só dos dígitos
country / operatorPaís e operadora do número
priceValor em R$ (string decimal)
statusSituação do pedido (tabela abaixo)
messagesSMS recebidos: code (código extraído; pode vir vazio), text (mensagem completa), sender, received_at
awaiting_resendtrue enquanto aguarda o "outro SMS" pedido em /resend
serverServidor de origem do número (1, 2 ou 3)
created_at / expiresCompra e validade do número (ISO 8601 com fuso)
provider_order_idReferência interna — informe ao suporte se precisar de ajuda com o pedido
statusSignificado
PENDING / RECEIVEDNúmero ativo. Em alguns servidores ele já nasce RECEIVED, antes de qualquer SMS
FINISHEDConcluído
CANCELEDCancelado, valor estornado
TIMEOUTExpirou sem SMS, valor estornado
BANNEDReportado como já usado/bloqueado, valor estornado

Importante: o código chegou quando messages deixa de ser vazio. Confira por ele, não pelo status.

10. Fluxo recomendado

PassoO que fazer
1. ConsultarPeça o preço/estoque no servidor que vai usar (getPrices ou /services?server=).
2. ComprargetNumber ou POST /orders. Sem número em um servidor, tente outro.
3. Usar o númeroInforme o telefone no aplicativo que vai enviar o SMS.
4. AguardarConsulte a cada 3–5 segundos (getStatus ou GET /orders/{id}). O número vale ~20 minutos.
5a. ChegouUse o código e conclua (status=6 ou /finish). Precisa de outro código? Peça com status=3 ou /resend.
5b. Não chegouCancele (status=8 ou /cancel) e o valor volta. No Servidor 1, só a partir de ~2 min da compra.

11. Exemplos completos

Python (handler_api) — pip install requests
import time
import requests

API = "https://meusms.com/stubs/handler_api.php"
KEY = "SUA_API_KEY"


def call(**params):
    r = requests.get(API, params={"api_key": KEY, **params}, timeout=30)
    return r.text.strip()


resp = call(action="getNumber", service="wa", country=73, server=1)
if not resp.startswith("ACCESS_NUMBER"):
    raise SystemExit("Não comprou: " + resp)   # NO_BALANCE, NO_NUMBERS...
_, activation_id, phone = resp.split(":")
print("Número:", phone)

limite = time.time() + 20 * 60
while time.time() < limite:
    status = call(action="getStatus", id=activation_id)
    if status.startswith("STATUS_OK"):
        print("Código:", status.split(":", 1)[1])
        call(action="setStatus", id=activation_id, status=6)   # concluir
        break
    if status == "STATUS_CANCEL":
        print("Ativação encerrada sem SMS")
        break
    time.sleep(4)
else:
    print("Sem SMS, cancelando:", call(action="setStatus", id=activation_id, status=8))
JavaScript / Node 18+ (REST)
const API = "https://meusms.com/api/v1";
const headers = { "X-Api-Key": "SUA_API_KEY", "Content-Type": "application/json" };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

async function main() {
  const buy = await fetch(`${API}/orders`, {
    method: "POST",
    headers,
    body: JSON.stringify({ product: "telegram", server: 1 }),
  });
  const order = await buy.json();
  if (!buy.ok) throw new Error(`${buy.status}: ${JSON.stringify(order.detail)}`);
  console.log("Número:", order.phone);

  for (let i = 0; i < 300; i++) {          // ~20 min
    await sleep(4000);
    const o = await (await fetch(`${API}/orders/${order.id}`, { headers })).json();
    if (o.messages.length) {
      const sms = o.messages[o.messages.length - 1];
      console.log("Código:", sms.code || sms.text);
      await fetch(`${API}/orders/${order.id}/finish`, { method: "POST", headers });
      return;
    }
    if (["CANCELED", "TIMEOUT", "BANNED"].includes(o.status)) {
      return console.log("Encerrado:", o.status);
    }
  }
  const c = await fetch(`${API}/orders/${order.id}/cancel`, { method: "POST", headers });
  console.log("Sem SMS, cancelado:", c.status);
}

main().catch(console.error);
PHP (handler_api)
<?php
$api = "https://meusms.com/stubs/handler_api.php";
$key = "SUA_API_KEY";

function call($api, $key, $params) {
    $url = $api . "?" . http_build_query(array_merge(["api_key" => $key], $params));
    return trim(file_get_contents($url));
}

$resp = call($api, $key, ["action" => "getNumber", "service" => "wa", "country" => 73]);
if (strpos($resp, "ACCESS_NUMBER") !== 0) exit("Não comprou: $resp\n");
[, $id, $phone] = explode(":", $resp);
echo "Número: $phone\n";

for ($i = 0; $i < 300; $i++) {
    sleep(4);
    $status = call($api, $key, ["action" => "getStatus", "id" => $id]);
    if (strpos($status, "STATUS_OK:") === 0) {
        echo "Código: " . substr($status, 10) . "\n";
        call($api, $key, ["action" => "setStatus", "id" => $id, "status" => 6]);
        exit;
    }
    if ($status === "STATUS_CANCEL") exit("Encerrado sem SMS\n");
}
echo "Cancelando: " . call($api, $key, ["action" => "setStatus", "id" => $id, "status" => 8]) . "\n";

12. Regras e limites

Mesmo saldo da conta
As compras pela API usam o saldo normal da conta. Recarregue via Pix pelo painel.
Só paga se o SMS chegar
O valor fica congelado durante a espera. Sem código, ele volta sozinho para o saldo.
Limite de compras
Até 500 compras por minuto por conta, somando REST e handler_api. Acima disso: 429 no REST e NO_NUMBERS no handler_api.
Consultas de status
A cada 3–5 segundos por número. Não é preciso consultar mais rápido: o SMS fica guardado no pedido.
Validade do número
Cerca de 20 minutos. Sem SMS nesse prazo, o número expira (TIMEOUT) e o valor volta para o saldo.
Cancelamento
Só antes do SMS. No Servidor 1, a partir de ~2 minutos após a compra; nos Servidores 2 e 3, na hora.
Preço por servidor e país
O mesmo serviço custa diferente em cada servidor e país. Consulte antes de comprar.
DDD custa mais
No Servidor 3, escolher o DDD acrescenta 30% ao preço. Sem DDD, o número vem de qualquer região.
Suporte
Dúvidas na integração: suporte@meusms.com. Informe o id do pedido quando o assunto for um número específico.

Documentação atualizada em 13/10/2026 às 21:31 (horário de Brasília).