On-ramp y off-ramp · Brasil
On-ramp y off-ramp en Brasil, en una API
Conecta el cobro por Pix con la entrega de USDT o USDC, o recibe criptomonedas y paga Pix. Con LuniumPay, tu aplicación también puede recibir Pix en saldo BRL y elegir el retiro después. Empieza por el flujo que corresponda a tu producto.
A quién va dirigido
- Empresas extranjeras que quieren vender, pagar o recibir fondos en Brasil sin montar una operación local desde cero.
- Exchanges, plataformas de intercambio o brokers que necesitan un par BRL sin operar un banco brasileño.
- Productos globales que ya tienen PIX en su hoja de ruta y no quieren tres proveedores para una sola función.
¿Qué son on-ramp y off-ramp?
On-ramp es la conversión de moneda tradicional a criptomonedas. En este flujo, el cliente paga Pix y la aplicación sigue la entrega del activo en la red elegida. Off-ramp es la conversión de criptomonedas a moneda tradicional: tras la cotización, la aceptación y el depósito confirmado, la operación continúa con el pago Pix.
Recibir Pix en custodia es una opción diferente: el saldo permanece en reales brasileños hasta que se solicita un retiro. Recibir el Pix no significa que el saldo ya se haya convertido en stablecoins.
| Objetivo | Flujo | Siguiente paso |
|---|---|---|
| El cliente paga Pix y recibe USDT o USDC | Cash-in con entrega directa; activo, red y dirección definidos en la solicitud de cobro. | Probar Pix a criptomonedas |
| El cliente deposita criptomonedas y recibe Pix | Cash-out: cotización, aceptación, instrucciones de depósito y conciliación. | Probar criptomonedas a Pix |
| La plataforma recibe Pix y decide el retiro después | Custodia en BRL; saldo disponible y retiros por Pix o en criptomonedas. | Probar custodia |
| El marketplace paga a los usuarios con su saldo | Payout Pix: débito del saldo y seguimiento del pago. | Ver guía de payouts |
El flujo de principio a fin
- Entrada:
POST /cashin/chargecrea un QR PIX identificado con el CPF/CNPJ de quien va a pagar. Tras el pago, sigue las posibles retenciones y la entrega de criptomonedas hasta el estado final. - Salida:
POST /cash-outscotiza,/acceptfija la cotización y devuelve la dirección; haces el depósito y una clave PIX recibe reales brasileños. - Custodia (opcional): con
destino: "saldo"el PIX se convierte en saldo en reales brasileños por subcuenta, y puedes pagar conPOST /payoutscuando quieras. - Ambos sentidos usan la misma clave, el mismo formato de error (
erro+acao) y el mismoexternal_id. - Valida la firma de los webhooks y usa la consulta de estado para conciliar eventos ausentes o retrasados.
Endpoints utilizados
| Endpoint | Para qué |
|---|---|
POST /cashin/charge | Entrada: crea el QR PIX y entrega stablecoins. |
POST /cash-outs + /accept | Salida: cotiza, fija la cotización y recibe la dirección de depósito. |
POST /payouts | PIX directamente en reales brasileños desde el saldo en custodia, sin pasar por criptomonedas. |
GET /keys/me | Tus límites vigentes y las funciones habilitadas. Consúltalos aquí, no los fijes en el código. |
GET /v1/verificar/{e2e} | Verificación pública de un PIX liquidado. Sin clave. |
Ejemplo de solicitudes — sustituye los datos
# entrada: PIX se convierte en stablecoins en tu billetera
curl -X POST https://api.luniumpay.com/cashin/charge -H "X-API-Key: $LUNIUM_KEY" \
-H "Content-Type: application/json" \
-d '{"amount_cents":100000,"asset":"usdc","chain":"polygon",
"payout_address":"0xTesouraria","payer_tax_number":"12345678909",
"external_id":"in-9001"}'
# salida: las stablecoins se convierten en PIX en la cuenta de alguien
curl -X POST https://api.luniumpay.com/cash-outs -H "X-API-Key: $LUNIUM_KEY" \
-H "Content-Type: application/json" \
-d '{"asset":"USDC","network":"polygon","brl_amount":"1000.00",
"pix_key":"11122233344","pix_key_type":"cpf","external_id":"out-9001"}'const API = "https://api.luniumpay.com";
const h = { "X-API-Key": process.env.LUNIUM_KEY, "Content-Type": "application/json" };
export const entrada = (cents, carteira, docPagador, id) =>
fetch(`${API}/cashin/charge`, { method: "POST", headers: h, body: JSON.stringify({
amount_cents: cents, asset: "usdc", chain: "polygon",
payout_address: carteira, payer_tax_number: docPagador, external_id: id,
})}).then((r) => r.json());
export const saida = (brl, chave, tipo, id) =>
fetch(`${API}/cash-outs`, { method: "POST", headers: h, body: JSON.stringify({
asset: "USDC", network: "polygon", brl_amount: brl,
pix_key: chave, pix_key_type: tipo, external_id: id,
})}).then((r) => r.json());import os, requests
API, H = "https://api.luniumpay.com", {"X-API-Key": os.environ["LUNIUM_KEY"]}
def entrada(cents, carteira, doc_pagador, ident):
return requests.post(f"{API}/cashin/charge", headers=H, timeout=30, json={
"amount_cents": cents, "asset": "usdc", "chain": "polygon",
"payout_address": carteira, "payer_tax_number": doc_pagador,
"external_id": ident}).json()
def saida(brl, chave, tipo, ident):
return requests.post(f"{API}/cash-outs", headers=H, timeout=30, json={
"asset": "USDC", "network": "polygon", "brl_amount": brl,
"pix_key": chave, "pix_key_type": tipo, "external_id": ident}).json()Sandbox: prueba antes de gastar
Una llamada, sin aprobación previa ni tarjeta; solo es obligatorio tu correo (al que enviamos el manual, el diagrama de flujo y la guía de integración paso a paso). La clave lun_test_ permite probar los flujos y escenarios documentados sin mover dinero real.
curl -X POST https://api.luniumpay.com/keys/sandbox \
-H "Content-Type: application/json" \
-d '{"email":"voce@empresa.com","name":"meu-teste"}'
Lo que el sandbox no demuestra: liquidación real. No se mueven criptomonedas ni se paga ningún PIX; sirve para ajustar el contrato, no para medir la vía de procesamiento.
Activos y redes
El catálogo de entrada de criptomonedas es GET /catalog; el de entrega tras Pix es GET /cashin/catalog. Consulta el activo y la red del flujo elegido antes de cotizar. La disponibilidad y los mínimos pueden cambiar.
Usa deposit_tag en el depósito cuando la aceptación indique un memo. En la entrega, envía payout_tag cuando lo requiera la ruta. El manual de la API describe cada campo.
Límites y retenciones
Consulta GET /keys/me para conocer los límites y las tarifas de la cuenta, GET /cashin/limits?payer_tax=... para el pagador y las vistas previas para el mínimo de la ruta. No uses un límite máximo fijo compartido entre cash-in, cash-out y payout.
Una solicitud de cobro pagada puede quedar retenida antes de la liquidación. Usa los estados, la cronología y los eventos firmados para distinguir entre cobro, saldo disponible y entrega final. La validez de la operación figura en expires_at.
Mediciones, no promesas
El plazo depende del flujo, la ruta disponible, las confirmaciones de la red y las posibles retenciones. Sigue la operación hasta su estado final y consulta el estado del servicio. El tiempo de una simulación no mide una liquidación real.
Idempotencia
Envía external_id en cada operación que mueve dinero. Repetir la misma llamada devuelve la misma operación, nunca una segunda; los mismos parámetros con un id distinto crean dos, y el mismo id con parámetros distintos devuelve 409 external_id_divergente en lugar de intentar adivinar.
Un timeout no es un rechazo. Si la llamada no respondió, consulta por el external_id antes de repetirla: la operación puede existir.
Webhooks y conciliación
Cada transición genera un evento firmado con HMAC SHA-256 y una marca de tiempo (cabecera X-Lunium-Signature, formato t=…,v1=…). La marca de tiempo impide reutilizar una entrega capturada. Verifica la firma antes de confiar en el cuerpo.
El webhook es la señal principal; el polling es opcional. Cuando necesites consultar, el estado incluye la timeline marcada por el servidor — representa la etapa a partir de ella, porque el cronómetro de tu polling mide tu red, no la operación.
¿No respondió con 2xx? Se reintenta la entrega con esperas progresivas. Puedes reenviarla manualmente en POST /webhooks/deliveries/{event_id}/retry y probar tu URL en POST /webhooks/test.
Cuando algo falla
Cada error incluye erro (qué ocurrió) y acao (qué hacer): corrigir,
repetir, esperar o parar. Es el campo que puede seguir un agente o un reintento automático sin recurrir a heurísticas.
parar es el más importante: en provedor_sem_resposta en un retiro, el PIX puede haberse enviado. Consulta la operación; no la repitas.
Seguridad
- webhook firmado — Cada webhook se firma con HMAC SHA-256 y una marca de tiempo (cabecera X-Lunium-Signature, formato t=…,v1=…), lo que impide reutilizar una entrega capturada.
- idempotencia — external_id en cash-in, cash-out y payout: repetir la misma llamada devuelve la MISMA operación, nunca una segunda. Los parámetros distintos con el mismo external_id devuelven 409.
- tráfico de salida validado — La URL del webhook se resuelve y valida antes de cada entrega: se rechazan direcciones internas, metadatos de la nube y redirecciones a redes privadas, y la conexión se fija en la IP validada.
- retención con bloqueo ante fallos — La retención se verifica al liquidar y de nuevo al reclamar la operación en SQL: ninguna vía (worker, consulta de estado o cola) puede liquidar antes de tiempo.
- payout duradero — El retiro registra la operación y debita el saldo en la MISMA transacción, antes de cualquier llamada al proveedor: no existe un débito sin una orden que conciliar.
- verificación abierta — GET /v1/verificar/{e2e} comprueba un PIX liquidado sin ninguna clave; la contraparte no tiene que confiar en nuestra palabra.
La verificación abierta es especialmente importante en una negociación: tu contraparte comprueba el PIX por su cuenta, sin clave y sin depender de nuestra palabra.
Tiempo hasta la primera integración
Sandbox con una llamada, sin aprobación previa. Permite probar los flujos y escenarios documentados con importes ficticios. Las cotizaciones y algunas respuestas de simulación tienen campos propios. Consulta el manual y valida la configuración y la liquidación en una prueba piloto de producción antes de atender a clientes.
Preguntas sobre Pix, on-ramp y off-ramp
¿Necesito una empresa en Brasil?
Puedes empezar por el sandbox. Para producción, confirma con el equipo de integración la elegibilidad, los documentos y las condiciones aplicables a tu modelo de negocio.
¿Cómo funciona el límite para quienes empiezan?
Consulta GET /keys/me para conocer los límites y tarifas de la clave, GET /cashin/limits para el pagador y la vista previa para el mínimo de la ruta. No apliques una tabla fija a todos los flujos; comprueba también las retenciones y el saldo disponible.
¿Puedo recibir Pix y elegir cuándo retirar?
Sí. En el flujo destino=saldo, el Pix se acredita en saldo BRL, sujeto a las reglas de disponibilidad. La aplicación solicita después un payout Pix o un retiro en criptomonedas por una ruta disponible. El abono en BRL no es una conversión automática a USDT.
¿La prueba del sandbox usa dinero real?
No. El saldo, los pagos y las entregas son simulados. La prueba sirve para validar la integración; la disponibilidad de la ruta y la liquidación real deben validarse en producción.
¿Puedo integrar con una IA?
Sí. Usa el manual, OpenAPI y la guía de integración con IA. Lleva la lista de comprobación de aceptación a tu editor y pide evidencias de cada prueba, incluidos los fallos, la idempotencia y la conciliación.
Prepara un plan de integración para tu equipo
Usa la lista de comprobación para definir el flujo, validar el saldo y los mínimos, probar los fallos y registrar las evidencias antes de la prueba piloto. Puede rellenarla un desarrollador o usarse como contexto para un agente de IA.
Descargar lista de comprobación de integración (Markdown) · Integrar con IA · Todas las guías
Contenido técnico del equipo de LuniumPay · Revisado el . Conoce la empresa.
Contrato OpenAPI vigente · datos de esta página en product-truth.json · estado