Documentação de API

Versão 1.0

Suas Credenciais de API

Ativo
Utilize esta chave para identificar sua conta em requisições públicas.
pk_e4dd31519e549f75135a2c6b7db15991524a98d7b7f8e225
Mantenha esta chave em segredo. Ela é usada para autenticar suas requisições.
sk_f9501881543029b38527432a43959544ebc10e8efde7073836bffb0ba2e5d54d

Introdução

Bem-vindo à documentação da API EXPFY Pay. Nossa API permite que você integre pagamentos PIX de forma simples e segura em sua aplicação. Todas as transações são processadas em tempo real e com alta disponibilidade.

URL Base da API

https://expfypay.com/api/v1

Autenticação

Todas as requisições à API devem incluir suas chaves de autenticação nos headers. Suas chaves são únicas e identificam sua conta no sistema.

Headers Obrigatórios

{
    "X-Public-Key": "sua_public_key",
    "X-Secret-Key": "sua_secret_key",
    "Content-Type": "application/json"
}

Importante

Nunca compartilhe sua Secret Key. Ela deve ser mantida em segurança e usada apenas em requisições do seu servidor para nossa API.

Rate Limiting

Para garantir a estabilidade e disponibilidade do serviço para todos os usuários, aplicamos os seguintes limites de requisições:

Requisições por hora

25.000

Tamanho máximo do payload

1MB

Caso exceda esses limites, você receberá um erro 429 Too Many Requests. Recomendamos implementar uma lógica de retry com exponential backoff para lidar com esses casos.

Endpoints Disponíveis

POST

/api/v1/payments

Gera um QR Code PIX para recebimento de pagamento.

{
    "amount": 100.00,
    "description": "Pagamento do Pedido #123",
    "customer": {
        "name": "João Silva",
        "document": "123.456.789-00",
        "email": "joao@email.com"  // opcional
    },
    "external_id": "seu_id_interno",  // opcional
    "callback_url": "https://seusite.com.br/webhook",
    "split_email": "seu@email.com", // opcional
    "split_percentage": "10" // opcional
}
{
    "success": true,
    "data": {
        "transaction_id": "285af09f32aa5f20b46f1ec288b25a8b",
        "external_id": "seu_id_interno",
        "qr_code": "00020126580014br.gov.bcb.pix...",
        "qr_code_image": "data:image/svg+xml;base64,...",
        "amount": 100.00,
        "status": "pending"
    }
}

Parâmetros

amount
Decimal
Valor do pagamento
description
String
Descrição do pagamento
customer
Object
Dados do cliente
external_id
String
Seu ID interno (opcional)
callback_url
String
URL para receber webhooks
split_email
String
E-mail que receberá o split
split_percentage
String
Porcentagem de Split (ex.: 10)
POST

Campos UTM para Tracking (opcional)

Agora é possível enviar parâmetros de rastreamento (UTM) junto à criação do pagamento. Isso permite análise de origem de vendas em plataformas integradas como a UTMIFY.

{
    "amount": 100.00,
    "description": "Compra de Curso Avançado",
    "customer": {
        "name": "João da Silva",
        "document": "123.456.789-00",
        "email": "joao@email.com"
    },
    "external_id": "pedido_456",
    "callback_url": "https://seusite.com.br/webhook",
    "split_email": "seu@email.com", // opcional
    "split_percentage": "10", // opcional
    "utm": {
        "utm_source": "google",
        "utm_medium": "cpc",
        "utm_campaign": "black_friday",
        "utm_term": "curso+programacao",
        "utm_content": "banner_topo",
        "src": "src_valor",
        "sck": "sck_valor"
    }
}

Descrição dos Campos UTM

utm_source
String
Origem da campanha (ex.: google, facebook)
utm_medium
String
Meio da campanha (ex.: cpc, orgânico)
utm_campaign
String
Nome da campanha (ex.: black_friday)
utm_term
String
Termo pesquisado (ex.: curso+online)
utm_content
String
Conteúdo do anúncio (ex.: banner_topo)
src
String
Código especial de origem (se aplicável)
sck
String
Código especial de sessão (se aplicável)

➔ Se não forem enviados dados UTM, a integração continuará funcionando normalmente.
➔ Recomendamos sempre preencher os campos para maximizar a análise de performance.

POST

/api/v1/withdrawls

Solicita um saque via PIX para uma chave específica.

{
    "amount": 1000.00,
    "pix_key": "joao@email.com",
    "pix_key_type": "EMAIL",  // EMAIL, CPF, CNPJ, PHONE, EVP
    "description": "Saque mensal",
    "callback_url": "https://seusite.com.br/webhook"
}
{
    "success": true,
    "data": {
        "withdrawal_id": "1d50dcadf69d5378ff5fe93772b1cc5b",
        "status": "processing",
        "amount": 1000.00,
        "expected_completion": "2024-01-16T16:30:00Z"
    }
}

Parâmetros

amount
Decimal
Valor do saque
pix_key
String
Chave PIX do destinatário
pix_key_type
String
Tipo da chave PIX
description
String
Descrição do saque
callback_url
String
URL para receber webhooks
POST

/api/v1/getBalance

Retorna o saldo disponível para saque da sua conta vinculada à chave da API.

{
    "public_key": "sua_public_key",
    "secret_key": "sua_secret_key"
}
{
    "balance": 1049.87
}

Webhooks

Receba notificações em tempo real sobre o status das suas transações através de webhooks. Nosso sistema envia automaticamente atualizações para a URL de callback configurada sempre que ocorre uma mudança de status.

Eventos Disponíveis

payment.received

Pagamento recebido e em processamento

payment.confirmed

Pagamento confirmado e concluído

withdrawl.processing

Saque em processamento

withdrawl.completed

Saque concluído com sucesso

Exemplo de Payload

{
    "event": "payment.confirmed",
    "transaction_id": "tx_123456",
    "external_id": "seu_id_interno",
    "status": "completed",
    "amount": 100.00,
    "paid_at": "2024-01-16T15:30:00Z",
    "pix_data": {
        "end2end_id": "E12345678202401161530abcdef12345",
        "receipt_url": "https://expfypay.com/receipts/tx_123456.pdf"
    }
}

Segurança de Webhooks

Dica de Segurança

Sempre verifique a autenticidade dos webhooks validando a assinatura no header X-Signature.

Para garantir a integridade e segurança dos dados recebidos, todos os webhooks enviados pela nossa API são assinados com HMAC-SHA256 utilizando sua secret_key.

Header HTTP enviado

X-Signature: <assinatura gerada com HMAC-SHA256 do corpo bruto>

Como validar a assinatura

  1. Leia o corpo da requisição exatamente como recebido (sem alterações de encoding).
  2. Recupere sua secret_key fornecida ao criar a integração.
  3. Calcule a assinatura esperada usando HMAC-SHA256 do corpo com sua secret_key.
  4. Compare com o valor recebido no header X-Signature usando hash_equals() (em PHP) ou método equivalente seguro.

Exemplo em PHP

$payload = file_get_contents('php://input');
$signatureRecebida = $_SERVER['HTTP_X_SIGNATURE'];
$secretKey = 'SUA_SECRET_KEY_AQUI';

$assinaturaEsperada = hash_hmac('sha256', $payload, $secretKey);

if (!hash_equals($assinaturaEsperada, $signatureRecebida)) {
    http_response_code(401);
    exit('Assinatura inválida');
}

// OK: continue processando o webhook
$data = json_decode($payload, true);
$event = $data['event'];

// Processe o evento conforme necessário
switch ($event) {
    case 'payment.confirmed':
        // Atualize o status do pedido para pago
        break;
    case 'withdrawl.completed':
        // Atualize o status do saque
        break;
}

Dicas de segurança adicionais

Evite ataques de tempo

Sempre use hash_equals() ou equivalente para comparações seguras.

Proteja sua Secret Key

Nunca compartilhe ou exponha sua chave secreta em código cliente.

Não confie apenas no IP

A assinatura é a única prova de origem válida para webhooks.

Evite processamento duplicado

Armazene IDs de transação já processados para evitar duplicidade.

Códigos de Erro

Nossa API utiliza códigos de status HTTP padrão para indicar o sucesso ou falha de uma requisição. Abaixo estão os principais códigos de erro que você pode encontrar:

Código Status Descrição Solução
400 Bad Request Requisição inválida ou mal formatada Verifique os parâmetros enviados
401 Unauthorized Credenciais inválidas Verifique suas chaves de API
422 Unprocessable Entity Dados inválidos Verifique o formato dos dados enviados
429 Too Many Requests Limite de requisições excedido Aguarde e tente novamente com backoff
500 Internal Server Error Erro interno do servidor Contate o suporte técnico
400 - Bad Request
Requisição inválida ou mal formatada
Solução: Verifique os parâmetros enviados
401 - Unauthorized
Credenciais inválidas
Solução: Verifique suas chaves de API
422 - Unprocessable Entity
Dados inválidos
Solução: Verifique o formato dos dados enviados
429 - Too Many Requests
Limite de requisições excedido
Solução: Aguarde e tente novamente com backoff
500 - Internal Server Error
Erro interno do servidor
Solução: Contate o suporte técnico