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.
https://api.leiganpayments.com/v1Uma 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/jsonEscopos 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.
Do pedido ao pagamento.
- Crie a chave com o escopo
transactions:writee configure um endpoint de webhook no painel. - Envie os dados do pedido com uma chave de idempotência única.
- Guarde
data.ide apresente o conteúdo dedata.pix.copy_pastecomo PIX copia e cola ou QR Code. - 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.
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-1043HTTP 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.
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=0O 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…
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_HEXADECIMALA 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.
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.
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.
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.
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"
}
}| HTTP | Como tratar |
|---|---|
| 400 / 415 / 422 | Corrija JSON, Content-Type, campos ou filtros. |
| 401 | Confira a credencial e sua revogação. |
| 403 | Confira escopo, IP, situação do usuário, API e nominal da operação. |
| 404 | O ID não existe ou não pertence à credencial. |
| 409 | Confira idempotência e saldo suficiente para principal e tarifa. |
| 413 | Reduza o corpo da requisição. |
| 429 | Respeite Retry-After. |
| 500 / 503 | Guarde 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→paidouexpiredprocessing→completedoucancelledUma 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.