Pular para o conteúdo
LeztyPay docs
Painel

Quickstart

Em cinco minutos você cria uma cobrança PIX no ambiente de teste, vê o QR Code e recebe o evento transaction.paid. Nada de dinheiro se move e nenhum SDK é instalado.

1. Pegue uma chave de teste

A chave nasce no painel. Escolha o ambiente de teste: a chave sai com o prefixo sk_test_ e funciona antes mesmo de o seu KYC ser aprovado.

O segredo aparece uma única vez, na criação. Guarde em variável de ambiente, nunca no repositório e nunca no front:

export LM_API_URL=https://api.leztypay.com
export LM_API_KEY=sk_test_sua_chave_aqui

2. Crie a primeira cobrança

amount é sempre inteiro em centavos: 10000 são cem reais. O header Idempotency-Key é obrigatório e é você quem escolhe o valor, normalmente o id do pedido na sua loja.

#!/usr/bin/env bash
# Cria uma cobrança PIX. Precisa de LM_API_URL e LM_API_KEY no ambiente.
#   export LM_API_URL=https://api.leztypay.com
#   export LM_API_KEY=sk_test_...
set -euo pipefail

curl --fail-with-body -sS "$LM_API_URL/v1/transactions" \
  -H "Authorization: Bearer $LM_API_KEY" \
  -H "Idempotency-Key: pedido-A123-tentativa-1" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 10000,
    "payment_method": "pix",
    "customer": {
      "name": "Maria Silva",
      "email": "maria@exemplo.com",
      "document": "123.456.789-09"
    },
    "items": [{ "name": "Curso X", "quantity": 1, "unit_amount": 10000 }],
    "pix": { "expires_in_seconds": 1800 },
    "postback_url": "https://loja.exemplo.com/webhooks/leztypay",
    "metadata": { "order_id": "A123" }
  }'

A resposta 201 traz pix.payload (o copia e cola) e pix.qr_base64 (a imagem PNG já em base64). Mostre um dos dois ao cliente. Em Node, sem dependência nenhuma:

// Cria uma cobrança PIX com o fetch global do Node 22. Sem dependência.
//   LM_API_URL=https://api.leztypay.com LM_API_KEY=sk_test_... node create-transaction.mjs
const apiUrl = process.env.LM_API_URL;
const apiKey = process.env.LM_API_KEY;

// A chave de idempotência é do SEU pedido, não da requisição. Repetir a mesma chave com o
// mesmo corpo devolve a cobrança já criada em vez de criar uma segunda.
const idempotencyKey = 'pedido-A123-tentativa-1';

const res = await fetch(`${apiUrl}/v1/transactions`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Idempotency-Key': idempotencyKey,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    amount: 10000,
    payment_method: 'pix',
    customer: {
      name: 'Maria Silva',
      email: 'maria@exemplo.com',
      document: '123.456.789-09',
    },
    items: [{ name: 'Curso X', quantity: 1, unit_amount: 10000 }],
    pix: { expires_in_seconds: 1800 },
    postback_url: 'https://loja.exemplo.com/webhooks/leztypay',
    metadata: { order_id: 'A123' },
  }),
});

const body = await res.json();

if (!res.ok) {
  // Todo erro tem o mesmo envelope. `request_id` é o que o suporte pede.
  console.error(res.status, body.error.code, body.error.message, body.error.request_id);
  process.exit(1);
}

if (res.headers.get('Idempotent-Replayed') === 'true') {
  console.log('resposta salva de uma tentativa anterior com a mesma chave');
}

console.log('id:', body.id);
console.log('status:', body.status);
console.log('expira em:', body.pix.expires_at);
console.log('copia e cola:', body.pix.payload);

3. Faça a cobrança ser paga

No ambiente de teste ninguém abre o app do banco. Quem decide o desfecho é você, pelos dois últimos dígitos de amount. Um valor terminado em qualquer coisa fora da lista de gatilhos, como os 10000 acima, é pago sozinho poucos segundos depois da criação.

Terminando em 01 a cobrança nunca paga e expira. Terminando em 03 a criação já volta recusada. A lista inteira está em Gatilhos do ambiente de teste.

4. Receba o webhook

Quando a cobrança é paga, a LeztyPay entrega o evento transaction.paid assinado no seu endpoint. Duas formas de apontar o destino:

  • postback_url na cobrança, como no exemplo acima. Vale só para aquela cobrança e é o caminho mais rápido para testar.
  • Endpoint da conta, cadastrado no painel. Recebe todos os eventos, tem segredo próprio e é o que você usa em produção.

O endpoint precisa responder 2xx rápido e verificar a assinatura antes de confiar no corpo. Como fazer isso está em Webhooks.

5. Confirme pelo GET

Webhook é aviso, não é fonte de verdade. A qualquer momento consulte a cobrança pelo id e confira status e paid_at:

#!/usr/bin/env bash
# Consulta uma cobrança pelo id. O GET é sempre a fonte de verdade do status.
#   LM_TRANSACTION_ID=txn_01j... ./get-transaction.sh
set -euo pipefail

curl --fail-with-body -sS "$LM_API_URL/v1/transactions/$LM_TRANSACTION_ID" \
  -H "Authorization: Bearer $LM_API_KEY"

Próximo passo

Entenda a chave que você acabou de usar em Autenticação, e depois Criar uma cobrança para os campos que ficaram de fora deste roteiro.

Referência da operação: Cria uma cobrança PIX.