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.
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.
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.
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.
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.
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.
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.
# 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.
Por caso de uso
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