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.
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.
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:
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.
Atributos da Resposta
| Atributo | Tipo | Descriçã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) |
curl "https://paytag.pro/api/v1/me" \
-H "X-PayTag-Public-Key: pk_live_xxx" \
-H "X-PayTag-Secret-Key: sk_live_xxx"
{
"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.
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
{
"detail": "Campos de endereco obrigatorios ausentes em 'buyer.address': postCode, street, number"
}
{
"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.
Parâmetros (JSON Body)
| Campo | Tipo | Descriçã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) |
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"
}'
{
"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.
Campos do Cartão (JSON Body)
| Campo | Tipo | Descriçã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) |
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"
}
}'
{
"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".
Especificação do Boleto
A estrutura de buyer e buyer.address é idêntica ao pagamento via Cartão e PIX.
| Campo | Tipo | Descrição |
|---|---|---|
| amount* | integer | Valor em centavos |
| method* | string | Defina como boleto |
| buyer.address* | object | Endereço completo (postCode, street, number, neighborhood, city, state) |
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"
}'
{
"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.
Parâmetros de Consulta (Query Params)
| Parâmetro | Tipo | Descriçã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) |
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"
{
"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).
Status Normalizados
pending: Aguardando pagamento ou compensação.approved: Pagamento aprovado e liquidado.refused: Pagamento recusado ou cancelado.refunded: Valor estornado ao cliente.
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"
{
"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.
Reembolso (Refund)
Envie uma solicitação de estorno informando o motivo:
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"}'
{
"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.
Cadastrar Endpoint
Registre sua URL para receber os eventos:
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"
}'
{
"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"
}
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.
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
{
"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>.
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-Keyao 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_refe seuexternal_referenceem 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.