API para revendedores

Uma API para pedidos, carteira e marketplace

Crie pedidos, acompanhe a entrega, consulte saldos e gerencie anúncios a partir do seu próprio sistema. Endpoints REST versionados, chaves com escopos, escritas idempotentes e webhooks assinados, no mesmo motor que move esta vitrine.

  • REST /v1, JSON na entrada e na saída
  • Chaves Bearer com escopos
  • Idempotency-Key nas escritas
  • Webhooks assinados
  • Plano Revendedor

Como funciona uma integração

Cinco chamadas do zero ao pedido entregue

A API espelha o que o painel faz, na mesma ordem. Nada é cobrado até você criar um pedido, e toda escrita é idempotente.

  1. Crie uma chave

    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.

  2. Leia o catálogo

    GET /v1/catalog/services devolve todos os serviços publicados com o preço já na moeda e no nível da sua conta.

  3. Pré-visualize a cotação

    POST /v1/orders/preview valida o link e a quantidade e devolve o valor exato sem criar nada.

  4. Crie o pedido

    POST /v1/orders com um Idempotency-Key. A carteira é debitada e o pedido é roteado para o fornecedor com a melhor qualidade medida.

  5. Receba os eventos

    Cadastre um endpoint https e receba eventos assinados de mudança de status, entrega parcial, conclusão, reembolso e refill.

Crie um pedido em uma única requisiçãobash
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

Chaves com escopo, restrição e rotação

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.

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.

Lista de IPs permitidos

Opcionalmente, prenda a chave a até 20 endereços IP. Requisições de qualquer outro endereço são recusadas com 403 FORBIDDEN.

Limite por chave

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

Escopos

Cada chave carrega apenas os escopos que você concede. Uma chamada fora dos escopos é recusada com 403 FORBIDDEN.

EscopoO que faz
catalog:readListar serviços e preços
orders:readConsultar pedidos
orders:writeCriar pedidos, refill e cancelamento
wallet:readConsultar saldos
assets:readListar os próprios anúncios e ofertas
assets:writeCriar e editar anúncios, verificação e disponibilidade
transactions:writeRegistrar passos da transferência nas negociações

Em toda resposta

  • X-Request-Id: informe ao falar com o suporte
  • X-Api-Version: a data do contrato com o qual você está falando
  • Cache-Control: no-store, as respostas nunca são cacheadas

Idempotência

Repita com segurança, nunca cobre em dobro

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.

  • Gere uma chave por pedido lógico (um UUID é ideal) e guarde-a antes de enviar.
  • Em timeout ou erro de rede, reenvie com a mesma chave: você recebe o resultado original.
  • Mudou o corpo? Use uma chave nova. A antiga fica presa à primeira requisição.
Corpo do errohttp
HTTP/1.1 409 Conflict
X-Request-Id: req_<hex>

{
  "error": {
    "code": "IDEMPOTENCY_KEY_REUSE",
    "message": "..."
  },
  "request_id": "req_<hex>"
}

Endpoints

Tudo o que a vitrine faz, por HTTP

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.

Especificação OpenAPI (YAML)

Catálogo

MétodoCaminhoEscopoO que faz
GET/v1/catalog/platformscatalog:readPlataformas que têm serviços publicados no momento
GET/v1/catalog/servicescatalog:readServiços com preço na sua moeda e nível; filtre por plataforma
GET/v1/catalog/services/{id}catalog:readUm serviço com o esquema dos seus campos

Pedidos

MétodoCaminhoEscopoO que faz
POST/v1/orders/previeworders:writeValida e cota sem criar nem cobrar
POST/v1/ordersExige Idempotency-Keyorders:writeCria um pedido: debita a carteira e roteia ao melhor fornecedor
GET/v1/ordersorders:readLista pedidos, mais recentes primeiro, com paginação por cursor
POST/v1/orders/batchExige Idempotency-Keyorders:writeAté 100 pedidos em uma chamada, cada um com resultado próprio
GET/v1/orders/{id}orders:readBusca um pedido pelo id
POST/v1/orders/{id}/refillorders:writeSolicita refill dentro da janela de garantia
POST/v1/orders/{id}/cancelorders:writeSolicita cancelamento; reembolsado quando o fornecedor confirmar

Carteira

MétodoCaminhoEscopoO que faz
GET/v1/wallet/balancewallet:readSaldos por moeda: disponível, dinheiro, bônus e reservado

Ativos (vendedores)

MétodoCaminhoEscopoO que faz
POST/v1/assetsassets:writeCria um rascunho de anúncio; vai ao ar após verificação e moderação
GET/v1/assetsassets:readSeus anúncios
PATCH/v1/assets/{id}assets:writeAtualiza um anúncio (corpo completo; If-Match para trava otimista)
POST/v1/assets/batchassets:writeImporta até 1.000 anúncios, casados por external_ref
POST/v1/assets/{id}/verifyassets:writeInicia (method) ou confere (verification_id) uma verificação de propriedade
POST/v1/assets/{id}/availabilityassets:writeOculta ou exibe um anúncio (não vale durante uma negociação)

Ofertas

MétodoCaminhoEscopoO que faz
GET/v1/offersassets:readOfertas recebidas nos seus anúncios

Negociações

MétodoCaminhoEscopoO que faz
POST/v1/transactions/{id}/handofftransactions:writeMarca um passo do roteiro, adiciona um item seguro ou conclui a transferência
Resposta (201)http
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

Eventos assinados, entregues até você confirmar

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.

Cabeçalhos da entregahttp
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", ... } }
Verificação em Node.jsjs
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));
}

Verifique a assinatura

  1. Leia o Webhook-Timestamp (t) e o corpo bruto da requisição exatamente como recebido.
  2. Calcule o HMAC-SHA256 com o segredo do endpoint sobre a string "t.corpo".
  3. Compare em tempo constante com o valor v1 do Webhook-Signature.
  4. Rejeite timestamps com mais de 5 minutos e deduplique pelo Webhook-Id.
  5. Responda 2xx rápido e processe de forma assíncrona.

Retentativas e outbox

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.

Eventos que você pode assinar

  • order.created
  • order.status_changed
  • order.partial
  • order.completed
  • order.refunded
  • order.refill_updated
  • deposit.confirmed
  • offer.created
  • offer.updated
  • reservation.created
  • transaction.updated
  • payout.updated
  • listing.updated
  • dispute.updated

Regras do endpoint

  • Somente https://, em host público; endereços privados e internos são recusados.
  • Assine eventos específicos ou todos eles.
  • O segredo de assinatura aparece uma única vez, na criação.

Compatibilidade

Adicione esta vitrine a qualquer painel SMM

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" }.

Ações suportadas

  • services: o catálogo com rate, min, max e indicadores de refill/cancel
  • add: cria um pedido (service, link, quantity, comments, usernames, runs, interval)
  • status: um pedido, ou até 100 com orders=id1,id2
  • balance: saldo disponível na moeda da sua conta
  • refill: solicita refill para um ou mais pedidos
  • refill_status: status de um ou mais refills
  • cancel: solicita cancelamento para um ou mais pedidos

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.

Requisiçãobash
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

Um único formato para todo erro

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.

Corpo do errohttp
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ódigoHTTPSignificado
VALIDATION_ERROR400Corpo ou cabeçalhos inválidos; details.fields lista cada caminho e problema
UNAUTHORIZED401Chave ausente, inválida, revogada ou expirada
INSUFFICIENT_FUNDS402Saldo da carteira insuficiente para a cotação
FORBIDDEN403Chave sem o escopo, IP não permitido, subusuário sem permissão ou conta suspensa
NOT_FOUND404Pedido, serviço ou anúncio não existe para esta conta
CONFLICT409Conflito de estado, como o limite de chaves ativas
INVALID_TRANSITION409O pedido ou a negociação não pode passar para esse estado
DUPLICATE_ORDER409Mesmo serviço, link e quantidade dentro da janela de duplicidade
IDEMPOTENCY_KEY_REUSE409Idempotency-Key já usada com outro corpo
ALREADY_RESERVED409O ativo está reservado por outro comprador
POLICY_BLOCKED422Serviço ou país bloqueado pela política da plataforma
MARGIN_GUARD422Nenhum fornecedor consegue atender este pedido pelo preço publicado
UNPROCESSABLE422A requisição é válida, mas não pode ser atendida
RATE_LIMITED429Limite por chave atingido; aguarde os segundos de Retry-After
INTERNAL500Erro inesperado; fale com o suporte informando o request_id
PROVIDER_ERROR502Falha no fornecedor; o pedido é repetido ou reembolsado
NO_ROUTE503Sem rota de fornecedor disponível agora; tente mais tarde
NOT_CONFIGURED503Recurso não configurado nesta vitrine

Quem pode usar

Disponível no plano Revendedor

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.

Como construir uma integração de revenda na API do SocialMediaPRO

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.

Um contrato, versionado por data

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.

Chaves, escopos e a conta pela qual agem

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.

Escritas idempotentes e lotes

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.

  • Gere um UUID por pedido lógico e guarde-o antes de enviar.
  • Em timeout, reenvie com a mesma chave; nunca gere outra para o mesmo pedido.
  • Trate códigos 4xx como finais e 5xx e 429 como repetíveis com backoff.

Webhooks em que você pode confiar

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.

Painéis filhos pelo endpoint SMM v2

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.

Perguntas frequentes

Qual plano preciso ter para usar a API?

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.

Como autentico uma requisição?

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.

O que acontece se a requisição der timeout depois de criar um pedido?

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.

Como verifico um webhook?

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.

Qual é o limite de requisições?

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.

Os preços na API são os mesmos do site?

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.

Posso usar a API para anúncios do marketplace?

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.

Pronto para integrar?

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.