API de revenda de números virtuais
Venda números para receber SMS (WhatsApp, Telegram, Google, iFood e outros) no seu site, painel ou bot. A API segue o mesmo formato do sms-activate: se o seu sistema já funciona com outro fornecedor desse padrão, basta trocar o endereço e a chave. Cada compra sai do seu saldo no Flash SMS, com preço de revendedor.
Em 3 passos
Crie a conta e recarregue
As compras feitas pela API usam o saldo da sua conta. Recarregue por Pix ou cartão no painel.
Gere sua chave
No painel, abra Minha conta → API de revenda e clique em Gerar minha chave. Guarde a chave: ela só aparece uma vez.
Configure seu sistema
Use o endereço abaixo com api_key e action. Pode ser GET ou POST.
https://okgflpvrtyrohparffoy.supabase.co/functions/v1/reseller-api/stubs/handler_api.php
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
api_key | sim | Sua chave, gerada em Minha conta. |
action | sim | A ação desejada (veja abaixo). |
server | não | 1 (padrão), 2 ou 3. São três fornecedores com estoques e preços diferentes, os mesmos do painel, mas com outra numeração: server=1 é o "Servidor 1" do painel, server=3 é o "Servidor 2" e server=2 é o "Servidor 3". Vale para getNumber e getPrices; nas outras ações o servidor é descoberto pelo id. |
operator | não | Só no server=2, números do Brasil (country=73), em getNumber/getNumberV2. Operadora do número: claro, vivo, tim, oi, algartelecom, correios_celular, nlt ou any (padrão). Sem custo extra. |
ddd | não | Só no server=2, números do Brasil, em getNumber/getNumberV2. DDD do número, ex.: 11, 21, 31. Escolher DDD acrescenta 30% ao preço da ativação. Sem números com esse DDD/operadora, a resposta é NO_NUMBERS; DDD ou operadora inválidos dão BAD_ACTION. |
Valores em reais (R$). As respostas são texto puro (ex.: ACCESS_BALANCE:50.00) ou JSON, igual ao padrão sms-activate.
Ações
getBalance
Saldo da sua conta?api_key=SUA_CHAVE&action=getBalanceACCESS_BALANCE:50.00getPrices
Preços de revenda e estoqueservice, country e server. Sem filtro, devolve todos os serviços e países com estoque. cost é o preço que você paga por número, já com o desconto de revendedor.?api_key=SUA_CHAVE&action=getPrices
&service=wa&country=73{ "73": { "wa": { "cost": 10.13, "count": 27852 } } }getNumber
Compra um númeroservice (código do serviço), country (padrão 73 = Brasil) e server. O valor é descontado do saldo na hora; se não sair número, nada é cobrado.?api_key=SUA_CHAVE&action=getNumber
&service=wa&country=73&server=1ACCESS_NUMBER:933749378:5511987654321 id número
getNumberV2
Mesma compra, resposta em JSON?api_key=SUA_CHAVE&action=getNumberV2
&service=wa&country=73{
"activationId": "933749378",
"phoneNumber": "5511987654321",
"activationCost": 10.13,
"currency": "BRL",
"countryCode": "73",
"activationTime": "2026-10-05T14:25:32Z"
}getStatus
Consulta se o SMS chegouSTATUS_OK ou STATUS_CANCEL.
STATUS_WAIT_CODE: aguardando o SMSSTATUS_OK:123456: código recebidoSTATUS_WAIT_RETRY:123456: você pediu outro SMS (status=3); aguardando o novo código (o número após os dois-pontos é o código anterior)STATUS_CANCEL: encerrado sem SMS (o valor já voltou para o seu saldo)NO_ACTIVATION: id não encontrado na sua conta
?api_key=SUA_CHAVE&action=getStatus
&id=933749378STATUS_OK:482913setStatus
Cancela ou finalizastatus=8: cancelar. Sem SMS, o valor volta para o saldo:ACCESS_CANCEL. Antes de 2 minutos da compra:EARLY_CANCEL_DENIED. Se o SMS já chegou, o número é encerrado sem estorno:ACCESS_ACTIVATION.status=6: finalizar depois de receber o código:ACCESS_ACTIVATION. Sem SMS:BAD_STATUS(use cancelar).status=3: receber outro SMS no mesmo número, sem custo, dentro dos 20 minutos e depois do primeiro código:ACCESS_RETRY_GET. Continue comgetStatusaté vir o novoSTATUS_OK. Se a operadora não liberar:BAD_STATUS.status=1: avisar que o SMS foi enviado:ACCESS_READY.
?api_key=SUA_CHAVE&action=setStatus
&id=933749378&status=8ACCESS_CANCELgetServicesList · getCountries
Códigos de serviço e de paísservice e country.Códigos mais usados
| Serviço | service | Serviço | service |
|---|---|---|---|
wa | Discord | ds | |
| Telegram | tg | Shopee | ka |
| Google / YouTube | go | iFood | pd |
ig | Uber | ub | |
fb | 99 | ki | |
| TikTok | lf | Netflix | nf |
| Mercado Livre / Pago | cq | País Brasil | country=73 |
Compre e-mails pela API
O mesmo e-mail temporário do painel: você informa o site onde vai usar (ex.: instagram.com), escolhe o domínio e recebe um endereço que fica ativo por 20 minutos. O código e o texto do e-mail chegam pela API. Sem mensagem, o valor volta para o saldo. Preço de revendedor, como nos números.
getEmailDomains
Domínios com estoque e preçosite (aceita instagram, instagram.com ou uma URL). price é o valor que você paga por e-mail, já com o preço de revendedor; count é o estoque do domínio.?api_key=SUA_CHAVE&action=getEmailDomains
&site=instagram.com{
"site": "instagram.com",
"price": 0.85,
"currency": "BRL",
"freeExtraCodes": 0,
"extraCodePrice": 0.40,
"extraCodeMultiplier": 1.8,
"domains": [
{ "domain": "gmail.com", "count": 412 },
{ "domain": "outlook.com", "count": 96 }
]
}getEmail
Compra um e-mailsite e domain (um dos domínios de getEmailDomains). O valor é descontado do saldo na hora; se não sair e-mail, nada é cobrado (NO_EMAILS). Guarde o activationId: ele funciona em getStatus, setStatus e getEmailMessage.?api_key=SUA_CHAVE&action=getEmail
&site=instagram.com&domain=gmail.com{
"activationId": "4000009915311",
"email": "joao.silva8821@gmail.com",
"site": "instagram.com",
"domain": "gmail.com",
"activationCost": 0.85,
"extraCodePrice": 0.44,
"currency": "BRL",
"canGetAnotherCode": true,
"activationTime": "2026-11-09T14:45:54Z",
"expiresAt": "2026-11-09T15:05:54Z"
}getStatus · setStatus
Mesmos códigos dos númerosactivationId do e-mail nas mesmas ações dos números.
getStatus:STATUS_WAIT_CODE(aguardando o e-mail),STATUS_OK:482913(código recebido),STATUS_WAIT_RETRY:482913(pediu outro código e aguarda o novo) eSTATUS_CANCEL(encerrado sem mensagem, valor já devolvido).setStatus status=3: outro código no mesmo e-mail, dentro dos 20 minutos e depois do primeiro código:ACCESS_RETRY_GET. Cada código extra custa 1,8x o custo do e-mail no fornecedor, com mínimo de R$ 0,40 (o valor exato vem emextraCodePricenogetEmail; emgetEmailDomains,extraCodePriceé o mínimo). É descontado do saldo e volta se o código não chegar. Sem saldo:NO_BALANCE.setStatus status=8: cancelar com estorno, a partir de 2 minutos e só se nada chegou:ACCESS_CANCEL. Antes disso:EARLY_CANCEL_DENIED. Se a mensagem já chegou:BAD_STATUS.setStatus status=6: encerrar depois de receber:ACCESS_ACTIVATION.
getEmailMessage
Texto completo do e-mailmessage vem em HTML ou texto, como o site enviou. Antes de chegar a mensagem: STATUS_WAIT_CODE.?api_key=SUA_CHAVE&action=getEmailMessage
&id=4000009915311{
"activationId": "4000009915311",
"email": "joao.silva8821@gmail.com",
"site": "instagram.com",
"code": "482913",
"message": "<html>...</html>",
"receivedAt": "2026-11-09T14:47:10Z"
}Fluxo do e-mail
1. getEmailDomains site=instagram.com → escolha um domínio com estoque 2. getEmail site=instagram.com domain=gmail.com → activationId e email 3. getStatus a cada 5s → STATUS_WAIT_CODE ... STATUS_OK:482913 veio um link? getEmailMessage id=... → texto completo 4. setStatus status=6 → ACCESS_ACTIVATION nada chegou? setStatus status=8 (após 2 min) → ACCESS_CANCEL, valor de volta ao saldo
Regras das compras
20 minutos por número
Cada número fica disponível por 20 minutos para receber o SMS. Depois disso ele é encerrado.
Estorno automático
Se o SMS não chegar, o valor volta para o seu saldo automaticamente, mesmo que você não cancele.
Cancelamento após 2 minutos
O cancelamento só é aceito a partir de 2 minutos depois da compra. Antes disso a resposta é EARLY_CANCEL_DENIED.
Mesmo estoque do painel
A API compra dos mesmos fornecedores do site. Os servidores 1, 2 e 3 têm estoques e preços diferentes; se faltar número em um, tente outro.
Fluxo típico
1. getNumber → ACCESS_NUMBER:933749378:5511987654321 2. mostre o número ao seu cliente 3. getStatus a cada 5s → STATUS_WAIT_CODE ... STATUS_OK:482913 outro código? setStatus status=3 → ACCESS_RETRY_GET, depois getStatus até o novo STATUS_OK 4. setStatus status=6 → ACCESS_ACTIVATION sem SMS? setStatus status=8 (após 2 min) → ACCESS_CANCEL, valor de volta ao saldo
Código pronto
<?php
$api = 'https://okgflpvrtyrohparffoy.supabase.co/functions/v1/reseller-api/stubs/handler_api.php';
$key = 'SUA_CHAVE';
function flash($params) {
global $api, $key;
return trim(file_get_contents($api . '?' . http_build_query(['api_key' => $key] + $params)));
}
// 1. Compra um número de WhatsApp no Brasil
$r = flash(['action' => 'getNumber', 'service' => 'wa', 'country' => 73]);
if (strpos($r, 'ACCESS_NUMBER') !== 0) die("Erro: $r");
[, $id, $numero] = explode(':', $r);
echo "Número: $numero\n";
// 2. Espera o código (até 20 minutos)
for ($i = 0; $i < 240; $i++) {
sleep(5);
$st = flash(['action' => 'getStatus', 'id' => $id]);
if (strpos($st, 'STATUS_OK') === 0) { echo 'Código: ' . explode(':', $st)[1]; flash(['action' => 'setStatus', 'id' => $id, 'status' => 6]); break; }
if ($st === 'STATUS_CANCEL') { echo 'Expirou sem SMS (valor estornado)'; break; }
}
const API = 'https://okgflpvrtyrohparffoy.supabase.co/functions/v1/reseller-api/stubs/handler_api.php';
const KEY = 'SUA_CHAVE';
const flash = async params => (await (await fetch(API + '?' + new URLSearchParams({ api_key: KEY, ...params }))).text()).trim();
const espera = ms => new Promise(r => setTimeout(r, ms));
const r = await flash({ action: 'getNumber', service: 'wa', country: 73 });
if (!r.startsWith('ACCESS_NUMBER')) throw new Error(r);
const [, id, numero] = r.split(':');
console.log('Número:', numero);
for (let i = 0; i < 240; i++) {
await espera(5000);
const st = await flash({ action: 'getStatus', id });
if (st.startsWith('STATUS_OK')) { console.log('Código:', st.split(':')[1]); await flash({ action: 'setStatus', id, status: 6 }); break; }
if (st === 'STATUS_CANCEL') { console.log('Expirou sem SMS (valor estornado)'); break; }
}
import time, requests
API = 'https://okgflpvrtyrohparffoy.supabase.co/functions/v1/reseller-api/stubs/handler_api.php'
KEY = 'SUA_CHAVE'
def flash(**params):
return requests.get(API, params={'api_key': KEY, **params}, timeout=60).text.strip()
r = flash(action='getNumber', service='wa', country=73)
if not r.startswith('ACCESS_NUMBER'):
raise SystemExit('Erro: ' + r)
_, id_, numero = r.split(':')
print('Número:', numero)
for _ in range(240):
time.sleep(5)
st = flash(action='getStatus', id=id_)
if st.startswith('STATUS_OK'):
print('Código:', st.split(':')[1]); flash(action='setStatus', id=id_, status=6); break
if st == 'STATUS_CANCEL':
print('Expirou sem SMS (valor estornado)'); break
Erros possíveis
| Resposta | O que significa |
|---|---|
BAD_KEY | Chave inválida, ausente ou trocada. Gere outra em Minha conta. |
BAD_ACTION | Ação desconhecida. |
BAD_SERVICE | Código de serviço inválido. |
NO_BALANCE | Saldo insuficiente na sua conta Flash SMS. Recarregue no painel. |
NO_NUMBERS | Sem número disponível agora para esse serviço/país. Nada foi cobrado. Tente de novo ou use o outro servidor. |
NO_EMAILS | E-mail: o domínio esgotou para esse site. Nada foi cobrado. Escolha outro domínio em getEmailDomains. |
BAD_SITE · BAD_DOMAIN | E-mail: site ausente ou inválido, ou domínio não informado. |
NO_ACTIVATION | Id não encontrado na sua conta. |
EARLY_CANCEL_DENIED | Cancelamento antes de 2 minutos da compra. |
BAD_STATUS | Status inválido, ou finalização pedida antes de chegar o SMS. |
ERROR_SQL | Falha temporária. Tente de novo em instantes. |
Perguntas frequentes
Quanto custa usar a API?
A API é grátis. Você paga só pelos números que comprar, com preço de revendedor. Consulte os valores atuais com getPrices.
Funciona com sistemas feitos para o sms-activate?
Sim. As ações e as respostas seguem o mesmo padrão. Normalmente basta trocar o endereço da API e a chave.
Dá para comprar e-mail temporário pela API?
Sim. Use getEmailDomains e getEmail; o código chega pelo mesmo getStatus dos números e o texto completo por getEmailMessage. O e-mail fica ativo por 20 minutos e, sem mensagem, o valor volta para o saldo.
Perdi minha chave. E agora?
Por segurança a chave não pode ser exibida de novo. Gere uma nova em Minha conta; a anterior para de funcionar na hora.
Se o SMS não chegar, eu perco o valor?
Não. Sem SMS, o valor volta para o seu saldo automaticamente quando o número expira, ou na hora em que você cancela (a partir de 2 minutos).
Posso usar os números para qualquer finalidade?
Não. Os números servem para verificação de contas legítimas, conforme os termos de cada plataforma. É proibido o uso para fraude ou criação de contas em massa. Chaves usadas de forma abusiva são bloqueadas.
