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 |
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_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.
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.
