{
  "_sobre": "Fatos publicáveis da Lunium, gerados a partir da produção. Cada bloco diz de onde veio. Não contém segredo, dado pessoal nem volume financeiro.",
  "_gerador": "bin/gerar-verdade.mjs",
  "gerado_em": "2026-09-07T05:13:59.980Z",
  "contrato": {
    "openapi_versao": "1.25.0",
    "openapi_spec": "3.1.0",
    "url_spec": "https://api.luniumpay.com/openapi.json",
    "origem_da_spec": "arquivo local docs/openapi.json (pré-deploy)",
    "base_url": "https://api.luniumpay.com",
    "autenticacao": "Header X-API-Key. Chave de sandbox em uma chamada: POST /keys/sandbox.",
    "endpoints_publicos_total": 34,
    "endpoints": [
      {
        "metodo": "GET",
        "caminho": "/cash-outs",
        "resumo": "Listar ordens"
      },
      {
        "metodo": "POST",
        "caminho": "/cash-outs",
        "resumo": "Cotar (passo 1 de 3)"
      },
      {
        "metodo": "GET",
        "caminho": "/cash-outs/{cashout_id}",
        "resumo": "Acompanhar (passo 3 de 3)"
      },
      {
        "metodo": "POST",
        "caminho": "/cash-outs/{cashout_id}/accept",
        "resumo": "Aceitar e receber o endereço (passo 2 de 3)"
      },
      {
        "metodo": "POST",
        "caminho": "/cash-outs/preview",
        "resumo": "Prévia de cotação (não cria ordem)"
      },
      {
        "metodo": "GET",
        "caminho": "/cashin/{cashin_id}/status",
        "resumo": "State of a PIX charge"
      },
      {
        "metodo": "GET",
        "caminho": "/cashin/catalog",
        "resumo": "Catálogo do cash-in (o que entregamos ao receber PIX)"
      },
      {
        "metodo": "POST",
        "caminho": "/cashin/charge",
        "resumo": "Gerar cobrança PIX para entregar cripto"
      },
      {
        "metodo": "GET",
        "caminho": "/cashin/charges",
        "resumo": "Lista/recupera cobrancas de cash-in desta chave"
      },
      {
        "metodo": "GET",
        "caminho": "/cashin/events",
        "resumo": "Feed de eventos da sua chave (operação)"
      },
      {
        "metodo": "GET",
        "caminho": "/cashin/limits",
        "resumo": "How much this taxpayer can pay right now"
      },
      {
        "metodo": "POST",
        "caminho": "/cashin/preview",
        "resumo": "Cotação de cash-in — não cria nada"
      },
      {
        "metodo": "GET",
        "caminho": "/catalog",
        "resumo": "Ativos, redes e limites que liquidam agora"
      },
      {
        "metodo": "GET",
        "caminho": "/catalog/dex",
        "resumo": "Tokens long-tail negociáveis por DEX"
      },
      {
        "metodo": "POST",
        "caminho": "/keys",
        "resumo": "Criar chave (self-service)"
      },
      {
        "metodo": "GET",
        "caminho": "/keys/me",
        "resumo": "Limites, uso e tier atual"
      },
      {
        "metodo": "PATCH",
        "caminho": "/keys/me",
        "resumo": "Atualiza a chave (nome, settlement, webhook, rotações)"
      },
      {
        "metodo": "POST",
        "caminho": "/keys/painel-link",
        "resumo": "Receber o link do painel por e-mail (sem chave)"
      },
      {
        "metodo": "POST",
        "caminho": "/keys/sandbox",
        "resumo": "Get a sandbox API key — one call, no signup"
      },
      {
        "metodo": "GET",
        "caminho": "/payouts",
        "resumo": "Lista os payouts desta chave"
      },
      {
        "metodo": "POST",
        "caminho": "/payouts",
        "resumo": "Send a PIX directly (no crypto leg)"
      },
      {
        "metodo": "GET",
        "caminho": "/payouts/{payout_id}",
        "resumo": "State of a payout"
      },
      {
        "metodo": "GET",
        "caminho": "/ping",
        "resumo": "Saúde da API"
      },
      {
        "metodo": "GET",
        "caminho": "/pix/keys/lookup",
        "resumo": "Who owns this Pix key (DICT) — verify the recipient BEFORE paying"
      },
      {
        "metodo": "GET",
        "caminho": "/saldo",
        "resumo": "BRL balance (custody) — available, on hold, next releases"
      },
      {
        "metodo": "GET",
        "caminho": "/saldo/clientes",
        "resumo": "Subcontas (clientes finais) com saldo, paginadas"
      },
      {
        "metodo": "GET",
        "caminho": "/saldo/consolidado",
        "resumo": "Consolidado da chave: casa + clientes (custódia total)"
      },
      {
        "metodo": "GET",
        "caminho": "/saldo/extrato",
        "resumo": "Balance statement (movements, newest first)"
      },
      {
        "metodo": "POST",
        "caminho": "/saldo/sacar-cripto",
        "resumo": "Withdraw BRL balance as crypto to a self-custodial wallet"
      },
      {
        "metodo": "POST",
        "caminho": "/saldo/transferir",
        "resumo": "Transferência interna entre subcontas e a casa (sem PIX)"
      },
      {
        "metodo": "GET",
        "caminho": "/v1/verificar/{e2e}",
        "resumo": "Confirmar que um PIX aconteceu (aberto, sem chave)"
      },
      {
        "metodo": "GET",
        "caminho": "/webhooks/deliveries",
        "resumo": "Historico de entregas de webhook desta chave"
      },
      {
        "metodo": "POST",
        "caminho": "/webhooks/deliveries/{event_id}/retry",
        "resumo": "Reenviar um evento"
      },
      {
        "metodo": "POST",
        "caminho": "/webhooks/test",
        "resumo": "Disparar um evento de teste agora"
      }
    ],
    "origem": "GET https://api.luniumpay.com/openapi.json"
  },
  "produtos": [
    {
      "id": "cash_in",
      "nome": "Cash-in",
      "descricao": "O cliente paga um PIX e a stablecoin (ou o saldo em reais) é entregue.",
      "endpoints": [
        "POST /cashin/preview",
        "POST /cashin/charge",
        "GET /cashin/{cashin_id}/status",
        "GET /cashin/charges",
        "GET /cashin/catalog",
        "GET /cashin/limits"
      ]
    },
    {
      "id": "cash_out",
      "nome": "Cash-out",
      "descricao": "O cliente envia cripto e uma chave PIX (ou uma cobrança copia e cola) recebe reais.",
      "endpoints": [
        "POST /cash-outs/preview",
        "POST /cash-outs",
        "POST /cash-outs/{cashout_id}/accept",
        "GET /cash-outs/{cashout_id}",
        "GET /catalog"
      ]
    },
    {
      "id": "saldo",
      "nome": "Saldo custodial em reais",
      "descricao": "Reais guardados por subconta (customer_ref): depósito por PIX, saque por PIX ou em cripto.",
      "endpoints": [
        "GET /saldo",
        "GET /saldo/extrato",
        "GET /saldo/clientes",
        "GET /saldo/consolidado",
        "POST /saldo/transferir",
        "POST /saldo/sacar-cripto"
      ]
    },
    {
      "id": "payouts",
      "nome": "Payout PIX",
      "descricao": "PIX direto em reais, sem perna cripto, debitado do saldo.",
      "endpoints": [
        "POST /payouts",
        "GET /payouts",
        "GET /payouts/{payout_id}"
      ]
    },
    {
      "id": "verificacao",
      "nome": "Verificação aberta",
      "descricao": "Qualquer pessoa confere um PIX pelo EndToEndId, sem chave.",
      "endpoints": [
        "GET /v1/verificar/{e2e}"
      ],
      "sem_chave": true
    }
  ],
  "ativos": {
    "instantaneo": {
      "descricao": "Trilho próprio: liquidação em segundos, sem corretora no caminho.",
      "cash_in": [
        {
          "ativo": "USDT",
          "rede": "polygon"
        },
        {
          "ativo": "USDC",
          "rede": "polygon"
        }
      ],
      "cash_out": [
        {
          "ativo": "USDT",
          "rede": "polygon"
        },
        {
          "ativo": "USDC",
          "rede": "polygon"
        }
      ]
    },
    "via_corretora": {
      "descricao": "Depósito na corretora, conversão e liquidação; o prazo é o das confirmações da rede.",
      "cash_out_ativos": 1479,
      "cash_out_pares_ativo_rede": 1669,
      "cash_out_redes": 241,
      "cash_in_rotas": 1795,
      "cash_in_redes": 282
    },
    "dex": {
      "descricao": "Tokens long-tail por DEX (mande token_address na cotação).",
      "redes": [
        "polygon"
      ]
    },
    "memo_obrigatorio": {
      "descricao": "Redes de endereço compartilhado: o depósito precisa levar o memo/tag (deposit_tag no aceite; payout_tag na compra).",
      "redes": [
        "algo",
        "atom",
        "eos",
        "hbar",
        "kava",
        "luna",
        "ton",
        "xlm",
        "xrp"
      ]
    },
    "catalogos_ao_vivo": {
      "cash_out": "https://api.luniumpay.com/catalog",
      "cash_in": "https://api.luniumpay.com/cashin/catalog"
    },
    "atualizado_em": "2026-09-07T05:05:03.512Z",
    "origem": "GET https://api.luniumpay.com/catalog e GET https://api.luniumpay.com/cashin/catalog"
  },
  "limites": {
    "por_operacao": {
      "cashin": {
        "min_brl_cents": 100,
        "max_brl_cents": 600000
      },
      "payout": {
        "min_brl_cents": 100,
        "max_brl_cents": 600000
      },
      "cashout": {
        "min_brl_cents": 600,
        "max_brl_cents": 25000000
      }
    },
    "por_pagador": {
      "applies_to": [
        "cash-in"
      ],
      "first_transaction_cents": 6000,
      "first_window_cents": 20000,
      "first_window_hours": 24,
      "mature_daily_cents": 600000,
      "nota": "Por CPF/CNPJ do pagador. Consulte o disponível de um pagador em GET /cashin/limits?payer_tax="
    },
    "por_recebedor": {
      "applies_to": [
        "cash-out"
      ],
      "daily_cents": 10000000,
      "scope": "cpf_cnpj",
      "nota": "Por CPF/CNPJ de quem recebe o PIX, somado no dia (renova à meia-noite, horário de Brasília). Quando a chave PIX não é um documento (e-mail, telefone, aleatória), o teto vale por chave — nunca pedimos o CPF de quem vende."
    },
    "validade_do_qr_minutos": 15,
    "tiers": [
      {
        "nome": "Início",
        "liquidado_minimo_cents": 0,
        "limite_diario_cents": 500000
      },
      {
        "nome": "Crescimento",
        "liquidado_minimo_cents": 5000000,
        "limite_diario_cents": 2500000
      },
      {
        "nome": "Escala",
        "liquidado_minimo_cents": 50000000,
        "limite_diario_cents": 10000000
      }
    ],
    "nota": "Os limites por operação são POR CHAVE e a resposta de GET /keys/me é a fonte: leia de lá em vez de fixar no código. Tetos acima do tier são contratados.",
    "origem": "GET https://api.luniumpay.com/keys/me → limits; tiers em src/lib/tiers.js"
  },
  "retencao": {
    "escada_do_pagador": {
      "aplica_a": "cash-in (PIX → cripto ou saldo), por CPF/CNPJ de QUEM PAGA",
      "estreia_cents": 6000,
      "primeiras_24h_cents": 20000,
      "maduro_dia_cents": 600000,
      "consulta": "GET /cashin/limits?payer_tax=",
      "origem": "GET /keys/me → limits.payer_limits"
    },
    "retido_no_provedor": {
      "descricao": "Acima da escada instantânea, o QR ainda é aceito: o provedor segura o valor por 24h (D+1) antes de liberar. O parceiro desliga com allow_hold:false e recebe 403 dizendo quanto cabe na hora.",
      "horas": 24,
      "teto_dia_cents": 600000,
      "campos_na_resposta": [
        "held",
        "delay_until"
      ],
      "origem": "PAYER_DELAY_HOURS / PAYER_DELAY_MAX_CENTS (configuração do serviço)"
    },
    "carencia_do_saldo": {
      "descricao": "Depósito em saldo custodial aparece na hora e fica utilizável depois da carência; o primeiro depósito de uma subconta trava saques por 24h.",
      "horas_padrao": 24,
      "campos_na_resposta": [
        "carencia_horas",
        "liberar_em",
        "carencia_ate"
      ],
      "origem": "GET /saldo (carencia_horas) e saldo_hold_hours da chave"
    },
    "invariante": "Nenhum caminho de liquidação envia antes de a retenção vencer: o gate é verificado na liquidação e repetido na própria reivindicação SQL (fail-closed)."
  },
  "estados": {
    "cash_in": [
      "pending",
      "paid",
      "settled",
      "refunded",
      "expired"
    ],
    "cash_out": [
      "QUOTE_CREATED",
      "AWAITING_DEPOSIT",
      "DEPOSIT_DETECTED",
      "DEPOSIT_CONFIRMED",
      "SELLING",
      "SOLD",
      "FORWARDING",
      "PAYING_OUT",
      "COMPLETED",
      "REFUNDING_CRYPTO",
      "REFUNDED",
      "MANUAL_REVIEW",
      "EXPIRED",
      "FAILED"
    ],
    "payout": [
      "requested",
      "processing",
      "sent",
      "failed",
      "refunded"
    ],
    "origem": "OpenAPI (schemas CashOut/Cobranca/Payout) e máquina de estados do orquestrador"
  },
  "seguranca": [
    {
      "id": "webhook_assinado",
      "descricao": "Todo webhook vai assinado em HMAC SHA-256 com timestamp (header X-Lunium-Signature, formato t=…,v1=…), o que impede replay de uma entrega capturada."
    },
    {
      "id": "idempotencia",
      "descricao": "external_id em cash-in, cash-out e payout: repetir a mesma chamada devolve a MESMA operação, nunca uma segunda. Parâmetros diferentes no mesmo external_id respondem 409."
    },
    {
      "id": "egress_validado",
      "descricao": "A URL de webhook é resolvida e validada antes de cada entrega: endereço interno, metadata de nuvem e redirect para rede privada são recusados, e a conexão é fixada no IP validado."
    },
    {
      "id": "retencao_fail_closed",
      "descricao": "A retenção é verificada na liquidação e repetida na reivindicação SQL: nenhum caminho (worker, consulta de status, fila) consegue liquidar antes da hora."
    },
    {
      "id": "payout_duravel",
      "descricao": "O saque grava a operação e debita o saldo na MESMA transação, antes de qualquer chamada ao provedor: não existe débito sem ordem para reconciliar."
    },
    {
      "id": "verificacao_aberta",
      "descricao": "GET /v1/verificar/{e2e} confere um PIX liquidado sem chave nenhuma — a contraparte não precisa confiar na nossa palavra."
    }
  ],
  "medicoes": [
    {
      "chave": "cashout_polygon_aceite_ate_pix_p50_s",
      "descricao": "Mediana do aceite da cotação até o PIX pago, vendas liquidadas na Polygon.",
      "valor": 81,
      "unidade": "segundos",
      "amostra": 27,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashout_eventos (carimbo do servidor a cada transição)"
    },
    {
      "chave": "cashout_polygon_aceite_ate_pix_p90_s",
      "descricao": "p90 do aceite até o PIX pago, vendas liquidadas na Polygon.",
      "valor": 580,
      "unidade": "segundos",
      "amostra": 27,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashout_eventos"
    },
    {
      "chave": "cashin_polygon_pix_ate_entrega_p50_s",
      "descricao": "Mediana do PIX recebido até a stablecoin entregue, trilho próprio na Polygon.",
      "valor": 6,
      "unidade": "segundos",
      "amostra": 112,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashin_charges (paid_at → settled_at)"
    },
    {
      "chave": "cashin_polygon_pix_ate_entrega_p90_s",
      "descricao": "p90 do PIX recebido até a stablecoin entregue, Polygon.",
      "valor": 70,
      "unidade": "segundos",
      "amostra": 112,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashin_charges"
    },
    {
      "chave": "cashin_operacoes_entregues",
      "descricao": "Compras (PIX → cripto) entregues na janela.",
      "valor": 122,
      "unidade": "operações",
      "amostra": 122,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashin_charges"
    },
    {
      "chave": "cashout_operacoes_completas",
      "descricao": "Vendas (cripto → PIX) concluídas na janela.",
      "valor": 27,
      "unidade": "operações",
      "amostra": 27,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashout_orders"
    },
    {
      "chave": "payouts_enviados_com_comprovante",
      "descricao": "Saques PIX enviados que têm EndToEndId (comprovante verificável) — o denominador da amostra é o total enviado.",
      "valor": 14,
      "unidade": "operações",
      "amostra": 14,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "payout_orders"
    },
    {
      "chave": "webhooks_entregues_30d",
      "descricao": "Webhooks entregues com 2xx nos últimos 30 dias; a amostra é o total tentado.",
      "valor": 214,
      "unidade": "entregas",
      "amostra": 275,
      "janela_dias": 90,
      "medido_em": "2026-09-07T05:13:59.980Z",
      "origem": "cashin_webhook_deliveries"
    }
  ],
  "links": {
    "documentacao": "https://docs.luniumpay.com",
    "documentacao_en": "https://docs.luniumpay.com/en/",
    "openapi": "https://api.luniumpay.com/openapi.json",
    "llms_txt": "https://docs.luniumpay.com/llms.txt",
    "status": "https://docs.luniumpay.com/status",
    "status_json": "https://docs.luniumpay.com/status.json",
    "manual_pdf": "https://docs.luniumpay.com/manual.pdf",
    "sandbox": "POST https://api.luniumpay.com/keys/sandbox",
    "contato": "contato@luniumpay.com"
  }
}
