Visão geral
API REST para autenticação, depósito PIX, saque, transferência interna, cripto, MEDs e webhooks — contrato alinhado ao fluxo da adquirente.
Base URL
https://fyrenpay.com/api
Definida por APP_URL no .env de produção (ex.: https://fyrenpay.com/api). Respostas em application/json.
documents_checked=1 e cash_out_active=1 (libera cash-out). Depósito (cash-in) pode funcionar antes. Saque via API ainda exige IP na whitelist quando configurado. Conta com KYC ok mas cash_out_active=0 continua bloqueada para sacar.client_secret só é exibido uma vez. URL de webhook opcional na chave vira padrão quando a cobrança não enviar projectWebhook.Unidades
| Contexto | Unidade |
|---|---|
Request amount (criar, sacar, interno, crypto) | Reais (ex: 25.90) |
Resposta transactionAmount, value, fee | Centavos (ex: 2590) |
Saldo (balance / availableBalance) | Reais |
Webhook value / fee | Centavos |
Status de transação
PENDENTE · COMPLETO · FALHA · CANCELADO
Autenticação
HTTP Basic Auth com as chaves do lojista:
Authorization: Basic BASE64(client_id:client_secret) Content-Type: application/json
curl -u 'SEU_CLIENT_ID:SEU_CLIENT_SECRET' \ -H 'Content-Type: application/json' \ 'https://fyrenpay.com/api/users/balance'
ci / cs, mas o recomendado é Basic Auth.Whitelist de IP (só saque)
- Aplica-se apenas a saque PIX e saque crypto — não a depósito, saldo, listagem nem check.
- Cadastre IPs em Credenciais → IPs.
- Se houver IPs cadastrados, só esses IPs podem sacar.
- Se a lista estiver vazia e
API_REQUIRE_IP_WHITELIST=true, o saque é bloqueado (403). Cadastre ao menos um IP.
403 IP não autorizado para saque.Erros HTTP
| HTTP | Quando |
|---|---|
| 400 | Parâmetros inválidos / limite / falha de processamento |
| 401 | Credenciais ausentes ou inválidas |
| 403 | IP bloqueado, KYC pendente, cash-in/out desativado |
| 404 | Recurso não encontrado |
| 409 | Saque duplicado / conflito de idempotência |
| 429 | Rate limit |
| 502/503 | Adquirente indisponível |
Gerar transação
Cria cobrança PIX (cash-in). Retorna QR e copia-e-cola.
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amount | number | sim | Valor em reais. Ex: 25.90 |
| payerName | string | sim | Nome do pagador |
| payerDocument | string | sim | CPF/CNPJ só dígitos |
| transactionId | string | não | Seu ID interno (vira clientTransactionId) |
| description | string | não | Descrição da cobrança |
| projectWebhook | string | não | URL HTTPS para webhook de depósito |
| returnUrl | string | não | Para onde o checkout leva o cliente depois de pagar |
curl -X POST 'https://fyrenpay.com/api/transactions/create' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"amount": 25.90,
"payerName": "Cliente Exemplo",
"payerDocument": "12345678909",
"transactionId": "pedido_1001",
"description": "Pedido #1001",
"projectWebhook": "https://seusite.com/webhooks/fyrenpay",
"returnUrl": "https://seusite.com/obrigado"
}'
Resposta 200
{
"message": "Transação criada com sucesso",
"data": {
"transactionId": "31484480",
"clientTransactionId": "pedido_1001",
"transactionFee": 152,
"transactionType": "DEPOSITO",
"transactionMethod": "PIX",
"transactionAmount": 2590,
"transactionState": "PENDENTE",
"qrCodeBase64": "...",
"copyPaste": "00020126...BR.GOV.BCB.PIX...",
"checkoutUrl": "https://fyrenpay.com/pay/Xb3k9QaP2mLr7TzW1vYc8NdE",
"expiresAt": "2026-11-08T21:30:00-03:00"
}
}
transactionAmount e transactionFee em centavos. Exiba o copyPaste como Pix Copia e Cola — ou simplesmente redirecione o cliente para o checkoutUrl.Checkout hospedado
Toda cobrança criada pela API vem com um checkoutUrl: uma página de pagamento pronta, responsiva e com a marca FyrenPay. Você não precisa montar tela de QR Code.
- Celular: botão grande de Copiar código Pix (o cliente cola no app do banco); QR Code sob demanda.
- Computador: QR Code em destaque para ler com o celular.
- Atualiza sozinha: quando o Pix é confirmado, mostra a tela de pagamento aprovado e, se você enviou
returnUrl, leva o cliente de volta ao seu site. - Validade: o código vale 30 minutos (veja
expiresAt); depois a página mostra que expirou.
checkoutUrl. A confirmação continua chegando no seu webhook — não confie no returnUrl para liberar o pedido.Veja um exemplo: /pay/demo (demonstração, sem cobrança real).
Links de pagamento (sem código)
No painel, em Links de pagamento, você cria um link com produto e valor (fixo ou livre) e envia por WhatsApp, Instagram ou e-mail. O cliente informa nome e CPF e cai no mesmo checkout. As vendas aparecem no extrato e disparam os mesmos webhooks. Exemplo: /l/demo.
Gerar transação interna
Transfere saldo entre contas FyrenPay (sem PIX externo).
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| string | sim | E-mail da conta destino | |
| amount | number | sim | Valor em reais |
| description | string | não | Descrição |
curl -X POST 'https://fyrenpay.com/api/transactions/withdraw/internal' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-d '{"email":"destino@email.com","amount":10,"description":"repasse"}'
TRANSFERENCIA_INTERNA na origem e TRANSFERENCIA_INTERNA_RECEBIDA no destino, na mesma operação atômica.Consultar saldo
curl -u 'CLIENT_ID:CLIENT_SECRET' 'https://fyrenpay.com/api/users/balance'
{
"message": "Saldo do usuário obtido com sucesso",
"data": { "balance": 150.75 }
}
Consultar dados do usuário
curl -u 'CLIENT_ID:CLIENT_SECRET' 'https://fyrenpay.com/api/users/info'
{
"message": "Dados do usuário encontrados com sucesso",
"data": {
"name": "Loja Exemplo",
"email": "loja@email.com",
"document": "12345678000199",
"phone": "11999999999",
"accountVerified": true,
"documentVerified": true,
"withdrawBlocked": false,
"availableBalance": 150.75,
"blockedBalance": 0
}
}
documentVerified deve ser true (KYC aprovado) para sacar via API. Sem KYC → HTTP 403.Solicitar saque
Cash-out PIX. Debita saldo + taxa na criação; estorna se falhar.
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amount | number | sim | Valor em reais a enviar |
| pixKey | string | sim | Chave PIX |
| pixKeyType | string | sim | CPF CNPJ EMAIL TELEFONE CHAVE_ALEATORIA |
| description | string | não | Descrição |
| projectWebhook | string | não | URL HTTPS para webhook de saque |
| idempotencyKey | string | não | Evita duplicata (também: header Idempotency-Key) |
403 KYC pendente. Com KYC mas cash_out_active=0 → 403 de saque bloqueado. IP fora da whitelist → 403 IP não autorizado para saque. Aprovar KYC no admin libera saque (cash_out_active=1).curl -X POST 'https://fyrenpay.com/api/transactions/withdraw' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: saque-pedido-1001' \
-d '{
"amount": 50,
"pixKey": "12345678909",
"pixKeyType": "CPF",
"description": "Saque pedido 1001",
"projectWebhook": "https://seusite.com/webhooks/fyrenpay"
}'
Resposta 200
{
"message": "Saque adicionado à fila de processamento",
"data": {
"jobId": "withdraw-...",
"transactionId": "...",
"status": "QUEUED",
"message": "Seu saque será processado em breve"
}
}
Solicitar saque crypto
Saque USDT BEP20. Mín. R$ 20 / máx. R$ 3.000. Debita saldo + taxa (cash-out do gateway, mínimo 3%).
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amount | number | sim | Valor em reais (20–3000) |
| wallet | string | sim | 0x + 40 hex (BEP20) |
| projectWebhook | string | não | Webhook opcional |
curl -X POST 'https://fyrenpay.com/api/crypto/withdraw-api' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"amount": 100,
"wallet": "0x1234567890123456789012345678901234567890"
}'
Consultar taxas de cripto
curl -u 'CLIENT_ID:CLIENT_SECRET' 'https://fyrenpay.com/api/crypto/fees'
Proxy das taxas atuais da adquirente (rede + percentual).
Verificar transação
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| transactionId | string | sim | ID da adquirente ou ID interno |
curl -X POST 'https://fyrenpay.com/api/transactions/check' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-d '{"transactionId":"31484480"}'
Resposta 200
{
"message": "Transação encontrada com sucesso!",
"transaction": {
"transactionId": "31484480",
"clientTransactionId": "e...",
"value": 2590,
"fee": 152,
"transactionState": "COMPLETO",
"transactionType": "DEPOSITO",
"transactionMethod": "PIX",
"createdAt": "2026-09-11 22:00:00",
"updatedAt": "2026-09-11 22:00:00"
}
}
value e fee em centavos (mesmo padrão do create e dos webhooks).Listar transações
Página começa em 1. Query opcional: ?status=COMPLETO (também PENDENTE, FALHA, CANCELADO).
Tipos: DEPOSITO, RETIRADA, TRANSFERENCIA_INTERNA, TRANSFERENCIA_INTERNA_RECEBIDA.
curl -u 'CLIENT_ID:CLIENT_SECRET' \ 'https://fyrenpay.com/api/users/transactions/list/1?status=COMPLETO'
value e fee em centavos.Listar infrações
Lista MEDs / infrações vinculadas à operação (proxy adquirente).
Query: ?page=1&perPage=20
curl -u 'CLIENT_ID:CLIENT_SECRET' \ 'https://fyrenpay.com/api/meds/infractions/list?page=1&perPage=20'
Responder infração
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| analise | string | sim | Ex: ACEITO / contestação conforme adquirente |
| justificativa | string | sim | Texto da defesa |
| proofs | array | não | URLs de provas |
curl -X POST 'https://fyrenpay.com/api/meds/infractions/42/defense' \
-u 'CLIENT_ID:CLIENT_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"analise": "ACEITO",
"justificativa": "Cliente reconheceu a compra",
"proofs": ["https://seusite.com/comprovante.pdf"]
}'
Webhook de Depósito
Informe projectWebhook em POST /transactions/create. Após liquidar o PIX, a FyrenPay envia POST JSON e só considera entregue se sua URL responder HTTP 2xx.
Confirmação e retries
- Responda
200–299rápido (ideal < 5s) com body vazio ou JSON. - Qualquer outro status / timeout → reenvio automático (até 8 tentativas: 1 min, 5 min, 30 min, 2 h…).
- Cron no servidor:
php scripts/process_merchant_webhooks.phpa cada minuto.
Assinatura HMAC
Headers enviados:
X-FyrenPay-Event: DEPOSIT X-FyrenPay-Delivery: 123 X-FyrenPay-Timestamp: 1726100000 X-FyrenPay-Signature: sha256=HEX
Calcule HMAC_SHA256(timestamp + "." + rawBody, webhook_secret) e compare com o hex do header (após sha256=). O webhook_secret está em API → Credenciais (whsec_...).
// Node.js
const crypto = require('crypto');
const ts = req.headers['x-fyrenpay-timestamp'];
const sig = String(req.headers['x-fyrenpay-signature'] || '').replace(/^sha256=/, '');
const expected = crypto.createHmac('sha256', webhookSecret)
.update(ts + '.' + rawBody).digest('hex');
if (sig !== expected) return res.status(401).end();
return res.status(200).json({ ok: true });
{
"event": "DEPOSIT",
"webhookVersion": 1,
"transactionId": "31484480",
"clientTransactionId": "e...",
"transactionType": "DEPOSITO",
"transactionMethod": "PIX",
"status": "COMPLETO",
"transactionState": "COMPLETO",
"value": 2590,
"fee": 152,
"e2e": "E..."
}
value / fee em centavos. Status: COMPLETO ou FALHA.
transactionId no seu banco antes de liberar o produto. Trate reenvios como idempotentes (mesmo transactionId).Webhook de Saque
Informe projectWebhook em POST /transactions/withdraw (ou crypto). Mesma confirmação 2xx, HMAC e retries. Payload com event": "WITHDRAW" e transactionType": "RETIRADA".
{
"event": "WITHDRAW",
"webhookVersion": 1,
"transactionId": "...",
"clientTransactionId": "e...",
"transactionType": "RETIRADA",
"transactionMethod": "PIX",
"status": "COMPLETO",
"transactionState": "COMPLETO",
"value": 5000,
"fee": 150,
"e2e": "E..."
}
Em FALHA, o valor + taxa debitados na criação são estornados automaticamente no saldo.
Webhook de MED
Quando uma infração MED chega, se a TX tiver projectWebhook, enviamos com o mesmo sistema de confirmação/assinatura (event": "INFRACTION"):
{
"event": "INFRACTION",
"webhookVersion": 1,
"infractionId": 42,
"transactionId": "31484480",
"clientTransactionId": "e...",
"status": "OPEN",
"transactionState": "OPEN",
"value": 2590
}
Use a API de MEDs para listar e responder a defesa. O gateway também retém saldo e bloqueia saque conforme a política interna.
Documentação alinhada à API real da FyrenPay · 2026