Documentação da API PinaCash v2.0
API REST completa para pagamentos PIX. Crie cobranças, realize transferências, gerencie webhooks, rastreie conversões em tempo real, configure Ofertas 360° e integre com Meta/Google Ads.
Visão Geral
A API do PinaCash v2.0 permite integrar pagamentos PIX, Ofertas 360°, rastreamento de conversões e integrações com Meta/Google Ads diretamente na sua aplicação. Utilize JSON para envio e recebimento de dados, seguindo os padrões REST.
Base URL
Health Check
Verifique o status da API a qualquer momento. A raiz (/) retorna uma página HTML de status; o endpoint /health retorna JSON:
curl -H "Accept: application/json" https://api.pinacash.com/health
{
"success": true,
"data": {
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-03-20T01:00:00-03:00"
}
}
https://api.pinacash.com/) com header Accept: application/json retorna status detalhado incluindo services.database e services.gateway.Rate Limits
Para garantir estabilidade, aplicamos limites por plano:
| Plano | Req/Minuto | Req/Dia |
|---|---|---|
| Básico | 60 | 10.000 |
| Profissional | 300 | 100.000 |
| Enterprise | Ilimitado | Ilimitado |
Formato de Resposta
Todas as respostas da API seguem o mesmo formato padrão:
{
"success": true,
"data": { ... }
}
{
"success": false,
"error": {
"code": 400,
"message": "Descrição do erro",
"errors": ["campo X é obrigatório"]
}
}
Autenticação
Todas as requisições devem incluir suas chaves de API nos headers. Encontre suas chaves no painel em Configurações → Chaves de API.
Método 1 — Headers X-Key
X-Public-Key: pk_live_xxxxxxxxxxxxxxxxxxxxxxxx X-Secret-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
Método 2 — Bearer Token
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
sk_) no frontend ou em repositórios públicos. Todas as requisições devem ser feitas pelo seu servidor backend.Ambientes
| Ambiente | Prefixo da Chave | Base URL |
|---|---|---|
| Producao | pk_live_ / sk_live_ | api.pinacash.com |
| Sandbox | pk_test_ / sk_test_ | sandbox.pinacash.com |
API Key vs Webhook Secret
| API Key | Webhook Secret | |
|---|---|---|
| Formato | pk_live_... / sk_live_... | whsec_... |
| Onde gerenciar | app.pinacash.com/api-key.php | app.pinacash.com/webhooks.php |
| Para que serve | Autenticar suas chamadas a API | Validar eventos que nos enviamos a voce |
| Quem usa | Seu backend → PinaCash | PinaCash → Seu backend |
| Quantas | 1 par por merchant | 1 por webhook (multiplos webhooks permitidos) |
whsec_ gerado ao criar o webhook. Ver validacao de webhooks →Códigos de Erro
A API utiliza códigos HTTP padrão para indicar sucesso ou falha.
| Código | Status | Descrição |
|---|---|---|
| 200 | OK | Requisição processada com sucesso |
| 201 | Created | Recurso criado com sucesso |
| 400 | Bad Request | Parâmetros inválidos ou ausentes |
| 401 | Unauthorized | Chaves de API inválidas ou ausentes |
| 403 | Forbidden | Sem permissão para este recurso |
| 404 | Not Found | Recurso não encontrado |
| 422 | Unprocessable | Validação falhou (verifique campo errors) |
| 429 | Too Many Requests | Rate limit excedido |
| 500 | Internal Error | Erro interno do servidor |
| 503 | Unavailable | Gateway não configurado ou em manutenção |
Criar Cobrança PIX
Gera um QR Code PIX para recebimento. O pagador escaneia o QR Code ou copia o código Copia e Cola.
/v1/pix/cashin · /pix/cashin
Cria uma cobrança PIX e retorna o QR Code (base64) e código Copia e Cola.
Parâmetros
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amount | number | Sim | Valor em reais (mínimo R$ 1.00) |
| external_id | string | Não | Identificador único do seu sistema (alias: order_id) |
| description | string | Não | Descrição da cobrança |
| customer.name | string | Não | Nome do pagador (alias: payer_name) |
| customer.document | string | Não | CPF ou CNPJ (alias: payer_document) |
| customer.email | string | Não | Email (alias: payer_email) |
| customer.phone | string | Não | Telefone (alias: payer_phone) |
| webhook_url | string | Não | URL de callback (alias: postback_url) |
| link_id | string | Não | ID do link de pagamento (tracking) |
| checkout_id | string | Não | ID do checkout (tracking) |
| utm_source | string | Não | UTM Source para rastreamento |
| utm_medium | string | Não | UTM Medium |
| utm_campaign | string | Não | UTM Campaign |
| offer_id | integer | Não | ID da oferta (Ofertas 360°) |
| page_url | string | Não | URL de origem do checkout |
| latitude | number | Não | Latitude do pagador (geolocalização browser) |
| longitude | number | Não | Longitude do pagador |
Exemplo de Requisição
curl -X POST https://api.pinacash.com/v1/pix/charge \ -H "Authorization: Bearer sk_live_xxx" \ -H "Content-Type: application/json" \ -d '{ "amount": 150.00, "external_id": "pedido_12345", "description": "Pagamento Pedido #12345", "customer": { "name": "João Silva", "document": "12345678900", "email": "joao@email.com" }, "webhook_url": "https://seusite.com/webhook" }'
Resposta de Sucesso
{
"success": true,
"data": {
"transaction_id": "TX-ABC123DEF456",
"id": "TX-ABC123DEF456",
"external_id": "pedido_12345",
"status": "PENDING",
"amount": 150.00,
"amount_cents": 15000,
"pix_code": "00020126580014br.gov.bcb.pix...",
"qr_code": "00020126580014br.gov.bcb.pix...",
"qr_code_base64": "data:image/png;base64,iVBORw0K...",
"pix": {
"qr_code": "00020126...",
"qr_code_base64": "data:image/png;base64,...",
"expires_at": "2026-02-11T15:30:00Z"
},
"expires_at": "2026-02-11T15:30:00Z",
"gateway_transaction_id": "GTW-789...",
"merchant_id": 7,
"created_at": "2026-02-11T15:00:00Z"
}
}
pix_generated é registrado automaticamente com geolocalização do pagador via IP.payment.created é disparado automaticamente para todos os webhooks configurados do merchant via WebhookDispatcherService.Consultar Cobrança
Consulte o status e detalhes completos de uma cobrança pelo ID da transação ou external_id.
Retorna os detalhes de uma cobrança. O parâmetro {id} pode ser o transaction_id ou external_id.
Resposta
{
"success": true,
"data": {
"id": "TX-ABC123",
"status": "paid",
"amount": 150.00,
"amount_cents": 15000,
"tax": 4.49,
"net_amount": 145.51,
"order_id": "pedido_12345",
"description": "Pagamento Pedido #12345",
"customer": {
"name": "João Silva",
"document": "***456***00",
"email": "joao@email.com"
},
"paid_at": "2026-02-11T15:02:15Z",
"created_at": "2026-02-11T15:00:00Z"
}
}
Payout (Cash-Out)
Realiza uma transferência PIX para outra conta. O valor é debitado do seu saldo disponível.
/v1/pix/cashout
Envia um PIX para a chave especificada. O tipo da chave é detectado automaticamente.
Parâmetros
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amount | number | Sim | Valor em reais (mínimo R$ 1.00) |
| pix_key | string | Sim | Chave PIX do destinatário |
| recipient_name | string | Não | Nome do destinatário |
| recipient_document | string | Não | CPF/CNPJ do destinatário |
| order_id | string | Não | Identificador único |
Resposta
{
"success": true,
"data": {
"id": "TX-XYZ789",
"status": "pending",
"amount": 500.00,
"amount_cents": 50000,
"recipient": {
"name": "Maria Souza",
"pix_key": "maria@email.com",
"pix_key_type": "email"
},
"gateway_transaction_id": "GTW-456...",
"created_at": "2026-02-11T16:00:00Z"
}
}
pix_key_type é detectado automaticamente (cpf, cnpj, email, phone, random). O saldo é debitado imediatamente ao criar o payout.Consultar Saldo
Retorna o saldo disponível, bloqueado e total da sua conta.
{
"success": true,
"data": {
"available": 15420.50,
"blocked": 500.00,
"total": 15920.50,
"currency": "BRL",
"updated_at": "2026-02-11T16:30:00Z"
}
}
Listar Transações
Lista todas as transações da sua conta com filtros e paginação.
Query Parameters
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| page | integer | 1 | Página |
| limit | integer | 25 | Itens por página (máx. 100) |
| status | string | — | pending, paid, cancelled |
| type | string | — | DEPOSIT ou WITHDRAW |
| date_from | date | — | Data início (YYYY-MM-DD) |
| date_to | date | — | Data fim (YYYY-MM-DD) |
Exemplo
curl "https://api.pinacash.com/v1/transactions?status=paid&limit=10" \
-H "Authorization: Bearer sk_live_xxx"
{
"success": true,
"data": {
"items": [
{
"id": "TX-ABC123",
"type": "deposit",
"status": "paid",
"amount": 150.00,
"tax": 4.49,
"net_amount": 145.51,
"description": "Pedido #12345",
"customer": { "name": "João Silva" },
"created_at": "2026-02-11T15:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 284,
"total_pages": 29
}
}
}
Webhooks
Receba notificacoes em tempo real sobre eventos de pagamento e saque. Cada webhook tem seu proprio secret (whsec_...) para validacao HMAC-SHA256.
sk_live_...) autentica chamadas a API. O Webhook Secret (whsec_...) valida eventos que nos enviamos para voce. Sao coisas diferentes. Nao misture.Configurando via Painel
Acesse app.pinacash.com/webhooks.php e crie seus webhooks. Voce pode ter multiplos webhooks, cada um com sua propria URL, eventos e secret.
Ao criar um webhook, o sistema gera um secret unico (whsec_...) e um codigo PHP pronto com o secret embutido — basta copiar e colar no seu servidor.
dead_letter e voce recebe uma notificacao no painel.Eventos Disponiveis
| Evento | Descricao | Quando |
|---|---|---|
payment.created | PIX criado, aguardando pagamento | Ao gerar cobranca via API ou checkout (dispatch automatico) |
payment.paid | Pagamento PIX confirmado ✓ | Quando o pagador efetua o PIX (via webhook Reflow) |
payment.pending | Pagamento pendente de confirmacao | Status intermediario |
payment.cancelled | Pagamento cancelado / expirado | PIX expirou ou foi cancelado |
payment.refunded | Pagamento estornado | Estorno realizado |
withdrawal.created | Saque solicitado | Saque aprovado e em processamento |
withdrawal.completed | Saque concluido ✓ | Saque pago com sucesso |
withdrawal.failed | Saque falhou | Erro no processamento do saque |
test.webhook | Evento de teste | Ao clicar "Testar" no painel |
merchant_webhooks e processados via webhook_outbox com retentativas automáticas e HMAC-SHA256. O evento payment.created é disparado imediatamente na criação da cobrança via API.Headers Enviados
Cada requisicao webhook inclui os seguintes headers:
| Header | Descricao | Exemplo |
|---|---|---|
X-PINACASH-SIGNATURE | Assinatura HMAC-SHA256 do payload | a1b2c3d4e5... |
X-PINACASH-EVENT | Nome do evento | payment.paid |
X-PINACASH-WEBHOOK-ID | ID do webhook configurado | 42 |
X-PINACASH-TIMESTAMP | Timestamp Unix do envio | 1739290935 |
Content-Type | Tipo do conteudo | application/json |
User-Agent | Identificacao do remetente | PinaCash-Webhook/1.0 |
Payload de Exemplo
{
"event": "payment.paid",
"timestamp": "2026-02-11T15:02:15Z",
"data": {
"transaction_id": "TX-ABC123",
"external_id": "pedido_12345",
"amount": 150.00,
"amount_cents": 15000,
"status": "PAID",
"payer_name": "Joao Silva",
"payer_document": "12345678900",
"merchant_id": 7,
"end_to_end_id": "E12345678202602111502ABCD",
"offer_id": 123,
"paid_at": "2026-02-11T15:02:15Z"
}
}
Validando Assinatura (HMAC-SHA256)
Todos os webhooks incluem uma assinatura HMAC-SHA256 no header X-PINACASH-SIGNATURE. A assinatura e calculada assim:
signature = HMAC-SHA256(payload_json, SHA256(webhook_secret))
Ou seja: a chave do HMAC e o hash SHA-256 do seu secret, nao o secret em texto puro. Isso e feito automaticamente no codigo gerado pelo painel.
// 1. Seu webhook secret (gerado ao criar o webhook no painel) $webhookSecret = 'whsec_SEU_SECRET_AQUI'; // 2. Ler payload e assinatura $payload = file_get_contents('php://input'); $receivedSignature = $_SERVER['HTTP_X_PINACASH_SIGNATURE'] ?? ''; // 3. Calcular assinatura esperada // Chave = SHA-256 do secret (nao o secret cru) $expectedSignature = hash_hmac( 'sha256', $payload, hash('sha256', $webhookSecret) ); // 4. Comparar (timing-safe) if (!hash_equals($expectedSignature, $receivedSignature)) { http_response_code(401); error_log('[PinaCash] Assinatura HMAC invalida'); exit('Invalid signature'); } // 5. Headers adicionais $eventName = $_SERVER['HTTP_X_PINACASH_EVENT'] ?? 'unknown'; $webhookId = $_SERVER['HTTP_X_PINACASH_WEBHOOK_ID'] ?? ''; // 6. Processar $data = json_decode($payload, true); $event = $data['event'] ?? 'unknown'; switch ($event) { case 'payment.paid': // Marcar pedido como pago break; case 'payment.created': // Cobranca criada break; case 'withdrawal.completed': // Saque concluido break; } // 7. SEMPRE responder 200 (evita retentativas) http_response_code(200); echo json_encode(['received' => true]);
const crypto = require('crypto'); function verifyWebhook(payload, receivedSignature, webhookSecret) { // Chave = SHA-256 do secret const key = crypto.createHash('sha256').update(webhookSecret).digest('hex'); const expected = crypto .createHmac('sha256', key) .update(payload) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(receivedSignature) ); } // Uso no Express: app.post('/webhook/pinacash', (req, res) => { const payload = req.body; // raw body string const sig = req.headers['x-pinacash-signature']; const event = req.headers['x-pinacash-event']; if (!verifyWebhook(payload, sig, 'whsec_SEU_SECRET')) { return res.status(401).send('Invalid signature'); } const data = JSON.parse(payload); console.log(`Evento: ${data.event}`); res.status(200).json({ received: true }); });
import hmac, hashlib def verify_webhook(payload: bytes, received_sig: str, secret: str) -> bool: key = hashlib.sha256(secret.encode()).hexdigest() expected = hmac.new(key.encode(), payload, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, received_sig) # Uso no Flask: @app.route('/webhook/pinacash', methods=['POST']) def webhook(): payload = request.get_data() sig = request.headers.get('X-PINACASH-SIGNATURE', '') event = request.headers.get('X-PINACASH-EVENT', '') if not verify_webhook(payload, sig, 'whsec_SEU_SECRET'): return 'Invalid signature', 401 data = request.json print(f"Evento: {data['event']}") return jsonify({'received': True}), 200
Gerenciamento de Webhooks
Gerencie webhooks via painel (app.pinacash.com/webhooks.php) ou programaticamente via API. Cada webhook tem seu proprio secret (whsec_...).
Via Painel (recomendado)
O painel permite criar webhooks, gerar secrets, e baixar o codigo PHP pronto com o secret embutido. Fluxo:
- Acesse app.pinacash.com/webhooks.php
- Clique "Adicionar Webhook" → preencha nome, URL (HTTPS) e eventos
- O sistema gera o secret e o codigo PHP completo
- Copie o codigo e cole no seu servidor — funciona imediatamente
whsec_...) e exibido apenas uma vez ao criar ou regenerar. Armazenamos apenas o hash SHA-256. Se perder, clique "Gerar Codigo PHP" para regenerar (o anterior para de funcionar).Via API
Lista todos os webhooks configurados para o merchant autenticado.
{
"success": true,
"data": [
{
"id": 1,
"name": "Meu ERP",
"url": "https://seusite.com/webhook/pinacash",
"events": ["payment.paid", "withdrawal.completed"],
"is_active": true,
"secret_last4": "a7f2",
"success_count": 142,
"failure_count": 3,
"last_sent_at": "2026-02-14T12:30:00Z",
"created_at": "2026-02-01T10:00:00Z"
}
]
}
Cria um novo webhook. O secret (whsec_...) e retornado apenas nesta resposta.
| Parametro | Tipo | Obrig. | Descricao |
|---|---|---|---|
| url | string | Sim | URL HTTPS do endpoint |
| name | string | Nao | Nome identificador (ex: "Meu ERP") |
| events | array | Nao | Lista de eventos (padrao: todos) |
{
"success": true,
"data": {
"id": 2,
"secret": "whsec_a1b2c3d4e5f6...",
"message": "Copie o secret agora. Ele nao sera exibido novamente."
}
}
Event Tracking
Rastreie visitantes, leads e conversões no seu checkout e links de pagamento. Os dados aparecem no Analytics do seu painel.
Registra um evento de tracking. Não requer autenticação via API key — apenas o merchant_id.
Parâmetros Principais
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| merchant_id | integer | Sim | ID do merchant |
| session_id | string | Sim | ID da sessão do visitante (max 64 chars) |
| event | string | Não | checkout_view, form_focus, form_fill, pix_generated, payment_complete |
| page_type | string | Não | checkout, payment_link, product, funnel |
| link_id | string | Não | ID do link de pagamento |
| value | number | Não | Valor da transação |
| lead_name | string | Não | Nome do lead |
| lead_email | string | Não | Email do lead |
| lead_phone | string | Não | Telefone do lead |
| lead_cpf | string | Não | CPF do lead |
| utm_source | string | Não | UTM Source |
| utm_medium | string | Não | UTM Medium |
| utm_campaign | string | Não | UTM Campaign |
| utm_term | string | Não | UTM Term |
| utm_content | string | Não | UTM Content |
| offer_id | integer | Não | ID da oferta (Ofertas 360°) |
| test_token | string | Não | Token de teste 360° (para sessões de diagnóstico) |
| fbclid | string | Não | Facebook Click ID (capturado da URL) |
| gclid | string | Não | Google Click ID (capturado da URL) |
| fbc | string | Não | Facebook Browser Cookie (_fbc) |
| fbp | string | Não | Facebook Pixel Cookie (_fbp) |
| latitude | number | Não | Latitude do visitante (browser geolocation) |
| longitude | number | Não | Longitude do visitante |
| source_host | string | Não | Hostname de origem (auto-extraído da page_url) |
| browser | string | Não | Nome do navegador |
| os | string | Não | Sistema operacional |
| screen_width | integer | Não | Largura da tela |
| screen_height | integer | Não | Altura da tela |
Resposta
{
"success": true,
"action": "created",
"funnel_step": "checkout_generated",
"visitor_id": 1234,
"has_lead": true
}
fbclid, gclid) são propagados para Meta CAPI e GA4 automaticamente.heartbeat atualiza a sessão como ativa sem criar evento. page_leave marca a sessão como inativa.Eventos Canônicos
O EventRecorder normaliza todos os eventos para um conjunto canônico. Eventos legados são mapeados automaticamente.
Eventos Válidos
| Evento Canônico | Descrição | Aliases Aceitos |
|---|---|---|
checkout_view | Visitante abriu o checkout | page_view, view |
form_start | Começou a preencher formulário | form_focus, field_focus |
form_complete | Completou dados do formulário | form_fill, field_filled, form_submit |
pix_generated | PIX/QR Code foi gerado | checkout_generated, checkout_start, qr_generated |
pix_copied | Código PIX copiado pelo pagador | copy_pix, pix_copy, copy_code, qr_copied |
payment_paid | Pagamento confirmado | payment_complete, pix_paid, paid |
converted | Pós-pagamento (opcional) | success, thank_you |
offer_click | Clique em oferta 360° | — |
Funil de Conversão
Os eventos formam um funil progressivo. O sistema nunca regride o passo do funil de um visitante:
checkout_view → form_start → form_complete → pix_generated → pix_copied → payment_paid → converted
gateway_events como fonte única de verdade, além de tabelas legadas (tracking_events, visitor_tracking, tracking_leads) para compatibilidade.Check Status (Polling)
Verifique o status de um pagamento via polling. Ideal para atualizar a interface em tempo real enquanto o pagador escaneia o QR Code.
Consulta o status atual de uma transação. Busca primeiro em transactions, depois em reflow_transactions como fallback. Não requer autenticação.
Query Parameters
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| id | string | Sim | ID da transação ou external_id |
Resposta
{
"success": true,
"status": "PAID",
"amount": 150.00,
"paid_at": "2026-02-11T15:02:15"
}
Status Possíveis
| Status | Descrição |
|---|---|
PENDING | Aguardando pagamento |
PAID | Pagamento confirmado |
CANCELLED | Cancelado ou expirado |
PAID, redirecione o pagador para a página de sucesso.Ofertas 360°
O sistema de Ofertas 360° permite criar links rastreáveis que conectam landing pages externas ao checkout PinaCash, com diagnóstico completo do fluxo: clique → checkout → pagamento.
Como Funciona
- Crie uma oferta no painel (app.pinacash.com/ofertas.php) vinculando a um link de pagamento
- Use a URL
https://pay.pinacash.com/go/{offer_id}na sua landing page ou anúncio - O sistema registra o
offer_click, redireciona ao checkout e propaga ooffer_idem todo o funil - Acompanhe métricas 360° no painel: cliques, checkouts, PIX gerados, pagamentos
Snippet de Tracking (Opcional)
Instale o snippet na sua landing page para rastrear visitas antes do clique na oferta:
<script> (function() { var offerId = 123; // Seu offer_id var visitorId = 'v_' + Math.random().toString(36).substr(2,12); fetch('https://api.pinacash.com/public/offer-collect.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ offer_id: offerId, visitor_id: visitorId, page_url: location.href, referrer: document.referrer }) }); })(); </script>
offer_id correto na aba Snippet da página de detalhe da oferta no painel do merchant.Redirect de Oferta
Redireciona o visitante para o checkout vinculado à oferta. Registra um evento offer_click em gateway_events com geolocalização, device e referrer.
Path Parameters
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| offer_id | integer | Sim | ID da oferta (deve estar ativa) |
Query Parameters
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| t | string | Não | Token de teste 360° (para sessões de diagnóstico) |
Comportamento
- Valida que a oferta existe e está ativa (
merchant_offers.is_active = 1) - Registra evento
offer_clickcom IP, device, referrer - Se
destination_mode = 'gateway': redireciona parapay.pinacash.com/{link_id}?offer_id={id} - Se
destination_mode = 'external': redireciona para a URL externa configurada - O
offer_idetest_tokensão propagados via query params para todo o funil
Offer Collect
Registra um evento offer_click a partir do snippet instalado na landing page do merchant. CORS habilitado para qualquer origem. Não requer autenticação.
Parâmetros
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| offer_id | integer | Sim | ID da oferta (deve existir e estar ativa) |
| visitor_id | string | Sim | ID do visitante (max 64 chars) |
| page_url | string | Não | URL da landing page (max 500 chars) |
| referrer | string | Não | Referrer da landing page (max 500 chars) |
Resposta de Sucesso
{
"ok": true,
"event_id": 4567
}
Erros
| Código | Descrição |
|---|---|
| 400 | offer_id e visitor_id obrigatórios |
| 404 | Oferta não encontrada ou inativa |
| 503 | Serviço indisponível (erro de banco) |
Ads Integration — Meta & Google
O PinaCash integra nativamente com Meta Conversions API (CAPI) e Google Analytics 4 Measurement Protocol para rastreamento server-side de conversões. Nenhuma PII é enviada em texto puro — todos os dados são hash SHA-256.
Arquitetura
| Componente | Descrição |
|---|---|
| Client-side | ads-loader.js — Carrega Meta Pixel e/ou gtag condicionalmente, com event IDs dedup |
| Config API | /tracking/ads-config.php — Retorna config segura (sem secrets) por merchant |
| Server-side | AdsEventDispatcher — Enfileira eventos no ads_outbox (chamado pelo EventRecorder) |
| Processador | AdsOutboxProcessor — Cron processa fila com 3 retries e dedup |
| Meta CAPI | MetaCapiService — Envia para graph.facebook.com |
Configuração pelo Merchant
O merchant configura suas integrações de ads no painel em app.pinacash.com/integracoes.php?tab=ads:
- Meta/Facebook: Pixel ID + Access Token (para CAPI server-side)
- Google Analytics: GA4 Measurement ID + API Secret (para Measurement Protocol)
ads-config.php) nunca expõe tokens — apenas Pixel ID e Measurement ID.Eventos Enviados
| Evento PinaCash | Meta CAPI | GA4 MP |
|---|---|---|
checkout_view | PageView | page_view |
form_start | AddToCart | begin_checkout |
pix_generated | InitiateCheckout | add_payment_info |
payment_paid | Purchase | purchase |
EventRecorder. PII (email, telefone, CPF) é hashed com SHA-256 antes do envio conforme requisitos Meta e Google.Click IDs & Pixels
O PinaCash captura automaticamente Click IDs de anúncios (Facebook, Google) e os propaga por todo o funil de conversão.
Click IDs Capturados
| Parâmetro | Origem | Coluna em gateway_events |
|---|---|---|
fbclid | Facebook Ads (URL param) | fbclid |
gclid | Google Ads (URL param) | gclid |
fbc | Facebook Browser Cookie (_fbc) | fbc |
fbp | Facebook Pixel Cookie (_fbp) | fbp |
Fluxo de Propagação
1. Visitante clica anúncio → URL contém ?fbclid=xxx ou ?gclid=xxx 2. JS do checkout (ads-loader.js) captura e envia via tracking/collect 3. EventRecorder grava na coluna dedicada em gateway_events 4. AdsEventDispatcher inclui click IDs no payload server-side 5. Meta CAPI / GA4 MP recebem para atribuição de conversão
Ads Config Endpoint
Retorna a configuração de ads segura (sem secrets) para o merchant. Usado pelo ads-loader.js no checkout.
{
"success": true,
"meta": {
"pixel_id": "123456789",
"enabled": true
},
"google": {
"measurement_id": "G-XXXXXXXXXX",
"enabled": true
}
}
access_token ou api_secret. Esses valores são usados apenas server-side pelo AdsOutboxProcessor.SDKs & Plugins
Integre ainda mais rápido usando nossos SDKs oficiais e plugins.
PHP
composer require pinacash/pinacash-php
use PinaCash\PinaCash; $pinacash = new PinaCash('pk_live_xxx', 'sk_live_xxx'); // Criar cobrança PIX $pix = $pinacash->pix->charge([ 'amount' => 100.00, 'external_id' => 'pedido_123', 'customer' => [ 'name' => 'João Silva', 'document' => '12345678900', 'email' => 'joao@email.com' ] ]); echo $pix->qr_code_base64; echo $pix->pix_code; // Consultar saldo $balance = $pinacash->balance->get(); echo "Disponível: R$ " . $balance->available; // Payout $payout = $pinacash->pix->payout([ 'amount' => 50.00, 'pix_key' => 'email@destino.com' ]);
Node.js
npm install @pinacash/pinacash-node
const PinaCash = require('@pinacash/pinacash-node'); const pinacash = new PinaCash('pk_live_xxx', 'sk_live_xxx'); // Criar cobrança const pix = await pinacash.pix.charge({ amount: 100.00, external_id: 'pedido_123', customer: { name: 'João Silva', document: '12345678900' } }); console.log(pix.pix_code); console.log(pix.qr_code_base64);
Python
pip install pinacash
from pinacash import PinaCash client = PinaCash('pk_live_xxx', 'sk_live_xxx') # Criar cobrança pix = client.pix.charge( amount=100.00, external_id='pedido_123', customer={ 'name': 'João Silva', 'document': '12345678900' } ) print(pix.pix_code) print(pix.qr_code_base64)
WooCommerce
Plugin oficial para aceitar pagamentos PIX na sua loja WordPress.
Instalação
- Faça download do plugin no seu painel em Integrações → WooCommerce
- No WordPress, vá em Plugins → Adicionar Novo → Enviar Plugin
- Ative o plugin e acesse WooCommerce → Configurações → Pagamentos
- Habilite "PinaCash PIX" e insira suas chaves de API
Recursos
- QR Code na página de pedido
- Confirmação automática via webhook
- Status do pedido atualizado automaticamente
- Compatível com WooCommerce 6.x+
pk_live_ e sk_live_.