Chaves Bearer
Envie Authorization: Bearer smp_live_… ou X-Api-Key. A chave completa aparece uma vez e só o hash fica guardado. Até 20 chaves ativas por conta, validade opcional e rotação em um clique.
Como funciona uma integração
A API espelha o que o painel faz, na mesma ordem. Nada é cobrado até você criar um pedido, e toda escrita é idempotente.
No painel, escolha os escopos que a chave precisa e, se quiser, os IPs autorizados a usá-la. A chave completa aparece uma única vez.
GET /v1/catalog/services devolve todos os serviços publicados com o preço já na moeda e no nível da sua conta.
POST /v1/orders/preview valida o link e a quantidade e devolve o valor exato sem criar nada.
POST /v1/orders com um Idempotency-Key. A carteira é debitada e o pedido é roteado para o fornecedor com a melhor qualidade medida.
Cadastre um endpoint https e receba eventos assinados de mudança de status, entrega parcial, conclusão, reembolso e refill.
curl -X POST https://YOUR-DOMAIN/v1/orders \
-H "Authorization: Bearer smp_live_xxxxxxxxxx_..." \
-H "Idempotency-Key: 2b7c1d9e-order-1001" \
-H "Content-Type: application/json" \
-d '{"service":"<service_id>","link":"https://instagram.com/p/abc","quantity":1000}'Troque YOUR-DOMAIN pelo host desta vitrine, a chave pela sua e <service_id> por um id do catálogo.
Autenticação e limites
A chave é uma credencial de servidor. Nunca vai para o navegador, carrega só as permissões que você concede e pode ser revogada ou rotacionada a qualquer momento sem mexer nas outras chaves.
Envie Authorization: Bearer smp_live_… ou X-Api-Key. A chave completa aparece uma vez e só o hash fica guardado. Até 20 chaves ativas por conta, validade opcional e rotação em um clique.
Opcionalmente, prenda a chave a até 20 endereços IP. Requisições de qualquer outro endereço são recusadas com 403 FORBIDDEN.
Cada chave herda o limite de requisições por minuto do seu nível de cliente. Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; acima do limite você recebe 429 com Retry-After.
Limite em vigor para o nível Revendedor1.200 requisições por minuto
Cada chave carrega apenas os escopos que você concede. Uma chamada fora dos escopos é recusada com 403 FORBIDDEN.
| Escopo | O que faz |
|---|---|
catalog:read | Listar serviços e preços |
orders:read | Consultar pedidos |
orders:write | Criar pedidos, refill e cancelamento |
wallet:read | Consultar saldos |
assets:read | Listar os próprios anúncios e ofertas |
assets:write | Criar e editar anúncios, verificação e disponibilidade |
transactions:write | Registrar passos da transferência nas negociações |
Idempotência
POST /v1/orders e POST /v1/orders/batch exigem o cabeçalho Idempotency-Key com 8 a 120 caracteres. Repetir a chamada com a mesma chave devolve o mesmo pedido sem cobrar de novo. Reutilizar a chave com outro corpo é recusado com 409 IDEMPOTENCY_KEY_REUSE. Em um lote, cada item é identificado pela chave do lote mais o seu índice.
HTTP/1.1 409 Conflict
X-Request-Id: req_<hex>
{
"error": {
"code": "IDEMPOTENCY_KEY_REUSE",
"message": "..."
},
"request_id": "req_<hex>"
}Endpoints
Todos os caminhos ficam sob /v1 no host desta vitrine. Dinheiro é sempre uma string decimal com moeda ISO 4217, nunca float. Os esquemas completos de requisição e resposta estão no arquivo OpenAPI.
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /v1/catalog/platforms | catalog:read | Plataformas que têm serviços publicados no momento |
| GET | /v1/catalog/services | catalog:read | Serviços com preço na sua moeda e nível; filtre por plataforma |
| GET | /v1/catalog/services/{id} | catalog:read | Um serviço com o esquema dos seus campos |
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /v1/orders/preview | orders:write | Valida e cota sem criar nem cobrar |
| POST | /v1/ordersExige Idempotency-Key | orders:write | Cria um pedido: debita a carteira e roteia ao melhor fornecedor |
| GET | /v1/orders | orders:read | Lista pedidos, mais recentes primeiro, com paginação por cursor |
| POST | /v1/orders/batchExige Idempotency-Key | orders:write | Até 100 pedidos em uma chamada, cada um com resultado próprio |
| GET | /v1/orders/{id} | orders:read | Busca um pedido pelo id |
| POST | /v1/orders/{id}/refill | orders:write | Solicita refill dentro da janela de garantia |
| POST | /v1/orders/{id}/cancel | orders:write | Solicita cancelamento; reembolsado quando o fornecedor confirmar |
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /v1/wallet/balance | wallet:read | Saldos por moeda: disponível, dinheiro, bônus e reservado |
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /v1/assets | assets:write | Cria um rascunho de anúncio; vai ao ar após verificação e moderação |
| GET | /v1/assets | assets:read | Seus anúncios |
| PATCH | /v1/assets/{id} | assets:write | Atualiza um anúncio (corpo completo; If-Match para trava otimista) |
| POST | /v1/assets/batch | assets:write | Importa até 1.000 anúncios, casados por external_ref |
| POST | /v1/assets/{id}/verify | assets:write | Inicia (method) ou confere (verification_id) uma verificação de propriedade |
| POST | /v1/assets/{id}/availability | assets:write | Oculta ou exibe um anúncio (não vale durante uma negociação) |
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| GET | /v1/offers | assets:read | Ofertas recebidas nos seus anúncios |
| Método | Caminho | Escopo | O que faz |
|---|---|---|---|
| POST | /v1/transactions/{id}/handoff | transactions:write | Marca um passo do roteiro, adiciona um item seguro ou conclui a transferência |
HTTP/1.1 201 Created
X-Request-Id: req_<hex>
X-Api-Version: 2026-09-23
RateLimit-Limit: <limit> RateLimit-Remaining: <n> RateLimit-Reset: <seconds>
{
"id": "SMP-7K2Q9XHT",
"status": "routing",
"service": "<service_id>",
"link": "https://instagram.com/p/abc",
"quantity": 1000,
"charge": "<decimal>",
"refunded": "0",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": null,
"refill_until": null,
"created_at": "2026-09-23T12:00:00.000Z",
"updated_at": "2026-09-23T12:00:00.000Z"
}Webhooks
Cadastre um endpoint https em um host público e escolha os eventos que quer receber. Cada entrega é assinada com o segredo do endpoint, mostrado uma única vez na criação.
POST /webhooks/orders HTTP/1.1
Content-Type: application/json
Webhook-Id: <event id>
Webhook-Timestamp: 1790000000
Webhook-Signature: t=1790000000,v1=<hex HMAC-SHA256(secret, "1790000000.<body>")>
{ "id": "<event id>", "type": "order.partial", "created_at": "2026-09-23T12:05:00.000Z",
"data": { "orderId": "SMP-7K2Q9XHT", ... } }import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyWebhook(secret, headers, rawBody) {
const t = headers['webhook-timestamp'];
const v1 = (headers['webhook-signature'] ?? '')
.split(',').find((p) => p.startsWith('v1='))?.slice(3) ?? '';
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; // 5 minutes
return fresh && expected.length === v1.length
&& timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}Os eventos são gravados em um outbox na mesma transação de banco da mudança que os gerou, então nada se perde quando uma entrega falha. Entregas com falha são repetidas após 1 min, 5 min, 30 min, 2 h, 6 h, 12 h e 24 h antes de serem marcadas como mortas.
order.createdorder.status_changedorder.partialorder.completedorder.refundedorder.refill_updateddeposit.confirmedoffer.createdoffer.updatedreservation.createdtransaction.updatedpayout.updatedlisting.updateddispute.updatedCompatibilidade
POST /api/v2 implementa o contrato comum “SMM API v2”: envie key e action como campos de formulário ou JSON. As mesmas chaves, escopos e limites da /v1; só o formato muda, e os erros voltam como { "error": "mensagem" }.
Painéis não enviam chave de idempotência, então ela é derivada do conteúdo do pedido e do minuto atual; a janela de pedidos duplicados cobre o resto.
curl -X POST https://YOUR-DOMAIN/api/v2 \
-d key=smp_live_xxxxxxxxxx_... \
-d action=add \
-d service=<service_id> \
-d link=https://instagram.com/p/abc \
-d quantity=1000
{ "order": "SMP-7K2Q9XHT" }Erros
Toda resposta fora de 2xx tem o mesmo corpo. Integre pelo código, não pela mensagem: mensagens podem mudar, códigos não. O request_id também vai no cabeçalho X-Request-Id.
HTTP/1.1 400 Bad Request
X-Request-Id: req_<hex>
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request.",
"details": {
"fields": [{ "path": "quantity", "message": "..." }]
}
},
"request_id": "req_<hex>"
}| Código | HTTP | Significado |
|---|---|---|
VALIDATION_ERROR | 400 | Corpo ou cabeçalhos inválidos; details.fields lista cada caminho e problema |
UNAUTHORIZED | 401 | Chave ausente, inválida, revogada ou expirada |
INSUFFICIENT_FUNDS | 402 | Saldo da carteira insuficiente para a cotação |
FORBIDDEN | 403 | Chave sem o escopo, IP não permitido, subusuário sem permissão ou conta suspensa |
NOT_FOUND | 404 | Pedido, serviço ou anúncio não existe para esta conta |
CONFLICT | 409 | Conflito de estado, como o limite de chaves ativas |
INVALID_TRANSITION | 409 | O pedido ou a negociação não pode passar para esse estado |
DUPLICATE_ORDER | 409 | Mesmo serviço, link e quantidade dentro da janela de duplicidade |
IDEMPOTENCY_KEY_REUSE | 409 | Idempotency-Key já usada com outro corpo |
ALREADY_RESERVED | 409 | O ativo está reservado por outro comprador |
POLICY_BLOCKED | 422 | Serviço ou país bloqueado pela política da plataforma |
MARGIN_GUARD | 422 | Nenhum fornecedor consegue atender este pedido pelo preço publicado |
UNPROCESSABLE | 422 | A requisição é válida, mas não pode ser atendida |
RATE_LIMITED | 429 | Limite por chave atingido; aguarde os segundos de Retry-After |
INTERNAL | 500 | Erro inesperado; fale com o suporte informando o request_id |
PROVIDER_ERROR | 502 | Falha no fornecedor; o pedido é repetido ou reembolsado |
NO_ROUTE | 503 | Sem rota de fornecedor disponível agora; tente mais tarde |
NOT_CONFIGURED | 503 | Recurso não configurado nesta vitrine |
Quem pode usar
Chaves de API e endpoints de webhook são criados pelo dono da conta no plano Revendedor. Pedidos feitos com uma chave são debitados da carteira da conta e aparecem no mesmo painel dos pedidos manuais. Subusuários não criam chaves.
Seja um painel que precisa de um fornecedor confiável, uma ferramenta de agência que faz pedidos para clientes ou um estoque de vendedor que deve ficar sincronizado com o marketplace, a integração segue o mesmo padrão: uma chave com escopo, escritas idempotentes e eventos que você verifica antes de confiar.
Todos os endpoints ficam sob /v1 no host da vitrine com a qual você integra. As respostas são JSON, dinheiro é uma string decimal acompanhada de uma moeda ISO 4217 e datas seguem ISO 8601. Toda resposta traz o cabeçalho X-Api-Version com a data do contrato em uso e um X-Request-Id que você pode informar ao suporte. Os erros têm sempre o mesmo corpo: um objeto error com código estável, mensagem legível e detalhes opcionais, mais o request_id.
O arquivo OpenAPI 3.1 descreve cada caminho, esquema e código de erro. Importe-o no seu cliente HTTP ou gerador de código e você terá requisições tipadas para catálogo, pedidos, carteira, anúncios, ofertas e transferências de negociações.
A chave é criada pelo dono da conta no plano Revendedor e aparece uma única vez; só o hash fica guardado. Ao criá-la, você escolhe os escopos, uma lista opcional de até 20 IPs permitidos e uma validade opcional. A rotação cria uma chave nova com os mesmos escopos e revoga a antiga, então dá para trocar credenciais sem parar a operação. Pedidos feitos com uma chave são debitados da carteira da conta e aparecem no mesmo painel dos pedidos manuais, com a origem marcada como API.
Cada chave herda o limite de requisições por minuto do nível de cliente da conta. Os cabeçalhos RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset mostram onde você está; ao passar do limite a API responde 429 com Retry-After, e o certo é esperar exatamente esse tempo.
Criar pedido é a única chamada que movimenta dinheiro, por isso é protegida duas vezes. Primeiro, o cabeçalho Idempotency-Key é obrigatório: repetir a requisição com a mesma chave devolve o pedido original sem segunda cobrança, e reutilizar a chave com outro corpo é recusado com 409 IDEMPOTENCY_KEY_REUSE. Segundo, uma janela de duplicidade captura o mesmo serviço, link e quantidade enviados de novo em um intervalo curto sem a chave coincidir, devolvendo 409 DUPLICATE_ORDER.
Lotes aceitam até 100 pedidos por chamada. Cada item é validado e cobrado por conta própria, identificado pela chave do lote mais o índice, e a resposta traz um resultado por item, então uma linha ruim nunca trava as demais. Use POST /v1/orders/preview antes quando quiser o valor exato e o resultado da validação sem criar nada.
Toda mudança de estado é gravada em um outbox na mesma transação de banco da própria mudança, e um despachante a entrega no seu endpoint https com três cabeçalhos: Webhook-Id, Webhook-Timestamp e Webhook-Signature. A assinatura é um HMAC-SHA256 do timestamp, um ponto e o corpo bruto, calculado com o segredo do endpoint mostrado uma vez na criação. Verifique em tempo constante, rejeite timestamps com mais de cinco minutos e deduplique pelo Webhook-Id, porque um evento reenviado carrega o mesmo id.
Entregas que não recebem 2xx são repetidas após 1 minuto, 5 minutos, 30 minutos, 2 horas, 6 horas, 12 horas e 24 horas antes de serem marcadas como mortas. Responda rápido e processe de forma assíncrona; um handler lento é a causa mais comum de processamento duplicado.
Se o seu painel já fala o formato “SMM API v2”, amplamente usado no mercado, basta adicionar esta vitrine como fornecedor colando a URL /api/v2 e a sua chave. As ações services, add, status, balance, refill, refill_status e cancel são suportadas, os preços voltam na moeda e no nível da sua conta, e os erros usam o formato plano { "error": "mensagem" } que esses painéis esperam. A idempotência é derivada do conteúdo do pedido e do minuto atual, então envios duplicados por acidente dentro do mesmo minuto são unificados.
O plano Revendedor. Chaves de API e endpoints de webhook são criados pelo dono da conta; subusuários não podem criá-los. As chaves são credenciais de servidor e nunca devem ficar embutidas em navegador ou aplicativo móvel.
Envie a chave como Authorization: Bearer smp_live_… ou no cabeçalho X-Api-Key. A chave precisa ter o escopo que o endpoint exige, por exemplo orders:write para criar pedido ou catalog:read para listar serviços.
Reenvie com o mesmo Idempotency-Key. Você recebe o pedido original e nada é cobrado duas vezes. Se enviar outro corpo com a mesma chave, a API responde 409 IDEMPOTENCY_KEY_REUSE.
Calcule o HMAC-SHA256 com o segredo do endpoint sobre a string formada por Webhook-Timestamp, um ponto e o corpo bruto, e compare em tempo constante com o valor v1 do Webhook-Signature. Rejeite timestamps com mais de 5 minutos e deduplique pelo Webhook-Id.
Cada chave herda o limite de requisições por minuto do seu nível de cliente, mostrado nesta página. Os cabeçalhos RateLimit-* informam a janela atual e a resposta 429 inclui Retry-After em segundos.
Sim. GET /v1/catalog/services devolve o preço já convertido para a moeda da sua conta com o desconto do seu nível, e POST /v1/orders/preview devolve o valor exato, incluindo descontos por volume e cupons, antes de você confirmar.
Sim. Com o escopo assets:write você cria e atualiza anúncios, importa até 1.000 de uma vez, inicia a verificação de propriedade e alterna a disponibilidade; assets:read lista seus anúncios e ofertas, e transactions:write registra passos da transferência em uma negociação.
No plano Revendedor, crie uma chave, baixe o arquivo OpenAPI e envie o primeiro pedido pelo seu próprio sistema.
Nunca vendemos avaliações ou notas. Algumas plataformas restringem serviços de engajamento ou transferência de contas em seus termos; você é responsável pelas regras de cada plataforma que usa.