Developers
Infraestructura.
Todo lo que necesitas para integrar cobros automáticos en Argentina y Brasil con la simplicidad de una sola línea de código.
SDK Oficial (TypeScript)
Nuestra recomendación para Backend: idempotencia automática en cada cobro, errores con hint accionable y verificación criptográfica de webhooks en una línea. Corre en Node 18+, Edge, Workers, Deno y Bun.
npm install @recasmart/sdk¿Integrás con Claude Code, Cursor o VS Code? Andá a la pestaña Conectar IA (acá arriba): un click genera tu credencial sandbox y te deja el servidor MCP oficial @recasmart/mcp configurado en menos de 2 minutos. También podés apuntar a tu agente a recasmart.online/llms.txt.
Autenticación y Entornos
sk_test_...) y Producción (usando sk_live_...). Siempre envía tu API Key en el header `Authorization` de cada llamada.curl -H "Authorization: Bearer sk_test_..." \
https://recasmart.online/api/public/checkoutsCobrar con PIX
curl -X POST "https://recasmart.online/api/public/checkout/create" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"amount": 100.00,
"currency": "BRL",
"payment_method": "pix",
"description": "Venda Teste PIX"
}'Cobrar con Transferencia (CVU)
Alias: recasmart.pago.x82
CVU: 00000031000... (Variable)Máquinas y Cajas (POS físico)
qr_image en su pantalla y despacha cuando el estado pasa a completed. El mismo código en los 3 países: currency elige el riel.- Device keys: cada terminal lleva su key atada a ella (emitida con
POST /api/private/pos/:id/device-key). Si una máquina se compromete, revocás esa key sola — la flota sigue cobrando. - Un QR vigente por terminal: cada intención nueva expira la anterior; la pantalla nunca muestra un QR viejo cobrable. TTL default 5 minutos.
- Polling sin key: el estado se consulta en el endpoint público — la máquina no expone credenciales para saber si le pagaron. Alternativa: webhook
checkout.completedfirmado al backend del operador.
curl -X POST "https://recasmart.online/api/public/pos/POS_ID/checkout" \
-H "Authorization: Bearer sk_test_DEVICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 12000,
"currency": "PYG",
"description": "Coca-Cola 500ml",
"expires_in_seconds": 300
}'Generación Masiva de QRs (B2B Corporativo)
{ invoices: [...] }.- Límite Seguro (5000): Si envías más de 5000 facturas en un solo payload, la API retornará HTTP 400 previniendo un colapso en memoria. Fracciona lotes enormes.
- interoperable_qr_data: Usa este texto *crudo* para renderizar e imprimir el QR final físico en la factura de papel. Lo escaneará nativamente cualquier banco.
- recasmart_url: Opcionalmente envíales esta URL (Magic Checkout) por email o WhatsApp para pagar de forma digital fácil y segura.
curl -X POST "https://recasmart.online/api/public/invoices/bulk" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '[
{
"amount": 15000.00,
"first_due_date": "2026-04-10T23:59:59Z",
"currency": "ARS"
}
]'Crear Checkout (ARG/BRA)
- checkout_id: UUID de la orden — usalo para consultar estado o iniciar un intent.
- payment_url: Redirige a tu cliente a nuestra interfaz de pago.
- cvu: Alias variable para conciliación vía transferencia/PIX.
- external_reference: Tu ID interno de orden, devuelto en el webhook al completarse el pago.
import { RecaSmart } from "@recasmart/sdk";
const reca = new RecaSmart(); // lee RECASMART_API_KEY
// Idempotency-Key manejada nativamente por el SDK
const checkout = await reca.checkouts.create({
amount: 5000,
currency: "ARS",
description: "Servicios Digitales",
external_reference: "ORDER-12345",
});
console.log(checkout.payment_url);Magic Checkout (UI Embed)
magic.js crea un IFRAME seguro superpuesto en tu tienda. Cuando el usuario escanea el QR o el PIX y paga con éxito, nuestro motor en tiempo real detecta el pago instantáneamente y dispara el evento onSuccess en tu frontend.- Conversión: El cliente nunca abandona tu sitio.
- PIX & Transferencias: Generación dinámica de QR en iframe.
<!-- 1. Agrega el script en tu <head> -->
<script src="https://recasmart.online/sdk/js/magic.js"></script>
<!-- 2. Abre el checkout cuando el cliente haga clic en Pagar -->
<script>
window.RecaSmart.openCheckout({
checkoutId: "14b1abb3-1458-...", // ID generado en tu backend
onSuccess: (data) => {
console.log("¡Pago exitoso!", data);
window.location.href = "/gracias";
},
onClose: () => {
console.log("El cliente cerró el modal");
}
});
</script>Consultar Transacciones
curl "https://recasmart.online/api/public/transactions?start_date=2026-01-01&end_date=2026-02-01" \
-H "Authorization: Bearer sk_live_..."Consultar Liquidaciones
curl "https://recasmart.online/api/public/settlements" \
-H "Authorization: Bearer sk_live_..."Plugins & E-commerce
Configuración plug-and-play para WordPress.
Activación instantánea vía OAuth2.
1. Plugin ZIP: recasmart-woo.zip
2. Admin → Plugins → Añadir nuevo
3. Webhook: ?wc-api=recasmartSuscripciones y Cobros Recurrentes
- →SaaS y software: cobra la licencia mensual o anual automáticamente.
- →Membresías y gimnasios: cuota mensual sin que el cliente tenga que recordarla.
- →Servicios profesionales: honorarios recurrentes por consultoría, seguro, mantenimiento.
- →Planes a medida: intervalos en días o meses — bimestral, trimestral, anual.
Crear un Plan
Define monto, moneda, intervalo (month / day) y período de gracia.
Crear la Suscripción
Recibes un checkout_url para el primer pago y un customer_portal_url para que el cliente gestione su suscripción.
Ciclos Automáticos
Cada período el sistema genera un nuevo checkout, notifica al cliente por email y dispara el webhook. Si no paga en el período de gracia, la suscripción pasa a past_due.
pending
Esperando primer pago
active
Al corriente de pagos
past_due
Pago vencido, en gracia
cancelled
Cancelada
curl -X POST "https://recasmart.online/api/public/subscriptions/plans" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Plan Mensual Pro",
"amount": 5000,
"currency": "ARS",
"interval_unit": "month",
"interval_count": 1,
"grace_period_days": 3
}'Split de Pagos
- →Marketplace: 90% al vendedor, 10% de comisión a la plataforma.
- →Franquicias: distribuye entre casa central y sucursal automáticamente.
- →Afiliados: paga comisiones a múltiples referidos en una sola transacción.
curl -X POST "https://recasmart.online/api/public/checkout/create" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"amount": 10000,
"currency": "ARS",
"description": "Compra en marketplace",
"splits": [
{
"destination": "cvu-o-alias-vendedor",
"percentage": 90,
"description": "Pago al vendedor"
},
{
"destination": "cvu-o-alias-plataforma",
"percentage": 10,
"description": "Comisión plataforma"
}
]
}'Webhooks y Validación de Firmas
import { constructEvent } from "@recasmart/sdk";
import express from "express";
const app = express();
// ¡OJO! raw body: la firma se calcula sobre los bytes exactos
app.post("/webhook", express.raw({ type: "application/json" }), async (req, res) => {
try {
// Valida X-RecaSmart-Signature + ventana anti-replay.
// Lanza WebhookSignatureError si alguien falsifica la firma.
const event = await constructEvent(
req.body.toString("utf8"), // raw body, no parseado
req.headers,
process.env.RECASMART_WEBHOOK_SECRET // whsec_... del dashboard
);
if (event.type === "checkout.completed") {
console.log("Cobro Completado:", event.data.checkout_id);
}
res.json({ received: true });
} catch (err) {
res.status(400).send(`Webhook Error: ${err.message}`);
}
});Webhooks — Notificación de Pagos
Éxito
checkout.completed
Fallo
checkout.failed
Expirado
checkout.expired
Orden
order.completed
Reembolso
refund.created
Orden Fallo
order.failed
Creada
subscription.created
Activada
subscription.activated
Renovada
subscription.renewed
Pago OK
subscription.payment_succeeded
Pago Fallo
subscription.payment_failed
Atrasada
subscription.past_due
Cancelada
subscription.cancelled
Si tu servidor no responde con código 2xx, reintentamos automáticamente:
1 min → 2 min → 4 min → 1 hora (máx. 4 intentos en 72hs)
{
"type": "checkout.completed",
"data": {
"checkout_id": "14b1abb3-1458-4f3d-8740-83e457a4596e",
"transaction_id": "a3f8c2d1-9b7e-4f3a-bc21-5d8e1f2a9c4b",
"status": "COMPLETED",
"amount": 5000,
"currency": "ARS",
"external_reference": "ORDER-12345",
"paid_at": "2026-02-19T12:00:00Z"
},
"timestamp": "2026-02-19T12:00:01Z"
}Verificar Firma HMAC
- Siempre verifica la firma antes de procesar el webhook
- Rechaza timestamps mayores a 5 minutos para prevenir replay attacks
- Responde con 200 OK rápidamente, procesa async si es necesario
- Tu endpoint debe ser idempotente (puede recibir el mismo evento 2+ veces)
const crypto = require("crypto");
function verifyWebhook(req, webhookSecret) {
const signature = req.headers["x-recasmart-signature"];
const timestamp = req.headers["x-recasmart-timestamp"];
const body = JSON.stringify(req.body);
// 1. Verificar que el timestamp no sea viejo (5 min)
const age = Math.floor(Date.now() / 1000) - parseInt(timestamp);
if (age > 300) return false;
// 2. Calcular firma esperada
const signedPayload = `${timestamp}.${body}`;
const expected = crypto
.createHmac("sha256", webhookSecret)
.update(signedPayload)
.digest("hex");
// 3. Comparar
const received = signature.replace("sha256=", "");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(received)
);
}Idempotency Keys (Nivel Enterprise)
checkout_id original generado hace 24 horas y te devolveremos un Copia exacto de la primera respuesta exitosa, garantizando que el usuario no pague dos veces.curl -X POST "https://recasmart.online/api/public/checkout/create" \
-H "Authorization: Bearer sk_live_..." \
-H "Idempotency-Key: idm_8f29c1b3d..." \
-H "Content-Type: application/json" \
-d '{"amount": 5000, "currency": "ARS"}'SDK Frontend: useCheckoutStatus (React)
import { useCheckoutStatus } from "./recasmart/sdk";
function StatusPantalla({ checkoutId }) {
const { status, isPaid, isLoading } = useCheckoutStatus(
"TU_SUPABASE_URL",
"TU_SUPABASE_ANON_KEY",
checkoutId
);
if (isLoading) return <p>Cargando websocket...</p>;
if (isPaid) {
return <p>✅ ¡Pago Completado al instante!</p>;
}
return <p>⏳ Esperando que escanees el QR...</p>;
}