Integrar com IA NOVO Dashboard

API PayTag v1 — Guia de Integração

A API PayTag expõe um contrato universal e simplificado para que sua aplicação processe pagamentos de forma direta, ágil e segura.

O PayTag cuida automaticamente do processamento, cálculo de taxas, registro contábil no ledger e disparo de webhooks assíncronos.

BASE URL: https://paytag.pro/api/v1

Produção x Sandbox

Em ambiente de produção, substitua a BASE URL pelo seu domínio configurado na plataforma. As credenciais iniciadas com pk_live_ e sk_live_ operam em ambiente real.

Integração Assistida por IA (AI-Assisted Integration)

Sistema de Integração via 1-Prompt de IA

Alimente seu assistente de código (Cursor IDE, Claude Code, GitHub Copilot, ChatGPT ou v0) com a especificação técnica oficial e inegociável da API PayTag. Em apenas um prompt, a IA gera o módulo completo, resiliente, tipado e pronto para produção na sua stack.

1. Chaves Server-Side Only

As chaves secretas sk_live_ devem permanecer apenas no backend via variáveis de ambiente (.env).

2. Idempotência Obrigatória

Todas as requisições POST (Criação de Pix, Cartão, Boleto) utilizam obrigatoriamente Idempotency-Key (UUID v4).

3. Validação HMAC SHA-256

Assinatura X-PayTag-Signature validada no raw body do webhook com o segredo da aplicação.

4. Liberação via Webhook

A liberação de pedidos ou acessos é realizada exclusivamente por confirmação assíncrona de webhook ou reconciliação server-side.

MASTER SYSTEM PROMPT — PAYTAG INTEGRATION
You are a principal software engineer building a production-grade PayTag Payment Gateway integration.

Sources of truth:
- Official Documentation: https://paytag.pro/api-docs
- Production Base URL: https://paytag.pro/api/v1

Strict Integration Rules:
1. SECURITY: Keep PayTag secret keys (sk_live_ / sk_test_) strictly server-side. Load from environment variables (e.g. PAYTAG_SECRET_KEY). Never expose secret keys to the browser or frontend.
2. IDEMPOTENCY: Include a unique UUID v4 'Idempotency-Key' header on all POST mutation requests (creating PIX, credit card, or boleto payments) to prevent duplicate transactions.
3. AUTHENTICATION HEADERS:
   - X-PayTag-Public-Key: pk_live_...
   - X-PayTag-Secret-Key: sk_live_...
   - Content-Type: application/json
4. WEBHOOK HMACS: Validate incoming Webhook notifications against the 'X-PayTag-Signature' header (format 'sha256=') using HMAC SHA-256 calculation on raw body payload with your PAYTAG_WEBHOOK_SECRET. Strip 'sha256=' if present before comparison.
5. FULFILLMENT: Fulfill orders or grant user permissions ONLY when a webhook 'payment.approved' event is HMAC-verified or when server-side reconciliation confirms status via GET /api/v1/transactions/{tx_ref}.
6. NO UNDOCUMENTED FIELDS: Strictly stick to documented PayTag contract fields (amount in cents, description, method, buyer, card, boleto, pix, tx_ref, status).

PAYTAG API CONTRACTS:

1. Unified Payment Endpoint:
   POST /api/v1/payments
   Headers: X-PayTag-Public-Key, X-PayTag-Secret-Key, Idempotency-Key

   A) Create PIX Payment:
   Payload:
   {
     "amount": 12990,
     "description": "Order #1001",
     "method": "pix",
     "buyer": {
       "firstName": "João", "lastName": "Silva", "email": "joao@email.com", "doc": "12345678909", "phone": "11999999999",
       "address": { "postCode": "01001000", "street": "Rua Exemplo", "number": "100", "neighborhood": "Centro", "city": "São Paulo", "state": "SP" }
     },
     "external_reference": "order_1001"
   }
   Expected Response:
   {
     "success": true, "tx_ref": "TX-12345", "status": "pending", "method": "pix", "amount": 12990,
     "pix": { "qr_code": "00020126580014BR.GOV.BCB.PIX...", "qr_image": "data:image/png;base64,..." }
   }

   B) Create Credit Card Payment:
   Payload:
   {
     "amount": 25000, "description": "Order #1002", "method": "credit", "installments": 3,
     "buyer": {
       "firstName": "Maria", "lastName": "Souza", "email": "maria@email.com", "doc": "12345678909", "phone": "11999999999",
       "address": { "postCode": "01001000", "street": "Rua Exemplo", "number": "100", "neighborhood": "Centro", "city": "São Paulo", "state": "SP" }
     },
     "card": { "holderName": "MARIA SOUZA", "number": "4111111111111111", "expirationMonth": "12", "expirationYear": "2030", "cvv": "123" },
     "external_reference": "order_1002"
   }
   Expected Response:
   { "success": true, "tx_ref": "TX-12346", "status": "approved", "method": "credit", "amount": 25000, "card": { "last4": "1111", "brand": "visa" } }

2. Consult Transaction Status (Reconciliation):
   GET /api/v1/transactions/{tx_ref}
   Headers: X-PayTag-Public-Key, X-PayTag-Secret-Key
   Expected Response:
   { "tx_ref": "TX-12345", "status": "approved" | "pending" | "refused" | "refunded", "amount": 12990 }

3. Webhook Receiver Route & Signature Verification:
   Received Header: X-PayTag-Signature (e.g. 'sha256=1a2b3c...')
   Verification:
     rawSignature = signatureHeader.replace(/^sha256=/, '');
     expectedSignature = crypto.createHmac('sha256', WEBHOOK_SECRET).update(rawBody).digest('hex');
     isValid = crypto.timingSafeEqual(Buffer.from(rawSignature), Buffer.from(expectedSignature));

TASK:
Write the complete, clean, modular, and fully working PayTag API integration module in my project language/framework including:
- PayTag HTTP Client / Service wrapper class.
- Controller to create PIX and Credit Card payments via POST /api/v1/payments.
- Webhook listener route with raw body HMAC SHA-256 verification and order fulfillment handler.

Generate the complete production code now.

Autenticação

Todas as requisições para a API exigem autenticação via cabeçalhos HTTP (Headers). Envie suas chaves no seguinte formato:

HTTP HEADERS
X-PayTag-Public-Key: pk_live_sua_chave_publica
X-PayTag-Secret-Key: sk_live_sua_chave_secreta

Também é aceita a autenticação via HTTP Basic Auth informando public_key:secret_key codificado em Base64.

Segurança da Secret Key

A sua Secret Key concede acesso total de leitura e escrita ao seu saldo e transações. Nunca a exponha em aplicações client-side (frontend / mobile). Guarde-a exclusivamente em seu servidor backend.

Dados da Conta & Taxas Vigentes

Consulte as informações do perfil do comerciante, plano de recebimento ativo e a tabela de taxas finais consolidadas para sua conta.

GET /api/v1/me

Atributos da Resposta

AtributoTipoDescrição
id integer ID do usuário comerciante
rates array Tabela de taxas finais vigentes (plan, method, installments, fee_pct, fixed_fee_cents)
withdrawal_plan string Modelo de recebimento ativo (ex: D30, D15, D1)
EXEMPLO cURL
curl "https://paytag.pro/api/v1/me" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx"
EXEMPLO DE RESPOSTA
{
  "id": 10,
  "name": "Loja Exemplo",
  "email": "loja@exemplo.com",
  "withdrawal_plan": "D30",
  "effective_withdrawal_plan": "D30",
  "rates": {
    "pix": {
      "fee_pct": 0.99,
      "fixed_fee_cents": 0
    },
    "boleto": {
      "fee_pct": 0.00,
      "fixed_fee_cents": 240
    },
    "credit": {
      "1x": { "fee_pct": 4.50 },
      "2x": { "fee_pct": 4.85 },
      "3x": { "fee_pct": 5.00 },
      "12x": { "fee_pct": 6.50 }
    }
  }
}

Idempotência

Para evitar cobranças duplicadas em caso de oscilações de rede, utilize o cabeçalho Idempotency-Key em todas as requisições de criação de pagamento.

HTTP HEADER IDEMPOTÊNCIA
Idempotency-Key: pedido-1001-tentativa-1

Se a mesma chave for reenviada para a API, o PayTag retornará exatamente o payload da transação já criada anteriormente sem efetuar uma nova cobrança.

Códigos de Resposta HTTP

A API PayTag utiliza os códigos de status padrão do protocolo HTTP para indicar o sucesso ou a causa de erros em cada requisição:

Status Nome Descrição / Causa
200 OK Sucesso Requisição processada com êxito. Retorna o objeto da transação ou dados solicitados.
400 Bad Request Parâmetros obrigatórios ausentes (ex: dados de buyer.address ou card) ou regras de negócio violadas.
401 Unauthorized Chaves de API (X-PayTag-Public-Key ou X-PayTag-Secret-Key) ausentes, incorretas ou inválidas.
403 Forbidden A chave informada pertence a uma conta de usuário inativa ou suspensa.
404 Not Found O recurso solicitado não existe ou não pertence à sua conta (ex: tx_ref inexistente).
409 Conflict Conflito de idempotência ou tentativa de reprocessar requisição em andamento com a mesma Idempotency-Key.
422 Unprocessable Erro de validação no formato do JSON ou tipos de dados incompatíveis (ex: valor não inteiro em amount).
500 Server Error Erro inesperado nos servidores internos do PayTag.
502 / 504 Gateway Error Erro de conexão ou tempo limite excedido no processamento do pagamento.

Exemplos de Erros Retornados

HTTP 400 BAD REQUEST
{
  "detail": "Campos de endereco obrigatorios ausentes em 'buyer.address': postCode, street, number"
}
HTTP 401 UNAUTHORIZED
{
  "detail": "Credenciais de API invalidas ou ausentes nos headers."
}

Criar Pagamento PIX

Gere um QR Code e código Copia e Cola instantâneo para pagamento PIX. Requer os dados completos de identificação e endereço do comprador em buyer.address.

POST /api/v1/payments

Parâmetros (JSON Body)

CampoTipoDescrição
amount* integer Valor em centavos (ex: 12990 = R$ 129,90)
method* string Defina como pix
description* string Descrição do produto/pedido
buyer* object Dados do comprador (firstName, lastName, email, doc, phone, dateBirth)
buyer.address* object Endereço completo (postCode, street, number, neighborhood, city, state)
EXEMPLO cURL
curl -X POST "https://paytag.pro/api/v1/payments" \
  -H "Content-Type: application/json" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx" \
  -H "Idempotency-Key: pix-pedido-1001" \
  -d '{
    "amount": 12990,
    "description": "Pedido #1001",
    "method": "pix",
    "buyer": {
      "firstName": "Maria",
      "lastName": "Silva",
      "email": "maria@exemplo.com",
      "doc": "12345678909",
      "phone": "11999999999",
      "dateBirth": "1990-01-01",
      "address": {
        "postCode": "01001000",
        "street": "Rua Exemplo",
        "number": "100",
        "neighborhood": "Centro",
        "city": "Sao Paulo",
        "state": "SP"
      }
    },
    "external_reference": "pedido-1001"
  }'
EXEMPLO DE RESPOSTA
{
  "success": true,
  "tx_ref": "TX-12345",
  "status": "pending",
  "method": "pix",
  "amount": 12990,
  "fees": {
    "total_fee": 129,
    "net_amount": 12861
  },
  "pix": {
    "qr_code": "00020126580014br.gov.bcb.pix...",
    "qr_image": "data:image/png;base64,iVBORw0KGgo..."
  },
  "error": null
}

Criar Pagamento Cartão de Crédito

Processamento transparente com suporte a parcelamento em até 12x. Para compras à vista, defina installments: 1.

POST /api/v1/payments

Campos do Cartão (JSON Body)

CampoTipoDescrição
amount* integer Valor em centavos (ex: 25000 = R$ 250,00)
method* string Defina como credit
installments integer Número de parcelas (1 a 12, padrão: 1)
card.holderName* string Nome impresso no cartão
card.number* string Número do cartão (sem espaços)
card.expirationMonth* string Mês de expiração (2 dígitos, ex: 12)
card.expirationYear* string Ano de expiração (4 dígitos, ex: 2030)
card.cvv* string Código de segurança CVV (3 ou 4 dígitos)
EXEMPLO cURL
curl -X POST "https://paytag.pro/api/v1/payments" \
  -H "Content-Type: application/json" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx" \
  -H "Idempotency-Key: card-pedido-1002" \
  -d '{
    "amount": 25000,
    "description": "Pedido #1002",
    "method": "credit",
    "installments": 3,
    "buyer": {
      "firstName": "Joao",
      "lastName": "Souza",
      "email": "joao@exemplo.com",
      "doc": "12345678909",
      "phone": "11999999999",
      "dateBirth": "1990-01-01",
      "address": {
        "postCode": "01001000",
        "street": "Rua Exemplo",
        "number": "100",
        "neighborhood": "Centro",
        "city": "Sao Paulo",
        "state": "SP"
      }
    },
    "card": {
      "holderName": "JOAO SOUZA",
      "number": "4111111111111111",
      "expirationMonth": "12",
      "expirationYear": "2030",
      "cvv": "123"
    }
  }'
EXEMPLO DE RESPOSTA
{
  "success": true,
  "tx_ref": "TX-12346",
  "status": "approved",
  "method": "credit",
  "amount": 25000,
  "fees": {
    "total_fee": 1225,
    "net_amount": 23775
  },
  "card": {
    "last4": "1111",
    "brand": "visa"
  },
  "error": null
}

Criar Boleto Bancário

Geração de boleto registrado. O boleto utiliza exatamente a mesma estrutura de requisição enviando todos os dados de comprador e endereço em buyer.address, mudando apenas o atributo method: "boleto".

POST /api/v1/payments

Especificação do Boleto

A estrutura de buyer e buyer.address é idêntica ao pagamento via Cartão e PIX.

CampoTipoDescrição
amount* integer Valor em centavos
method* string Defina como boleto
buyer.address* object Endereço completo (postCode, street, number, neighborhood, city, state)
EXEMPLO cURL BOLETO
curl -X POST "https://paytag.pro/api/v1/payments" \
  -H "Content-Type: application/json" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx" \
  -H "Idempotency-Key: boleto-pedido-1003" \
  -d '{
    "amount": 8990,
    "description": "Pedido Boleto #1003",
    "method": "boleto",
    "buyer": {
      "firstName": "Carlos",
      "lastName": "Mendes",
      "email": "carlos@exemplo.com",
      "doc": "12345678909",
      "phone": "11999999999",
      "dateBirth": "1985-05-15",
      "address": {
        "postCode": "01001000",
        "street": "Rua Exemplo",
        "number": "100",
        "neighborhood": "Centro",
        "city": "Sao Paulo",
        "state": "SP"
      }
    },
    "external_reference": "pedido-1003"
  }'
EXEMPLO DE RESPOSTA
{
  "success": true,
  "tx_ref": "TX-12347",
  "status": "pending",
  "method": "boleto",
  "amount": 8990,
  "fees": {
    "total_fee": 240,
    "net_amount": 8750
  },
  "boleto": {
    "url": "https://paytag.com.br/b/pdf/123456",
    "barcode": "2379338128600830000200100000000818990"
  },
  "error": null
}

Listar Transações

Liste as transações da sua conta com suporte a paginação e filtros por status ou método de pagamento.

GET /api/v1/transactions

Parâmetros de Consulta (Query Params)

ParâmetroTipoDescrição
limit integer Quantidade máxima por página (padrão: 20, máx: 100)
offset integer Ponto de partida da paginação (padrão: 0)
status string Filtro de status (ex: approved, pending, refused)
method string Filtro por método (ex: pix, credit, boleto)
EXEMPLO cURL
curl "https://paytag.pro/api/v1/transactions?limit=10&status=approved" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx"
EXEMPLO DE RESPOSTA
{
  "total": 45,
  "limit": 10,
  "offset": 0,
  "transactions": [
    {
      "tx_ref": "TX-12345",
      "status": "approved",
      "amount": 12990,
      "method": "pix",
      "customer_name": "Maria Silva",
      "created_at": "2026-08-06T12:00:00.000Z"
    }
  ]
}

Consultar Transação Específica

Obtenha o status atualizado de uma transação pela sua referência (ex: TX-12345).

GET /api/v1/transactions/{tx_ref}

Status Normalizados

  • pending: Aguardando pagamento ou compensação.
  • approved: Pagamento aprovado e liquidado.
  • refused: Pagamento recusado ou cancelado.
  • refunded: Valor estornado ao cliente.
CONSULTAR STATUS
curl "https://paytag.pro/api/v1/transactions/TX-12345" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx"
EXEMPLO DE RESPOSTA
{
  "tx_ref": "TX-12345",
  "status": "approved",
  "amount": 12990,
  "net_amount": 12861,
  "fee_amount": 129,
  "method": "pix",
  "installments": "1x",
  "customer_name": "Maria Silva",
  "customer_email": "maria@exemplo.com",
  "product_name": "Pedido #1001",
  "created_at": "2026-08-06T12:00:00.000Z",
  "updated_at": "2026-08-06T12:00:05.000Z"
}

Cancelar e Estornar

Cancele ou reembolse transações ativas.

POST /api/v1/transactions/{tx_ref}/refund

Reembolso (Refund)

Envie uma solicitação de estorno informando o motivo:

REEMBOLSO
curl -X POST "https://paytag.pro/api/v1/transactions/TX-12345/refund" \
  -H "Content-Type: application/json" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx" \
  -d '{"reason": "Cliente solicitou estorno"}'
EXEMPLO DE RESPOSTA
{
  "ok": true,
  "status": "refunded",
  "provider_status": "REFUNDED",
  "error": null
}

Webhooks & Assinatura HMAC

Receba notificações automáticas em tempo real no seu servidor quando o status de um pagamento for alterado.

POST /api/v1/webhooks

Cadastrar Endpoint

Registre sua URL para receber os eventos:

CADASTRAR WEBHOOK
curl -X POST "https://paytag.pro/api/v1/webhooks" \
  -H "Content-Type: application/json" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx" \
  -d '{
    "url": "https://meudominio.com/paytag/webhook",
    "events": ["payment.approved", "payment.refunded"],
    "secret": "meu-segredo-de-assinatura"
  }'
EXEMPLO DE RESPOSTA
{
  "id": 1,
  "url": "https://meudominio.com/paytag/webhook",
  "events": ["payment.approved", "payment.refunded"],
  "is_active": true,
  "last_status_code": null,
  "last_error": null,
  "last_delivered_at": null,
  "created_at": "2026-08-06T12:00:00.000Z"
}
PUT / DELETE /api/v1/webhooks/{id}

Atualizar ou Remover Webhook

Utilize PUT /api/v1/webhooks/{id} para alterar URL, eventos ou ativar/desativar, e DELETE /api/v1/webhooks/{id} para remover.

EXCLUIR WEBHOOK
curl -X DELETE "https://paytag.pro/api/v1/webhooks/1" \
  -H "X-PayTag-Public-Key: pk_live_xxx" \
  -H "X-PayTag-Secret-Key: sk_live_xxx"

Exemplo de Payload Enviado no Webhook

PAYLOAD DE NOTIFICAÇÃO HTTP POST
{
  "event": "payment.approved",
  "transaction": {
    "id": 105,
    "tx_ref": "TX-12345",
    "amount": 12990,
    "net_amount": 12861,
    "fee_amount": 129,
    "method": "pix",
    "installments": "1x",
    "status": "approved",
    "customer_name": "Maria Silva",
    "customer_email": "maria@exemplo.com",
    "product_name": "Pedido #1001",
    "created_at": "2026-08-06T12:00:00.000Z"
  }
}

Validação da Assinatura HMAC SHA-256

O PayTag assina cada notificação enviada para o seu webhook com o cabeçalho X-PayTag-Signature no formato sha256=<hash_hex>.

NODE.JS — EXEMPLO DE VALIDAÇÃO
import crypto from 'node:crypto';

function isValidPayTagSignature(rawBody, signatureHeader, secret) {
  // Remove o prefixo 'sha256=' se presente
  const cleanSignature = signatureHeader.replace(/^sha256=/, '');
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  
  return crypto.timingSafeEqual(
    Buffer.from(cleanSignature),
    Buffer.from(expected)
  );
}

Boas Práticas de Integração

  • Idempotência: Envie sempre o header Idempotency-Key ao criar pagamentos.
  • Verificação de Webhook: Sempre confirme a assinatura HMAC do payload antes de alterar o status do pedido no seu sistema.
  • Conciliação: Guarde o parâmetro tx_ref e seu external_reference em seu banco de dados para relatórios e estornos.
  • Consultas de Fallback: Se seu servidor esteve offline durante uma notificação por webhook, consulte a API usando GET /api/v1/transactions/{tx_ref} antes de entregar o produto.