API SMM: como integrar ao seu sistema ou painel
Uma API SMM é uma interface HTTP em que o seu sistema manda um POST com a chave e uma ação (services, add, status, balance) e recebe JSON. Para integrar, gere a chave na conta, leia o catálogo, crie pedidos e consulte o status em lote. A chave fica em variável de ambiente.
Se você tem um site, um bot ou um painel próprio e quer vender seguidores, curtidas e visualizações sem digitar pedido por pedido, a api smm é o caminho. É o mesmo padrão que os painéis do mercado usam entre si: um endereço, um POST com a sua chave e uma ação, e a resposta volta em JSON. Este texto mostra como integrar, com código em PHP e em Python, e como tratar o que dá errado.
O que é uma API SMM e como ela funciona
A referência completa de campos e erros está na documentação da API SMM; aqui o foco é o fluxo de trabalho.
Uma API SMM deixa o seu sistema fazer o que você faria na tela do painel: ver o catálogo, criar pedido, acompanhar o andamento, pedir reposição e conferir o saldo. Tudo passa por uma única URL. Neste painel ela é:
https://painelderevenda.net/api/v2
Toda requisição é um POST com key (a sua chave) e action (o que você quer fazer). O corpo pode ser application/x-www-form-urlencoded ou JSON. A chave vai no corpo, nunca na URL.
As ações disponíveis:
| action | Para que serve | Parâmetros |
|---|---|---|
services | Lista o catálogo | nenhum |
add | Cria um pedido | service, link, quantity |
status | Situação de um ou vários pedidos | order ou orders |
refill | Pede reposição | order |
refill_status | Situação da reposição | refill |
cancel | Tenta cancelar | order ou orders |
balance | Saldo da conta | nenhum |
Passo a passo para integrar a API SMM
- Crie a conta e gere a chave em Conta > API. Ela é guardada com hash no servidor e pode ser revogada.
- Salve a chave em uma variável de ambiente, por exemplo
PR_API_KEY. - Chame
balanceeservices. As duas só leem, então não gastam nada. - Sincronize o catálogo no seu banco de dados.
- Crie um pedido pequeno com
addpara validar o fluxo inteiro. - Monte a rotina que consulta o status em lote.
- Trate os erros e o limite de requisições.
Não existe chave de teste. O add cria pedido de verdade, então o primeiro teste com ele deve ser pequeno, respeitando o mínimo do pacote.
API SMM em PHP: balance e services
Em PHP, o jeito mais direto é o cURL. Um detalhe importante: erros vêm com status HTTP 4xx e um JSON no corpo. O cURL entrega esse corpo normalmente, a menos que você ligue CURLOPT_FAILONERROR. Deixe desligado para poder ler a mensagem.
<?php
function chamar_api(array $params): array
{
$params['key'] = getenv('PR_API_KEY');
$ch = curl_init('https://painelderevenda.net/api/v2');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$corpo = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$json = json_decode((string) $corpo, true);
if (!is_array($json)) {
throw new RuntimeException("Resposta inválida (HTTP $codigo)");
}
if ($codigo === 429) {
throw new RuntimeException('Limite de requisições. Tente no próximo minuto.');
}
if (isset($json['error'])) {
throw new RuntimeException($json['error'] . " (HTTP $codigo)");
}
return $json;
}
$saldo = chamar_api(['action' => 'balance']); // balance e currency (BRL)
$catalogo = chamar_api(['action' => 'services']); // lista de serviços
A função concentra a chave, o tempo limite e o tratamento de erro. O resto do seu código só chama chamar_api.
Sincronizar o catálogo com a ação services
Cada item de services traz service, name, category, rate, min, max e refill. O rate é o preço por 1.000 unidades, em reais. O preço acompanha o fornecedor e pode mudar, então não copie o catálogo uma vez e esqueça.
O fluxo que funciona bem:
- Rode a sincronização em horário fixo, por exemplo uma vez por dia, e também antes de gerar a tabela de preços do cliente.
- Grave
service,name,category,rate,min,maxerefillem uma tabela sua. - Compare com a versão anterior. Se o
ratemudou, recalcule o preço que você cobra. - Se um serviço sumiu da lista, esconda-o da sua vitrine em vez de apagar. Pedidos antigos continuam precisando do registro.
- No momento do pedido, valide
quantitycontraminemaxantes de chamar a API. Isso evita o erroIncorrect quantity.
Seu preço de venda é rate mais a sua margem, proporcional à quantidade. Um exemplo: se o rate de um pacote fosse R$ 11,82 por mil e você pedisse 500 unidades, o custo seria R$ 5,91. É uma conta de exemplo com o preço da tabela de 13/10/2026; o valor real é o que services devolve no momento.
Criar pedidos com a ação add
O add recebe service (o id do catálogo), link e quantity. A resposta traz o número do pedido, como {"order": 12345}. Guarde esse número junto do cliente, do link e da data: ele é a sua referência para status, reposição e atendimento.
Em Python, com a biblioteca requests:
import os
import requests
URL = "https://painelderevenda.net/api/v2"
def chamar(**params):
params["key"] = os.environ["PR_API_KEY"]
r = requests.post(URL, data=params, timeout=30)
if r.status_code == 429:
raise RuntimeError("Limite de requisições. Tente no próximo minuto.")
dados = r.json()
if isinstance(dados, dict) and "error" in dados:
raise RuntimeError(f"{dados['error']} (HTTP {r.status_code})")
return dados
pedido = chamar(
action="add",
service=1, # id vindo de services
link="https://www.instagram.com/perfil-do-cliente/",
quantity=1000,
)
print(pedido["order"])
Status em lote: consultar vários pedidos de uma vez
Consultar pedido por pedido gasta o limite de 120 requisições por minuto à toa. A ação status aceita orders com ids separados por vírgula, então uma requisição cobre dezenas de pedidos.
Para cada pedido o retorno traz charge, start_count, status e remains. O status assume um destes valores: Pending, In progress, Completed, Partial ou Canceled. Neste painel, a resposta em lote vem indexada pelo id do pedido e cada chamada aceita até 100 pedidos; acima disso, divida a lista. Pedido que não pertence à sua conta não aparece na resposta.
ABERTOS = ("Pending", "In progress")
def atualizar_status(ids):
resposta = chamar(action="status", orders=",".join(str(i) for i in ids))
for pedido_id, info in resposta.items():
if isinstance(info, dict) and "status" in info:
print(pedido_id, info["status"], info.get("remains"))
A rotina de acompanhamento fica assim:
- Liste no seu banco os pedidos com status aberto.
- Envie os ids em blocos, por exemplo de 50 em 50.
- Atualize o status local e avise o cliente quando virar
Completed. - Trate
PartialeCanceledcomo casos para o atendimento: o saldo da parte não entregue é um assunto a resolver com o cliente. - Rode a rotina em intervalo razoável. Consultar a cada poucos segundos só consome limite.
Se o pacote tem reposição, a ação refill recebe o order e devolve o id da reposição, que você acompanha com refill_status (Pending, Completed ou Rejected). Nem todo pacote tem reposição; o campo refill do catálogo diz quais têm.
Erros e limite: como tratar
Os erros vêm como {"error": "mensagem"} com status HTTP 4xx. Os mais comuns:
| HTTP | error | O que fazer |
|---|---|---|
| 401 | Invalid API key | Conferir a variável de ambiente; se a chave foi revogada, gerar outra |
| 400 | Incorrect request | Ação desconhecida ou parâmetro faltando |
| 400 | Not enough funds | Recarregar o saldo e repetir o pedido |
| 400 | Incorrect quantity | Ajustar para o mínimo e máximo do serviço |
| 404 | Incorrect order ID | O pedido não pertence à conta |
| 429 | Too many requests | Esperar o minuto virar e agrupar consultas |
O limite é de 120 requisições por minuto por chave. Há também um limite de 30 tentativas com chave errada por minuto por IP, o que vale lembrar se um script em loop estiver usando uma chave antiga.
Para o 429, a regra é simples: não insista em loop. Faça uma pausa, reduza a frequência e use o status em lote. Para o Not enough funds, vale checar o balance antes de processar uma fila grande e parar a fila quando o saldo acabar.
Segurança da chave e limites do que a API faz
A chave dá acesso ao seu saldo, então trate como senha:
- Guarde em variável de ambiente ou cofre de segredos. Nunca no código, nunca no repositório.
- Não envie a chave para o navegador do cliente. Chame a API sempre do seu servidor.
- Se suspeitar de vazamento, revogue em Conta > API. A chave antiga deixa de funcionar assim que for revogada.
E fique atento aos limites do serviço em si. A API entrega o pedido ao fornecedor; ela não controla o que a rede social faz depois. As plataformas podem remover números a qualquer momento, e uma queda depois da entrega não é um erro da integração. Deixe isso claro nos termos que você apresenta ao seu cliente e não prometa resultado de vendas, alcance ou engajamento.
Para quem esta integração faz sentido
A API serve a quem já tem um sistema de pedidos: loja própria, bot de atendimento, ou um painel SMM próprio que precisa de um fornecedor por trás. Para quem tem painel e procura fornecedor, veja a página para donos de painel e a de fornecedor SMM. Quem ainda não tem sistema pode começar pelo próprio painel, com pedido em massa, e deixar a API para quando o volume pedir.