Leigan Payments.Developers
LEIGAN PAYMENTS API · V1

Seu próximo fluxo.
Começa com uma chamada.

Cobranças PIX, saldo e saques. Contratos completos, exemplos e eventos assinados para conectar sua operação.

BASE URLhttps://api.leiganpayments.com/v1
7 operações públicas5 tipos de evento120 requisições/minuto
ACESSO

Uma chave por operação.

Crie uma credencial em API e webhooks no painel de uma conta aprovada e com API habilitada. Ela aparece uma vez e acessa somente a operação que a criou. As chaves têm prefixo lg_live_. Guarde o segredo no seu servidor.

Authorization: Bearer SUA_CHAVE
Content-Type: application/json

Escopos disponíveis

A rota indica o escopo necessário. Revogar uma chave interrompe seu uso imediatamente. A criação de cobranças e saques também depende de uma nominal liberada e selecionada como principal. Suspensão e banimento do usuário bloqueiam as credenciais de todas as suas operações.

A autenticação pública usa exclusivamente Bearer. As sessões dos painéis cliente e staff não substituem uma chave da API. Os endpoints de gestão de credenciais e configurações pertencem ao painel e não fazem parte de /v1.

PRIMEIRA INTEGRAÇÃO

Do pedido ao pagamento.

  1. Crie a chave com o escopo transactions:write e configure um endpoint de webhook no painel.
  2. Envie os dados do pedido com uma chave de idempotência única.
  3. Guarde data.id e apresente o conteúdo de data.pix.copy_paste como PIX copia e cola ou QR Code.
  4. Confirme a venda somente quando a consulta ou um evento assinado indicar paid.

Valores são inteiros em centavos: 10000 equivale a R$ 100,00. A origem é definida pelo servidor: api ou panel. O corpo da resposta e seus campos ficam detalhados em cada rota abaixo.

CONFIABILIDADE

Uma operação, uma chave.

POSTs de cobrança e saque exigem Idempotency-Key de 8 a 120 caracteres. O identificador é vinculado à conta e ao tipo de operação. Use uma nova chave para cada novo pagamento ou saque.

Idempotency-Key: pedido-unico-1043

HTTP 201 retorna idempotent_replay: false. Uma repetição retorna HTTP 200 e idempotent_replay: true, com a resposta original. O snapshot pode conter um estado antigo: consulte o ID para obter o estado atual.

Reenvie o mesmo JSON, preservando conteúdo e ordem das propriedades. Nesta implementação, mudar o corpo com a mesma chave retorna 409 idempotency_conflict. As chaves são persistidas e não têm expiração automática nesta versão. Uma validação recusada não grava a chave. Após timeout ou resultado desconhecido, consulte o recurso e repita com a mesma chave; criar outra pode duplicar a intenção de pagamento.

CONSULTAS

Encontre a operação certa.

As listas aceitam limit de 1 a 100 (padrão 100), offset a partir de zero, status, search, from e to. Cobranças também aceitam origin. A busca de cobranças inclui o End-to-End ID, referência, ID, nome e e-mail do pagador.

GET /v1/transactions?search=SEU_END_TO_END_ID&limit=25&offset=0
GET /v1/transactions?status=paid&origin=api&from=2026-10-01T00%3A00%3A00Z&to=2026-11-01T00%3A00%3A00Z
GET /v1/withdrawals?status=processing&limit=25&offset=0

O período usa a criação do registro: from inclui o instante; to é exclusivo. Aceita ISO 8601 com fuso ou data YYYY-MM-DD em UTC. Codifique os parâmetros na URL. Para a próxima página, some pagination.limit a pagination.offset enquanto has_more for verdadeiro. Os resultados vêm por criação e ID decrescentes. Novos registros podem deslocar páginas; elimine duplicidades pelo ID ao coletar um período em movimento.

Carregando referência…

EVENTOS

Receba e confira a assinatura.

Cadastre um endpoint HTTPS e selecione os eventos no painel. O segredo pertence ao endpoint e aparece uma única vez. Se o perder, crie outro endpoint e atualize seu servidor. São aceitos destinos públicos HTTPS na porta 443, sem credenciais na URL. Destinos privados e redirecionamentos não são seguidos.

Content-Type: application/json
X-leigan-Event-Id: evt_exemplo
X-leigan-Signature: t=1792325100,v1=HMAC_SHA256_EM_HEXADECIMAL

A assinatura é HMAC-SHA256(segredo, timestamp + "." + corpo_bruto), codificada em hexadecimal. O timestamp é Unix em segundos e muda a cada tentativa. Confira o corpo original em bytes, rejeite diferença maior que 300 segundos e compare em tempo constante. Mantenha o relógio do seu servidor sincronizado.

Validar assinatura · Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(secret, header, rawBody) {
  const match = /^t=(\d{10}),v1=([a-f0-9]{64})$/.exec(header || '');
  if (!match || Math.abs(Date.now() / 1000 - Number(match[1])) > 300) return false;
  const expected = createHmac('sha256', secret)
    .update(Buffer.concat([Buffer.from(match[1] + '.'), rawBody]))
    .digest();
  const received = Buffer.from(match[2], 'hex');
  return expected.length === received.length && timingSafeEqual(expected, received);
}
// Express: receba esta rota com express.raw({ type: 'application/json' })
// antes de qualquer express.json(). Passe req.body como Buffer.
Validar assinatura · Python
import hashlib
import hmac
import re
import time

def verify(secret, header, raw_body):
    match = re.fullmatch(r't=(\d{10}),v1=([a-f0-9]{64})', header or '')
    if not match or abs(time.time() - int(match[1])) > 300:
        return False
    expected = hmac.new(secret.encode(), match[1].encode() + b'.' + raw_body,
                        hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, match[2])
# Flask: use request.get_data() para obter os bytes originais.

Após validar, persista o id com uma restrição única e aceite repetições sem executar a ação de negócio novamente. Responda 2xx quando o recebimento estiver persistido; faça o processamento mais demorado em sua fila. Não há garantia de ordem. Consulte o recurso quando precisar reconciliar um estado recebido fora de sequência.

CORPOS COMPLETOS

O que chega no seu endpoint.

Todos os eventos contêm id, type, created_at e data. Abra cada evento para ver o JSON e todos os campos. A assinatura deve ser conferida antes de usar qualquer valor.

ENTREGA

Até sete tentativas por ciclo.

A primeira tentativa é imediata. Após falhas, os intervalos até a próxima são 30 segundos, 2 minutos, 10 minutos, 1 hora, 6 horas e 24 horas. Esses são intervalos entre tentativas, não horários absolutos. A entrega tem timeout de 8 segundos.

HTTP 2xx encerra o ciclo. Outros códigos, timeout e falhas de rede usam a próxima tentativa. Ao esgotar sete, a entrega fica como falha. O painel permite consultar o histórico; a staff pode abrir outro ciclo manual, preservando o ID do evento e o histórico anterior.

Pausar um endpoint suspende sua fila. Reativá-lo permite continuar entregas pendentes. Os eventos são enviados em HTTPS conforme as configurações do endpoint. O painel informa o estado da entrega.

CONTROLE

Limites, IPs e valores.

São 120 requisições por minuto por conta, compartilhadas por suas chaves. Existe também uma janela de 120/minuto por IP. Em 429, aguarde os segundos de Retry-After. O servidor retorna os headers da janela aplicada:

X-Request-ID: req_exemplo
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1792325160
Retry-After: 60  (somente em 429)

Limites são mantidos em memória por processo nesta versão. Chaves podem ter até 20 IPs exatos (IPv4 ou IPv6), sem CIDR. Uma lista vazia na chave não restringe sua origem. Saques exigem também a lista de IPs de saque da operação; se estiver vazia, não são permitidos. As duas regras se acumulam. O IP de origem é validado pelo proxy de confiança; headers enviados diretamente pelo cliente não substituem essa validação.

Informe montantes inteiros em centavos de BRL. As tarifas de recebimento combinam percentual e valor fixo, arredondados em centavos. net = amount − fee. No saque, o saldo deve cobrir amount + fee. Os limites efetivos são os da operação e da nominal selecionada; consulte os valores liberados no painel. O corpo JSON tem limite de 4.500.000 bytes.

TRATAMENTO

Respostas previsíveis.

Toda falha da API segue o mesmo envelope. Cada rota acima contém os corpos de sucesso e de erro; selecione o código HTTP na aba de respostas.

{
  "error": {
    "code": "validation_error",
    "message": "Descrição do problema.",
    "request_id": "req_exemplo"
  }
}
HTTPComo tratar
400 / 415 / 422Corrija JSON, Content-Type, campos ou filtros.
401Confira a credencial e sua revogação.
403Confira escopo, IP, situação do usuário, API e nominal da operação.
404O ID não existe ou não pertence à credencial.
409Confira idempotência e saldo suficiente para principal e tarifa.
413Reduza o corpo da requisição.
429Respeite Retry-After.
500 / 503Guarde request_id. Após falha incerta, consulte a operação e preserve a chave de idempotência.

Códigos específicos incluem idempotency_conflict, insufficient_balance, ip_not_allowed, cash_out_ip_not_allowed, user_access_restricted, account_not_approved, nominal_unavailable, rate_limited e payments_unavailable.

Estados dos recursos

pending→paidouexpired
processing→completedoucancelled

Uma cobrança criada não confirma venda. Um saque em processamento não confirma transferência concluída. No cancelamento, principal e tarifa retornam ao saldo uma única vez. IDs são opacos; custos internos, credenciais e políticas de processamento não são expostos na API pública.