Fire Bankingdocs
Guias de Integração

PIX Cash-In (Recebimento)

Visão Geral

O endpoint PIX Cash-In permite que você gere cobranças PIX dinâmicas para receber pagamentos. Cada cobrança gera um QR Code único e um código PIX (Pix Copia e Cola) que seus clientes podem usar para efetuar o pagamento.

Este endpoint requer um token Bearer válido. Verifique a documentação de autenticação para mais detalhes.

Características

  • Geração de QR Code dinâmico
  • Código PIX no formato EMV (Copia e Cola)
  • Configuração de prazo de expiração (5 minutos a 7 dias)
  • Identificação única por externalId
  • Informações adicionais personalizáveis
  • Validação automática de CPF/CNPJ
  • Split de pagamento: divisão automática entre múltiplos destinatários

Endpoint

POST /api/pix/cash-in

Gera uma nova cobrança PIX.

Headers Obrigatórios

Authorization: Bearer {token}
Content-Type: application/json

Request Body

{
  "transaction": {
    "value": 150.00,
    "description": "Pagamento de pedido #12345",
    "expirationTime": 86400,
    "externalId": "ORDER-12345-20240119",
    "generateQrCode": true
  },
  "payer": {
    "fullName": "Carlos Oliveira",
    "document": "12345678901"
  },
  "additionalInfo": {
    "orderId": "12345",
    "storeName": "Tech Solutions",
    "productCategory": "Eletrônicos"
  },
  "splits": [
    {
      "pixKey": "fornecedor@email.com",
      "pixKeyType": "EMAIL",
      "name": "Fornecedor Ltda",
      "document": "12345678000199",
      "type": "PERCENTAGE",
      "value": 10,
      "immediate": false
    }
  ]
}

Request

curl -X POST https://api.public.firebanking.com.br/api/pix/cash-in \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{
    "transaction": {
      "value": 150.00,
      "description": "Pagamento de pedido #12345",
      "expirationTime": 86400,
      "externalId": "ORDER-12345-20240119",
      "generateQrCode": true
    },
    "payer": {
      "fullName": "Carlos Oliveira",
      "document": "12345678901"
    },
    "additionalInfo": {
      "orderId": "12345"
    },
    "splits": [
      {
        "pixKey": "fornecedor@email.com",
        "pixKeyType": "EMAIL",
        "name": "Fornecedor Ltda",
        "document": "12345678000199",
        "type": "PERCENTAGE",
        "value": 70,
        "immediate": false
      }
    ]
  }'

O campo splits é opcional. Veja o guia de Split de Pagamentos para detalhes completos sobre tipos, formatos de valor e frequências.

Response (201 Created)

{
  "transactionId": "7845",
  "correlationId": "550e8400-e29b-41d4-a716-446655440000",
  "externalId": "ORDER-12345-20240119",
  "status": "PENDING",
  "pixCode": "00020126580014br.gov.bcb.pix0136550e8400-e29b-41d4-a716-4466554400005204000053039865802BR5916Tech Solutions Ltda6009SAO PAULO62070503***63041D3D",
  "generateTime": "2024-01-19T14:30:00.000Z",
  "expirationDate": "2024-01-20T14:30:00.000Z",
  "qrCodeImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51..."
}

O campo qrCodeImage é retornado apenas quando generateQrCode: true é enviado na requisição. O valor é uma imagem PNG do QR Code codificada em Base64 no formato Data URL.

Parâmetros da Requisição

Transaction Object

transaction.valuenumberobrigatorio

Valor da transação em reais (BRL). Deve ter no máximo 2 casas decimais.

Mínimo: 0.01

Exemplo: 150.00

transaction.descriptionstringobrigatorio

Descrição da transação que aparecerá no extrato do pagador.

Máximo: 140 caracteres

Exemplo: "Pagamento de pedido #12345"

transaction.expirationTimenumber

Tempo de expiração em segundos.

Mínimo: 300 (5 minutos)

Máximo: 604800 (7 dias)

Padrão: 86400 (24 horas)

transaction.externalIdstringobrigatorio

Identificador único externo da transação. Use para correlacionar com seu sistema.

Máximo: 255 caracteres

Recomendação: Use um formato que inclua data/hora para garantir unicidade

Exemplo: "ORDER-12345-20240119-143000"

transaction.generateQrCodeboolean

Define se deve gerar o QR Code em Base64.

Padrão: false

Recomendação: Use true para exibir QR Code ao usuário

Payer Object

Os campos payer são obrigatórios na API, porém são puramente informativos — não são enviados ao banco liquidante nem ao PSP. Servem apenas para registro interno (extrato, auditoria, identificação da contraparte).

Abordagem simplificada: Se o seu caso de uso não exige coletar dados do pagador (ex: e-commerce onde qualquer pessoa pode pagar), você pode enviar valores fixos como o CNPJ e a razão social da conta recebedora. Não é necessário solicitar CPF/nome ao pagador final.

payer.fullNamestringobrigatorio

Nome do pagador ou identificador fixo.

Máximo: 100 caracteres

Uso: Campo informativo — armazenado nos registros da transação para identificação. Não é validado contra nenhum cadastro.

Exemplos:

  • Dados reais do cliente: "Carlos Oliveira"
  • Valor fixo (razão social da conta): "Minha Empresa Ltda"
payer.documentstringobrigatorio

CPF ou CNPJ do pagador (apenas números). Validação apenas de formato (11 ou 14 dígitos).

CPF: 11 dígitos | CNPJ: 14 dígitos

Uso: Campo informativo — não é enviado ao PSP e não afeta a geração do QR Code. Pode ser o documento do próprio integrador.

Exemplos:

  • CPF real do cliente: "12345678901"
  • CNPJ fixo da conta recebedora: "12345678000199"

Additional Info Object

additionalInfoobject

Informações adicionais em formato chave-valor (string:string).

Máximo: 10 chaves

Exemplo:

{
  "orderId": "12345",
  "customerId": "67890",
  "storeName": "Tech Solutions"
}

Splits Array (Opcional)

splitsarray

Lista de destinatários para divisão automática do pagamento recebido. Quando o PIX-IN é confirmado, o valor é dividido e enviado automaticamente aos destinatários.

Máximo: 10 destinatários por transação

splits[].pixKeystringobrigatorio

Chave PIX do destinatário do split.

Máximo: 255 caracteres

Exemplo: "fornecedor@email.com"

splits[].pixKeyTypestringobrigatorio

Tipo da chave PIX do destinatário.

Valores possíveis: EMAIL, PHONE, CPF, CNPJ, RANDOM

Exemplo: "EMAIL"

splits[].namestringobrigatorio

Nome completo do destinatário.

Máximo: 255 caracteres

Exemplo: "Fornecedor Ltda"

splits[].documentstringobrigatorio

CPF ou CNPJ do destinatário (apenas dígitos).

CPF: 11 dígitos | CNPJ: 14 dígitos

Exemplo: "12345678000199"

splits[].typestringobrigatorio

Tipo do split: valor fixo ou percentual.

Valores possíveis:

  • FIXED — Valor fixo em reais (ex: 10.00 = R$ 10,00)
  • PERCENTAGE — Percentual direto (ex: 10 = 10%)

Exemplo: "PERCENTAGE"

splits[].valuenumberobrigatorio

Valor do split conforme o tipo:

  • FIXED: Valor em reais com até 2 casas decimais. 10.50 = R$ 10,50
  • PERCENTAGE: Percentual direto. 10 = 10%, 25.5 = 25,5%

Mínimo: 0.01

Exemplo: 10 (10% para PERCENTAGE) ou 10.00 (R$ 10,00 para FIXED)

splits[].immediateboolean

Se true, o split é executado imediatamente após a confirmação do PIX-IN, ignorando a frequência configurada na conta.

Padrão: false

A soma dos splits (valores fixos + percentuais sobre o valor bruto) mais as taxas não pode exceder o valor da transação. Caso exceda, a API retornará erro 400.

Estrutura da Resposta

transactionIdstringsempre presente

ID interno da transação gerada pela Avista.

Exemplo: "7845"

correlationIdstringsempre presente

UUID para rastreamento e correlação da transação.

Exemplo: "550e8400-e29b-41d4-a716-446655440000"

externalIdstringsempre presente

ID externo fornecido na requisição (mesmo valor do input).

Exemplo: "ORDER-12345-20240119"

statusstringsempre presente

Status atual da transação.

Valores possíveis:

  • PENDING: Aguardando pagamento
  • CONFIRMED: Pagamento confirmado
  • ERROR: Erro no processamento

Exemplo: "PENDING"

pixCodestringsempre presente

Código PIX no formato EMV (Pix Copia e Cola).

Exemplo: "00020126580014br.gov.bcb.pix..."

generateTimestringsempre presente

Data e hora de geração da cobrança (ISO 8601 UTC).

Exemplo: "2024-01-19T14:30:00.000Z"

expirationDatestringsempre presente

Data e hora de expiração da cobrança (ISO 8601 UTC).

Exemplo: "2024-01-20T14:30:00.000Z"

qrCodeImagestring

QR Code em Base64 no formato Data URL. Retornado apenas quando generateQrCode: true na requisição.

Formato: data:image/png;base64,{base64_encoded_image}

Exemplo: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51..."

Uso: Pode ser exibido diretamente em uma tag <img> no HTML ou decodificado para salvar como arquivo.

Exemplos de Implementação

Node.js / TypeScript

import axios from 'axios';

interface CashInRequest {
  transaction: {
    value: number;
    description: string;
    expirationTime?: number;
    externalId: string;
    generateQrCode?: boolean;
  };
  payer: {
    fullName: string;
    document: string;
  };
  additionalInfo?: Record<string, string>;
}

interface CashInResponse {
  transactionId: string;
  correlationId: string;
  externalId: string;
  status: 'PENDING' | 'CONFIRMED' | 'ERROR';
  pixCode: string;
  generateTime: string;
  expirationDate: string;
  qrCodeImage?: string; // Presente apenas quando generateQrCode: true
}

async function createPixCharge(
  token: string,
  orderId: string,
  amount: number,
  customerName: string,
  customerDocument: string
): Promise<CashInResponse> {
  const payload: CashInRequest = {
    transaction: {
      value: amount,
      description: `Pagamento do pedido ${orderId}`,
      expirationTime: 3600, // 1 hora
      externalId: `ORDER-${orderId}-${Date.now()}`,
      generateQrCode: true
    },
    payer: {
      fullName: customerName,
      document: customerDocument
    },
    additionalInfo: {
      orderId: orderId,
      timestamp: new Date().toISOString()
    }
  };

  try {
    const response = await axios.post<CashInResponse>(
      'https://api.public.firebanking.com.br/api/pix/cash-in',
      payload,
      {
        headers: {
          'Authorization': `Bearer ${token}`,
          'Content-Type': 'application/json'
        }
      }
    );

    console.log('Cobrança PIX gerada com sucesso!');
    console.log(`ID da Transação: ${response.data.transactionId}`);
    console.log(`Código PIX: ${response.data.pixCode}`);
    console.log(`Expira em: ${new Date(response.data.expirationDate).toLocaleString('pt-BR')}`);
    if (response.data.qrCodeImage) {
      console.log('QR Code Image disponível para exibição');
    }

    return response.data;
  } catch (error) {
    if (axios.isAxiosError(error)) {
      console.error('Erro ao gerar cobrança:', error.response?.data);
      throw new Error(error.response?.data?.message || 'Erro ao gerar cobrança PIX');
    }
    throw error;
  }
}

// Uso
const token = 'seu_token_aqui';
createPixCharge(token, '12345', 150.00, 'Carlos Oliveira', '12345678901');

Python

import requests
from datetime import datetime, timedelta
from typing import Dict, Optional

def create_pix_charge(
    token: str,
    order_id: str,
    amount: float,
    customer_name: str,
    customer_document: str,
    expiration_hours: int = 1,
    additional_info: Optional[Dict[str, str]] = None
) -> Dict:
    """
    Gera uma cobrança PIX

    Args:
        token: Token Bearer válido
        order_id: ID do pedido
        amount: Valor em reais
        customer_name: Nome do cliente
        customer_document: CPF ou CNPJ (apenas números)
        expiration_hours: Horas até expiração (padrão: 1)
        additional_info: Informações adicionais

    Returns:
        Dados da cobrança gerada
    """
    url = 'https://api.public.firebanking.com.br/api/pix/cash-in'

    payload = {
        'transaction': {
            'value': round(amount, 2),
            'description': f'Pagamento do pedido {order_id}',
            'expirationTime': expiration_hours * 3600,
            'externalId': f'ORDER-{order_id}-{int(datetime.now().timestamp())}',
            'generateQrCode': True
        },
        'payer': {
            'fullName': customer_name,
            'document': customer_document
        },
        'additionalInfo': additional_info or {}
    }

    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json'
    }

    try:
        response = requests.post(url, json=payload, headers=headers)
        response.raise_for_status()

        data = response.json()

        print('Cobrança PIX gerada com sucesso!')
        print(f"ID da Transação: {data['transactionId']}")
        print(f"Código PIX: {data['pixCode']}")
        print(f"Status: {data['status']}")

        expiration = datetime.fromisoformat(data['expirationDate'].replace('Z', '+00:00'))
        print(f"Expira em: {expiration.strftime('%d/%m/%Y %H:%M:%S')}")

        if 'qrCodeImage' in data:
            print('QR Code Image disponível para exibição')

        return data

    except requests.exceptions.RequestException as e:
        print(f'Erro ao gerar cobrança: {e}')
        if hasattr(e.response, 'json'):
            print(f'Detalhes: {e.response.json()}')
        raise

# Uso
token = 'seu_token_aqui'
charge = create_pix_charge(
    token=token,
    order_id='12345',
    amount=150.00,
    customer_name='Carlos Oliveira',
    customer_document='12345678901',
    expiration_hours=24,
    additional_info={
        'storeName': 'Tech Solutions',
        'productCategory': 'Eletrônicos'
    }
)

PHP

<?php

function createPixCharge(
    string $token,
    string $orderId,
    float $amount,
    string $customerName,
    string $customerDocument,
    int $expirationHours = 1
): array {
    $url = 'https://api.public.firebanking.com.br/api/pix/cash-in';

    $payload = [
        'transaction' => [
            'value' => round($amount, 2),
            'description' => "Pagamento do pedido $orderId",
            'expirationTime' => $expirationHours * 3600,
            'externalId' => "ORDER-$orderId-" . time(),
            'generateQrCode' => true
        ],
        'payer' => [
            'fullName' => $customerName,
            'document' => $customerDocument
        ],
        'additionalInfo' => [
            'orderId' => $orderId
        ]
    ];

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json'
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 201) {
        throw new Exception("Erro ao gerar cobrança: HTTP $httpCode - $response");
    }

    $data = json_decode($response, true);

    echo "Cobrança PIX gerada com sucesso!" . PHP_EOL;
    echo "ID da Transação: {$data['transactionId']}" . PHP_EOL;
    echo "Código PIX: {$data['pixCode']}" . PHP_EOL;
    echo "Status: {$data['status']}" . PHP_EOL;
    if (isset($data['qrCodeImage'])) {
        echo "QR Code Image disponível para exibição" . PHP_EOL;
    }

    return $data;
}

// Uso
$token = 'seu_token_aqui';
$charge = createPixCharge(
    $token,
    '12345',
    150.00,
    'Carlos Oliveira',
    '12345678901',
    24
);

Casos de Uso

1. E-commerce - Checkout com PIX

// Integração em checkout de e-commerce
class PixCheckout {
  constructor(token) {
    this.token = token;
  }

  async generatePayment(order) {
    const charge = await createPixCharge(
      this.token,
      order.id,
      order.total,
      order.customer.name,
      order.customer.document
    );

    // Exibir QR Code na página (usando imagem da API ou gerando localmente)
    this.displayQrCode(charge);

    // Iniciar polling para verificar pagamento
    this.startPaymentPolling(charge.transactionId);

    return charge;
  }

  displayQrCode(charge) {
    const qrCanvas = document.getElementById('qr-canvas');
    const qrImage = document.getElementById('qr-image');

    // Usar imagem Base64 da API (preferível - evita processamento no cliente)
    if (charge.qrCodeImage) {
      qrImage.src = charge.qrCodeImage;
      qrImage.style.display = 'block';
      qrCanvas.style.display = 'none';
    } else {
      // Fallback: gerar QR Code localmente usando biblioteca (ex: qrcode.js)
      QRCode.toCanvas(qrCanvas, charge.pixCode, {
        width: 300,
        margin: 2
      });
      qrCanvas.style.display = 'block';
      qrImage.style.display = 'none';
    }

    // Mostrar também o código Pix Copia e Cola
    document.getElementById('pix-code').textContent = charge.pixCode;
  }

  startPaymentPolling(transactionId) {
    // Verificar status a cada 3 segundos
    const interval = setInterval(async () => {
      const status = await this.checkPaymentStatus(transactionId);

      if (status === 'CONFIRMED') {
        clearInterval(interval);
        this.onPaymentConfirmed();
      }
    }, 3000);

    // Parar após 10 minutos
    setTimeout(() => clearInterval(interval), 10 * 60 * 1000);
  }

  onPaymentConfirmed() {
    // Redirecionar para página de sucesso
    window.location.href = '/payment/success';
  }
}

2. PDV (Ponto de Venda)

class PixPDV:
    """Sistema de PDV com cobrança PIX"""

    def __init__(self, token: str):
        self.token = token

    def process_sale(self, items: list, customer: dict) -> dict:
        """Processar venda e gerar cobrança PIX"""

        # Calcular total
        total = sum(item['price'] * item['quantity'] for item in items)

        # Gerar descrição
        description = self.generate_sale_description(items)

        # Criar cobrança PIX (expira em 15 minutos)
        charge = create_pix_charge(
            token=self.token,
            order_id=self.generate_sale_id(),
            amount=total,
            customer_name=customer['name'],
            customer_document=customer['document'],
            expiration_hours=0.25,  # 15 minutos
            additional_info={
                'items_count': str(len(items)),
                'cashier_id': self.get_cashier_id()
            }
        )

        # Imprimir comprovante com QR Code
        self.print_receipt(charge, items, total)

        return charge

    def generate_sale_description(self, items: list) -> str:
        """Gerar descrição resumida da venda"""
        if len(items) == 1:
            return f"{items[0]['name']}"
        else:
            return f"{len(items)} itens - {items[0]['name']} e mais"

    def print_receipt(self, charge: dict, items: list, total: float):
        """Imprimir comprovante com QR Code"""
        # Implementar impressão térmica ou gerar PDF
        print("\n" + "="*50)
        print("COMPROVANTE DE COBRANÇA PIX")
        print("="*50)
        for item in items:
            print(f"{item['name']}: R$ {item['price']:.2f}")
        print("-"*50)
        print(f"TOTAL: R$ {total:.2f}")
        print(f"\nID da Transação: {charge['transactionId']}")
        print(f"Código PIX:\n{charge['pixCode']}")
        print("="*50 + "\n")

3. SaaS - Cobrança de Assinatura

class SubscriptionBilling {
  constructor(private token: string) {}

  async chargeMonthlySubscription(
    subscriptionId: string,
    userId: string,
    planValue: number
  ) {
    // Buscar dados do usuário
    const user = await this.getUserData(userId);

    // Gerar cobrança com expiração de 3 dias
    const charge = await createPixCharge(
      this.token,
      `SUB-${subscriptionId}-${new Date().getMonth() + 1}`,
      planValue,
      user.name,
      user.document
    );

    // Enviar email com link de pagamento
    await this.sendPaymentEmail(user.email, charge);

    // Agendar lembrete 1 dia antes de expirar
    await this.scheduleReminder(user, charge, 24);

    return charge;
  }

  async sendPaymentEmail(email: string, charge: CashInResponse) {
    // Implementar envio de email
    const paymentLink = `https://app.exemplo.com/payment/${charge.transactionId}`;

    await sendEmail({
      to: email,
      subject: 'Fatura disponível - Pague com PIX',
      html: `
        <h2>Sua fatura está disponível</h2>
        <p>Valor: R$ ${charge.value}</p>
        <p>Vencimento: ${new Date(charge.expirationDate).toLocaleDateString('pt-BR')}</p>
        <p><a href="${paymentLink}">Clique aqui para pagar com PIX</a></p>
      `
    });
  }
}

Monitoramento de Pagamentos

Para ser notificado quando um pagamento for confirmado, você pode:

Configure webhooks para receber notificações automáticas quando o status mudar.

// Endpoint webhook em seu servidor
app.post('/webhooks/pix', (req, res) => {
  const { transactionId, status, externalId } = req.body;

  if (status === 'CONFIRMED') {
    // Processar pagamento confirmado
    processPaymentConfirmation(externalId);
  }

  res.sendStatus(200);
});

Consulte periodicamente o status da transação.

async function monitorPayment(transactionId, maxAttempts = 200) {
  for (let i = 0; i < maxAttempts; i++) {
    const status = await checkTransactionStatus(transactionId);

    if (status === 'CONFIRMED') {
      return true;
    }

    // Aguardar 3 segundos antes de tentar novamente
    await new Promise(resolve => setTimeout(resolve, 3000));
  }

  return false; // Timeout
}

Códigos de Resposta

CódigoDescriçãoSignificado
201Cobrança CriadaCobrança PIX gerada com sucesso
400Dados InválidosVerifique os campos obrigatórios e formatos
401Token InválidoToken não fornecido, expirado ou inválido

Consulte a Referência da API para detalhes completos dos campos de resposta.

Boas Práticas

Observações Importantes

Cobranças expiradas não podem ser reativadas. Gere uma nova cobrança se necessário.

  • Valor mínimo: R$ 0,01
  • Expiração mínima: 5 minutos (300 segundos)
  • Expiração máxima: 7 dias (604800 segundos)

Próximos Passos

Nesta página