CurtiPay
CurtiPay › Revenda SMM › Documentação da API
API SMM

Documentação da API

Padrão de mercado, compatível com PerfectPanel e scripts similares. Envie um POST com corpo JSON (ou form-urlencoded) para a URL abaixo. Se o seu painel já consome outro fornecedor, trocar a URL e a chave costuma bastar.

URL da API
Sua chave

A chave é gerada junto com a conta — sem espera e sem aprovação. Criar conta de revendedor.

Autenticação e cobrança

Toda chamada leva o campo key. Cada pedido debita a sua carteira pré-paga pelo preço de fornecedor no momento da criação — não há fatura nem pós-pago. Recarregue por PIX no painel.

Leia isto antes de escrever a primeira linha

Quatro comportamentos que quebram integração e não aparecem em lista de endpoint.

1. O HTTP é sempre 200, inclusive em erro.

Erro vem no corpo, como {"error": "..."}. Cliente que decide sucesso por response.ok vai tratar “saldo insuficiente” como pedido criado — e só descobre pelo que não foi entregue.

2. add debita no ato e não é idempotente.

Se a chamada der timeout, não repita automaticamente. Consulte antes se o pedido existe. Retry cego numa chamada que gasta dinheiro cobra duas vezes pela mesma venda.

3. Acompanhe em lote, não um a um.

multiStatus aceita até 1.000 ids por chamada. E pedido terminal (Completed, Partial, Canceled) não muda mais: pare de consultá-lo, ou o seu job cresce para sempre.

4. Dinheiro vem como string.

"14.9000", quatro casas, em BRL. Converter para float e somar é como centavo some do seu fechamento. Use decimal.

balance services add status multiStatus cancel 🤖 prompts para IA
Consultar saldo action: balance
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "balance"
}
RESPONSE
{ "balance": "250.0000", "currency": "BRL" }
Saldo da carteira pré-paga, em reais, com 4 casas. É o valor que os pedidos consomem.
Listar o catálogo action: services
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "services"
}
RESPONSE
[
  {
    "service": 101,
    "name": "Curtidas Instagram",
    "type": "Default",
    "category": "Curtidas",
    "rate": "14.9000",
    "min": "50",
    "max": "10000",
    "refill": false,
    "cancel": true,
    "currency": "BRL"
  }
]
rate é o preço por MIL, já com o seu desconto de volume aplicado. Serviço sem preço de revenda definido simplesmente não aparece na lista.
Criar pedido action: add
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "add",
  "service": 101,
  "link": "https://instagram.com/p/ABC123",
  "quantity": 1000
}
RESPONSE
{ "order": 84213 }
Debita o saldo no ato. service e link são obrigatórios; quantity também, exceto em serviços de comentário — nesses, mande comments com uma frase por linha e a quantidade vem daí.
Status de um pedido action: status
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "status",
  "order": 84213
}
RESPONSE
{
  "charge": "14.9000",
  "start_count": "0",
  "status": "In progress",
  "remains": "820",
  "currency": "BRL"
}
remains é quanto falta entregar. charge é o que foi debitado de você, não o que você cobrou do seu cliente.
Status de vários pedidos action: multiStatus
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "multiStatus",
  "orders": "84213,84214,84215"
}
RESPONSE
{
  "84213": { "charge": "14.9000", "status": "Completed", "remains": "0", ... },
  "84214": { "error": "Incorrect order ID" }
}
Até 1.000 ids por chamada. É assim que se acompanha uma carteira de pedidos — um por um desperdiça requisição e é o erro de integração mais comum.
Cancelar pedidos action: cancel
REQUEST
{
  "key": "SUA_CHAVE_DE_API",
  "action": "cancel",
  "orders": "84213,84214"
}
RESPONSE
[
  { "order": 84213, "cancel": 1 },
  { "order": 84214, "cancel": { "error": "..." } }
]
Até 100 ids. Só pedidos elegíveis são cancelados, e o estorno é proporcional ao que ainda não foi entregue.

Status possíveis

statusO que significa
Pending Recebido, ainda não começou a entrega.
In progress Entrega em andamento.
Partial Parte foi entregue e o pedido encerrou. O não entregue já foi estornado.
Completed Entregue por completo.
Canceled Cancelado ou reembolsado.

refill não é suportado e responde {"error": "Refill not supported"} — trate como “sem reposição automática” no seu painel, em vez de deixar o cliente pedir e não acontecer nada.

Exemplos prontos

curl -sX POST https://curtipay.com/api/reseller \
  -H "Content-Type: application/json" \
  -d '{"key":"SUA_CHAVE_DE_API","action":"balance"}'

Integrar usando IA

Cole um destes prompts no Claude Code, Cursor, ChatGPT ou o assistente que você usar, dentro do seu projeto. Eles já carregam as armadilhas da seção acima — sem elas, a IA escreve um cliente que decide sucesso pelo código HTTP e engole erro em silêncio.

Escrever o cliente da API do zero
Escreva um cliente para a API SMM da CurtiPay no meu projeto.

ENDPOINT
POST https://curtipay.com/api/reseller
Corpo em JSON (Content-Type: application/json). Todas as chamadas levam o
campo "key" com a chave de API.

REGRAS QUE NÃO PODEM SER IGNORADAS
1. A API responde SEMPRE com HTTP 200, inclusive em erro. Nunca use o
   código de status para decidir sucesso. Considere erro quando o corpo
   da resposta for um objeto contendo a chave "error", e propague essa
   mensagem.
2. "action": "add" DEBITA saldo no momento da chamada. Trate como
   operação não idempotente: nunca faça retry automático de "add" depois
   de timeout sem antes conferir se o pedido foi criado.
3. Para acompanhar pedidos use "action": "multiStatus" com "orders"
   contendo até 1000 ids separados por vírgula. Não faça uma chamada por
   pedido.
4. Valores monetários vêm como STRING com 4 casas decimais e moeda BRL.
   Não converta para float em cálculo de dinheiro; use decimal.
5. O limite é de 120 chamadas de "add" por minuto por conta. Ao receber
   {"error": "Rate limit exceeded"}, faça backoff exponencial.

ACTIONS
- balance  -> {"balance": "250.0000", "currency": "BRL"}
- services -> lista de serviços; "rate" é o preço por MIL
- add      -> exige service, link e quantity (quantity é dispensada em
              serviço de comentário, que usa "comments" com uma frase por
              linha). Responde {"order": 84213}
- status   -> um pedido, por "order"
- multiStatus -> vários, por "orders"
- cancel   -> até 100 ids em "orders"

STATUS possíveis: Pending, In progress, Partial, Completed, Canceled.

O QUE EU QUERO
Um módulo com funções tipadas para cada action, tratamento de erro
centralizado (uma exceção própria com a mensagem da API), retry com
backoff apenas nas chamadas de leitura, e testes cobrindo: erro com HTTP
200, rate limit, e multiStatus com id inexistente no meio do lote.
Ligar a API ao meu sistema de pedidos
Integre a API SMM da CurtiPay ao meu sistema de pedidos.

Contexto: quando um cliente meu compra um serviço, eu preciso criar o
pedido na CurtiPay, guardar o id retornado e depois acompanhar o status
até concluir.

ENDPOINT: POST https://curtipay.com/api/reseller (JSON, campo "key" com a chave de API)

FAÇA ASSIM
1. Ao confirmar o pagamento do meu cliente, chame "add" com service, link
   e quantity. Guarde o "order" retornado na MINHA tabela de pedidos,
   numa coluna própria (ex.: fornecedor_pedido_id). Sem isso eu perco o
   vínculo e não consigo mais consultar nada.
2. Crie um job periódico (a cada 5 minutos) que pegue TODOS os meus
   pedidos ainda não terminais, monte lotes de até 1000 ids e chame
   "multiStatus" uma vez por lote. Atualize o status de cada um.
3. Pedido com status Completed, Partial ou Canceled é TERMINAL: pare de
   consultar. Continuar consultando pedido terminal é o que faz o job
   crescer para sempre.
4. Trate erro pelo corpo, nunca pelo HTTP — a API responde 200 mesmo em
   erro, com {"error": "..."} .
5. Registre em log toda chamada de "add" com o corpo enviado e a resposta
   recebida. É a única forma de auditar uma cobrança depois.

ATENÇÃO AO DINHEIRO
"add" debita no ato. Se a chamada der timeout, NÃO repita
automaticamente: consulte antes se o pedido existe, ou você paga duas
vezes pela mesma venda.
Sincronizar o catálogo e aplicar minha margem
Criar conta e pegar minha chave

Grátis, sem aprovação — a chave sai junto com a conta.