v2.0

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.

API Online 99.9% Uptime < 3s Confirmação HMAC-SHA256 Ofertas 360° Meta CAPI + GA4

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

API Produção
https://api.pinacash.com/v1
Tracking
https://api.pinacash.com/tracking
Payment Links
https://pay.pinacash.com
Sandbox (Testes)
https://sandbox.pinacash.com/v1

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
curl -H "Accept: application/json" https://api.pinacash.com/health
Resposta — 200 OK
{
  "success": true,
  "data": {
    "status": "ok",
    "version": "1.0.0",
    "timestamp": "2026-03-20T01:00:00-03:00"
  }
}
A raiz da API (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:

PlanoReq/MinutoReq/Dia
Básico6010.000
Profissional300100.000
EnterpriseIlimitadoIlimitado

Formato de Resposta

Todas as respostas da API seguem o mesmo formato padrão:

Sucesso
{
  "success": true,
  "data": { ... }
}
Erro
{
  "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

Headers
X-Public-Key: pk_live_xxxxxxxxxxxxxxxxxxxxxxxx
X-Secret-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

Método 2 — Bearer Token

Headers
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
Importante: Nunca exponha sua chave secreta (sk_) no frontend ou em repositórios públicos. Todas as requisições devem ser feitas pelo seu servidor backend.

Ambientes

AmbientePrefixo da ChaveBase URL
Producaopk_live_ / sk_live_api.pinacash.com
Sandboxpk_test_ / sk_test_sandbox.pinacash.com

API Key vs Webhook Secret

API KeyWebhook Secret
Formatopk_live_... / sk_live_...whsec_...
Onde gerenciarapp.pinacash.com/api-key.phpapp.pinacash.com/webhooks.php
Para que serveAutenticar suas chamadas a APIValidar eventos que nos enviamos a voce
Quem usaSeu backend → PinaCashPinaCash → Seu backend
Quantas1 par por merchant1 por webhook (multiplos webhooks permitidos)
API Keys nao servem para validar webhooks. Use o 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ódigoStatusDescrição
200OKRequisição processada com sucesso
201CreatedRecurso criado com sucesso
400Bad RequestParâmetros inválidos ou ausentes
401UnauthorizedChaves de API inválidas ou ausentes
403ForbiddenSem permissão para este recurso
404Not FoundRecurso não encontrado
422UnprocessableValidação falhou (verifique campo errors)
429Too Many RequestsRate limit excedido
500Internal ErrorErro interno do servidor
503UnavailableGateway 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.

POST /v1/pix/charge Aliases: /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âmetroTipoObrig.Descrição
amountnumberSimValor em reais (mínimo R$ 1.00)
external_idstringNãoIdentificador único do seu sistema (alias: order_id)
descriptionstringNãoDescrição da cobrança
customer.namestringNãoNome do pagador (alias: payer_name)
customer.documentstringNãoCPF ou CNPJ (alias: payer_document)
customer.emailstringNãoEmail (alias: payer_email)
customer.phonestringNãoTelefone (alias: payer_phone)
webhook_urlstringNãoURL de callback (alias: postback_url)
link_idstringNãoID do link de pagamento (tracking)
checkout_idstringNãoID do checkout (tracking)
utm_sourcestringNãoUTM Source para rastreamento
utm_mediumstringNãoUTM Medium
utm_campaignstringNãoUTM Campaign
offer_idintegerNãoID da oferta (Ofertas 360°)
page_urlstringNãoURL de origem do checkout
latitudenumberNãoLatitude do pagador (geolocalização browser)
longitudenumberNãoLongitude do pagador

Exemplo de Requisição

cURL
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

JSON — 201 Created
{
  "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"
  }
}
A cobrança PIX expira em 30 minutos por padrão. O evento pix_generated é registrado automaticamente com geolocalização do pagador via IP.
Webhook automático: Ao criar uma cobrança, o evento 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.

GET /v1/pix/charge/{id}

Retorna os detalhes de uma cobrança. O parâmetro {id} pode ser o transaction_id ou external_id.

Resposta

JSON — 200 OK
{
  "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.

POST /v1/pix/payout Alias: /v1/pix/cashout

Envia um PIX para a chave especificada. O tipo da chave é detectado automaticamente.

Parâmetros

ParâmetroTipoObrig.Descrição
amountnumberSimValor em reais (mínimo R$ 1.00)
pix_keystringSimChave PIX do destinatário
recipient_namestringNãoNome do destinatário
recipient_documentstringNãoCPF/CNPJ do destinatário
order_idstringNãoIdentificador único

Resposta

JSON — 201 Created
{
  "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"
  }
}
O pix_key_type é detectado automaticamente (cpf, cnpj, email, phone, random). O saldo é debitado imediatamente ao criar o payout.

Consultar Saldo

GET /v1/balance

Retorna o saldo disponível, bloqueado e total da sua conta.

JSON — 200 OK
{
  "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.

GET /v1/transactions

Query Parameters

ParâmetroTipoPadrãoDescrição
pageinteger1Página
limitinteger25Itens por página (máx. 100)
statusstringpending, paid, cancelled
typestringDEPOSIT ou WITHDRAW
date_fromdateData início (YYYY-MM-DD)
date_todateData fim (YYYY-MM-DD)

Exemplo

cURL
curl "https://api.pinacash.com/v1/transactions?status=paid&limit=10" \
  -H "Authorization: Bearer sk_live_xxx"
JSON — 200 OK
{
  "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.

Webhook Secret ≠ API Key — Sua API Key (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.

Retentativas: Webhooks que falham sao retentados ate 5 vezes com backoff exponencial — 1min, 5min, 30min, 2h, 12h. Apos esgotar as tentativas, o webhook entra em dead_letter e voce recebe uma notificacao no painel.

Eventos Disponiveis

EventoDescricaoQuando
payment.createdPIX criado, aguardando pagamentoAo gerar cobranca via API ou checkout (dispatch automatico)
payment.paidPagamento PIX confirmado ✓Quando o pagador efetua o PIX (via webhook Reflow)
payment.pendingPagamento pendente de confirmacaoStatus intermediario
payment.cancelledPagamento cancelado / expiradoPIX expirou ou foi cancelado
payment.refundedPagamento estornadoEstorno realizado
withdrawal.createdSaque solicitadoSaque aprovado e em processamento
withdrawal.completedSaque concluido ✓Saque pago com sucesso
withdrawal.failedSaque falhouErro no processamento do saque
test.webhookEvento de testeAo clicar "Testar" no painel
WebhookDispatcherService: Webhooks são gerenciados pela tabela 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:

HeaderDescricaoExemplo
X-PINACASH-SIGNATUREAssinatura HMAC-SHA256 do payloada1b2c3d4e5...
X-PINACASH-EVENTNome do eventopayment.paid
X-PINACASH-WEBHOOK-IDID do webhook configurado42
X-PINACASH-TIMESTAMPTimestamp Unix do envio1739290935
Content-TypeTipo do conteudoapplication/json
User-AgentIdentificacao do remetentePinaCash-Webhook/1.0

Payload de Exemplo

JSON — payment.paid
{
  "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:

Formula
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.

Dica: Ao criar um webhook em app.pinacash.com/webhooks.php, o sistema gera um codigo PHP completo com seu secret ja embutido. Basta copiar e colar — zero configuracao.
PHP — Validacao completa
// 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]);
Node.js — Validacao
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 });
});
Python — Validacao
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:

  1. Acesse app.pinacash.com/webhooks.php
  2. Clique "Adicionar Webhook" → preencha nome, URL (HTTPS) e eventos
  3. O sistema gera o secret e o codigo PHP completo
  4. Copie o codigo e cole no seu servidor — funciona imediatamente
Seguranca: O secret (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

GET /v1/webhooks

Lista todos os webhooks configurados para o merchant autenticado.

JSON — 200 OK
{
  "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"
    }
  ]
}
POST /v1/webhooks

Cria um novo webhook. O secret (whsec_...) e retornado apenas nesta resposta.

ParametroTipoObrig.Descricao
urlstringSimURL HTTPS do endpoint
namestringNaoNome identificador (ex: "Meu ERP")
eventsarrayNaoLista de eventos (padrao: todos)
JSON — 201 Created
{
  "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.

POST /tracking/collect.php

Registra um evento de tracking. Não requer autenticação via API key — apenas o merchant_id.

Parâmetros Principais

ParâmetroTipoObrig.Descrição
merchant_idintegerSimID do merchant
session_idstringSimID da sessão do visitante (max 64 chars)
eventstringNãocheckout_view, form_focus, form_fill, pix_generated, payment_complete
page_typestringNãocheckout, payment_link, product, funnel
link_idstringNãoID do link de pagamento
valuenumberNãoValor da transação
lead_namestringNãoNome do lead
lead_emailstringNãoEmail do lead
lead_phonestringNãoTelefone do lead
lead_cpfstringNãoCPF do lead
utm_sourcestringNãoUTM Source
utm_mediumstringNãoUTM Medium
utm_campaignstringNãoUTM Campaign
utm_termstringNãoUTM Term
utm_contentstringNãoUTM Content
offer_idintegerNãoID da oferta (Ofertas 360°)
test_tokenstringNãoToken de teste 360° (para sessões de diagnóstico)
fbclidstringNãoFacebook Click ID (capturado da URL)
gclidstringNãoGoogle Click ID (capturado da URL)
fbcstringNãoFacebook Browser Cookie (_fbc)
fbpstringNãoFacebook Pixel Cookie (_fbp)
latitudenumberNãoLatitude do visitante (browser geolocation)
longitudenumberNãoLongitude do visitante
source_hoststringNãoHostname de origem (auto-extraído da page_url)
browserstringNãoNome do navegador
osstringNãoSistema operacional
screen_widthintegerNãoLargura da tela
screen_heightintegerNãoAltura da tela

Resposta

JSON — 200 OK
{
  "success": true,
  "action": "created",
  "funnel_step": "checkout_generated",
  "visitor_id": 1234,
  "has_lead": true
}
O tracking registra automaticamente geolocalização por IP (cache DB 24h via ip-api.com), tipo de device, browser e OS. Os dados alimentam o Analytics 360° no seu painel. Click IDs (fbclid, gclid) são propagados para Meta CAPI e GA4 automaticamente.
Eventos especiais: 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ônicoDescriçãoAliases Aceitos
checkout_viewVisitante abriu o checkoutpage_view, view
form_startComeçou a preencher formulárioform_focus, field_focus
form_completeCompletou dados do formulárioform_fill, field_filled, form_submit
pix_generatedPIX/QR Code foi geradocheckout_generated, checkout_start, qr_generated
pix_copiedCódigo PIX copiado pelo pagadorcopy_pix, pix_copy, copy_code, qr_copied
payment_paidPagamento confirmadopayment_complete, pix_paid, paid
convertedPós-pagamento (opcional)success, thank_you
offer_clickClique em oferta 360°

Funil de Conversão

Os eventos formam um funil progressivo. O sistema nunca regride o passo do funil de um visitante:

Funil — Progressão
checkout_viewform_startform_completepix_generatedpix_copiedpayment_paidconverted
Cada evento é gravado na tabela canônica 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.

GET https://pay.pinacash.com/check-status.php?id={id}

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âmetroTipoObrig.Descrição
idstringSimID da transação ou external_id

Resposta

JSON — 200 OK
{
  "success": true,
  "status": "PAID",
  "amount": 150.00,
  "paid_at": "2026-02-11T15:02:15"
}

Status Possíveis

StatusDescrição
PENDINGAguardando pagamento
PAIDPagamento confirmado
CANCELLEDCancelado ou expirado
Polling recomendado: Consulte a cada 3-5 segundos. Quando o status mudar para 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

  1. Crie uma oferta no painel (app.pinacash.com/ofertas.php) vinculando a um link de pagamento
  2. Use a URL https://pay.pinacash.com/go/{offer_id} na sua landing page ou anúncio
  3. O sistema registra o offer_click, redireciona ao checkout e propaga o offer_id em todo o funil
  4. 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:

HTML — Snippet Landing Page
<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>
O snippet é gerado automaticamente com o offer_id correto na aba Snippet da página de detalhe da oferta no painel do merchant.

Redirect de Oferta

GET https://pay.pinacash.com/go/{offer_id}

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âmetroTipoObrig.Descrição
offer_idintegerSimID da oferta (deve estar ativa)

Query Parameters

ParâmetroTipoObrig.Descrição
tstringNãoToken de teste 360° (para sessões de diagnóstico)

Comportamento

  1. Valida que a oferta existe e está ativa (merchant_offers.is_active = 1)
  2. Registra evento offer_click com IP, device, referrer
  3. Se destination_mode = 'gateway': redireciona para pay.pinacash.com/{link_id}?offer_id={id}
  4. Se destination_mode = 'external': redireciona para a URL externa configurada
  5. O offer_id e test_token são propagados via query params para todo o funil
Este endpoint nunca faz fetch/crawl de URLs externas (proteção SSRF). Apenas redireciona via HTTP 302.

Offer Collect

POST https://api.pinacash.com/public/offer-collect.php

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âmetroTipoObrig.Descrição
offer_idintegerSimID da oferta (deve existir e estar ativa)
visitor_idstringSimID do visitante (max 64 chars)
page_urlstringNãoURL da landing page (max 500 chars)
referrerstringNãoReferrer da landing page (max 500 chars)

Resposta de Sucesso

JSON — 200 OK
{
  "ok": true,
  "event_id": 4567
}

Erros

CódigoDescrição
400offer_id e visitor_id obrigatórios
404Oferta não encontrada ou inativa
503Serviç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

ComponenteDescrição
Client-sideads-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-sideAdsEventDispatcher — Enfileira eventos no ads_outbox (chamado pelo EventRecorder)
ProcessadorAdsOutboxProcessor — Cron processa fila com 3 retries e dedup
Meta CAPIMetaCapiService — 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)
Segurança: Access Tokens e API Secrets são criptografados com AES-256-CBC no banco. A config retornada ao client (ads-config.php) nunca expõe tokens — apenas Pixel ID e Measurement ID.

Eventos Enviados

Evento PinaCashMeta CAPIGA4 MP
checkout_viewPageViewpage_view
form_startAddToCartbegin_checkout
pix_generatedInitiateCheckoutadd_payment_info
payment_paidPurchasepurchase
O dispatch server-side é acionado automaticamente pelo 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âmetroOrigemColuna em gateway_events
fbclidFacebook Ads (URL param)fbclid
gclidGoogle Ads (URL param)gclid
fbcFacebook Browser Cookie (_fbc)fbc
fbpFacebook Pixel Cookie (_fbp)fbp

Fluxo de Propagação

Fluxo — Click ID
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

GET https://api.pinacash.com/tracking/ads-config.php?merchant_id={id}

Retorna a configuração de ads segura (sem secrets) para o merchant. Usado pelo ads-loader.js no checkout.

JSON — 200 OK
{
  "success": true,
  "meta": {
    "pixel_id": "123456789",
    "enabled": true
  },
  "google": {
    "measurement_id": "G-XXXXXXXXXX",
    "enabled": true
  }
}
Segurança: Este endpoint nunca retorna 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
composer require pinacash/pinacash-php
PHP — Exemplo Completo
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
npm install @pinacash/pinacash-node
Node.js — Exemplo
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
pip install pinacash
Python — Exemplo
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

  1. Faça download do plugin no seu painel em Integrações → WooCommerce
  2. No WordPress, vá em Plugins → Adicionar Novo → Enviar Plugin
  3. Ative o plugin e acesse WooCommerce → Configurações → Pagamentos
  4. 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+
O plugin é configurado automaticamente com os webhooks corretos. Basta inserir suas chaves pk_live_ e sk_live_.