Introdução

API REST para receber pagamentos via Pix

A API SkinPay permite gerar cobranças Pix, consultar status e receber notificações automáticas via webhook. Ideal para e-commerces, marketplaces e SaaS que precisam de liquidação instantânea.

Latência média
~400ms
Liquidação
Instantânea
Assinatura
HMAC-SHA256

Autenticação

Header x-api-key

Toda requisição precisa do header x-api-key com sua chave secreta. Gere chaves no painel em API Keys. Nunca exponha sk_live_* no frontend.

curl https://skinpay.pro/api/public/v1/charges \
  -H "x-api-key: sk_live_seu_token_aqui"

Criar cobrança

POST /v1/charges

POST/v1/charges

Gera um QR Code Pix e código copia-e-cola. Retorna em ~400ms.

Body (JSON)

CampoTipoDescrição
amount *integerValor em centavos. Mínimo 50.
description stringDescrição visível para o pagador. Máx 200.
external_id stringSeu ID interno (ex: pedido).
expires_in integerSegundos até expirar. Padrão 3600.
payer.name stringNome do pagador.
payer.document stringCPF/CNPJ (apenas dígitos).
payer.email stringE-mail do pagador.

Exemplo

curl -X POST https://skinpay.pro/api/public/v1/charges \
  -H "x-api-key: sk_live_seu_token" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido_42" \
  -d '{
    "amount": 9990,
    "description": "Pedido #42",
    "external_id": "pedido_42",
    "payer": {
      "name": "Maria Silva",
      "document": "11144477735",
      "email": "maria@example.com"
    },
    "expires_in": 3600
  }'

Resposta 201

{
  "data": {
    "id": "f5c1b8d4-...",
    "status": "pending",
    "amount_cents": 9990,
    "fee_cents": 348,
    "net_cents": 9642,
    "pix_qr_code": "data:image/png;base64,iVBORw0KGgo...",
    "pix_copy_paste": "00020126580014br.gov.bcb.pix...",
    "expires_at": "2026-04-20T05:43:00Z",
    "external_id": "pedido_42",
    "created_at": "2026-04-20T04:43:00Z"
  }
}

Consultar cobrança

GET /v1/charges/:id

GET/v1/charges/:id
curl https://skinpay.pro/api/public/v1/charges/f5c1b8d4-... \
  -H "x-api-key: sk_live_seu_token"

Status possíveis: pending, paid, expired, cancelled, refunded, failed.

Listar cobranças

GET /v1/charges

GET/v1/charges

Retorna as 50 cobranças mais recentes da sua conta.

curl https://skinpay.pro/api/public/v1/charges \
  -H "x-api-key: sk_live_seu_token"

Saque automático

POST /v1/withdrawals

POST/v1/withdrawals

Dispara um saque Pix instantâneo direto pela API — ideal para automatizar bots, painéis internos, split de afiliados ou sistemas próprios. Envie para qualquer chave PIX (qualquer banco, qualquer titular) informando pix_key e pix_key_type no body, ou omita esses campos para cair na chave cadastrada no painel. A operação é atômica: o valor é debitado do saldo, enviado ao processador e, em caso de falha, o saldo é devolvido automaticamente.

Mínimo por saque
R$ 15,00
Máximo por saque
R$ 1.000,00
Taxa fixa
R$ 2,50
💡 Split de afiliados

Recebeu um pagamento e precisa repassar parte para um afiliado, revendedor ou parceiro? Basta chamar este endpoint uma vez para cada destinatário, informando a chave PIX de cada um. O dinheiro vai direto da sua conta SkinPay para a conta do destinatário — você nunca precisa passar por uma conta intermediária.

Body (JSON)

CampoTipoDescrição
amount *integerValor bruto em centavos (inclui a taxa). Mínimo 1500.
pix_key stringChave PIX do destinatário. Se omitida, usa a chave cadastrada no painel.
pix_key_type stringTipo da chave: cpf, cnpj, email, phone ou evp (aleatória). Obrigatório quando pix_key é enviada.

Headers

CampoTipoDescrição
x-api-key *stringSua chave secreta sk_live_...
Idempotency-Key stringRecomendado. Reenvios com mesma chave devolvem o mesmo saque, sem duplicar.

Exemplo — split de afiliado

curl -X POST https://skinpay.pro/api/public/v1/withdrawals \
  -H "x-api-key: sk_live_seu_token" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: afiliado_123_venda_45" \
  -d '{
    "amount": 5000,
    "pix_key": "afiliado@email.com",
    "pix_key_type": "email"
  }'

Tipos de chave aceitos

CampoTipoDescrição
cpf 11 dígitosSó números. Ex.: 12345678900
cnpj 14 dígitosSó números. Ex.: 12345678000199
email stringE-mail cadastrado como chave PIX.
phone stringCelular no formato 5511999999999 (com DDI 55).
evp uuidChave aleatória (random) gerada pelo banco.

Resposta 201

{
  "data": {
    "id": "b1c2d3...",
    "status": "processing",
    "gross_cents": 5000,
    "net_cents": 4750,
    "fee_cents": 250,
    "pix_key": "afiliado@email.com",
    "pix_key_type": "email",
    "gateway_id": "tx_...",
    "gateway_status": "PROCESSING",
    "requested_at": "2026-07-14T12:00:00Z"
  }
}

Falha do processador

Se o processador recusar, respondemos HTTP 502 com { "refunded": true, "message": "..." } — o saldo já foi devolvido automaticamente e você pode simplesmente reenviar.

Consultar status

GET/v1/withdrawals/:id
curl https://skinpay.pro/api/public/v1/withdrawals/b1c2d3... \
  -H "x-api-key: sk_live_seu_token"

Status: requested (em processamento), paid, rejected (com refund automático).

Webhooks

Notificação em tempo real

Cadastre uma URL no painel Webhooks. Quando o status mudar, enviamos POST com assinatura HMAC-SHA256.

POST https://sua-loja.com/webhook
Headers:
  X-SkinPay-Signature: t=1729400000,v1=<hmac_sha256>
  Content-Type: application/json

Body:
{
  "event": "charge.paid",
  "data": {
    "id": "uuid",
    "status": "paid",
    "amount_cents": 9990,
    "external_id": "pedido_42",
    "paid_at": "2026-04-20T04:50:00Z"
  }
}

Verificando assinatura (Node.js)

import crypto from "crypto";

app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const sig = req.headers["x-skinpay-signature"];
  const [tsPart, v1Part] = sig.split(",");
  const ts = tsPart.split("=")[1];
  const v1 = v1Part.split("=")[1];

  const expected = crypto
    .createHmac("sha256", process.env.WEBHOOK_SECRET)
    .update(`${ts}.${req.body}`)
    .digest("hex");

  if (expected !== v1) return res.status(401).end();

  const event = JSON.parse(req.body);
  if (event.event === "charge.paid") {
    // libera o pedido
  }
  res.status(200).end();
});

Retry automático: 30s → 5min → 30min → 2h → 6h → 12h.

Integrar com IA

Cole em ChatGPT, Claude, Cursor, Lovable ou Copilot

Construímos um manifesto público em /llms.txt que assistentes de IA leem automaticamente, e um prompt pronto abaixo que entrega à IA todo o contexto da API (endpoints, autenticação, webhook, regras de segurança). Basta colar, descrever sua stack e seu objetivo — a IA gera o backend, o webhook e o checkout para você.

Manifesto IA
/llms.txt
Compatível
GPT • Claude • Lovable
Setup
1 prompt

1. Prompt pronto (copie e cole na sua IA)

Você é um engenheiro integrando a API SkinPay (pagamentos Pix no Brasil) no meu projeto.

CONTEXTO DA API
- Base URL: https://skinpay.pro/api/public/v1
- Autenticação: header "x-api-key: sk_live_xxx" (a chave fica APENAS no backend, nunca no frontend).
- Valores monetários sempre em centavos (integer). Mínimo cobrança 50.
- Manifesto para IA: https://skinpay.pro/llms.txt
- Documentação humana: https://skinpay.pro/docs
- Suporte oficial (Telegram): https://t.me/Skinpayatendimento

ENDPOINTS
1) POST /v1/charges  -> cria cobrança Pix
   Body JSON: { "amount": 9990, "description": "Pedido #42", "external_id": "pedido_42",
                "payer": { "name": "...", "document": "...", "email": "..." },
                "expires_in": 3600 }
   Resposta 201: { "data": { "id", "status", "pix_qr_code" (data:image/png;base64,...),
                              "pix_copy_paste", "expires_at", "amount_cents", "net_cents" } }
2) GET  /v1/charges/:id -> consulta status (pending|paid|expired|cancelled|refunded|failed)
3) GET  /v1/charges -> lista as 50 mais recentes
4) POST /v1/withdrawals -> saque Pix automático (mín R$ 15,00 / máx R$ 1.000,00 por saque)
   Body: { "amount": 5000,                       // centavos, obrigatório
           "pix_key": "cliente@email.com",        // opcional — envia para QUALQUER chave
           "pix_key_type": "email" }              // cpf | cnpj | email | phone | evp
   Header: Idempotency-Key: <seu id> (recomendado para evitar saques duplicados)
   Se pix_key/pix_key_type forem omitidos, usa a chave cadastrada no painel do lojista.
   Ideal para split de afiliados: dispare um saque para cada chave PIX. Taxa: R$ 2,50 por saque.
5) GET  /v1/withdrawals/:id -> consulta status do saque (requested|paid|rejected)

WEBHOOK
- POST na URL cadastrada com header "X-SkinPay-Signature: t=<unix>,v1=<hmac>"
- Verificação: HMAC_SHA256(WEBHOOK_SECRET, `${t}.${rawBody}`) === v1
- Sempre responder 200 rápido; reprocessamento por external_id é idempotente.
- Eventos: charge.paid, charge.expired, charge.refunded

REGRAS QUE VOCÊ DEVE SEGUIR
- Crie um endpoint backend POST /api/checkout que chame /v1/charges e devolva apenas { id, pix_qr_code, pix_copy_paste, expires_at } para o frontend.
- Crie um endpoint POST /api/webhooks/skinpay que valide a assinatura ANTES de ler o body como JSON (use o raw body).
- Marque o pedido como pago somente quando o evento for charge.paid e o status no banco ainda for pendente.
- Use Idempotency-Key (ex.: o id do pedido) ao criar cobranças para evitar duplicidade.
- Nunca exponha sk_live_* no frontend. Use variáveis de ambiente SKINPAY_API_KEY e SKINPAY_WEBHOOK_SECRET.

MINHA STACK: <descreva aqui: ex. Next.js + Prisma + Postgres>
MEU OBJETIVO: <descreva aqui: ex. cobrar R$ 99,90 no checkout e liberar o pedido quando o Pix for pago>

Implemente os arquivos necessários, com tratamento de erros (401, 402, 422, 502) e logs claros.

2. Manifesto para crawlers de IA

Disponível em https://skinpay.pro/llms.txt seguindo o padrão llmstxt.org. Ferramentas como ChatGPT, Perplexity, Claude e Cursor leem esse arquivo para entender a API sem precisar parsear o site.

3. Dica para usar no Cursor / Lovable

No Cursor adicione @Docs e cole a URL https://skinpay.pro/docs. No Lovable, basta dizer: "integre a API SkinPay seguindo https://skinpay.pro/llms.txt".

Erros

Códigos HTTP padrão

CampoTipoDescrição
400 Bad RequestJSON inválido ou parâmetro fora do permitido.
401 UnauthorizedChave API ausente, inválida ou revogada.
403 ForbiddenKYC pendente ou conta suspensa.
404 Not FoundCobrança não encontrada.
502 Bad GatewayFalha temporária no provedor Pix. Tente novamente.