Infraestrutura · subcontas e custódia

Infraestrutura PIX e stablecoin, com a sua marca

A aba "Depositar e Sacar" do seu produto, sem você virar instituição de pagamento. Cada cliente final é uma subconta no livro-razão, identificada pelo id que já existe no seu sistema.

Criar chave sandbox Falar com integração Documentação completa

Para quem é

O problema

Guardar dinheiro de terceiros é onde a maioria dos produtos trava. Não é só receber: é separar por cliente, segurar o que ainda não pode sair, provar cada movimento e conseguir explicar um saldo meses depois. Construir isso do zero significa livro-razão, conciliação e uma auditoria que ninguém queria fazer agora.

Aqui a separação é um campo. customer_ref viaja na cobrança, no saldo, no saque e no extrato; o livro-razão é append-only e cada linha tem origem. Você entrega a experiência com a sua marca e não escreve conciliação nenhuma.

O fluxo, ponta a ponta

  1. Depositar: POST /cashin/charge com destino: "saldo" e o customer_ref do cliente. O PIX vira saldo em reais na subconta dele.
  2. Ver: GET /saldo?customer_ref= traz disponível, bloqueado e próximas liberações. GET /saldo/extrato traz movimento a movimento.
  3. Sacar em reais: POST /payouts com o mesmo customer_ref — debita da subconta certa.
  4. Sacar em cripto: POST /saldo/sacar-cripto entrega qualquer moeda do catálogo, com o mínimo da rota checado antes do débito.
  5. Mover entre clientes: POST /saldo/transferir resolve no livro-razão, sem tocar em trilho externo.

Endpoints usados

EndpointPara quê
POST /cashin/charge (destino: saldo)Depósito em reais na subconta do cliente final.
GET /saldo?customer_ref=Saldo, taxas vigentes e próximas liberações.
GET /saldo/extratoMovimento a movimento, com origem de cada linha.
GET /saldo/clientes · /saldo/consolidadoTodas as subcontas e o total sob custódia.
POST /saldo/transferirTransferência entre subcontas, dentro do livro-razão.
POST /saldo/sacar-cripto · POST /payoutsAs duas saídas: cripto na carteira do cliente ou PIX na chave dele.

Exemplo que roda

# depósito na subconta de um cliente final
curl -X POST https://api.luniumpay.com/cashin/charge -H "X-API-Key: $LUNIUM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount_cents":50000,"destino":"saldo","customer_ref":"cliente_412",
       "payer_tax_number":"12345678909","external_id":"dep-412-88"}'

# saldo daquele cliente
curl "https://api.luniumpay.com/saldo?customer_ref=cliente_412" -H "X-API-Key: $LUNIUM_KEY"

# transferência entre subcontas, sem sair do livro-razão
curl -X POST https://api.luniumpay.com/saldo/transferir -H "X-API-Key: $LUNIUM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from_customer_ref":"cliente_412","to_customer_ref":"cliente_907",
       "amount_cents":15000,"external_id":"tr-9912"}'
const h = { "X-API-Key": process.env.LUNIUM_KEY, "Content-Type": "application/json" };
const api = (rota, corpo) => fetch(`${API}${rota}`, corpo
  ? { method: "POST", headers: h, body: JSON.stringify(corpo) }
  : { headers: h }).then((r) => r.json());

export const depositar = (cliente, cents, cpf, id) => api("/cashin/charge", {
  amount_cents: cents, destino: "saldo", customer_ref: cliente,
  payer_tax_number: cpf, external_id: id,
});

export const saldoDe = (cliente) => api(`/saldo?customer_ref=${encodeURIComponent(cliente)}`);

export const sacarPix = (cliente, cents, chave, tipo, doc, id) => api("/payouts", {
  amount_cents: cents, pix_key: chave, pix_key_type: tipo,
  tax_number: doc, customer_ref: cliente, external_id: id,
});

export const sacarCripto = (cliente, cents, ativo, rede, carteira, doc, id) => api("/saldo/sacar-cripto", {
  amount_cents: cents, asset: ativo, chain: rede, payout_address: carteira,
  tax_number: doc, customer_ref: cliente, external_id: id,
});
import os, requests

API, H = "https://api.luniumpay.com", {"X-API-Key": os.environ["LUNIUM_KEY"]}

def depositar(cliente, cents, cpf, ident):
    return requests.post(f"{API}/cashin/charge", headers=H, timeout=30, json={
        "amount_cents": cents, "destino": "saldo", "customer_ref": cliente,
        "payer_tax_number": cpf, "external_id": ident}).json()

def saldo_de(cliente):
    return requests.get(f"{API}/saldo", headers=H, params={"customer_ref": cliente}, timeout=20).json()

def transferir(de, para, cents, ident):
    return requests.post(f"{API}/saldo/transferir", headers=H, timeout=30, json={
        "from_customer_ref": de, "to_customer_ref": para,
        "amount_cents": cents, "external_id": ident}).json()

Sandbox: teste antes de gastar

Uma chamada, sem aprovação prévia, sem cartão; só o seu e-mail é obrigatório (é para ele que mandamos o manual, o fluxograma e o passo a passo da integração). A chave lun_test_ exercita a superfície inteira sem mover dinheiro nenhum.

curl -X POST https://api.luniumpay.com/keys/sandbox \
  -H "Content-Type: application/json" \
  -d '{"email":"voce@empresa.com","name":"meu-teste"}'

O que o sandbox não prova: liquidação real. Nenhuma cripto se move e nenhum PIX é pago — ele serve para acertar o contrato, não para medir o trilho.

Ativos e redes

O catálogo de entrada de cripto é GET /catalog; o de entrega após Pix é GET /cashin/catalog. Consulte o ativo e a rede do fluxo escolhido antes de cotar. Disponibilidade e mínimos podem mudar.

Use deposit_tag no depósito quando o aceite informar um memo. Na entrega, envie payout_tag quando exigido pela rota. O manual da API descreve cada campo.

Limites e retenções

Consulte GET /keys/me para os limites e as taxas da conta, GET /cashin/limits?payer_tax=... para o pagador e as prévias para o mínimo da rota. Não use um teto fixo compartilhado entre cash-in, cash-out e payout.

Uma cobrança paga pode aguardar retenção antes da liquidação. Use os estados, a linha do tempo e os eventos assinados para distinguir recebimento, saldo disponível e entrega final. A validade da operação vem em expires_at.

Medições, não promessas

O prazo depende do fluxo, da rota disponível, das confirmações da rede e de eventuais retenções. Acompanhe a operação até o estado final e consulte o status do serviço. O tempo de uma simulação não mede uma liquidação real.

Idempotência

Mande external_id em toda operação que move dinheiro. Repetir a mesma chamada devolve a mesma operação, nunca uma segunda; os mesmos parâmetros com id diferente criam duas, e o mesmo id com parâmetros diferentes responde 409 external_id_divergente em vez de adivinhar.

Timeout não é recusa. Se a chamada não respondeu, consulte pelo external_id antes de repetir — a operação pode existir.

Webhooks e reconciliação

Cada transição dispara um evento assinado em HMAC SHA-256 com timestamp (header X-Lunium-Signature, formato t=…,v1=…) — o timestamp é o que impede replay de uma entrega capturada. Confira a assinatura antes de confiar no corpo.

Webhook é o sinal principal; polling é opcional. Quando precisar pesquisar, o status traz a timeline carimbada pelo servidor — desenhe a etapa a partir dela, porque o cronômetro do seu polling mede a sua rede, não a operação.

Não respondeu 2xx? A entrega é retentada com backoff. Você reenvia à mão em POST /webhooks/deliveries/{event_id}/retry e testa a sua URL em POST /webhooks/test.

Quando dá errado

Retenção do primeiro PIX: o crédito fica disponível assim que o Pix é confirmado; só o 1º PIX de um documento acima de R$ 100,00 fica retido 24 h no provedor e aparece como delayed em GET /saldo, liberando sozinho com saldo.liberado — mostre a hora ao cliente, não um erro genérico.

Saldo insuficiente: 402 com disponível e bloqueado separados. Nada é debitado.

Saque abaixo do mínimo da moeda: recusado antes do débito, com o mínimo estimado em reais — o saldo do cliente nunca sai para uma entrega que morreria na corretora.

Segurança

A verificação aberta é a que mais importa numa negociação: a sua contraparte confere o PIX sozinha, sem chave e sem depender da nossa palavra.

Tempo até a primeira integração

A tela de depósito é uma chamada; a de saldo, outra. O que costuma levar mais tempo é desenhar a sua tela de saldo — as taxas e retenções vigentes são visíveis na API, então a sua interface pode explicá-las sem você hard-codar nada.

Perguntas que os integradores fazem

Isso me torna uma instituição de pagamento?

A custódia e a liquidação são nossas; você opera a experiência e a relação com o cliente final. O enquadramento regulatório do seu produto é uma decisão sua e do seu jurídico — não vendemos licença nem opinião jurídica.

Como separo o dinheiro de cada usuário?

Pelo customer_ref, o mesmo id que você já usa. O livro-razão é append-only e cada movimento tem origem rastreável; GET /saldo/consolidado fecha o total sob custódia.

Posso definir a carência?

Por padrão não há carência: o crédito fica disponível assim que o Pix é confirmado (GET /saldo mostra carencia_horas: 0). Carência só por acordo contratual; se existir, a sua interface lê de lá.

O cliente final pode sacar em cripto?

Pode: POST /saldo/sacar-cripto entrega qualquer moeda do catálogo pelo mesmo trilho da compra, com o mínimo da rota conferido antes de debitar.

Criar chave sandbox Falar com integração

Contrato OpenAPI vigente · fatos desta página em product-truth.json · status

O trilho com a sua marca. Comece com uma chave de teste.

A chave de teste sai em uma chamada, sem aprovação prévia e sem custo — e o seu caso vai direto para quem integra.

Receber sandbox e falar com integração Cash-in e payout com as taxas da sua chave · consulte a cotação · sem mensalidade

Outros caminhos

API PIX para USDTReceba em reais e entregue USDT na carteira do cliente.API USDT para PIXVenda stablecoin e pague qualquer chave PIX.API de payout PIXPague fornecedores e usuários em reais, por API.BRL ↔ USDT por APIConversão nos dois sentidos, com cotação e comprovante.On-ramp e off-ramp no BrasilEntrada e saída de cripto no país, numa integração só.PIX no checkout, stablecoin no caixaReceba do cliente em PIX e guarde em dólar digital.PIX e stablecoin para walletsDê aos seus usuários um trilho de entrada e saída.

Fala com quem construiu

A chave de teste sai em uma chamada, sem aprovação prévia — se é isso que você quer, comece pela documentação. Este formulário é para o resto: taxa por volume, um caso que a doc não cobre, ou uma dúvida antes de integrar.

Prefere e-mail direto? contato@luniumpay.com