Navegar e buscar
Manual de integração
PIX, custódia em reais e cripto, com o fluxo certo para cada operação.
Receba em reais. Escolha o destino do saque depois.
02 / SACARSaldo para criptoMoeda, rede e carteira escolhidas a cada retirada.
03 / OPERARAPI pelo TelegramCobrança, saldo e saques no grupo do projeto.
Nenhuma seção encontrada. Tente outra palavra.
1. Escolha o fluxo#
| Você quer | Entrada | Operação | Resultado |
|---|---|---|---|
| Cobrar PIX e decidir o saque depois | PIX do pagador | POST /cashin/charge com destino: "saldo" |
Saldo em BRL, na casa ou na subconta |
| Sacar o saldo em cripto | Saldo BRL disponível | POST /saldo/sacar-cripto |
Conversão e entrega na moeda/rede escolhidas |
| Sacar o saldo por PIX | Saldo BRL disponível | POST /payouts |
PIX para a chave informada |
| Cobrar PIX e entregar cripto diretamente | PIX do pagador | POST /cashin/charge com destino: "cripto" |
Entrega na carteira definida para a cobrança |
| Vender cripto de uma carteira externa | Depósito cripto | POST /cash-outs → aceite → depósito |
PIX para o recebedor |
| Pagar PIX com saldo em USDT | Depósito de USDT ou USDC na carteira | POST /carteira-usdt/deposits → POST /carteira-usdt/payments | PIX para a chave ou o Copia e Cola informado |
Custódia é um saldo em reais. O parceiro recebe o líquido do PIX e escolhe a moeda e a rede no saque. Não é necessário cadastrar uma carteira fixa. Um depósito em custódia não cria saldos simultâneos em BTC, ETH e USDT.
Atenção ao padrão de cada canal: na API, omitir destino continua significando cripto. Para receber em custódia, envie destino: "saldo". No Telegram, /cobrar valor cpf já usa custódia por padrão.
2. Chaves e configuração#
Entre no Lunium Partners, a comunidade oficial de integradores. A participação é fortemente recomendada desde o início da integração: é onde compartilhamos avisos operacionais, manutenções, mudanças de API e troca entre parceiros. Entenda como usar a comunidade junto do grupo dedicado e do monitor.
Base: https://api.luniumpay.com. Nas rotas autenticadas, envie X-API-Key e, nos corpos JSON, Content-Type: application/json. Use a chave no seu servidor; ela autoriza operações sobre a conta.
Sandbox
curl --fail-with-body https://api.luniumpay.com/keys/sandbox \
-H 'Content-Type: application/json' \
-d '{"email":"voce@empresa.com","name":"Minha integração de teste"}'
Troque voce@empresa.com pelo e-mail de quem vai testar: email é obrigatório. Cerca de um minuto depois, o suporte da LuniumPay envia para esse endereço, uma única vez, o que é a LuniumPay, a integração em 3 passos, o manual e o PDF, o fluxograma e o VendaCripto (app pronto para quem só quer comprar ou vender cripto com PIX, sem integrar). Uma mensagem por endereço, com link de descadastro. Sem email válido, a resposta é 400 com erro: "email_obrigatorio". Continua sendo uma chamada, sem aprovação e sem chave de API; name é opcional.
Guarde api_key como LUNIUM_API_KEY no ambiente do seu servidor. Chaves novas de teste têm prefixo lun_test_; as de produção, lun_live_. Chaves antigas lun_ continuam válidas.
O sandbox simula PIX de entrada, crédito em custódia BRL, entrega e saque de cripto, payout PIX, transferências internas e cash-out. O QR é não pagável: confirme em POST /sandbox/cashin/{cashin_id}/pay. Nenhum banco, corretora ou blockchain é acionado. Consulte o guia de sandbox e GET /sandbox para cenários, persistência e diferenças de produção. Custódia não exige carteira fixa.
Produção sem carteira fixa
curl --fail-with-body https://api.luniumpay.com/keys \
-H 'Content-Type: application/json' \
-d '{"name":"Meu projeto","email":"operacao@example.com"}'
Troque nome e e-mail pelos seus. A resposta traz api_key, key, limits, monitor_url e as instruções de Telegram. A chave completa só é apresentada na criação. monitor_url é o painel de acompanhamento; trate também esse link como informação privada do projeto.
Chaves de produção novas são criadas com custódia e payouts habilitados. A situação da sua chave é a que vale: consulte payout.enabled em GET /keys/me e custodia_ativa em GET /saldo.
curl --fail-with-body https://api.luniumpay.com/keys/me \
-H "X-API-Key: $LUNIUM_API_KEY"
curl --fail-with-body https://api.luniumpay.com/saldo \
-H "X-API-Key: $LUNIUM_API_KEY"
Configure um receptor HTTPS de webhooks por PATCH /keys/me com webhook_url; guarde o webhook_secret devolvido. settlement_address é uma opção para entrega direta em Polygon. Não é requisito para custódia e não define os destinos dos saques futuros.
Reutilize sua chave de teste: criação de chaves tem limites por IP. Em 429, respeite o prazo indicado. Não crie uma chave por operação.
Recuperar o monitor e cuidar dos acessos
O monitor privado acompanha o projeto em modo de leitura. A chave de API autoriza operações. O link do monitor, a chave de API e o segredo do webhook são credenciais diferentes; recuperar um deles não recupera os demais.
Se perdeu o link, solicite-o para o e-mail cadastrado na chave de produção:
curl --fail-with-body https://api.luniumpay.com/keys/painel-link \
-H 'Content-Type: application/json' \
-d '{"email":"operacao@example.com"}'
Essa rota não exige chave. A resposta 200 {"ok":true,...} é genérica para proteger o cadastro: não confirma a existência da conta nem a entrega do e-mail. Confira entrada e spam. Em 429, aguarde; não automatize pedidos sucessivos. Se o e-mail estiver incorreto ou inacessível, procure os contatos humanos do projeto para validar a recuperação.
Com a chave disponível, GET /keys/me devolve monitor_url. Para invalidar um link exposto, use PATCH /keys/me com {"rotate_monitor_token":true} e distribua o novo link apenas à equipe autorizada. O link anterior deixa de funcionar imediatamente. Isso não troca a chave da API nem o segredo do webhook.
A chave completa só é apresentada na criação. Este procedimento não reexibe nem recupera a chave. Se ela foi perdida ou exposta, acione o suporte para tratar substituição/revogação e continuidade da conta. Não crie outra chave presumindo que saldo, cobranças ou vínculos serão transferidos automaticamente. Para trocar o segredo do webhook, siga o roteiro próprio.
Monitor atual e evolução do painel
Nesta revisão, o caminho documentado de acompanhamento é o monitor privado, o feed e as rotas públicas do contrato. Recursos adicionais de painel e múltiplos destinos de webhook só devem ser integrados quando estiverem publicados e validados em produção. Configure o receptor documentado em PATCH /keys/me; não presuma uma API pública de vários destinos nem rotas de login/2FA a partir de anúncios de desenvolvimento.
Para Fable e outras IAs: confira a versão e o inventário revisados junto do OpenAPI. Se houver divergência, registre qual fonte e operação divergem e suspenda a implementação daquela capacidade até esclarecer; não invente uma rota para completar o fluxo.
Novo painel do parceiro
O painel do parceiro fica em parceiros.luniumpay.com, com o mesmo login (e-mail e senha). Também dá para entrar com um código enviado por e-mail ou com a conta Google; quem ainda não tem acesso usa Criar conta. O painel serve para a sua equipe operar e acompanhar o projeto. A integração continua pela API, com a chave do projeto: as telas do painel usam a sessão de quem entrou e não fazem parte do contrato público da API.
- Início: resumo do negócio por período (Pix recebido, vendas de cripto, Pix enviado, saques em cripto e comissão), situação das cobranças, das vendas e dos pagamentos, e calendário.
- Comprovantes: PDF nas vendas, nos Pix enviados e nas cobranças.
- Pagar com cripto: escolha entre as stablecoins (USDT e USDC em todas as redes, mais DePix) e as 30 principais criptos, com busca e ícones. A carteira de devolução só é pedida se a venda falhar (Carteira de devolução).
- Carteira USDT/USDC: depósito com QR Code do endereço e contagem regressiva do prazo de 1 hora; Pix pago com o saldo. Detalhes em Carteira USDT/USDC.
- Comissão: saque a partir de US$ 10.
- Notificações: sino com a atividade do projeto e avisos de cada operação pelo Telegram e por e-mail.
- Equipe: papéis Dono, Financeiro, Operador, Desenvolvedor e Leitura; segundo fator em Meu acesso.
- Meu acesso: o botão Encerrar as outras sessões fecha o painel nos outros aparelhos e mantém a sessão atual. Conta sem senha (entrada por código ou Google) desliga a verificação em dois passos com o código do app autenticador ou com um código de recuperação. Na troca de senha, a senha atual tem limite de 10 tentativas erradas por hora, e um e-mail avisa sempre que a senha é trocada, criada ou redefinida.
- Webhooks: Reenviar agora repete a entrega de um evento pelo próprio painel.
- Legibilidade: mais contraste e letras maiores, “Pix” com a mesma grafia em todas as telas, títulos iguais aos do menu e mensagens de erro em português claro.
Ativação de conta nova. Ao ativar o painel com um e-mail que ainda não tem conta (pelo link que chega pelo bot ou por e-mail, ou com a chave do projeto), você recebe nesse e-mail um código de 6 dígitos para confirmar. O código vale 30 minutos e aceita até 5 tentativas; Reenviar código libera um código novo depois de 1 minuto, até 5 vezes; só o mais recente vale. E-mail que já tem conta continua confirmando com a senha da conta.
Convite para quem entra por código ou Google. A conta sem senha aceita convite assim: entre no painel com o e-mail convidado e abra o link do convite de novo; com a sessão aberta, ele é aceito num clique.
Regras de segurança do painel:
- Só o papel Dono vê o link e o código de vínculo do Telegram, desconecta conversas e gera um código novo. O código troca sozinho quando alguém perde o acesso, deixa de ser dono ou quando uma conversa é desconectada.
- Quando alguém deixa de ser dono, os outros donos recebem um e-mail para revisar, em Notificações, as conversas do Telegram conectadas: elas continuam ligadas até um dono desconectá-las.
- A conversa conectada também consulta o saldo e movimenta dinheiro pelo bot: no privado, quem conectou; no grupo, os administradores. Conecte só conversas de confiança.
- Pelo painel, só o Dono troca a carteira de liquidação (
settlement_address) e as sub fees (partner_fee_bps,partner_cashout_fee_bps,partner_saque_fee_bps). O papel Desenvolvedor continua ajustando webhook, nome e monitor. - A sessão vale 12 horas e se renova enquanto você usa o painel, até 7 dias desde a entrada. O cookie de sessão é protegido e as páginas têm política de segurança de conteúdo.
3. Cobrar PIX para a custódia#
Criar a cobrança
Consulte antes GET /cashin/limits?payer_tax=CPF_OU_CNPJ, autenticado com a chave do projeto. O documento é de quem pagará o PIX; customer_ref identifica a subconta do seu sistema. São informações diferentes.
O exemplo usa R$ 50,00. Substitua documento e referência e escolha um valor permitido para esse pagador. A chamada em produção cria uma cobrança real.
curl --fail-with-body https://api.luniumpay.com/cashin/charge \
-H "X-API-Key: $LUNIUM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"amount_cents":5000,
"payer_tax_number":"00000000191",
"destino":"saldo",
"customer_ref":"cliente-42",
"external_id":"deposito-cliente42-001"
}'
Não envie payout_address para esse fluxo. Sem customer_ref, o crédito pertence ao saldo da própria chave, chamado casa. Com a referência, pertence somente àquela subconta.
Guarde cashin_id e external_id. Apresente qr_copypaste, qr_image_url quando disponível, o valor e o expires_at devolvidos. QR gerado significa cobrança criada; ainda não significa dinheiro recebido.
Confirmar o crédito
Use GET /cashin/{cashin_id}/status ou os eventos de webhook. Acompanhe dois estados:
| Campo | O que responde | Como agir |
|---|---|---|
status |
Situação do PIX | pending, delayed, under_review, paid, expired, refunded ou failed |
settlement_status |
Situação do crédito/entrega | pending, sending, entregando, sent, incerto ou failed |
Considere o crédito/entrega concluído em cashin.settled ou ao consultar status: "paid" com settlement_status: "sent". Em custódia, confirme o montante e a disponibilidade em GET /saldo?customer_ref=cliente-42 e no extrato. Um crédito registrado pode estar bloqueado por uma retenção; não gaste total_cents como se fosse disponivel_cents.
depix_received_cents é o valor recebido do liquidante, antes da dedução das taxas de depósito da chave. O nome é legado e não implica que o crédito líquido do cliente seja esse valor. Para conciliação, use os movimentos do saldo.
Taxa de depósito e disponibilidade
GET /saldo publica deposito_fee_bps, deposito_fee_fixed_cents, carencia_horas, carencia_ate, retencao_acima_cents e proximas_liberacoes. 100 bps = 1%. Novos depósitos têm deposito_fee_bps=0 e deposito_fee_fixed_cents=100, sem comissão do parceiro.
Há três conceitos separados:
| Regra | Onde aparece | Significado |
|---|---|---|
| Retenção pelo provedor | held, held_hours, delay_until, estado delayed |
PIX pago, aguardando liberação do provedor |
| Retenção local da cobrança | hold_hours na criação, liberar_em no status, evento cashin.held |
PIX pode estar paid, mas crédito/entrega ainda aguarda |
| Carência do saldo | carencia_horas, carencia_ate, créditos bloqueados em /saldo |
Regra da chave/subconta para disponibilização e saque |
held_hours e hold_hours não são aliases. Uma cobrança pode ter held: false e ainda estar sob retenção local. Não prometa liberação imediata a partir desse booleano isolado.
Não existe carência universal de 24 horas para todos os parceiros. Chaves com liberação imediata do saldo têm regra própria, mas continuam sujeitas às retenções do pagador, da cobrança e a bloqueios. Leia a criação, o status e o saldo em conjunto; um saque recusado por carência devolve 423 e o momento de liberação.
Limites por pagador
GET /cashin/limits publica a faixa de liberação imediata, a possibilidade de QR com retenção, a utilização e a próxima liberação do documento. As condições da chave podem alterar a régua. A consulta é orientativa: a criação revalida a operação, inclusive o fluxo de custódia com liberação imediata.
allow_hold: false recusa a cobrança quando ela precisaria da retenção calculada pelo limite do pagador. Não desativa outras regras contratuais nem bloqueios posteriores. Omitir o campo permite a retenção aplicável. Mostre essas condições antes do pagamento.
O mínimo efetivo também depende das taxas e do provedor. Não use R$ 1,00 como teste universal nem confunda o mínimo global com o mínimo aceito pela rota.
4. Saldo, subcontas e extrato#
| Consulta | Escopo e paginação |
|---|---|
GET /saldo |
Saldo da casa; não soma os clientes |
GET /saldo?customer_ref=cliente-42 |
Somente a subconta informada |
GET /saldo/consolidado |
Casa e clientes, com total custodiado |
GET /saldo/clientes?limit=50&com_saldo=1 |
Clientes; continue com cursor=next_cursor |
GET /saldo/extrato?customer_ref=cliente-42&limit=50 |
Movimentos; continue com before=proxima_pagina |
Extrato por operação: tarifa fixa e fee única
Nas respostas de payout e em data dos webhooks payout.*, use fee_service_total_cents para a taxa de serviço do cliente: ela já inclui Lunium + parceiro. fee_provider_cents é a tarifa Pix cobrada do cliente. fee_cents = fee_service_total_cents + fee_provider_cents; o débito completo é amount_cents + fee_cents. Não some fee_partner_cents novamente: ele e fee_service_cents são componentes contábeis já incluídos. Os valores vêm da operação gravada e preservam o arredondamento em centavos; null indica componente desconhecido em registro legado. Para novas operações, o percentual exibido vem de saque_fee_total_bps; uma mudança da comissão só afeta operações novas. Exemplo: Pix R$ 50,00, Lunium 1,5% + parceiro 1% e tarifa Pix R$ 1,00: serviço R$ 1,25, taxas R$ 2,25 e débito R$ 52,25. Aplicativos de parceiros precisam consumir esses campos para atualizar suas telas e notificações.
Para o histórico do usuário, consulte GET /saldo/extrato?customer_ref=cliente-42&visao=operacoes. O retorno traz uma linha por operação. Nos detalhes, taxas contém uma única categoria servico, com descrição “Taxa”, somando tarifa Pix e todas as fees; não há linha, rótulo ou percentual separado de comissão para o cliente. O mesmo vale no sandbox.
Para apresentar a taxa vigente antes de um novo saque, GET /saldo fornece saque_fee_total_bps (fee da casa + fee adicional do parceiro; 250 bps = 2,5%). A tarifa fixa em centavos está em saque_taxa_estimada_cents quando saque_taxa_provedor_tipo=fixo. Exiba somente tarifa fixa + fee total. Os campos de componentes e o extrato contábil padrão são destinados ao backend/conciliação; não os repasse diretamente à interface do cliente. Use os valores monetários cotados/gravados, pois as componentes têm arredondamento interno em centavos; não recalcule cobranças antigas com o percentual atual.
valor_cents é o efeito total e assinado no saldo: negativo = débito; positivo = crédito. valor_operacao_cents é o principal assinado; taxas_cents é o total absoluto das taxas incluídas. Cada taxa informa tipo, descricao, valor_cents absoluto e efeito_saldo_cents assinado. A identidade é valor_cents = valor_operacao_cents + soma(taxas[].efeito_saldo_cents). Não desconte as taxas novamente.
Exemplo: Pix de R$ 2,00, tarifa fixa R$ 1,00 e fee total R$ 0,05 → uma saída de R$ 3,05, com principal -200, taxas 105 e total -305. O detalhe mostra apenas Taxa: R$ 1,05. Gere uma notificação por operação, identificada por origem_id e tipo, nunca por componente de taxa. Não transforme taxas em cartões, notificações de recebimento ou valores positivos verdes. Estornos ficam em linhas próprias; uma devolução debitada mantém seu sinal negativo. Ajustes de taxas sem principal disponível permanecem visíveis para não ocultar movimentações.
status/status_label refletem o estado persistido da operação na consulta; settlement_status informa a entrega cripto. Estado desconhecido é null, não conclusão presumida. Atualize a consulta enquanto a tela estiver aberta e use os webhooks de estado para disparar uma nova leitura; deduplique notificações pela operação e transição de estado, não pelos lançamentos de taxa. A visão agrupada não altera lançamentos contábeis nem atualiza automaticamente aplicativos de terceiros.
A paginação agrupa antes de aplicar limit (1–200). Reenvie before=proxima_pagina enquanto has_more=true; proxima_pagina=null encerra. O cursor é uma string decimal, ancorada no primeiro lançamento; não o converta para Number. Use o mesmo customer_ref em todas as páginas. movimentos_ids referencia os lançamentos originais para conciliação; não renderize esses IDs como novas atividades. Atualize a primeira página para refletir taxas ou estados que chegarem depois. Erro de cursor/limite nessa visão retorna HTTP 400.
Reutilize exatamente o mesmo customer_ref no depósito, nas consultas e no saque. O limite é de 80 caracteres. Essa referência separa os saldos; a chave da API continua tendo autoridade sobre todas as suas subcontas. A autorização dos seus usuários deve existir também no seu sistema.
Transferência interna, sem gerar PIX, por POST /saldo/transferir:
{
"amount_cents":1000,
"from_customer_ref":"cliente-42",
"to_customer_ref":"casa",
"external_id":"transferencia-interna-001",
"descricao":"Transferência autorizada pelo cliente"
}
casa representa o saldo sem subconta. Só o disponível pode ser transferido; carência da subconta de origem continua sendo aplicada. Saldo insuficiente nessa rota retorna 409 saldo_insuficiente; nas rotas de saque, normalmente 402.
5. Sacar o saldo em cripto#
- Consulte
GET /saldono escopo correto. - Consulte
GET /cashin/catalog: é o catálogo de entrega, usado também no saque da custódia. - Ofereça pares de
instanteconvertcomentregavel: true. Para saque do saldo, exclua Liquid/DePix, que não são suportados nesse fluxo. - Selecione moeda, rede, carteira de destino e memo/tag quando necessário. A carteira pode mudar a cada saque.
- Envie
POST /saldo/sacar-criptoe acompanhe ocashin_iddevolvido emGET /cashin/{cashin_id}/status.
Corpo ilustrativo; substitua carteira e documento antes de enviar:
{
"amount_cents":10000,
"asset":"usdt",
"chain":"polygon",
"payout_address":"0x1111111111111111111111111111111111111111",
"tax_number":"00000000191",
"customer_ref":"cliente-42",
"external_id":"saque-cripto-cliente42-001"
}
amount_cents é o valor em BRL a converter, não a quantidade de cripto. O documento tax_number é do cliente que saca. Para redes com memo, envie payout_tag conforme a carteira recebedora e memoRequired do catálogo. Os aliases memo, tag e destination_tag são aceitos.
A resposta traz fonte: "saldo", destino: "cripto", fee_cents e debited_cents. O débito inclui o valor mais a taxa de saque da casa. A quantidade final de cripto também considera conversão e custos de entrega; não calcule o recebido dividindo apenas o débito por uma cotação de mercado.
GET /saldo informa saque_cripto_fee_bps. POST /cashin/preview ajuda a consultar a conversão e o mínimo da rota, mas não é uma prévia completa do débito do saque. A prévia de saque utilizada pelo Telegram é interna; não existe uma rota pública /saldo/sacar-cripto/preview.
O campo opcional max_debited_cents permite limitar o débito de BRL: se a soma superar o limite, a API recusa com 409 taxa_alterada. Ele não fixa a cotação nem garante uma quantidade mínima de tokens.
Não anuncie “todas as criptos” de forma irrestrita: as opções são os pares entregáveis do catálogo atual, sujeitos a mínimos, manutenção e validação de endereço. stale: true indica catálogo de contingência; revalide antes de confirmar.
6. Sacar o saldo por PIX#
POST /payouts reserva e debita o disponível da casa ou da subconta antes de enviar o PIX. São necessários payout.enabled, custódia ativa e saldo para valor mais taxas.
{
"amount_cents":5000,
"pix_key":"recebedor@example.com",
"pix_key_type":"email",
"tax_number":"00000000191",
"customer_ref":"cliente-42",
"external_id":"saque-pix-cliente42-001"
}
Troque a chave PIX e o documento pelos do recebedor. tax_number deve conter um CPF ou CNPJ válido para chaves de e-mail, telefone e aleatória. Para uma chave CPF/CNPJ válida, a API deriva o documento da própria chave; se informado, deve coincidir. beneficiary_name continua opcional e não comprova titularidade. Chaves de 11 dígitos exigem pix_key_type: "cpf" ou "phone"; telefone usa DDI, como +55.
Este fluxo usa somente saldo em reais recebido por PIX. funding_source é opcional e aceita apenas pix_brl. O máximo por PIX é 600000 centavos (R$ 6.000,00), sujeito a limite menor da conta, além das taxas.
Em 409 external_id_divergente ou external_id_nao_verificavel, consulte a ordem indicada por payout_id/recovery_endpoint. Preserve o identificador; não gere outro para contornar o conflito. Em 503 idempotencia_indisponivel, aguarde e consulte o mesmo external_id: uma ordem anterior pode existir.
A carteira USDT é separada do saldo BRL: requer habilitação do projeto, recebe depósitos externos de USDT e não usa /payouts. Quando habilitada, usa funding_source=crypto_usdt; documento do recebedor não é exigido nesse fluxo. Seus limites vêm da cotação e das condições da API, não do teto de R$ 6.000 do saldo BRL. Não está disponível em sandbox.
Preço: amount_cents + fee_cents, com fee_cents = fee_service_total_cents + fee_provider_cents. Consulte saque_fee_total_bps, saque_taxa_provedor_tipo, saque_taxa_provedor_piso_cents, saque_taxa_estimada_cents e saque_taxa_provedor_formula em GET /saldo. Leia a tarifa vigente na API; não fixe “1%” ou “R$ 2,00” no seu código. O payout registra a taxa efetiva.
Consulte GET /payouts/{payout_id}. processing ainda não é pagamento concluído; sent indica envio confirmado. failed e refunded exigem conciliação do status e do extrato. Em timeout, continue consultando a operação original: não presuma estorno nem envie novamente com outro identificador.
Após confirmação, e2e, paid_at, receiver_name, receiver_tax_number e verify_url podem trazer a prova do PIX. Campos ainda não obtidos podem ser null.
7. PIX para cripto diretamente#
Para entregar cripto após cada PIX, use destino: "cripto", o par do catálogo de entrega e payout_address. Sem endereço no corpo, o serviço pode usar a carteira Polygon configurada na chave; não use essa configuração como carteira universal para outras redes.
{
"amount_cents":10000,
"payer_tax_number":"00000000191",
"destino":"cripto",
"asset":"usdt",
"chain":"polygon",
"payout_address":"0x1111111111111111111111111111111111111111",
"external_id":"compra-cripto-001",
"allow_hold":false
}
Catálogo e cotação
GET /cashin/catalog lista o que a API consegue entregar. Use asset e network do catálogo; no corpo do cash-in e do saque, o nome do campo de rede é chain. instant pode estar vazio. A presença em convert não dispensa entregavel, mínimo ou memo. A tabela pronta de mínimos por moeda e por rede, com os números de hoje, está em Mínimos e redes.
curl --fail-with-body https://api.luniumpay.com/cashin/preview \
-H "X-API-Key: $LUNIUM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"amount_cents":10000,"asset":"usdt","chain":"polygon"}'
A prévia não cria uma cobrança e não trava o câmbio até o pagamento. Leia min_brl_cents, taxas e quantidade estimada da resposta. A quantidade que chega na carteira do cliente vem em asset_amount, em todas as rotas e também no sandbox, já descontada a taxa de saque da rede (withdraw_fee, em unidades do ativo). Essa taxa é fixa por envio e pesa mais em valores pequenos (BTC na rede Bitcoin, por exemplo); para exibi-la em reais, use withdraw_fee × brl_per_asset. Nas rotas convertidas, usdt_amount é o USDT usado na compra, não o que o cliente recebe; amount é o nome antigo de asset_amount. eta/etaSeconds são estimativas da rota, não prazo máximo contratual.
O valor recebido e a cotação aplicável na liquidação determinam a entrega. Exiba settlement_tx_hash e settlement_tx_url quando presentes; não construa links sempre para Polygon. Identificador interno de entrega pode não ter explorador público.
O CPF/CNPJ informado deve ser o do pagador. Divergência pode gerar devolução (PAYER_MISMATCH) ou análise quando a devolução não for concluída. Não credite com base em comprovante enviado pelo cliente ou em under_review.
8. Cripto externa para PIX#
Esse fluxo recebe cripto de uma carteira externa. Para gastar saldo custodial em PIX, use /payouts.
- Consulte
GET /catalog, o catálogo de entrada cripto; ele é diferente de/cashin/catalog. - Opcionalmente use
POST /cash-outs/previewpara uma estimativa sem ordem. - Crie a cotação por
POST /cash-outs. - Mostre quantidade, rede, valor líquido em reais, destinatário e validade. Aceite por
POST /cash-outs/{cashout_id}/accept. - Só então apresente o
deposit_address, odeposit_tagquando houver e o valor exato retornado. - Acompanhe
GET /cash-outs/{cashout_id}ou webhook até o estado final.
Exemplo de sandbox, usando LUNIUM_API_KEY de teste:
curl --fail-with-body https://api.luniumpay.com/cash-outs \
-H "X-API-Key: $LUNIUM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"asset":"USDT",
"network":"polygon",
"amount":"10.00",
"pix_key":"teste@example.com",
"pix_key_type":"email",
"external_id":"sandbox-cashout-001"
}'
Envie amount (cripto) ou brl_amount (reais desejados), em string decimal com ponto. Não envie os dois. A criação pode responder 200 em produção ou 201 no sandbox; aceite respostas 2xx conforme o contrato. cashout_id é o identificador retornado, não um ID criado pelo integrador.
refund_address é opcional na criação, também na venda de DePix: a carteira de devolução só é pedida se a venda falhar (veja Carteira de devolução). Se você já tem a carteira do cliente, pode enviá-la: ela precisa ser válida para a mesma rede e estar sob controle do destinatário da devolução. A origem de um saque de exchange pode ser a carteira coletiva da exchange; não presuma que ela serve como carteira de retorno.
Estados e comprovantes
| Fase | Estados que podem aparecer |
|---|---|
| Cotação e depósito | QUOTE_CREATED, AWAITING_DEPOSIT, DEPOSIT_DETECTED |
| Confirmação e conversão | DEPOSIT_CONFIRMED, SELLING, SOLD, FORWARDING, PAYING_OUT |
| Conclusão do PIX | COMPLETED |
| Exceções | MANUAL_REVIEW, AWAITING_REFUND_ADDRESS, REFUNDING_CRYPTO, REFUNDING (venda de DePix), REFUNDED, EXPIRED, FAILED |
Nem toda rota passa por todas as etapas. timeline, confirmations e confirmations_required, quando presentes, ajudam a acompanhar. Não trate confirmação de depósito como PIX concluído.
Em COMPLETED, confira pix_e2e, pix_paid_at, receipt_url, receipt_pdf_url e verify_url, quando disponíveis. Use os links retornados. A consulta pública GET /v1/verificar/{e2e} verifica um PIX conhecido; não é uma prova genérica de toda operação cripto.
Em devolução, acompanhe REFUNDED e refund_tx_hash. Valor e prazo dependem do estágio atingido e do retorno do provedor. Não prometa estorno integral, automático ou em prazo fixo para qualquer falha. Depósito tardio ou divergente exige acompanhar a mesma ordem; não reutilize seu endereço para outra operação.
Carteira de devolução: só quando a venda falha
A carteira de devolução só é pedida quando a venda falha e o valor precisa voltar ao cliente. Se a ordem não tem refund_address, ela para em AWAITING_REFUND_ADDRESS (refund_address_required: true) e a Lunium envia o webhook cashout.awaiting_refund_address. Peça ao seu cliente uma carteira na rede de refund_network (na venda de DePix, um endereço Liquid lq1…) e informe:
curl --fail-with-body -X POST \
"https://api.luniumpay.com/cash-outs/$CASHOUT_ID/refund-address" \
-H "X-API-Key: $LUNIUM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"refund_address":"CARTEIRA_DO_CLIENTE"}'
A devolução nunca vai para a origem do depósito: o destino é só a carteira informada. Com ela registrada, a devolução segue (REFUNDING_CRYPTO na venda de cripto, REFUNDING na de DePix) até REFUNDED, com refund_tx_hash (webhooks cashout.refunding e cashout.refunded); o caso de DePix já enviado ao provedor está logo abaixo. Quando o valor a devolver já está com a Lunium, refund_amount, refund_asset e refund_network dizem o que volta. Não refaça o pagamento antes de a devolução terminar.
Na venda de DePix (asset: "DEPIX", network: "liquid"), POST /cash-outs/{cashout_id}/refund-address responde:
| Resposta | Quando |
|---|---|
200 |
Carteira registrada; a ordem segue para a devolução (REFUNDING) ou, se o DePix ainda estiver com o provedor, para MANUAL_REVIEW. Repetir a mesma carteira devolve 200 sem efeito novo |
400 refund_address_invalida |
Endereço vazio, fora do formato Liquid ou da própria Lunium, como o endereço de depósito desta ou de outra ordem |
409 refund_address_imutavel |
A ordem já tem outra carteira de devolução registrada; ela não é trocada |
409 devolucao_indisponivel |
A ordem não está aguardando carteira agora: ela só é pedida quando a venda falha e o DePix do cliente está com a Lunium. Em MANUAL_REVIEW, espere o retorno do provedor |
DePix que já foi enviado ao provedor. Se o Pix falhou depois de o DePix ter sido enviado ao provedor do DePix, nada é devolvido antes de o retorno do provedor ser confirmado na rede: até lá a ordem fica em MANUAL_REVIEW (webhook cashout.under_review), com refund_amount vazio, mesmo que já tenha carteira de devolução. Confirmado o retorno, refund_amount passa a mostrar o valor da devolução, que é no máximo o que voltou (somado à parte que não chegou a ser enviada, até o valor da ordem), e a ordem segue para REFUNDING ou, sem carteira, para AWAITING_REFUND_ADDRESS. Se o DePix ainda estava todo com a Lunium, a devolução é do valor da ordem.
Comprovante oficial do PIX
Toda venda que chega a COMPLETED tem um comprovante oficial do PIX, emitido pela Lunium. É o documento que você entrega ao seu cliente final e guarda na sua contabilidade. Ele traz valor, data e hora (horário de Brasília), o E2E (identificador único do PIX no Banco Central), a instituição e o titular da chave que recebeu, o pagador (o liquidante PIX da Lunium, que é como o PIX aparece no extrato de quem recebeu) e o link da verificação pública.
O mesmo comprovante existe em quatro formas, e todas vêm no corpo da ordem:
| Campo | O que é | Use para |
|---|---|---|
pix_e2e | Identificador oficial do PIX no Banco Central | Conciliar com o extrato do recebedor; é a prova que vale em qualquer banco |
receipt_url | Página do comprovante, que abre no celular | Mostrar ao cliente assim que o PIX for concluído |
receipt_pdf_url | O comprovante em arquivo PDF | Anexar em chamado, enviar por mensagem, arquivar |
verify_url | Verificação pública, sem chave de API (GET /v1/verificar/{e2e}) | Deixar qualquer pessoa confirmar valor, data e iniciais do recebedor sem depender de você nem da Lunium |
Onde o comprovante chega:
- API: nos campos acima, em
GET /cash-outs/{cashout_id}, assim que a ordem viraCOMPLETED. - Webhook:
cashout.completedtraz os campos preenchidos quando o link já existe. Se vieremnull,cashout.receipt_readychega em seguida com a ordem inteira e os links prontos. Trate os dois de forma idempotente pelocashout_id. - Painel do parceiro: em Vendas, abra a venda e use “Abrir comprovante”, “Baixar o PDF” e “Abrir verificação”. Só usuários com permissão para ver valores enxergam esses links.
- Telegram: no grupo de operação vinculado à chave, o aviso “✅ PIX pago” traz o E2E e o link “Ver comprovante”, e o PDF chega logo depois como arquivo (“🧾 Comprovante oficial”). Se o link nascer depois do aviso, o PDF chega sozinho.
Titular da chave. Nome e instituição de quem recebeu vêm de uma única consulta ao diretório de chaves PIX, feita pela Lunium no momento do pagamento e reservada ao comprovante: ela tem cota e não é um serviço de consulta (GET /pix/keys/lookup pode responder verification_status: "not_performed" sem afetar o comprovante). Se o titular não for localizado nessa consulta, o comprovante sai válido mesmo assim, com valor, chave, data e instituição extraídos do próprio E2E, e o nome é completado depois.
Boas práticas. Guarde pix_e2e e receipt_pdf_url junto do seu pedido. Entregue o PDF ao cliente e o verify_url a quem precise conferir. Não aceite comprovante enviado pelo cliente como prova de pagamento: a prova é a ordem em COMPLETED com pix_e2e. Saques do saldo por PIX (POST /payouts) também têm E2E, nome do recebedor e verify_url em GET /payouts/{payout_id} e no painel (Payouts → “Abrir comprovante”). No cash-in, o E2E do PIX recebido vem em GET /cashin/{cashin_id}/status (e2e e payer_name).
Consulta de titular e pagamento de QR
GET /pix/keys/lookup?key=...&type=... é auxiliar. Pode responder 200 com available: false, verified: false, verification_status: "not_performed" e nomes null. Mostre “titular não verificado”; não invente nome nem confunda consulta indisponível com pagamento indisponível. No sandbox, o titular é fictício e vem com source: "sandbox".
br_code tem disponibilidade separada. Produção pode recusar a criação com 503 br_code_indisponivel, mesmo que uma prévia ou o sandbox aceite o QR. Não ofereça pagamento de copia e cola como funcionalidade sempre ativa. Quando habilitado, substitui pix_key, amount e brl_amount, e exige valor definido e ativo compatível. Se o cliente colou ou escaneou um QR com valor — estático ou dinâmico — envie o br_code inteiro, nunca pix_key + brl_amount extraídos dele: só assim o PIX sai no valor exato e como pagamento daquela cobrança (com o txid). Pago por chave, o valor pode diferir em centavos e o recebedor não reconhece.
A reserva operacional das novas vendas de cripto para Pix é de R$ 1,00 por operação, para todos os parceiros, já incluída na cotação e informada em reserve_brl. O equivalente em USDT é calculado pela cotação do momento e congelado na ordem: pix_key_reserve_usd para chave Pix ou copia_e_cola_buffer_usd para Copia e Cola. Esses campos representam o valor convertido, não uma cobrança de US$ 1. Não some a reserva novamente ao total. Os percentuais e custos do provedor continuam na cotação. O QR é pago somente pelo valor exato. A reserva operacional não é devolvida após o pagamento; a margem temporária de saldo é separada. Ordens anteriores mantêm os valores contratados. DePix/Liquid segue sua tarifa própria em reais.
Use somente redes oferecidas no catálogo da operação. Redes com memo podem ser excluídas do cash-out mesmo quando existem no catálogo de entrega; não copie a lista de um produto para outro.
Carteira USDT/USDC: saldo em cripto e PIX pago com ele
A carteira guarda um saldo em USDT do seu projeto. Você deposita USDT ou USDC, em várias redes, e paga PIX com esse saldo, por chave PIX ou por Copia e Cola. Está liberada para todas as chaves de produção; a chave lun_test_ usa o simulador.
GET /carteira-usdt: saldo (available,reserved,confirming), redes aceitas agora (networks[], com moedas e prazo estimado),min_depositemin_payment_brl.POST /carteira-usdt/depositscom{"amount": "100", "network": "tron"}: devolveamount_to_send(valor exato: as casas finais identificam o seu depósito),address,network_nameeexpires_at. Mostre os quatro ao usuário. Se a origem desconta a taxa do envio, some a taxa: o que conta é o valor que chega. O pedido vale 1 hora (deposit_validity_hours= 1;expires_at= criação + 1 h): envie dentro do prazo.- O crédito é automático: acompanhe
GET /carteira-usdt/deposits(waiting→confirming→available) ou o webhookwallet.deposit_credited. USDC entra 1 para 1 no saldo. POST /carteira-usdt/quotecom{"brl_amount": "50.00"}ou{"br_code": "000201…"}: prévia em USDT (usdt_total,usdt_reserved), sem efeito.POST /carteira-usdt/paymentscom{"brl_amount": "50.00", "pix_key": "cliente@exemplo.com", "pix_key_type": "email", "external_id": "pedido-123"}(ou combr_code): responde201emreservado. AcompanheGET /carteira-usdt/payments/{payment_id}atéfinal: true, ou os webhookswallet.payment_completedewallet.payment_failed.- Concluído traz
pix_e2e,recipient_name,recipient_document(CPF parcial) ereceipt_url(comprovante oficial).GET /carteira-usdt/statementé o extrato: valor sempre positivo,typedá a direção (deposit,reserve,debit,release,reversal).
Regras: o PIX mínimo é min_payment_brl (hoje R$ 25,00). A reserva cobre até 1% de variação e a sobra volta ao saldo. falhou = não executado, a reserva voltou; falhou_apos_envio = em apuração, a reserva não volta sozinha; revisao é conferência, não falha. O mesmo external_id com os mesmos dados devolve o mesmo pagamento (200); com dados diferentes, 409 external_id_divergente. 409 saldo_insuficiente quando o disponível não cobre a reserva.
Redes aceitas (9): USDT e USDC em Polygon, BNB Smart Chain (BEP20), Ethereum (ERC20), Arbitrum One, Optimism, Avalanche C-Chain e Solana; só USDT em Tron (TRC20); só USDC em Base. O que vale para a sua chave agora é networks[] de GET /carteira-usdt. Depósito mínimo: 5 USDT ou USDC (min_deposit). Sem envio dentro do prazo, o pedido termina em expired. O MCP da Lunium tem 6 ferramentas da carteira: saldo, pedido e lista de depósitos, prévia, pagamento e consulta do pagamento.
No painel do parceiro, o pedido de depósito mostra o QR Code só do endereço e uma contagem regressiva, com segundos, até expires_at. O QR não leva o valor: digite o valor exato (amount_to_send) no app de envio. Nas redes EVM o endereço 0x é o mesmo: escolha a rede certa no app.
No sandbox (lun_test_): endereço fictício (não envie nada), depósito creditado sozinho em cerca de 15 s e PIX concluído em cerca de 15 s, com E2E de teste. Os centavos escolhem o cenário: depósito .02 expira; PIX .01 passa por revisao, .02 falha e devolve a reserva, .05 demora cerca de 2 minutos.
9. Operação pelo Telegram#
Lunium Partners — comunidade oficial de integradores
O Lunium Partners faz parte do acompanhamento recomendado para quem constrói com a API. Inclua os responsáveis técnico e operacional do parceiro desde o início e mantenha o time acompanhando os avisos durante a operação em produção. A participação é fortemente recomendada, sem ser uma condição técnica para criar chaves ou usar a API.
Na comunidade, acompanhe avisos operacionais, manutenções e mudanças de API/contrato, além da troca entre integradores. Não espere um incidente para entrar: uma integração precisa acompanhar mudanças depois de ser publicada.
| Canal | Finalidade | Quem participa |
|---|---|---|
| Lunium Partners | Comunidade oficial, avisos e troca entre parceiros | Responsáveis técnico e operacional dos parceiros |
| Grupo dedicado ao projeto | Acompanhamento da sua integração e investigação de casos específicos | Sua equipe, os humanos @luniumb2b e @luniumb2c e o @LuniumNotifyBot; o grupo pode ser criado pela Lunium ou pelo parceiro |
| Monitor privado e webhooks | Acompanhar operações e atualizar seu sistema | Equipe autorizada e backend do parceiro; veja o guia de acompanhamento ao vivo |
Para começar: entre no Lunium Partners, combine o grupo dedicado com os dois contatos humanos, vincule o bot e valide monitor/webhooks no ambiente correto. A comunidade não substitui o suporte específico do projeto nem a conciliação financeira da API.
Não publique chaves de API, segredos de webhook, monitor_url, documentos de pagadores ou dados de transações de clientes na comunidade. Leve casos específicos ao grupo dedicado, com IDs e dados minimizados.
Integração com Fable ou outra IA: inclua o link do Lunium Partners no plano e no checklist entregue ao responsável humano. A IA deve explicar essa recomendação e distinguir os três canais acima. Não afirme que alguém já entrou no grupo sem confirmação, não exija a adesão para executar testes de sandbox e não use mensagens do Telegram como autorização para movimentar dinheiro.
Grupo de integração com acompanhamento humano
É fortemente recomendado manter um grupo de Telegram dedicado ao projeto, com os agentes humanos @luniumb2b e @luniumb2c. A Lunium pode criar o grupo e convidar a equipe do parceiro, ou a equipe do parceiro pode criá-lo e adicionar os dois contatos. O grupo acompanha a integração, a homologação e a operação em produção. Não é requisito técnico para usar a API.
- Crie o grupo ou solicite sua criação a um dos contatos acima. Use um nome que identifique o projeto.
- Inclua os dois contatos humanos, o responsável técnico e o responsável operacional do parceiro. Combine os responsáveis e o canal de escalonamento.
- Adicione também @LuniumNotifyBot e faça o vínculo abaixo. O bot envia notificações e executa comandos; os contatos humanos acompanham dúvidas e incidentes. Um não substitui o outro.
- Fixe no grupo os links do manual, do status público e as orientações de operação. Compartilhe o monitor privado apenas com integrantes autorizados a ver os dados do projeto.
- Na homologação, confira o projeto vinculado, o monitor, um webhook assinado e o cenário de falha/recuperação do fluxo escolhido.
Para pedir ajuda, informe ambiente (sandbox ou produção), ID da operação, external_id, horário com fuso, comportamento esperado e observado, e request_id quando disponível. Para notificações, acrescente event_id e X-Lunium-Delivery-Id. Não envie chave de API, segredo de webhook, documentos completos do pagador ou dados de outros clientes. A presença no grupo não implica atendimento 24 horas nem prazo de liquidação; combine o atendimento com a equipe.
Os canais gerais de parceiros/comunidade indicados em /keys/me complementam os avisos de manutenção e mudanças de API. Eles não substituem o grupo dedicado ao projeto.
Vínculo e comandos do bot
Adicione @LuniumNotifyBot ao grupo do projeto. Um administrador identificado deve usar /vincular e o fluxo de vínculo recebido ao criar/consultar a chave. Se o bot apresentar um botão de confirmação, clique no botão: responder “sim” em texto não equivale ao clique. Não publique a chave lun_... no grupo.
| Comando | Função |
|---|---|
/configurar |
Conferir vínculo e configuração |
/cobrar <valor BRL> <cpf/cnpj> [cliente=ref] |
Gerar PIX para custódia, sem carteira fixa |
/saldo [customer_ref] |
Consultar o saldo do escopo informado |
/extratosaldo [customer_ref] |
Consultar movimentos da custódia |
/moedas [moeda] |
Ver rotas disponíveis para entrega |
/sacarcripto <valor BRL> <moeda> <rede> <endereço> <cpf/cnpj> [memo] [cliente=ref] |
Estimar e confirmar saque da custódia em cripto |
/pagar <valor BRL> <chave PIX> [tipo] [cpf/cnpj] |
Solicitar PIX debitado do saldo do projeto |
/status <id> |
Acompanhar uma operação |
/limites |
Consultar limites do projeto e régua de pagadores |
/monitor |
Abrir o acompanhamento do projeto |
/comissao [taxa%] |
Consultar comissão ou apresentar mudança para confirmação pelo admin; guia |
No Telegram, valores são em reais, como 50 ou 50,50; na API, amount_cents usa centavos. Para subcontas, confira o escopo exibido antes de sacar. /pagar não oferece o parâmetro cliente=ref do saque cripto; para payout de subconta, use a API com customer_ref.
O saque cripto mostra destino, estimativa e débito antes da confirmação. A confirmação vale 60 segundos e pertence ao usuário, grupo e projeto que a solicitaram. Em grupos, saques exigem administrador identificado; mensagem sem remetente identificado não autoriza retirada. A confirmação revalida as condições e pode pedir nova prévia. A cotação não fica travada.
/sacar é o fluxo de cripto externa para PIX. Para retirar o saldo em cripto, use /sacarcripto. Os comandos /qr, /qrwhitelist e /qrdelay também usam custódia quando não há carteira explícita; prazo e retenção devem ser conferidos na resposta.
10. Webhooks confiáveis#
Configure webhook_url, guarde webhook_secret e execute POST /webhooks/test para testar seu receptor. Essa chamada envia uma notificação de teste ao endereço configurado.
Envelope ilustrativo:
{
"event":"cashin.settled",
"event_id":"evt_exemplo",
"created_at":"2026-09-17T20:00:00.000Z",
"data":{
"cashin_id":"ci_exemplo",
"destino":"saldo",
"status":"paid",
"settlement_status":"sent"
}
}
O exemplo abrevia data. Eventos de cobrança, cash-out e payout compartilham o objeto-base de status do recurso; enriquecimentos de uma consulta GET, como timeline, podem não estar no evento. Eventos saldo.* têm seus próprios dados de movimento. Não exija que todo webhook seja idêntico, campo a campo, à resposta enriquecida de um GET.
| Header | Uso |
|---|---|
X-Lunium-Signature |
t=<unix>,v1=<HMAC-SHA256 em hex> sobre timestamp.corpo_bruto |
X-Lunium-Event-Id |
Identificador estável do evento, para deduplicar |
X-Lunium-Delivery-Id |
Identificador da tentativa, para diagnóstico |
X-Lunium-Attempt |
Número da tentativa |
Valide o corpo bruto, sem reserializar JSON, e a idade do timestamp. Compare buffers de mesmo tamanho em tempo constante. Use o verificador Node.js completo, que também rejeita assinatura malformada sem lançar erro de tamanho de buffer.
Persista/enfileire o evento e responda 2xx rapidamente. O transporte tem timeout de 10 segundos. Faça o trabalho demorado depois. Não deduplique por tentativa: todas as tentativas do mesmo evento devem produzir uma única ação de negócio.
Sem sucesso, há até 12 tentativas com backoff. A janela é aproximadamente 7 horas, sujeita à fila; não é um SLA de entrega. Consulte GET /webhooks/deliveries e reenvie por POST /webhooks/deliveries/{event_id}/retry quando corrigir seu receptor. Entrega esgotada fica failed; o registro permite recuperação.
Novas integrações devem usar a assinatura v2. X-Webhook-Signature é legado, ausente para chaves novas e com retirada anunciada para 09/11/2026; não dependa dele.
Eventos
| Grupo / Group | Eventos / Events |
|---|---|
| cashin | cashin.paid · cashin.settled · cashin.settlement_failed · cashin.expired · cashin.refunded · cashin.failed · cashin.delayed · cashin.held |
| cashout | cashout.awaiting_deposit · cashout.deposit_detected · cashout.processing · cashout.confirming · cashout.under_review · cashout.awaiting_refund_address · cashout.refunding · cashout.completed · cashout.refunded · cashout.expired · cashout.failed · cashout.receipt_ready |
| payout | payout.sent · payout.failed · payout.refunded |
| saldo | saldo.liberado · saldo.congelado · saldo.transferido |
| webhook | webhook.test |
Tolere eventos e campos novos, registre o que não conhece e confirme o recurso por GET quando necessário. Não presuma ordem de chegada. Consulte o estado atual antes de regredir um recurso que já concluiu.
Monitor ao vivo do parceiro
O parceiro já pode acompanhar seu próprio projeto no monitor privado da Lunium. Consulte GET /keys/me no backend e abra o monitor_url da resposta, ou use /monitor no grupo vinculado. A criação de chave também devolve esse link. Ele oferece acesso de leitura ao projeto: compartilhe somente com pessoas autorizadas, nunca na documentação pública ou com o cliente final.
O painel consulta o feed a cada 3 segundos e o saldo de custódia a cada 15 segundos. Mostra cobranças, cash-outs, payouts e entregas de webhook; a seção de custódia inclui saldo disponível/bloqueado, subcontas e movimentos recentes quando habilitada. Esses intervalos são a frequência de consulta da interface, não um prazo garantido de atualização do banco, provedor ou blockchain.
Se o link privado vazar, use PATCH /keys/me com {"rotate_monitor_token":true}. Guarde o novo monitor_url: o token antigo deixa de dar acesso aos dados. O token de monitor é somente leitura, mas permite ver o projeto inteiro, não apenas um cliente. Não o use como autenticação de uma tela pública por transação.
Feed para o seu próprio painel
# Execute no backend; LUNIUM_API_KEY vem do seu gerenciador de segredos.
curl --fail-with-body 'https://api.luniumpay.com/cashin/events?limit=80' \
-H "X-API-Key: $LUNIUM_API_KEY"
GET /cashin/events aceita X-API-Key ou X-Dashboard-Token no header. O monitor hospedado usa ?token=. A resposta contém projeto, agora e eventos. Cada item traz ts, fluxo (cash-in, cash-out, payout ou webhook), provedor, ref, valor, estado, detalhe e tx, com campos eventualmente nulos. limit tem padrão 60 e limite de 1 a 200.
É um resumo recente, não um histórico completo de transições. A lista vem ordenada por ts decrescente; uma operação pode aparecer com o estado atual, e o feed não tem cursor de replay nem o event_id do envelope de webhook. Não calcule saldo, taxas ou conciliação a partir dos textos valor/estado. Não use ts como sequência global de mudanças. Para valores, rede, hash e comprovantes, consulte o recurso original. Em particular, use settlement_tx_url retornado pelo status do cash-in para o explorador correto da rede, em vez de presumir Polygon pelo resumo do feed.
Webhook + consulta de status + atualização da sua interface
O webhook é uma chamada HTTPS POST da Lunium para o backend do parceiro. Para reproduzir a experiência ao vivo no seu aplicativo, implemente este caminho:
- Receber: leia o corpo bruto com limite de tamanho, valide assinatura e timestamp antes de interpretar o JSON. Confira a correspondência do
event_iddo corpo com o header. Um segredo corresponde à configuração da chave/ambiente; não confie no payload para escolher o projeto. - Persistir: grave o evento em uma caixa de entrada durável, com restrição única
(projeto, ambiente, event_id), antes de responder 2xx. Em uma duplicata já persistida, retorne 2xx sem repetir o efeito. Se a gravação falhar, retorne erro para permitir nova tentativa. Não descarte silenciosamente um evento autenticado desconhecido. - Conciliar: um worker processa a caixa de entrada e consulta o recurso canônico quando necessário. Serialize as atualizações por operação para uma resposta antiga não sobrescrever uma consulta mais recente. Guarde o histórico recebido, o estado consultado e a hora da última consulta separadamente.
- Atualizar a tela: seu backend publica o resultado por SSE, WebSocket ou polling para sessões autenticadas do seu aplicativo. Autorize o projeto e o cliente em cada leitura/conexão. Esses canais são implementados pelo parceiro; não há endpoint público SSE/WebSocket da Lunium descrito neste contrato.
- Recuperar: mantenha uma rotina de conciliação das operações não concluídas e daquelas com entrega incerta. Use intervalo ajustável, backoff e limites da chave; não faça uma consulta à API por navegador aberto. Na reconexão do cliente, recarregue o estado persistido e mostre quando a atualização estiver atrasada.
O monitor da Lunium é a visão operacional pronta. O painel do parceiro pode acrescentar seus próprios pedidos, clientes e histórico durável. Webhooks não substituem o extrato nem constituem um registro de cada etapa interna da corretora parceira, bancos ou outros provedores.
| Operação / vínculo | Consulta para conferir o estado | Como mostrar a conclusão |
|---|---|---|
Cobrança PIX ou saque de custódia em cripto: cashin_id |
GET /cashin/{cashin_id}/status |
status=paid e settlement_status=sent; identifique destino/fonte para distinguir crédito BRL de entrega cripto |
Cripto externa para PIX: cashout_id |
GET /cash-outs/{cashout_id} |
state=COMPLETED; mostre comprovante/E2E quando retornados |
Payout PIX: payout_id |
GET /payouts/{payout_id} |
status=sent; não confunda com a entrega de webhook sent |
Movimento saldo.*: customer_ref, origem_id, charge_id, movimento_id |
GET /saldo e GET /saldo/extrato, com o customer_ref correto quando houver |
O saldo disponível vem do ledger; crédito registrado e saldo liberado são coisas distintas |
Persista também o external_id que você definiu ao criar a operação. O status do cash-in pode trazer timeline com etapa, em, detalhe; o do cash-out, timeline com state, at. Use apenas etapas e horários efetivamente retornados. Campos de confirmação, hash ou comprovante podem estar ausentes/nulos até existirem. Não invente percentual, horário de conclusão, transação on-chain ou motivo de falha.
O que cada evento significa na tela
| Eventos | Interpretação e ação |
|---|---|
cashin.paid |
PIX confirmado; a entrega/crédito ainda precisa ser conferida. Nunca exiba “cripto entregue” só por esse evento |
cashin.settled |
Liquidação informada; confirme destino e status. Em custódia, consulte quanto está disponível para saque |
cashin.delayed, cashin.held |
Atraso/retenção; mostre delay_until/liberar_em quando retornados, sem tratar como falha definitiva |
cashin.settlement_failed, cashin.failed |
Problema de liquidação ou operação; consulte o estado atual, registre o erro e escale. Não crie outro pagamento automaticamente |
cashin.expired, cashin.refunded |
Expiração ou devolução; reconcilie a cobrança original |
cashout.awaiting_deposit, cashout.deposit_detected, cashout.confirming |
Aguardando depósito, detectado ou em confirmação; exiba contagem apenas quando fornecida |
cashout.processing |
Processamento agregado. Várias etapas internas compartilham esse evento; ele não é emitido para cada etapa |
cashout.under_review, cashout.refunding |
Análise ou devolução em andamento; mantenha acompanhamento |
cashout.awaiting_refund_address |
A venda falhou e precisa ser devolvida, mas a ordem não tem carteira de devolução. Peça a carteira ao cliente e informe em POST /cash-outs/{cashout_id}/refund-address; não refaça o pagamento antes da devolução |
cashout.completed, cashout.refunded, cashout.expired, cashout.failed |
Resultado informado do cash-out; confira o recurso e os comprovantes disponíveis |
cashout.receipt_ready | O comprovante do PIX ficou pronto. Sai depois do cashout.completed (o link nasce alguns segundos após o pagamento, enquanto o titular da chave é consultado) e traz a ordem inteira com receipt_pdf_url, receipt_url e verify_url preenchidos. É o evento a usar para entregar o comprovante ao seu cliente sem ficar reconsultando |
payout.sent, payout.failed, payout.refunded |
Resultado do PIX enviado com saldo; confirme a operação e o extrato |
saldo.liberado, saldo.congelado, saldo.transferido |
Mudança no saldo; consulte o escopo correto. Não some eventos diretamente como se fossem extrato |
webhook.test |
Teste de transporte/assinatura; não representa dinheiro nem operação financeira |
settlement_status=incerto requer conciliação antes de qualquer nova entrega. Um webhook antigo pode chegar depois de uma consulta que já mostra conclusão; guarde-o no histórico sem regredir o estado atual. Até uma operação concluída pode ter atualização posterior legítima, como devolução: consulte a fonte, em vez de ignorar tudo após o primeiro sucesso.
Configurar, testar e recuperar notificações
Configure o receptor HTTPS público na chave do ambiente correto. A validação recusa destinos privados/locais. O segredo é retornado quando gerado: guarde-o no backend. Uma atualização de URL não necessariamente gera ou devolve outro segredo. Se precisar rotacionar, coordene a troca usando rotate_webhook_secret; tentativas posteriores usam o segredo vigente.
curl --fail-with-body -X PATCH 'https://api.luniumpay.com/keys/me' \
-H "X-API-Key: $LUNIUM_API_KEY" -H 'Content-Type: application/json' \
-d '{"webhook_url":"https://seu-dominio.example/webhooks/lunium"}'
# Testa apenas transporte e assinatura; não cria um pagamento.
curl --fail-with-body -X POST 'https://api.luniumpay.com/webhooks/test' \
-H "X-API-Key: $LUNIUM_API_KEY"
curl --fail-with-body 'https://api.luniumpay.com/webhooks/deliveries?status=failed&limit=100' \
-H "X-API-Key: $LUNIUM_API_KEY"
# Reenvie somente após corrigir o receptor, usando um event_id da sua chave.
curl --fail-with-body -X POST \
"https://api.luniumpay.com/webhooks/deliveries/$EVENT_ID/retry" \
-H "X-API-Key: $LUNIUM_API_KEY"
Substitua o domínio ilustrativo pelo receptor real. POST /webhooks/test tem limite de 6 chamadas/minuto por chave em produção; retorna ok, status_code, ms, event_id e delivery_id. Esse teste avulso não é persistido na fila de entregas de produção. Ele valida a comunicação, não a liquidação financeira ou todos os caminhos da sua aplicação.
GET /webhooks/deliveries aceita status (pending, sent, failed), event e limit (padrão 50, máximo 200). Cada linha traz event_id, operation_id, attempts, last_error, url, next_attempt_at, created_at e updated_at, além do evento/status. failed_count conta falhas somente nas linhas retornadas. Não há filtro por operation_id nem cursor de paginação nesse endpoint; mantenha seu histórico durável e procure a operação nas linhas recebidas.
O retry responde 200 se a tentativa foi entregue, 202 se falhou e foi recolocada na fila, 409 se já estava entregue e 404 se não existir para a chave. pending/sent/failed aqui descrevem o transporte do webhook, não o resultado do pagamento. Reenviar uma notificação não refaz o pagamento nem corrige uma liquidação pendente.
Homologação do acompanhamento ao vivo
- Configure o receptor na chave de sandbox e execute os cenários aplicáveis descritos em Sandbox.
GET /sandbox/eventsmostra os eventos simulados; não use o feed operacional de produção como prova de cobertura da sandbox. - Verifique assinatura inválida/expirada, duplicata, eventos fora de ordem, indisponibilidade do receptor, retorno após reconexão e isolamento entre projetos/clientes.
- Prove que
cashin.paidnão marca entrega cripto, que retenção não vira saldo disponível e quewebhook.testnão altera saldo. - Confira uma operação pela resposta de criação, webhook e GET de status, correlacionando os IDs e sem criar nova transação em timeout.
- Valide erro de liquidação, resultado incerto, devolução e recuperação de notificação. Encaminhe os IDs ao grupo humano para casos que precisem de investigação.
- Mostre no painel: operação, pedido externo, cliente autorizado, moeda/rede, valor retornado, status financeiro, entrega do webhook, última atualização e comprovante/hash quando disponíveis. Sinalize dados desatualizados e evite uma falsa indicação de “ao vivo”.
11. Erros, idempotência e conciliação#
Use o código HTTP junto de erro, acao, detail, request_id e agent_guidance quando presentes. Alguns caminhos retornam apenas parte desses campos. Não ramifique pelo texto livre de detail.
| Indicação | Conduta |
|---|---|
corrigir |
Ajustar campos ou valor; ler limits, payer_limits e min_brl_cents |
repetir |
Retentar com backoff e o mesmo identificador/payload |
esperar |
Respeitar Retry-After, prazo de liberação ou status do serviço |
parar / falar_com_suporte |
Interromper tentativas automáticas e resolver a condição |
401 / 403 |
Conferir autenticação, capacidade da chave, limite e política da operação |
402 saldo_insuficiente |
Conferir disponível, subconta e taxas do saque |
409 external_id_divergente |
ID já pertence a outra operação; não reutilizar para mudar o pedido |
423 carencia_primeiro_deposito |
Mostrar o prazo retornado; não contornar por outra subconta |
429 |
Aguardar o limite renovar; reduzir consultas concorrentes |
5xx ou timeout após envio |
Consultar a operação pelo ID/referência antes de repetir |
Envie external_id de até 64 caracteres em toda operação financeira que o aceite. Use um identificador persistente por intenção de negócio e mantenha todos os parâmetros iguais nos retries. Cobranças e saques cripto compartilham o espaço de referências da chave; use prefixos distintos. Não use a validação de divergência como mecanismo para alterar uma operação existente: a comparação varia por rota.
Para recuperar após timeout, consulte /cashin/charges?external_id=..., /cash-outs?external_id=... ou /payouts?external_id=..., conforme a operação. Se precisar repetir, mantenha o mesmo corpo e identificador. Não gere um novo ID apenas porque perdeu a resposta.
Salve IDs, valores, moeda/rede, customer_ref, timestamps, eventos processados e referências do extrato. Use centavos inteiros para BRL e strings decimais para cripto. Datas vêm com fuso explícito. Arredondamento e conversão devem seguir os valores devolvidos pela API.
Roteiro operacional: o que consultar e mostrar
| Situação | Verificação e ação | Mensagem para o cliente |
|---|---|---|
| PIX pago, cripto pendente | Consulte GET /cashin/{id}/status. paid com liquidação pending, sending ou incerto não é entrega confirmada. Preserve o ID e acompanhe; não gere outro pagamento. Em falha, resultado incerto ou ausência persistente de progresso, envie o ID ao suporte. |
“Pagamento recebido; entrega em acompanhamento.” Informe a última atualização, sem inventar prazo. |
| Crédito em custódia ainda não disponível | Consulte status e GET /saldo?customer_ref=... no mesmo escopo da cobrança. Confira retido/disponível e a data retornada. Retenção do provedor, retenção local e carência são condições diferentes. |
“Valor recebido; disponibilidade conforme a condição e o prazo informados.” Não mostre saldo total como sacável. |
| Webhook não chegou | Consulte o status canônico e GET /webhooks/deliveries. Confira URL, ambiente, assinatura, timeout e HTTP do receptor. Corrija o receptor antes de reenviar o event_id existente. Ausência na fila não prova que o pagamento falhou. |
Use o estado confirmado pela consulta da operação; o aviso atrasado não muda a situação financeira. |
| Resposta perdida após POST | Procure a operação com o external_id persistido na listagem do fluxo. Se encontrada, acompanhe-a. Se ainda ausente, reconcilie com backoff e mantenha corpo/ID; ausência imediata não prova que o pedido não foi aceito. |
“Solicitação em verificação.” Não pedir outro PIX nem criar outra intenção automaticamente. |
| Rota/moeda indisponível ou mínimo não atingido | Atualize o catálogo correto e leia erro, acao e o mínimo retornado. Antes do pagamento, peça nova escolha ao cliente. Depois do pagamento, acompanhe a operação e escale; não troque rede, moeda ou endereço silenciosamente. |
Explique a restrição específica e as opções verificadas, sem prometer outra rota. |
| Comissão não apareceu | Confira a taxa gravada na cobrança, conclusão da liquidação e extrato da comissão. Diferencie atraso de apuração, taxa zero e estorno. Leve divergência ao suporte com o ID original. | “Comissão em conferência.” Não prometa crédito retroativo por alterar a configuração. |
Em qualquer fluxo, um painel com dados antigos deve mostrar “última atualização” e o estado de conexão. Não transforme timeout, resposta vazia ou ausência de webhook em sucesso ou falha financeira. Uma operação em estado incerto exige conciliação; nunca envie manualmente outra transferência apenas para remover o alerta.
Ao acionar o grupo humano, envie ambiente, ID da operação, external_id, horário com fuso, código HTTP, erro/acao, request_id quando disponível e os últimos estados consultados. Para webhook, acrescente event_id e HTTP/horário da tentativa, com logs sanitizados. Não envie chave, segredo, monitor privado, CPF completo ou payload contendo dados de clientes na comunidade aberta. Não há prazo universal de suporte ou de liquidação garantido por este manual.
O Fable pode seguir o roteiro estruturado de incidentes. Ele orienta consultas e conciliação; não concede autorização para sacar, alterar taxas ou reenviar dinheiro.
12. Sandbox e testes de integração#
Execute node sandbox.mjs all ou python3 sandbox.py all no kit. Os exemplos confirmam a chave de teste, simulam pagamento PIX e percorrem custódia, saque USDC/Base, payout, BTC, USDC/Polygon e cash-out. Para cash-in/payout use sandbox_scenario; retenção, devolução, falha de entrega e resultado incerto estão detalhados no guia. GET /sandbox/events permite inspecionar eventos; callbacks configurados usam a fila assinada do produto. Preços e prazos são sintéticos, não condições reais da corretora parceira.
Carteira USDT/USDC: a chave de teste usa o simulador da carteira, com as mesmas rotas e formas. Depósito .02 expira; PIX .01 passa por revisão, .02 falha e devolve a reserva, .05 é lento. Detalhes na seção Carteira USDT/USDC.
No cash-out de sandbox, as duas primeiras casas decimais de amount selecionam o cenário:
| Final do valor | Cenário |
|---|---|
.00 |
Caminho de sucesso simulado |
.01 |
Retenção/demora simulada; conclusão posterior |
.02 |
Falha |
.03 |
Cotação expira em 5 segundos |
.04 |
Recusa por limite, com limits |
.05 |
Conclusão lenta, aproximadamente 2 minutos |
.06 |
Recusa do provedor, pagador_recusado_pelo_provedor |
.07 |
Primeiro aceite retorna 503; novo aceite da mesma ordem funciona |
.08 |
Recusa por limite do pagador |
Ordens de teste são temporárias e não representam depósitos reais. Sandbox não certifica prazo, preço, disponibilidade de provedor ou crédito em custódia de produção. Para cash-in e saldo, exercite as rotas de simulação e os cenários documentados. O piloto real posterior usa o mínimo aceito pela rota e pelo pagador, com valor e destinatário autorizados.
13. Onde ler a regra vigente#
| Fato | Fonte da API |
|---|---|
| Capacidades, limite por operação e rate limit da chave | GET /keys/me |
| Limite do pagador e faixas de retenção | GET /cashin/limits?payer_tax=... |
| Disponível, bloqueado, carência e taxas de custódia | GET /saldo no escopo da conta |
| Moedas/redes para entregar cripto | GET /cashin/catalog com entregavel: true |
| Moedas/redes para receber cripto externa | GET /catalog e, quando aplicável, /catalog/dex |
| Conversão de PIX para cripto e mínimo da rota | POST /cashin/preview |
| Conversão de cripto externa para PIX | POST /cash-outs/preview e cotação criada |
| Validade real de uma cobrança/cotação | expires_at da própria operação |
| Liberação, conclusão e comprovantes | GET de status, webhook e extrato |
GET /keys/me não contém sozinho todas as condições. Um limite diário null significa ausência daquele teto na chave; os limites por pagador, recebedor, operação, saldo e eventual mandate continuam valendo. Não programe números de catálogo, taxa, prazo ou limite a partir de um exemplo deste manual.
14. Comissão, agentes e operações adicionais#
Configurar a comissão do parceiro
A sub fee é a comissão do parceiro, adicionada à taxa da Lunium. 100 bps = 1%; 200 bps = 2%. Consulte a política e o teto permitido em GET /comissao antes de configurar. O exemplo abaixo altera o preço das novas cobranças da chave; só aplique a taxa acordada com o responsável pelo projeto.
curl --fail-with-body -X PATCH https://api.luniumpay.com/keys/me \
-H "X-API-Key: $LUNIUM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"partner_fee_bps":200}'
Confira o valor persistido em GET /keys/me. A taxa fica registrada em cada nova cobrança: alterar a configuração não recalcula cobranças abertas nem cria comissão retroativa. No Telegram, /comissao consulta; /comissao 2 apresenta a mudança e sua confirmação. O administrador deve conferir a identidade da chave e usar o comando de confirmação devolvido pelo bot, incluindo o ID da chave. Não confirme em nome de outro projeto.
Separar taxa, comissão, câmbio e quantidade entregue
No cash-in, a base é o valor recebido menos a taxa fixa da Lunium. Sobre essa base incidem os percentuais da Lunium e do parceiro. No depósito em saldo, desconta-se somente R$ 1,00: não há percentual, faixa ou comissão. Os parâmetros da cobrança e os valores retornados pela operação prevalecem sobre exemplos.
Exemplo didático em centavos, sem representar uma oferta vigente: recebido 10000 (R$ 100), taxa fixa 100 (R$ 1), Lunium 200 bps (2%) e parceiro 100 bps (1%).
| Componente | Valor do exemplo |
|---|---|
| Base após taxa fixa | R$ 99,00 |
| Líquido sem comissão do parceiro | R$ 97,02 |
| Líquido com comissão, antes da conversão | R$ 96,03 |
| Taxa Lunium, incluindo a fixa | R$ 2,98 |
| Comissão do parceiro | R$ 0,99 |
| Conferência | R$ 96,03 + R$ 2,98 + R$ 0,99 = R$ 100,00 |
O cálculo usa floor(base_cents * (10000 - lunium_bps - partner_bps) / 10000). A comissão é a diferença entre o líquido sem e com a sub fee, preservando o arredondamento do produto. Não aplique um segundo desconto de comissão sobre a quantidade já cotada.
POST /cashin/preview pode retornar lunium_fee_cents, partner_fee_cents, fee_total_cents, net_cents e a estimativa de cripto em asset_amount, já líquida da taxa de saque da rede (withdraw_fee). Nos retornos com essa decomposição, fee_total_cents + net_cents = amount_cents. Nos campos legados brl_per_usdt e usdt_amount, confira o ativo retornado: o nome do campo pode permanecer igual para USDC.
Câmbio não é outra comissão do parceiro. A conversão usa o ask da Binance, sem o antigo ágio. A taxa Lunium e a comissão são calculadas separadamente da cotação. A prévia de cash-in é estimativa, não trava o câmbio até o pagamento. Custos e mínimos da rota/rede também podem afetar a entrega: leia os campos aplicáveis do catálogo e da resposta. Não some withdrawFee cegamente a uma quantidade que já o considera. Confira a quantidade efetivamente liquidada no status e no comprovante da operação.
No depósito em custódia, o resultado é BRL, sem compra imediata de cripto. O saque posterior tem suas próprias taxas/conversão. A prévia de cash-in não é uma prévia completa do saque custodial. Para payout PIX, a resposta separa fee_service_total_cents (Lunium + parceiro) e fee_provider_cents; fee_cents é o total. Comissão do parceiro, saldo dos clientes e lucro da Lunium são contas distintas; uma diferença entre cotação e entrega, isoladamente, não comprova lucro.
Crédito, extrato e saque da comissão
- Consulte
GET /comissao:disponivel_cents,creditado_cents,estornado_cents,sacado_cents,min_saque_cents,pode_sacar_agora,proximo_saque_emepolitica. - Confira
GET /comissao/extrato?limit=50. Usenext_beforecomobeforena próxima página. Relacioneorigem_idcom a cobrança ou saque; leiakind,valor_centsepartner_fee_bps. - A apuração ocorre após
status=paidesettlement_status=sent, em processo posterior à liquidação. O PIX pago sozinho não comprova comissão disponível. Novos depósitos em saldo não geram comissão. Compras e saídas usam a comissão da família correspondente; consulte os valores gravados da operação. Sandbox não acumula comissão real. - Movimentos
credito,estorno,saqueesaque_estornoexplicam o saldo. Confira os sinais e não conte o mesmo lançamento duas vezes. Se uma operação elegível não aparecer após a apuração, envie seu ID ao grupo humano para conciliação; não altere a taxa esperando corrigir o passado. - Para sacar, consulte a política vigente, o saldo e a rota entregável. O mínimo convertido em BRL (hoje US$ 10 pela cotação do momento) e a janela entre saques vêm da API; se
min_saque_centsfornull, não há cotação para validar o mínimo.pode_sacar_agoranão substitui as validações da rede, endereço, memo, liquidez e mínimo da rota.
POST /comissao/sacar recebe amount_cents, asset, chain, payout_address, eventual payout_tag e external_id. O saque não cobra outra sub fee nem taxa administrativa da Lunium, mas a conversão e os custos da rota continuam relevantes. A resposta contém saque e comissao; acompanhe o identificador público de saque em GET /cashin/{cashin_id}/status até confirmar a entrega. Não confunda sucesso HTTP com cripto entregue.
Use um prefixo próprio, como comissao-..., para external_id: o espaço de referências é compartilhado com cobranças. Após timeout, primeiro procure /cashin/charges?external_id=... e acompanhe o ID existente. O saque valida política e intervalo antes de procurar a referência; portanto, um retry pode responder 429 mesmo que o pedido anterior tenha sido aceito. Não gere outro ID nem repita saques concorrentes para tentar destravar.
PATCH /keys/me aceita partner_fee_bps para a sub fee. Consulte política, disponível e condições de saque em GET /comissao; movimentos em GET /comissao/extrato; saque em POST /comissao/sacar. Comissão é um saldo separado da custódia dos clientes. Não some os dois nem trate comissão como recompensa de indicação do Mesh.
Para agentes, Mesh publica descoberta, registro, validação, mandate e ativação. Use GET /mesh e suas ações retornadas. O MCP está em https://api.luniumpay.com/mcp; descubra as ferramentas via tools/list, pois a superfície de ferramentas não é idêntica a todas as rotas HTTP. Operações sem ferramenta dedicada continuam disponíveis pela API autenticada.
O inventário abaixo é gerado do OpenAPI desta revisão. Inclui também consulta de entregas de webhook, recuperação do painel, catálogo DEX, comissão e ciclo de vida Mesh. Rotas administrativas e internas não são interfaces públicas do parceiro.
| Método / Method | Rota / Route | Operação / Operation |
|---|---|---|
GET |
/cash-outs |
Listar ordens |
POST |
/cash-outs |
Cotar (passo 1 de 3) |
POST |
/cash-outs/preview |
Prévia de cotação (não cria ordem) |
GET |
/cash-outs/{cashout_id} |
Acompanhar (passo 3 de 3) |
POST |
/cash-outs/{cashout_id}/accept |
Aceitar e receber o endereço (passo 2 de 3) |
POST |
/cash-outs/{cashout_id}/refund-address |
Informar a carteira confirmada para devolução pendente |
GET |
/cashin/catalog |
Catálogo do cash-in (o que entregamos ao receber PIX) |
POST |
/cashin/charge |
Gerar cobrança PIX para custódia BRL ou entrega de cripto |
GET |
/cashin/charges |
Lista/recupera cobrancas de cash-in desta chave |
GET |
/cashin/events |
Feed de eventos da sua chave (operação) |
GET |
/cashin/limits |
How much this taxpayer can pay right now |
POST |
/cashin/preview |
Cotação de cash-in — não cria nada |
GET |
/cashin/{cashin_id}/status |
State of a PIX charge |
GET |
/catalog |
Ativos, redes e limites que liquidam agora |
GET |
/catalog/dex |
Tokens long-tail negociáveis por DEX |
GET |
/comissao |
Saldo da sub fee (comissão do parceiro) |
GET |
/comissao/extrato |
Extrato da comissão |
POST |
/comissao/sacar |
Sacar a comissão em cripto |
POST |
/keys |
Criar chave (self-service) |
GET |
/keys/me |
Limites vigentes e uso do dia |
PATCH |
/keys/me |
Atualiza a chave (nome, settlement, webhook, rotações) |
POST |
/keys/painel-link |
Receber o link do painel por e-mail (sem chave) |
POST |
/keys/sandbox |
Get a sandbox API key — one call, no API key needed |
POST |
/leads |
Encaminhar um caso comercial ou técnico para uma pessoa |
GET |
/mesh |
Tudo que um agente precisa saber antes de integrar |
GET |
/mesh/agents |
Quem esta na rede |
POST |
/mesh/agents |
Cadastrar um agente e receber credencial de sandbox |
GET |
/mesh/agents/{agent_id} |
Estado, mandate, metricas e linhagem de um agente |
POST |
/mesh/agents/{agent_id}/mandate |
Definir a propria politica de limites |
GET |
/mesh/agents/{agent_id}/network |
Linhagem, arvore e volume de rede |
POST |
/mesh/agents/{agent_id}/production-request |
Ativar producao (automatico, sem humano) |
GET |
/mesh/agents/{agent_id}/rewards |
Saldo de recompensas e extrato do ledger |
POST |
/mesh/agents/{agent_id}/settlement |
Dizer para onde o dinheiro vai |
POST |
/mesh/agents/{agent_id}/validate |
Provar que o sandbox foi exercitado |
GET |
/mesh/economy |
Regras publicas da economia da rede |
GET |
/mesh/graph |
Grafo de agentes do Mesh |
POST |
/mesh/referrals |
Emitir uma attestation de indicacao |
GET |
/payouts |
Lista os payouts desta chave |
POST |
/payouts |
Send a PIX directly (no crypto leg) |
GET |
/payouts/{payout_id} |
State of a payout |
GET |
/ping |
Saúde da API |
GET |
/pix/keys/lookup |
Consultar titular PIX quando a verificação estiver disponível |
GET |
/saldo |
BRL balance (custody) — available, on hold, next releases |
GET |
/saldo/clientes |
Subcontas (clientes finais) com saldo, paginadas |
GET |
/saldo/consolidado |
Consolidado da chave: casa + clientes (custódia total) |
GET |
/saldo/extrato |
Balance statement (movements, newest first) |
POST |
/saldo/sacar-cripto |
Withdraw BRL balance as crypto to a self-custodial wallet |
POST |
/saldo/transferir |
Transferência interna entre subcontas e a casa (sem PIX) |
GET |
/sandbox |
Discover sandbox capabilities |
POST |
/sandbox/cashin/{cashin_id}/pay |
Simulate payment of a test PIX charge |
GET |
/sandbox/events |
Inspect generated sandbox events |
POST |
/sandbox/operations/{operation_id}/resolve |
Resolve an uncertain sandbox operation |
GET |
/sandbox/qr/{cashin_id}.svg |
Non-payable sandbox QR image |
POST |
/sandbox/reset |
Reset this key’s fictitious state |
GET |
/v1/verificar/{e2e} |
Confirmar que um PIX aconteceu (aberto, sem chave) |
GET |
/webhooks/deliveries |
Historico de entregas de webhook desta chave |
POST |
/webhooks/deliveries/{event_id}/retry |
Reenviar um evento |
POST |
/webhooks/test |
Disparar um evento de teste agora |
15. Checklist de produção#
- Comissão configurada na chave correta; decomposição e extrato conciliados sem desconto duplicado.
- E-mail de recuperação conferido; monitor, chave da API e segredo do webhook tratados separadamente.
- Roteiro de incidentes ensaiado; recursos em desenvolvimento não assumidos como disponíveis.
- Participação no Lunium Partners fortemente recomendada para os responsáveis técnico e operacional; acompanhamento de avisos e mudanças definido.
- Grupo dedicado com @luniumb2b e @luniumb2c fortemente recomendado, criado pela Lunium ou pelo parceiro, com responsáveis definidos.
- Monitor privado conferido; painel próprio autorizado por projeto/cliente, com indicação de última atualização.
- Inbox durável, duplicatas, eventos fora de ordem, indisponibilidade, retry e reconciliação do webhook testados.
- Chave guardada no servidor; ambiente de teste separado de produção.
/keys/mee/saldoconferidos para a chave e para o escopo de cada cliente.- Custódia usa
destino: "saldo"; carteira é escolhida somente na retirada em cripto. - Interface lê catálogo e limites atuais, mostra retenção e exige memo quando necessário.
- IDs persistidos; retries mantêm corpo e
external_id; recuperação após timeout testada. - Webhook verifica HMAC e timestamp, deduplica por evento e responde antes do timeout.
- Conciliação distingue PIX pago, crédito registrado, disponível para saque e cripto entregue.
- Erros de saldo, carência, rota, taxa, provedor e chave são tratados sem duplicar operações.
- Telegram vinculado por admin identificado; retiradas confirmadas no contexto correto.
- Homologação inclui sucesso, retenção, expiração, falha, reenvio e consulta após perda de resposta.
Suporte: @luniumb2b · @luniumb2c · contato@luniumpay.com. Acompanhe status e o Lunium Partners. Ao pedir ajuda, envie IDs e request_id quando disponível, sem compartilhar a chave completa.
16. O que mudou nesta revisão#
- 09/10/2026 · OpenAPI 1.44.1 · revisão 2026-10-09.1: Sandbox:
POST /sandbox/operations/{operation_id}/resolveresponde400 outcome_invalidoquandooutcomenão ésentnemfailed(antes, um corpo semoutcomepodia responder 200 sem resolver nada); a checagem vem antes de procurar a operação, e nada muda no simulador. Saldo: emGET /saldo,proximas_liberacoespode trazer até 200 liberações do escopo pedido (antes, no máximo 20); o formato e o escopo (casa oucustomer_ref) não mudam. - 08/10/2026 · OpenAPI 1.44.0 · revisão 2026-10-08.2: Venda de DePix:
refund_addressdeixa de ser obrigatória na criação; a carteira de devolução só é pedida se a venda falhar (Carteira de devolução). Sem carteira, a ordem fica emAWAITING_REFUND_ADDRESS(webhookcashout.awaiting_refund_address) e você informa o endereço Liquid emPOST /cash-outs/{cashout_id}/refund-address; a ordem segue paraREFUNDINGeREFUNDED, com webhooks. Erros:400 refund_address_invalida(inclui endereço da própria Lunium),409 refund_address_imutavele409 devolucao_indisponivel. DePix que já tinha sido enviado ao provedor só é devolvido depois de o retorno ser confirmado: até lá a ordem fica emMANUAL_REVIEW, e a devolução é de no máximo o que voltou. Odetailda recusa por limite do pagador comallow_hold: falsefoi revisado e mostra valores em R$ no formato brasileiro (R$ 1.234,56), assim como a explicação deGET /cashin/limits;erroecodenão mudam. Saque da comissão a partir de US$ 10. Painel do parceiro (2): ativação de conta nova com código de 6 dígitos por e-mail; convite aceito num clique por quem entra por código ou Google; Meu acesso com Encerrar as outras sessões, verificação em dois passos que a conta sem senha desliga com código e e-mail de aviso quando a senha muda; e-mail aos donos quando alguém deixa de ser dono; Pagar com cripto com stablecoins e as 30 principais criptos; mais legibilidade e sessão de 12 horas que se renova com o uso. Novo fluxograma da venda de cripto (venda e devolução) na seção 8. - 08/10/2026 · OpenAPI 1.43.1: o pedido de depósito da Carteira USDT/USDC vale 1 hora (
deposit_validity_hours= 1;expires_at= criação + 1 h; antes eram 3 h). Nova seção Novo painel do parceiro (2): parceiros.luniumpay.com com resumo do negócio, comprovantes em PDF, carteira com QR Code do endereço e contagem regressiva, notificações e equipe com papéis e segundo fator. Pelo painel, só o Dono vincula o Telegram e troca a carteira de liquidação e as sub fees. Fluxograma da carteira (depósito e PIX pago com o saldo) na seção Carteira USDT/USDC. - 07/10/2026 · OpenAPI 1.43.0: Carteira USDT/USDC (
/carteira-usdt): depósito de USDT ou USDC em várias redes, PIX pago com o saldo (chave ou Copia e Cola), extrato, webhookswallet.*e simulador no sandbox. - 07/10/2026: a prévia de cash-in (
POST /cashin/preview) passa a usar em produção os mesmos nomes do sandbox:asset_amount(o que chega na carteira),withdraw_fee(taxa de saque da rede, em unidades do ativo),withdraw_minebrl_per_asset(para converter em reais).amountenetwork_minseguem como nomes antigos. - 03/10/2026: seção Comprovante oficial do PIX (8): o que o comprovante contém, as quatro formas (
pix_e2e,receipt_url,receipt_pdf_url,verify_url) e por onde ele chega (API, webhook, painel do parceiro e Telegram). - Taxas e comissões conciliadas em exemplo; recuperação de acesso e cenários de incidente detalhados.
- Fontes estruturadas para IA alinhadas ao OpenAPI; capacidades futuras dependem de publicação e validação.
- Lunium Partners destacado como comunidade oficial no início, na operação pelo Telegram e no checklist.
- Recomendação do grupo humano restaurada: @luniumb2b e @luniumb2c, com criação pela Lunium ou pelo parceiro.
- Monitor privado, feed, painel ao vivo, estados por fluxo, assinatura, recuperação e homologação detalhados.
- Revisão desta atualização focada em suporte e acompanhamento; versão do OpenAPI referenciada atualizada.
- Fluxo de custódia sem carteira fixa e saques pelo Telegram documentados.
- Padrão de
destinoda API separado do padrão do bot. - Taxas e limites vinculados às consultas corretas; removidas promessas fixas de preço e prazo.
- Retenção local, retenção do provedor e carência de saldo diferenciadas.
- Catálogos de entrada e entrega separados, incluindo filtro
entregavele restrição de Liquid/DePix no saque. - Titular PIX opcional/indisponível e
br_codecondicionado à disponibilidade. - Timeout de webhook corrigido para 10 segundos, assinatura robusta e recuperação de falhas.
- Estados, campos, exemplos e inventário do OpenAPI revisados junto das rotas.
- HTML, Markdown e PDF gerados do mesmo conteúdo, com validações de contrato antes de publicar.
Baixar PDF · Markdown · Exemplos estruturados · Revisão do contrato

