Construir

Construir con Lunium

Elige qué quieres construir. Cada caso incluye REST, Node y Python, además de un prompt listo si prefieres que lo haga un agente de código.

Los prompts son genéricos de forma intencionada: ninguno menciona un endpoint, un campo ni un activo. Si tuvieran que hacerlo, el descubrimiento no estaría funcionando de verdad.

PIX → USDT

Recibe PIX de tus clientes y liquida el importe en USDT en una billetera.

# 1. clave de prueba — una llamada, con tu correo
curl -X POST https://api.luniumpay.com/keys/sandbox -H 'Content-Type: application/json' \
  -d '{"email":"voce@empresa.com","name":"meu-projeto"}'

# 2. solicitud de cobro PIX; el CPF/CNPJ del pagador es un requisito del Banco Central
curl -X POST https://api.luniumpay.com/cashin/charge \
  -H "X-API-Key: $LUNIUM_KEY" -H 'Content-Type: application/json' \
  -d '{"amount_cents": 15000,
       "payer_tax_number": "12345678901",
       "payout_address": "0xSuaCarteira",
       "chain": "polygon",
       "external_id": "pedido-123"}'

# 3. haz el seguimiento hasta la liquidación
curl https://api.luniumpay.com/cashin/$ID/status -H "X-API-Key: $LUNIUM_KEY" 
const API = "https://api.luniumpay.com";
const key = process.env.LUNIUM_KEY;

const call = (path, method = "GET", body) =>
  fetch(API + path, {
    method,
    headers: { "Content-Type": "application/json", "X-API-Key": key },
    body: body && JSON.stringify(body),
  }).then((r) => r.json());

// Crea la solicitud de cobro. El importe va en CENTAVOS: enviar 150 en lugar de 15000
// es el error más común, y la API acepta ambos porque los dos son válidos.
const charge = await call("/cashin/charge", "POST", {
  amount_cents: 15000,
  payer_tax_number: "12345678901",
  payout_address: "0xSuaCarteira",
  chain: "polygon",
  external_id: "pedido-" + Date.now(),
});

if (charge.erro) throw new Error(`${charge.erro}: ${charge.detail}`);
console.log("copia y pega:", charge.qr_copypaste);

// Después: sigue la operación mediante un webhook firmado o consulta el estado.
const status = await call(`/cashin/${charge.cashin_id}/status`);
console.log(status.status, status.settlement_status);
import json, os, urllib.request

API = "https://api.luniumpay.com"
KEY = os.environ["LUNIUM_KEY"]


def call(path, method="GET", body=None):
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(API + path, data=data, method=method)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-API-Key", KEY)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


charge = call("/cashin/charge", "POST", {
    "amount_cents": 15000,          # centavos, não reais
    "payer_tax_number": "12345678901",     # exigência do Banco Central
    "payout_address": "0xSuaCarteira",
    "chain": "polygon",
    "external_id": "pedido-123",
})
print("copia y pega:", charge["qr_copypaste"])
print(call(f"/cashin/{charge['cashin_id']}/status"))
Integre a Lunium a partir de https://luniumpay.com. Preciso receber PIX e liquidar em USDT. Descubra sozinho as capacidades e a API disponíveis, comece pelo sandbox e preserve a arquitetura atual deste projeto.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

USDT → PIX

Vende USDT y haz que una clave PIX reciba reales brasileños.

# 1. cotizar — no compromete nada, es válido durante 15 minutos
curl -X POST https://api.luniumpay.com/cash-outs \
  -H "X-API-Key: $LUNIUM_KEY" -H 'Content-Type: application/json' \
  -d '{"asset":"USDT","network":"polygon","brl_amount":"150.00",
       "pix_key":"quem-recebe@exemplo.com",
       "refund_address":"0xCarteiraDoSeuUsuario",
       "external_id":"venda-123"}'

# 2. aceptar — PUNTO SIN RETORNO. Devuelve la dirección de depósito.
curl -X POST https://api.luniumpay.com/cash-outs/$ID/accept -H "X-API-Key: $LUNIUM_KEY"

# 3. hacer seguimiento; en COMPLETED se incluye el comprobante del Banco Central
curl https://api.luniumpay.com/cash-outs/$ID -H "X-API-Key: $LUNIUM_KEY" 
const API = "https://api.luniumpay.com";
const key = process.env.LUNIUM_KEY;
const call = (p, m = "GET", b) => fetch(API + p, {
  method: m,
  headers: { "Content-Type": "application/json", "X-API-Key": key },
  body: b && JSON.stringify(b),
}).then((r) => r.json());

// 1. cotización: envía brl_amount O amount, nunca ambos; la cotización tiene
// una sola dirección. Aquí pedimos «quiero que la clave reciba R$ 150».
const quote = await call("/cash-outs", "POST", {
  asset: "USDT", network: "polygon", brl_amount: "150.00",
  pix_key: "quem-recebe@exemplo.com",
  // billetera confirmada para la devolución si no se puede pagar el PIX.
  // Si falta, la orden solicita la dirección de devolución; nunca usa el origen on-chain.
  refund_address: "0xCarteiraDoSeuUsuario",
  external_id: "venda-" + Date.now(),
});
if (quote.erro) throw new Error(`${quote.erro}: ${quote.detail}`);
console.log(`envía ${quote.amount} USDT → R$ ${quote.brl_amount}`);

// 2. aceptar fija la cotización y devuelve la dirección. Después no se puede deshacer.
const accepted = await call(`/cash-outs/${quote.cashout_id}/accept`, "POST", {});
console.log("depositar en:", accepted.deposit_address);

// 3. en COMPLETED: pix_e2e, receipt_url y verify_url
const done = await call(`/cash-outs/${quote.cashout_id}`);
console.log(done.state, done.pix_e2e ?? "");
import json, os, urllib.request

API = "https://api.luniumpay.com"
KEY = os.environ["LUNIUM_KEY"]


def call(path, method="GET", body=None):
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(API + path, data=data, method=method)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-API-Key", KEY)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


quote = call("/cash-outs", "POST", {
    "asset": "USDT", "network": "polygon",
    "brl_amount": "150.00",                    # ou "amount", nunca os dois
    "pix_key": "quem-recebe@exemplo.com",
    "refund_address": "0xCarteiraDoSeuUsuario",
    "external_id": "venda-123",
})
print(f"envía {quote['amount']} USDT -> R$ {quote['brl_amount']}")

# punto sin retorno
aceita = call(f"/cash-outs/{quote['cashout_id']}/accept", "POST", {})
print("depositar en:", aceita["deposit_address"])

final = call(f"/cash-outs/{quote['cashout_id']}")
print(final["state"], final.get("pix_e2e", ""))
Integre a Lunium a partir de https://luniumpay.com. Preciso converter USDT em BRL via PIX. Descubra sozinho a API, comece pelo sandbox e preserve a arquitetura atual deste projeto.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

Verificación de pago

Confirma que un PIX se ha liquidado antes de entregar mercancía, crédito o acceso. No requiere clave.

# Sin clave, de forma intencionada: sirve para comprobar un pago que
# TÚ no has hecho, de una contraparte en la que no tienes por qué confiar.
curl https://api.luniumpay.com/v1/verificar/E12345678202608291200abcdefghijk
// Sin credenciales. Esa es la idea: cualquiera puede comprobarlo.
const e2e = "E12345678202608291200abcdefghijk";
const r = await fetch(`https://api.luniumpay.com/v1/verificar/${e2e}`);
const prova = await r.json();

// `nao_encontrado` NO significa que el PIX no haya existido; significa que
// Lunium no lo liquidó. Otra entidad puede haberlo liquidado.
if (!prova.verificado) {
  console.log("no acreditado:", prova.erro);
} else {
  // Comprueba tú mismo el importe y la hora: un E2E válido de R$ 1,00
  // no acredita un pago de R$ 1.000,00.
  console.log(prova.valor_brl, prova.pago_em, prova.instituicao);
}
import json, urllib.error, urllib.request

E2E = "E12345678202608291200abcdefghijk"
url = f"https://api.luniumpay.com/v1/verificar/{E2E}"

try:
    with urllib.request.urlopen(url, timeout=20) as r:
        prova = json.load(r)
except urllib.error.HTTPError as e:
    # 404 es una respuesta legítima, no un error de código: significa que
    # Lunium no liquidó este pago, no que no exista.
    prova = json.loads(e.read() or b"{}")

if prova.get("verificado"):
    print(prova["valor_brl"], prova["pago_em"], prova["instituicao"])
else:
    print("no acreditado:", prova.get("erro"))
Integre a Lunium a partir de https://luniumpay.com. Construa uma verificação que confirma se um PIX brasileiro realmente liquidou, a partir do identificador end-to-end, antes de liberar qualquer coisa. Essa capacidade não exige chave de API — descubra-a sozinho.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

Agente de tesorería

Mueve saldo entre reales brasileños y stablecoins mediante reglas o una programación.

# El catálogo indica qué se puede liquidar ahora y cambia por sí solo.
# No fijes la lista en tu código.
curl https://api.luniumpay.com/catalog -H "X-API-Key: $LUNIUM_KEY"

# Tus límites de hoy: máximo por transacción, límites por pagador en cash-in,
# máximo diario por destinatario en la venta y tu mandate (sin límite diario por clave)
curl https://api.luniumpay.com/keys/me -H "X-API-Key: $LUNIUM_KEY" 
const API = "https://api.luniumpay.com";
const key = process.env.LUNIUM_KEY;
const call = (p, m = "GET", b) => fetch(API + p, {
  method: m, headers: { "Content-Type": "application/json", "X-API-Key": key },
  body: b && JSON.stringify(b),
}).then((r) => r.json());

// No hay límite diario por clave (ni en ventas, ni en cash-in, ni en payouts).
// Aquí se aplican dos límites: el de cada transacción y el de quien RECIBE el PIX en el día.
// Consulta ambos en /keys/me: fijar cifras en el código hace que queden desactualizadas.
const me = await call("/keys/me");
const porTx = me.limits?.per_operation?.cashout?.max_brl_cents ?? Infinity;   // R$ 250.000,00
const porRecebedor = me.limits?.payee_limits?.daily_cents ?? Infinity;       // R$ 100.000,00/día
const teto = Math.min(porTx, porRecebedor);

const alvoCents = 500_00;
if (alvoCents > teto) {
  console.log("por encima del límite; divide la operación");
} else {
  const quote = await call("/cash-outs", "POST", {
    asset: "USDT", network: "polygon",
    brl_amount: (alvoCents / 100).toFixed(2),
    pix_key: process.env.PIX_TESOURARIA,
    refund_address: process.env.CARTEIRA,
    external_id: "tesouraria-" + new Date().toISOString().slice(0, 10),
  });
  console.log(quote.cashout_id, quote.amount, "USDT");
}
import json, os, urllib.request

API = "https://api.luniumpay.com"
KEY = os.environ["LUNIUM_KEY"]


def call(path, method="GET", body=None):
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(API + path, data=data, method=method)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-API-Key", KEY)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


# No hay límite diario por clave: lo que
# limita es el máximo por transacción y el máximo diario de quien RECIBE el PIX.
me = call("/keys/me")
print("por transacción:", me["limits"]["per_operation"]["cashout"]["max_brl_cents"])
print("por destinatario/día:", me["limits"]["payee_limits"]["daily_cents"])

quote = call("/cash-outs", "POST", {
    "asset": "USDT", "network": "polygon", "brl_amount": "500.00",
    "pix_key": os.environ["PIX_TESOURARIA"],
    "refund_address": os.environ["CARTEIRA"],
    "external_id": "tesouraria-2026-08-29",
})
print(quote["cashout_id"], quote["amount"], "USDT")
Integre a Lunium a partir de https://luniumpay.com. Construa um agente de tesouraria que move saldo entre BRL via PIX e USDT conforme uma regra. Descubra sozinho a API e comece pelo sandbox.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

Agente de pagos

Permite que un software autónomo pague en Brasil dentro de una política de gastos que él mismo define.

# 1. el agente se registra y recibe una credencial de prueba
curl -X POST https://api.luniumpay.com/mesh/agents -H 'Content-Type: application/json' \
  -d '{"name":"meu-agente","contact":"eu@exemplo.com",
       "capabilities":["usdt_to_pix"]}'

# 2. la política que se impone. SOLO RESTRINGE los límites de la clave,
#    nunca los amplía; por eso puede definirla él mismo.
curl -X POST https://api.luniumpay.com/mesh/agents/$AGENT_ID/mandate \
  -H "X-API-Key: $LUNIUM_KEY" -H 'Content-Type: application/json' \
  -d '{"max_por_operacao_cents": 30000, "max_diario_cents": 200000}'
const API = "https://api.luniumpay.com";

// 1. registro: devuelve agent_id y la credencial de prueba en la misma respuesta
const reg = await fetch(`${API}/mesh/agents`, {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "meu-agente", contact: "eu@exemplo.com",
    capabilities: ["usdt_to_pix"],
  }),
}).then((r) => r.json());

const { agent_id } = reg.agent;
const key = reg.api_key;   // solo aparece una vez

// 2. la política de gastos del propio agente
await fetch(`${API}/mesh/agents/${agent_id}/mandate`, {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-API-Key": key },
  body: JSON.stringify({
    max_por_operacao_cents: 30_000,   // R$ 300 por operación
    max_diario_cents: 200_000,        // R$ 2.000 por día
  }),
});

// A partir de aquí, una orden por encima del límite se rechaza con
// `mandate_valor_acima_do_teto`, por su política, no por la nuestra.
import json, urllib.request

API = "https://api.luniumpay.com"


def post(path, body, key=None):
    req = urllib.request.Request(API + path, data=json.dumps(body).encode(), method="POST")
    req.add_header("Content-Type", "application/json")
    if key:
        req.add_header("X-API-Key", key)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


reg = post("/mesh/agents", {
    "name": "meu-agente", "contact": "eu@exemplo.com",
    "capabilities": ["usdt_to_pix"],
})
agent_id, key = reg["agent"]["agent_id"], reg["api_key"]

# El mandate solo RESTRINGE los límites: como mucho, te limita a ti mismo.
post(f"/mesh/agents/{agent_id}/mandate", {
    "max_por_operacao_cents": 30000,
    "max_diario_cents": 200000,
}, key=key)
print("agente", agent_id, "con política propia")
Integre a Lunium a partir de https://luniumpay.com. Construa um agente que paga uma chave PIX usando stablecoins, com teto por operação e teto diário que ele mesmo configura. Descubra sozinho a API e comece pelo sandbox.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

Billetera con PIX

Ofrece a los usuarios de la billetera depósitos y retiros por PIX contra USDT o USDC.

# depósito: entra PIX y USDT va a la billetera del usuario
curl -X POST https://api.luniumpay.com/cashin/charge -H "X-API-Key: $LUNIUM_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"amount_cents":10000,"payer_tax_number":"$CPF_DO_USUARIO",
       "payout_address":"$CARTEIRA_DO_USUARIO","chain":"polygon",
       "external_id":"deposito-$UID"}'

# retiro: USDT sale de la billetera y los reales brasileños llegan a su clave PIX
curl -X POST https://api.luniumpay.com/cash-outs -H "X-API-Key: $LUNIUM_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"asset":"USDT","network":"polygon","brl_amount":"100.00",
       "pix_key":"$CHAVE_PIX_DO_USUARIO","pix_key_type":"cpf",
       "refund_address":"$CARTEIRA_DO_USUARIO","external_id":"saque-$UID"}'
const API = "https://api.luniumpay.com";
const key = process.env.LUNIUM_KEY;
const call = (p, m = "GET", b) => fetch(API + p, {
  method: m, headers: { "Content-Type": "application/json", "X-API-Key": key },
  body: b && JSON.stringify(b),
}).then((r) => r.json());

// DEPÓSITO: el usuario paga un PIX y su billetera recibe USDT
export async function depositar(usuario, centavos) {
  return call("/cashin/charge", "POST", {
    amount_cents: centavos,
    payer_tax_number: usuario.cpf,     // requisito del Banco Central
    payout_address: usuario.carteira,
    chain: "polygon",
    external_id: `dep-${usuario.id}-${Date.now()}`,
  });
}

// RETIRO: el usuario envía USDT y su clave PIX recibe reales brasileños
export async function sacar(usuario, reais) {
  const q = await call("/cash-outs", "POST", {
    asset: "USDT", network: "polygon", brl_amount: reais.toFixed(2),
    pix_key: usuario.chavePix,
    // pix_key_type solo es obligatorio cuando la clave tiene 11 dígitos puros:
    // CPF y teléfono tienen la misma longitud y no se pueden distinguir sin el tipo.
    pix_key_type: usuario.tipoChave,
    refund_address: usuario.carteira,
    external_id: `saq-${usuario.id}-${Date.now()}`,
  });
  return call(`/cash-outs/${q.cashout_id}/accept`, "POST", {});
}
import json, os, urllib.request

API = "https://api.luniumpay.com"
KEY = os.environ["LUNIUM_KEY"]


def call(path, method="GET", body=None):
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(API + path, data=data, method=method)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-API-Key", KEY)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


def depositar(usuario, centavos):
    """PIX entra, USDT vai para a carteira do usuário."""
    return call("/cashin/charge", "POST", {
        "amount_cents": centavos,
        "payer_tax_number": usuario["cpf"],
        "payout_address": usuario["carteira"],
        "chain": "polygon",
        "external_id": f"dep-{usuario['id']}",
    })


def sacar(usuario, reais):
    """USDT sai, reais caem na chave PIX dele."""
    q = call("/cash-outs", "POST", {
        "asset": "USDT", "network": "polygon",
        "brl_amount": f"{reais:.2f}",
        "pix_key": usuario["chave_pix"],
        "pix_key_type": usuario["tipo_chave"],   # obrigatório se forem 11 dígitos
        "refund_address": usuario["carteira"],
        "external_id": f"saq-{usuario['id']}",
    })
    return call(f"/cash-outs/{q['cashout_id']}/accept", "POST", {})
Integre a Lunium a partir de https://luniumpay.com. Adicione depósito e saque por PIX a uma carteira cripto, liquidando em USDT. Descubra sozinho as capacidades e os campos obrigatórios, e comece pelo sandbox.

Entrégalo a un agente de código. Descubrirá la API por su cuenta.

Todos empiezan igual

# el catálogo completo, sin credenciales
curl https://api.luniumpay.com/mesh

# clave de prueba, una llamada (solo tu correo es obligatorio)
curl -X POST https://api.luniumpay.com/keys/sandbox \
  -H 'Content-Type: application/json' -d '{"email":"voce@empresa.com"}'

El sandbox simula solicitudes de cobro PIX, abonos en custodia, retiros y entregas de criptomonedas, payout PIX, transferencias y criptomonedas → PIX. Elige tu flujo en la demostración o ejecuta el kit. Escenarios y límites de la prueba.

Cómo funciona el descubrimiento Más ejemplos

Por caso de uso

API de PIX a USDTRecibe reales brasileños y entrega USDT en la billetera del cliente.API de USDT a PIXVende stablecoins y paga a cualquier clave PIX.API de payout PIXPaga a proveedores y usuarios en reales brasileños mediante la API.BRL ↔ USDT por APIConversión en ambos sentidos, con cotización y comprobante.On-ramp y off-ramp en BrasilEntrada y salida de criptomonedas en el país, con una sola integración.PIX en el checkout, stablecoins en la tesoreríaRecibe PIX de tus clientes y conserva los fondos en dólares digitales.PIX y stablecoins para billeterasOfrece a tus usuarios una vía de entrada y salida.Infraestructura con tu marcaToda la vía de procesamiento detrás de tu producto.

Habla con quienes lo construyeron

La clave de prueba se obtiene con una llamada, sin aprobación previa. Si es lo que buscas, empieza por la documentación. Este formulario es para las demás consultas: tarifas por volumen, un caso que la documentación no cubre o una duda antes de integrar.

¿Prefieres escribir directamente por correo? contato@luniumpay.com