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).
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.
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).
| Interface | URL base | Como enviar a chave | Para quem |
|---|---|---|---|
| handler_api | https://meusms.com/stubs/handler_api.php | parâmetro api_key (ou header X-Api-Key) | bots e softwares que já falam o protocolo SMS-Activate |
| REST | https://meusms.com/api/v1 | header X-Api-Key (ou Authorization: Bearer) | integrações próprias, respostas em JSON |
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.
| Servidor | Países | Escolha de operadora / DDD | Cancelamento |
|---|---|---|---|
| 1 (padrão) | Brasil + extras (ver Países) | Operadora: no WhatsApp, pela API · DDD: não | a partir de ~2 min após a compra |
| 2 | Brasil + extras (ver Países) | Linha: no WhatsApp, pela API · DDD: não | na hora |
| 3 | Só Brasil | Operadora: sim · DDD: sim (11–99, +30% no preço) | na hora |
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.
| Servidor | Serviço | Valores aceitos em operator |
|---|---|---|
| 1 | tim, surf, links_field, algartelecom | |
| 2 | virtual66, virtual51 — linhas do Servidor 2, não o nome de uma operadora | |
| 3 | todos | claro, oi, tim, vivo, nlt (e ddd de 11 a 99, com +30% no preço) |
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ço | Servidor 1 | Servidor 2 | Servidor 3 |
|---|---|---|---|
| Colômbia, Tailândia, Turquia | Colômbia, Tailândia, Turquia | — | |
| ChatGPT (openai) | EUA, México, Turquia, Nova Zelândia, Angola | EUA, México | — |
| — | EUA | — | |
| Demais serviços | só Brasil | só Brasil | só Brasil |
| País | REST (country) | handler_api (country) |
|---|---|---|
| Brasil (padrão) | brazil | 73 |
| EUA | usa | 187 |
| Colômbia | colombia | 33 |
| Tailândia | thailand | 52 |
| Turquia | turkey | 62 |
| México | mexico | 54 |
| Nova Zelândia | newzealand | 67 |
| Angola | angola | 76 |
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=2Pedir 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ço | Nome (REST) | Código (handler_api) |
|---|---|---|
| wa | ||
| Telegram | telegram | tg |
| ig | ||
| Google / Gmail / YouTube | go | |
| ChatGPT | openai | dr |
| fb | ||
| TikTok | tiktok | lf |
| Kwai | kwai | vp |
| Discord | discord | ds |
| Mercado Livre / Mercado Pago | mercado | cq |
| Nubank | nubank | aaa |
| PicPay | picpay | ev |
| iFood | ifood | pd |
| Uber | uber | ub |
| Shopee | shopee | ka |
| Outros (qualquer serviço não listado) | anyother | ot |
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.
https://meusms.com/stubs/handler_api.php
| action | Parâmetros | Resposta |
|---|---|---|
| getBalance | — | ACCESS_BALANCE:42.50 |
| getNumber | service, country (padrão 73), server, operator*, ddd* | ACCESS_NUMBER:id:telefone |
| getStatus | id | STATUS_WAIT_CODE · STATUS_OK:código · STATUS_WAIT_RETRY:código · STATUS_CANCEL |
| setStatus | id, status (1, 3, 6 ou 8) | ACCESS_READY · ACCESS_RETRY_GET · ACCESS_ACTIVATION · ACCESS_CANCEL |
| getExtraActivation | activationId (só Servidor 3) | ACCESS_NUMBER:novo_id:telefone |
| getPrices | server, country, service (opcional) | JSON com preço (cost, em R$) e estoque (count) |
| getNumbersStatus | server, country | JSON com estoque por serviço |
| getServicesList | server | JSON 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.
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
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.
| setStatus | Efeito | Resposta |
|---|---|---|
| status=1 | Avisa que está pronto para receber o SMS (opcional) | ACCESS_READY |
| status=3 | Pede OUTRO SMS no mesmo número, depois do 1º código, sem custo extra | ACCESS_RETRY_GET |
| status=6 | Conclui a ativação (código usado) | ACCESS_ACTIVATION |
| status=8 | Cancela e estorna (só sem SMS recebido) | ACCESS_CANCEL |
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
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 erro | Significado |
|---|---|
| NO_KEY / BAD_KEY | chave ausente, inválida ou revogada |
| BAD_ACTION | action desconhecida |
| BAD_SERVICE | serviço inexistente ou indisponível nesse servidor |
| WRONG_COUNTRY | país não liberado para o serviço/servidor (ou operadora inválida no Servidor 3) |
| WRONG_OPERATOR | operadora fora da lista no WhatsApp do Servidor 1 ou 2 |
| NO_BALANCE | saldo insuficiente |
| NO_NUMBERS | sem números agora (ou limite de 500 compras por minuto atingido) |
| NO_ACTIVATION | id de ativação não encontrado nesta conta |
| BAD_STATUS | ação inválida para o estado atual (ex.: cancelar depois do SMS) |
| EARLY_CANCEL_DENIED | cancelamento cedo demais (Servidor 1, ~2 min) — tente de novo |
| NEW_ACTIVATION_IMPOSSIBLE | reutilização fora do Servidor 3 ou sem SMS recebido |
| SERVER_ERROR | falha 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 rota | O que faz |
|---|---|
| GET /balance | Saldo 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 /orders | Compra 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}/finish | Conclui (código usado) |
| POST /orders/{id}/cancel | Cancela e estorna (só sem SMS) |
| POST /orders/{id}/ban | Reporta número já usado/bloqueado e o devolve (estorna se o SMS não chegou) |
| POST /orders/{id}/resend | Pede outro SMS no mesmo número (depois do 1º código, sem custo) |
| POST /orders/{id}/reuse | Nova ativação no mesmo número (só Servidor 3, cobra de novo) |
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": []}]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 compra | Obrigatório | Valores |
|---|---|---|
| product | sim | nome do serviço (ver Códigos de serviço) |
| server | não | 1, 2 ou 3 — padrão 1 |
| country | não | padrão brazil; outros só nos serviços da seção Países |
| operator | não | padrão any (escolhemos a que mais entrega); WhatsApp nos Servidores 1 e 2 e todos no 3 — ver Operadoras |
| ddd | não | só Servidor 3, de 11 a 99 (+30% no preço) |
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| HTTP | Quando | Corpo |
|---|---|---|
| 401 | chave ausente, inválida ou revogada | {"detail": "..."} |
| 402 | saldo insuficiente | {"detail": "Saldo insuficiente"} |
| 404 | serviço inexistente/indisponível no servidor, ou pedido não encontrado | {"detail": "..."} |
| 400 | país não liberado, operadora fora da lista, ou ação fora de hora (ex.: cancelar no Servidor 1 antes de ~2 min) | {"detail": "..."} |
| 409 | sem números disponíveis nesse servidor agora | {"detail": "Sem números disponíveis..."} |
| 422 | corpo inválido (campo faltando ou fora do formato) | {"detail": [...]} |
| 429 | mais de 500 compras por minuto | {"detail": "..."} |
| 502 | provedor indisponível no momento — tente de novo | {"detail": "..."} |
9. O pedido e seus status
| Campo | Descrição |
|---|---|
| id | Identificador do pedido (o mesmo id do handler_api) |
| product | Serviço comprado |
| phone | Número em formato internacional (55 + DDD + número). Pode vir com ou sem "+" — remova-o se precisar só dos dígitos |
| country / operator | País e operadora do número |
| price | Valor em R$ (string decimal) |
| status | Situação do pedido (tabela abaixo) |
| messages | SMS recebidos: code (código extraído; pode vir vazio), text (mensagem completa), sender, received_at |
| awaiting_resend | true enquanto aguarda o "outro SMS" pedido em /resend |
| server | Servidor de origem do número (1, 2 ou 3) |
| created_at / expires | Compra e validade do número (ISO 8601 com fuso) |
| provider_order_id | Referência interna — informe ao suporte se precisar de ajuda com o pedido |
| status | Significado |
|---|---|
| PENDING / RECEIVED | Número ativo. Em alguns servidores ele já nasce RECEIVED, antes de qualquer SMS |
| FINISHED | Concluído |
| CANCELED | Cancelado, valor estornado |
| TIMEOUT | Expirou sem SMS, valor estornado |
| BANNED | Reportado 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
| Passo | O que fazer |
|---|---|
| 1. Consultar | Peça o preço/estoque no servidor que vai usar (getPrices ou /services?server=). |
| 2. Comprar | getNumber ou POST /orders. Sem número em um servidor, tente outro. |
| 3. Usar o número | Informe o telefone no aplicativo que vai enviar o SMS. |
| 4. Aguardar | Consulte a cada 3–5 segundos (getStatus ou GET /orders/{id}). O número vale ~20 minutos. |
| 5a. Chegou | Use o código e conclua (status=6 ou /finish). Precisa de outro código? Peça com status=3 ou /resend. |
| 5b. Não chegou | Cancele (status=8 ou /cancel) e o valor volta. No Servidor 1, só a partir de ~2 min da compra. |
11. Exemplos completos
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))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
$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
Documentação atualizada em 13/10/2026 às 21:31 (horário de Brasília).