Documentação oficial

Integre seu site ao
gateway GeralPay

Crie cobranças Pix, disponibilize o código Pix Copia e Cola, redirecione o cliente para o checkout hospedado e acompanhe os pagamentos pelo painel.

Fluxo

Como a integração funciona

1
Chaves da API

Crie uma chave na seção API do painel GeralPay.

2
Criação do Pix

Envie o valor, a descrição e os dados completos do pagador ao endpoint de pagamentos.

3
Pagamento

A API retorna a referência, a URL do checkout hospedado e o código Pix Copia e Cola.

Autenticação

Cabeçalhos da requisição

Todas as chamadas privadas usam as chaves criadas no painel em API > Nova chave.

Na criação de pagamentos, envie também Content-Type: application/json e Idempotency-Key.

Content-Type: application/json
X-Public-Key: pk_test_xxxxxxxxx
X-Secret-Key: variável de ambiente do backend
Idempotency-Key: pedido-1001-pix-1
Pagamentos

Criar pagamento PIX

POSThttps://geralpay.com/api/v1/payments
Envie Idempotency-Key em toda criação. A mesma chave e o mesmo payload devolvem a resposta original sem gerar outro PIX.
CampoObrigatórioDescrição
methodSimUse pix.
amountSimValor em reais (BRL), com até duas casas decimais. Mínimo de R$ 3,00 e máximo de R$ 100.000,00 por cobrança.
external_referenceSimIdentificador único do pedido na loja, com 3 a 120 caracteres: letras, números, ponto, sublinhado, dois-pontos, barra ou hífen.
success_urlNãoURL HTTPS após a aprovação.
cancel_urlNãoURL HTTPS para cancelamento.
return_urlNãoURL HTTPS para retornar à loja.
descriptionNãoDescrição do pedido.
payer.nameSimNome do pagador.
payer.emailSimE-mail do pagador.
payer.documentSimCPF ou CNPJ válido do pagador, incluindo os dígitos verificadores.
payer.phoneSim, na FyntraTelefone brasileiro válido com DDD: 10 dígitos para telefone fixo ou 11 para celular. O prefixo internacional 55 é opcional.
payer.addressSim, na FyntraEndereço completo do pagador. Envie os campos detalhados abaixo.
expires_in_minutesNãoPrazo solicitado de 5 a 1.440 minutos; padrão de 30 minutos. Na Fyntra, o prazo é arredondado para dias completos, com mínimo de 1 dia. Consulte expira_em na resposta.
O valor mínimo para criar uma cobrança Pix é R$ 3,00. Envie amount em reais, por exemplo, "3.00". Valores inferiores ao mínimo são rejeitados antes do envio à adquirente.

Endereço obrigatório na Fyntra

Use o campo payer.address (com dois “d”). Em produção, a Fyntra exige o endereço completo e o telefone com DDD. O sandbox não consulta a adquirente; uma simulação aprovada não confirma que os dados serão aceitos em produção.

Campo em payer.addressObrigatórioDescrição
streetSimLogradouro, com até 160 bytes em UTF-8.
streetNumberSimNúmero do imóvel, com até 30 bytes em UTF-8.
complementNãoComplemento, com até 120 bytes em UTF-8.
zipCodeSimCEP com 8 dígitos. Exemplo: 01310100.
neighborhoodSimBairro, com até 100 bytes em UTF-8.
citySimCidade, com até 100 bytes em UTF-8.
stateSimUF com 2 letras. Exemplo: SP.
countryNão; padrão BRPaís com 2 letras. Envie BR para endereços brasileiros.
{
  "method": "pix",
  "amount": "49.90",
  "external_reference": "pedido-1001",
  "description": "Pedido #1001",
  "payer": {
    "name": "Maria Silva",
    "email": "maria@email.com",
    "document": "52998224725",
    "phone": "11987654321",
    "address": {
      "street": "Avenida Paulista",
      "streetNumber": "1000",
      "zipCode": "01310100",
      "neighborhood": "Bela Vista",
      "city": "Sao Paulo",
      "state": "SP",
      "country": "BR"
    }
  }
}
Resposta

Dados retornados

{
  "sucesso": true,
  "mensagem": "Pagamento criado com sucesso.",
  "pagamento": {
    "referencia": "PIX-123456",
    "external_reference": "pedido-1001",
    "ambiente": "test",
    "status": "pending",
    "valor_bruto": 49.9,
    "taxa": 0,
    "valor_liquido": 49.9,
    "checkout_url": "https://geralpay.com/checkout?token=chk_7db91e4c...",
    "pix": {
      "copia_e_cola": "GERAL_PAY_SANDBOX_PIX-123456_..."
    }
  }
}
Em produção, use pagamento.pix.copia_e_cola para gerar o QR Code ou redirecione o cliente para pagamento.checkout_url. No sandbox, o código retornado é fictício e não pode ser pago.
Exemplos

cURL

curl -X POST "https://geralpay.com/api/v1/payments" \
  -H "Content-Type: application/json" \
  -H "X-Public-Key: pk_test_xxxxxxxxx" \
  -H "X-Secret-Key: $GERAL_SECRET_KEY" \
  -H "Idempotency-Key: pedido-1001-pix-1" \
  -d '{
    "method": "pix",
    "amount": "49.90",
    "external_reference": "pedido-1001",
    "description": "Pedido #1001",
    "payer": {
      "name": "Maria Silva",
      "email": "maria@email.com",
      "document": "52998224725",
      "phone": "11987654321",
      "address": {
        "street": "Avenida Paulista",
        "streetNumber": "1000",
        "zipCode": "01310100",
        "neighborhood": "Bela Vista",
        "city": "Sao Paulo",
        "state": "SP",
        "country": "BR"
      }
    }
  }'

JavaScript no backend (Node.js)

Mantenha a chave secreta no servidor. O navegador deve chamar o backend da sua loja.
const response = await fetch("https://geralpay.com/api/v1/payments", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Public-Key": process.env.GERAL_PUBLIC_KEY,
    "X-Secret-Key": process.env.GERAL_SECRET_KEY,
    "Idempotency-Key": "pedido-1001-pix-1"
  },
  body: JSON.stringify({
    method: "pix",
    amount: "49.90",
    external_reference: "pedido-1001",
    description: "Pedido #1001",
    payer: {
      name: "Maria Silva",
      email: "maria@email.com",
      document: "52998224725",
      phone: "11987654321",
      address: {
        street: "Avenida Paulista",
        streetNumber: "1000",
        zipCode: "01310100",
        neighborhood: "Bela Vista",
        city: "Sao Paulo",
        state: "SP",
        country: "BR"
      }
    }
  })
});

const data = await response.json();

if (!data.sucesso) {
  throw new Error(data.mensagem || "Erro ao criar PIX");
}

console.log(data.pagamento.pix.copia_e_cola);

Consultar o status pela referência

GEThttps://geralpay.com/api/v1/payments?reference=PIX-615312

Use as mesmas chaves nos cabeçalhos para consultar o status, os valores, a origem e as datas da cobrança.

Webhooks

Cadastrar a URL de notificação

POSThttps://geralpay.com/api/v1/webhooks
{
  "url": "https://loja.com/webhooks/geral-pay",
  "events": ["pagamento.aprovado"]
}

O cadastro habilita as notificações de cobranças criadas pela API e pelo painel. Guarde o secret retornado e responda com HTTP 2xx após validar e persistir o evento. O processamento das entregas depende do worker de webhooks.

Payload de pagamento aprovado

{
  "id": "evt_f4e159c5f8db7f4d6c6628ae",
  "event": "pagamento.aprovado",
  "created_at": "2026-07-26T15:42:18-03:00",
  "data": {
    "reference": "PIX-615312",
    "external_reference": "pedido-1001",
    "environment": "live",
    "status": "approved",
    "method": "pix",
    "amount": 49.90,
    "fee": 0,
    "net_amount": 49.90,
    "currency": "BRL",
    "description": "Pedido #1001",
    "origin": "api",
    "checkout_url": "https://geralpay.com/checkout?token=chk_7db91e4c...",
    "acquirer_reference": "abc123",
    "updated_at": "2026-07-26T15:42:18-03:00",
    "payer": {
      "name": "Maria Silva",
      "email": "maria@email.com",
      "document": "52998224725",
      "phone": "11987654321"
    }
  }
}

Validar assinatura HMAC

Calcule HMAC-SHA256(timestamp + "." + corpo_json_bruto, secret) e compare com X-Geral-Signature no formato sha256=<hash>. O timestamp está em X-Geral-Timestamp.

$raw = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_GERAL_TIMESTAMP'] ?? '';
$received = $_SERVER['HTTP_X_GERAL_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac(
  'sha256',
  $timestamp . '.' . $raw,
  $webhookSecret
);

if (abs(time() - (int) $timestamp) > 300 || !hash_equals($expected, $received)) {
  http_response_code(401);
  exit;
}

http_response_code(204);

Entregas com falha são repetidas em intervalos progressivos. Não há IP fixo garantido; valide sempre a assinatura HMAC.

Reenviar o evento de uma cobrança existente

{
  "reference": "PIX-615312"
}

Envie esse JSON para POST https://geralpay.com/api/v1/webhooks. Um novo evento é criado sem creditar o saldo novamente.

Tratamento

Erros comuns

HTTPSituaçãoComo corrigir
401Chaves ausentes ou inválidas.Envie X-Public-Key e X-Secret-Key válidas nos cabeçalhos.
422JSON inválido.Confira o formato do corpo da requisição.
422Dados do pagador ausentes ou inválidos.Envie payer.name, payer.email e payer.document válidos.
422Valor fora dos limites.Envie amount entre R$ 3,00 e R$ 100.000,00, com até duas casas decimais.
422Telefone ou endereço incompleto.Na Fyntra, envie payer.phone com DDD e payer.address completo.
Produção

Antes de publicar sua integração

Confirme se sua conta está aprovada, se a chave da API está ativa e se o checkout coleta os dados completos do pagador.

ContaConta aprovada no painel GeralPay.
APIChaves ativas no ambiente de produção.
PagadorNome, e-mail e CPF ou CNPJ válido são obrigatórios. Na Fyntra, informe também telefone com DDD e endereço completo.
PedidoReferência salva no sistema da loja para conciliação.
PagamentoExiba o código Pix Copia e Cola ou redirecione o cliente para o checkout hospedado.