infi Começar grátis
Guia do Desenvolvedor: Integre Pagamentos BeInfi via API
API Developer Webhooks Integration Payments

Guia do Desenvolvedor: Integre Pagamentos BeInfi via API

Guia completo para integrar a API de pagamentos da BeInfi — chaves de API, webhooks, tipos de eventos e exemplos em TypeScript.

B
BeInfi Team · · 8 min de leitura

Se você está construindo um app, SaaS ou marketplace que precisa processar pagamentos, a API da BeInfi tem tudo que você precisa. Este guia cobre gerenciamento de chaves, criação de pagamentos, configuração de webhooks e boas práticas — tudo com exemplos em TypeScript prontos para usar.

Começando

Pré-requisitos

  • Uma conta BeInfi (cadastre-se aqui)
  • Node.js 18+ ou qualquer ambiente que suporte fetch
  • Conhecimento básico de APIs REST e TypeScript

URL Base da API

https://api.beinfi.com/v1

Todas as requisições precisam de autenticação e usar Content-Type: application/json.

Gerenciamento de Chaves de API

Gerando Chaves

  1. Faça login no painel da BeInfi
  2. Navegue até Configurações > Chaves de API
  3. Clique em Gerar Nova Chave
  4. Escolha as permissões (somente leitura, escrita ou acesso total)
  5. Copie a chave imediatamente — ela não será exibida novamente

Tipos de Chave

TipoCaso de UsoPermissões
Chave SecretaOperações server-sideAcesso total à API
Chave PúblicaClient-side (limitada)Somente leitura, iniciar pagamentos

Boas Práticas de Segurança

  • Nunca exponha chaves secretas em código client-side ou repositórios públicos
  • Use variáveis de ambiente para armazenar chaves
  • Faça rotação regularmente — mensalmente em produção, sempre que um membro sair do time
  • Use chaves separadas para desenvolvimento e produção
// Armazene chaves em variáveis de ambiente
const API_KEY = process.env.BEINFI_SECRET_KEY;

if (!API_KEY) {
  throw new Error('BEINFI_SECRET_KEY não está configurada');
}

Autenticação

Toda requisição precisa de um Bearer token no header Authorization:

const headers = {
  'Authorization': `Bearer ${API_KEY}`,
  'Content-Type': 'application/json',
};

Chaves inválidas ou expiradas retornam 401 Unauthorized.

Criando Pagamentos

interface CriarPagamentoRequest {
  amount: number;
  currency: 'BRL';
  description: string;
  redirect_url?: string;
  metadata?: Record<string, string>;
  expires_at?: string; // ISO 8601
}

interface PagamentoResponse {
  id: string;
  status: 'pending' | 'completed' | 'failed' | 'expired';
  amount: number;
  currency: string;
  payment_url: string;
  pix_code?: string;
  created_at: string;
  expires_at: string | null;
}

async function criarPagamento(
  dados: CriarPagamentoRequest
): Promise<PagamentoResponse> {
  const response = await fetch('https://api.beinfi.com/v1/payments', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(dados),
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Falha ao criar pagamento: ${error.message}`);
  }

  return response.json();
}

// Uso
const pagamento = await criarPagamento({
  amount: 49.90,
  currency: 'BRL',
  description: 'Plano Pro - Assinatura Mensal',
  redirect_url: 'https://seuapp.com.br/sucesso',
  metadata: {
    user_id: 'usr_12345',
    plan: 'pro_mensal',
  },
});

console.log(`URL do Pagamento: ${pagamento.payment_url}`);
console.log(`Código PIX: ${pagamento.pix_code}`);

Consultar Status de Pagamento

async function buscarPagamento(
  pagamentoId: string
): Promise<PagamentoResponse> {
  const response = await fetch(
    `https://api.beinfi.com/v1/payments/${pagamentoId}`,
    {
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
      },
    }
  );

  if (!response.ok) {
    throw new Error(
      `Falha ao buscar pagamento: ${response.statusText}`
    );
  }

  return response.json();
}

// Consultar status (ou use webhooks — recomendado)
const status = await buscarPagamento('pay_abc123');
console.log(`Status do pagamento: ${status.status}`);

Listar Pagamentos

interface ListarPagamentosParams {
  status?: 'pending' | 'completed' | 'failed' | 'expired';
  limit?: number;
  offset?: number;
  created_after?: string;
  created_before?: string;
}

async function listarPagamentos(
  params: ListarPagamentosParams = {}
): Promise<{ data: PagamentoResponse[]; total: number }> {
  const searchParams = new URLSearchParams();
  Object.entries(params).forEach(([key, value]) => {
    if (value !== undefined) searchParams.set(key, String(value));
  });

  const response = await fetch(
    `https://api.beinfi.com/v1/payments?${searchParams}`,
    {
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
      },
    }
  );

  return response.json();
}

Configuração de Webhooks

Webhooks permitem que sua aplicação receba notificações em tempo real sobre eventos de pagamento. Essa é a abordagem recomendada em vez de polling.

Configurando Webhooks

  1. Vá em Configurações > Webhooks no seu painel
  2. Clique em Adicionar Endpoint
  3. Insira a URL do seu endpoint (precisa ser HTTPS)
  4. Selecione os eventos que deseja receber
  5. Copie o segredo de assinatura do webhook

Tipos de Eventos

EventoDescriçãoQuando Dispara
payment.createdNovo pagamento iniciadoCliente inicia checkout
payment.completedPagamento confirmadoFundos recebidos com sucesso
payment.failedTentativa de pagamento falhouPIX expirado, erro no processamento
payment.expiredLink de pagamento expirouPassou do timestamp expires_at
payment.refundedReembolso processadoReembolso manual ou via API
subscription.createdNova assinatura iniciadaPrimeiro pagamento confirmado
subscription.renewedAssinatura renovadaPagamento recorrente bem-sucedido
subscription.cancelledAssinatura canceladaCancelamento pelo cliente ou merchant

Estrutura do Payload

interface WebhookPayload {
  id: string;
  event: string;
  created_at: string;
  data: {
    payment_id: string;
    amount: number;
    currency: string;
    status: string;
    metadata: Record<string, string>;
  };
}

Processando Webhooks

import { createHmac } from 'crypto';

const WEBHOOK_SECRET = process.env.BEINFI_WEBHOOK_SECRET!;

function verificarAssinatura(
  payload: string,
  assinatura: string
): boolean {
  const esperado = createHmac('sha256', WEBHOOK_SECRET)
    .update(payload)
    .digest('hex');

  return assinatura === `sha256=${esperado}`;
}

// Exemplo com Express.js
app.post('/webhooks/beinfi', express.raw({ type: 'application/json' }), (req, res) => {
  const assinatura = req.headers['x-beinfi-signature'] as string;
  const payload = req.body.toString();

  if (!verificarAssinatura(payload, assinatura)) {
    return res.status(401).json({ error: 'Assinatura inválida' });
  }

  const evento: WebhookPayload = JSON.parse(payload);

  switch (evento.event) {
    case 'payment.completed':
      processarPagamentoCompleto(evento.data);
      break;
    case 'payment.failed':
      processarPagamentoFalho(evento.data);
      break;
    case 'subscription.renewed':
      processarRenovacao(evento.data);
      break;
    default:
      console.log(`Tipo de evento não tratado: ${evento.event}`);
  }

  // Sempre retorne 200 para confirmar recebimento
  res.status(200).json({ received: true });
});

async function processarPagamentoCompleto(
  data: WebhookPayload['data']
) {
  // Atualize seu banco de dados
  await db.pedidos.update({
    where: { paymentId: data.payment_id },
    data: { status: 'pago' },
  });

  // Libere acesso, envie email de confirmação, etc.
  await liberarAcesso(data.metadata.user_id, data.metadata.plan);
  await enviarEmailConfirmacao(data.metadata.user_id);
}

Boas Práticas de Webhooks

  • Sempre verifique assinaturas antes de processar eventos
  • Retorne 200 rapidamente — faça processamento pesado de forma assíncrona
  • Trate duplicatas — eventos de webhook podem ser enviados mais de uma vez
  • Registre tudo — armazene payloads brutos para debugging
  • Configure retry handling — a BeInfi reenvia entregas com falha usando backoff exponencial
// Idempotência: previna processamento duplicado
async function processarWebhook(evento: WebhookPayload) {
  const existente = await db.webhookEvents.findUnique({
    where: { eventId: evento.id },
  });

  if (existente) {
    console.log(`Evento ${evento.id} já processado, pulando`);
    return;
  }

  // Processe o evento
  await tratarEvento(evento);

  // Registre que processamos
  await db.webhookEvents.create({
    data: { eventId: evento.id, processedAt: new Date() },
  });
}

Tratamento de Erros

A API usa códigos de status HTTP padrão:

CódigoSignificadoAção
200SucessoProcesse a resposta
400Requisição InválidaVerifique o body da requisição
401Não AutorizadoVerifique sua chave de API
404Não EncontradoVerifique o ID do recurso
422Erro de ValidaçãoVerifique campos obrigatórios
429Rate LimitedAguarde e tente novamente
500Erro do ServidorRetry com backoff exponencial
class BeInfiAPIError extends Error {
  constructor(
    public statusCode: number,
    public errorCode: string,
    message: string
  ) {
    super(message);
    this.name = 'BeInfiAPIError';
  }
}

async function requisicaoAPI<T>(
  endpoint: string,
  options: RequestInit = {}
): Promise<T> {
  const response = await fetch(`https://api.beinfi.com/v1${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
      ...options.headers,
    },
  });

  if (!response.ok) {
    const error = await response.json();
    throw new BeInfiAPIError(
      response.status,
      error.code,
      error.message
    );
  }

  return response.json();
}

Rate Limits

A API aplica limites de taxa para garantir estabilidade:

PlanoLimite
Free60 requisições/minuto
Pro300 requisições/minuto
EnterpriseLimites customizados

Respostas com rate limit incluem headers com informações de reset:

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 12
X-RateLimit-Reset: 1709251200

Exemplo Completo de Integração

Uma rota de API completa em Next.js que cria pagamento e trata o webhook:

// app/api/checkout/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function POST(req: NextRequest) {
  const { planId, userId } = await req.json();

  const planos: Record<string, { nome: string; preco: number }> = {
    starter: { nome: 'Plano Starter', preco: 29.90 },
    pro: { nome: 'Plano Pro', preco: 79.90 },
    business: { nome: 'Plano Business', preco: 199.90 },
  };

  const plano = planos[planId];
  if (!plano) {
    return NextResponse.json(
      { error: 'Plano inválido' },
      { status: 400 }
    );
  }

  const pagamento = await requisicaoAPI<PagamentoResponse>(
    '/payments',
    {
      method: 'POST',
      body: JSON.stringify({
        amount: plano.preco,
        currency: 'BRL',
        description: `${plano.nome} - Mensal`,
        redirect_url: `${process.env.NEXT_PUBLIC_URL}/dashboard?payment=success`,
        metadata: {
          user_id: userId,
          plan_id: planId,
        },
      }),
    }
  );

  return NextResponse.json({
    paymentUrl: pagamento.payment_url,
    pixCode: pagamento.pix_code,
  });
}

Próximos Passos

Com pagamentos funcionando, explore:

  • Gerenciamento de assinaturas para cobranças recorrentes
  • Portal do cliente usando o endpoint de listagem de pagamentos
  • Monitoramento com logs de eventos de webhook
  • Fluxos de reembolso pela API de refunds

A API da BeInfi foi feita para desenvolvedores que querem infraestrutura de pagamentos que simplesmente funciona. Endpoints limpos, webhooks previsíveis e design TypeScript-first. Comece a construir em beinfi.com.

Pronto para transformar seus dados?

A infi ajuda você a tomar decisões mais inteligentes com dados em tempo real.

Começar grátis