API Reference.
Todo lo que necesitas para integrar y escalar tus pagos en Latam. Una sola API, tres países, cero fricción.
recasmart.online/llms.txtDe cero a cobrando en 5 líneas
@recasmart/sdk es la forma recomendada de integrar. TypeScript, cero dependencias, corre en Node 18+, Next.js, Edge, Cloudflare Workers, Deno y Bun.- Idempotencia automática: cada POST lleva una Idempotency-Key estable entre reintentos. Un corte de red nunca duplica un cobro.
- Errores que se explican solos: cada error trae un
hintcon la acción concreta para resolverlo. - Webhooks verificados en una línea:
constructEvent()valida la firma HMAC y la ventana anti-replay. - Tres países, un código: la moneda elige el riel — ARS→CVU, BRL→PIX, PYG→tarjeta o QR (Bancard). Y en los tres hay QR interoperable:
interoperable_qr_data(string cruda) yqr_image(PNG base64 listo para<img src>o pantallas de máquinas) en cada checkout.
https://recasmart.online/llms.txt — es este mismo contrato en formato optimizado para que el modelo escriba la integración correcta al primer intento. También hay un servidor MCP oficial (ver la sección MCP).import { RecaSmart } from "@recasmart/sdk";
const reca = new RecaSmart(); // lee RECASMART_API_KEY
const checkout = await reca.checkouts.create({
amount: 15000,
description: "Plan Pro - Marzo",
external_reference: "order_1234",
});
// Redirigí al pagador acá:
console.log(checkout.payment_url);Bearer Token
Authorization. Obtén tus claves en el Panel → Configuración → API Keys.sk_live_...Producción — transacciones realessk_test_...Sandbox — sin movimientos realessk_test_ lista para usar: podés integrar y probar punta a punta (incluidos los webhooks reales, con /simulate) sin verificación previa. El KYC se exige recién para operar en producción con sk_live_. El código es idéntico: cambiar de ambiente es cambiar la key.401 Unauthorized.sk_test_... en Sandbox no generará impacto fiscal ni retenciones a la AFIP/IIBB reales.curl -X POST "https://recasmart.online/api/public/checkout/create" \
-H "Authorization: Bearer sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{ "amount": 1500 }'Crear Orden de Cobro
currency: "BRL", se genera automáticamente un QR de PIX.| Parámetro | Tipo | Descripción |
|---|---|---|
| amount* | number | Monto a cobrar. Mín 1; máx 10M (ARS/USD/BRL) o 100M (PYG, solo enteros) |
| currency | string | ARS (default), USD, BRL o PYG. La moneda elige el riel: BRL→PIX, PYG→tarjeta |
| payment_method | string | Opcional: "qr" fuerza el riel QR del país (en PYG usa Bancard QR Express en vez de tarjeta) |
| description* | string | Descripción del cobro (3-500 chars) |
| payment_method | string | "transfer" o "pix". Auto si BRL |
| external_reference | string | Tu ID interno de orden (alfanumérico, -, _) |
| items | array | Array de items (suma = amount) |
| customer | object | { name, email, document } |
| webhook_url | string | URL para notificaciones de este checkout |
| success_url | string | Redirigir al pagar exitosamente |
| failure_url | string | Redirigir si falla el pago |
| expires_in_hours | number | Expiración en horas (1-720, default: 72) |
items, la suma de los montos debe coincidir con amount. La API valida con tolerancia de centavos.import { RecaSmart } from "@recasmart/sdk";
const reca = new RecaSmart(); // lee RECASMART_API_KEY
// El SDK genera la Idempotency-Key automáticamente
const checkout = await reca.checkouts.create({
amount: 1500.50,
currency: "ARS",
description: "Plan Premium mensual",
external_reference: "ORDER_123",
webhook_url: "https://tu-sitio.com/webhook",
});
console.log(checkout.payment_url);Consultar Órdenes
| Parámetro | Tipo | Descripción |
|---|---|---|
| status | string | pending, completed, failed, expired |
| external_reference | string | Buscar por tu referencia externa |
| start_date | ISO 8601 | Fecha inicio (ej: 2026-01-01T00:00:00Z) |
| end_date | ISO 8601 | Fecha fin |
| limit | number | 1-100 (default: 50) |
| offset | number | Para paginación (default: 0) |
curl "https://recasmart.online/api/public/checkouts?status=pending&limit=20" \
-H "Authorization: Bearer sk_live_..."Consultar Estado
EXPIRED.PENDINGCOMPLETEDFAILEDEXPIREDcurl "https://recasmart.online/api/public/checkout/14b1abb3-1458-4f3d-8740-83e457a4596e/status"Iniciar Intento de Pago
pix, la API genera automáticamente un QR de PIX con conversión ARS→BRL al tipo de cambio actual.| Parámetro | Tipo | Descripción |
|---|---|---|
| method* | string | "transfer" o "pix" |
| customerEmail | string | Email del cliente pagador |
dolarapi.com y genera el PIX en BRL al valor actual.curl -X POST "https://recasmart.online/api/public/checkout/14b1abb3-1458-4f3d-8740-83e457a4596e/intent" \
-H "Content-Type: application/json" \
-d '{
"method": "pix",
"customerEmail": "[email protected]"
}'Crear Lote de Facturas
| Parámetro | Tipo | Descripción |
|---|---|---|
| invoices* | array | Array de objetos factura. (Alternativa: mandar el Array plano en el body) |
| invoice.amount* | number | Monto del primer vencimiento |
| invoice.first_due_date | ISO 8601 | Fecha de vencimiento (default: +30 días) |
| invoice.second_amount | number | Monto si se cobra en el segundo vencimiento |
| invoice.second_due_date | ISO 8601 | Fecha del segundo vencimiento |
| invoice.external_reference | string | ID de tu factura/cliente para fácil reconciliación |
| invoice.currency | string | Moneda (default: ARS) |
- Límite Seguro (5000): Prevención estricta contra latencia de base de datos interrumpiendo procesamientos que excedan el límite por payload.
- Magia QR CRUDA: El retorno de
interoperable_qr_datapermite imprimir directamente en papel para escaneo MODO MercadoPago nativo sin apps intermediarias.
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"
}
]'Cobrar con PIX
currency: "BRL", se genera un QR PIX dinámico Copy & Paste automáticamente.- Liquidación en ARS o USD a tu cuenta local.
- Conciliación automática vía Webhook en milisegundos.
- Conversión automática ARS → BRL al tipo de cambio actual.
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",
"customer": {
"name": "Cliente Brasil",
"email": "[email protected]"
}
}'Cobrar en Paraguay
currency: "PYG" el cobro se procesa vía Bancard, el procesador local, en dos modalidades: tarjeta (default — formulario seguro embebido en tu payment_url; los datos nunca pasan por RecaSmart) o QR interoperable con payment_method: "qr" — un QR dinámico que el pagador escanea desde la app de más de 25 entidades. Con QR, la respuesta incluye interoperable_qr_data (string EMVCo cruda) y qr_image (imagen PNG en base64): tu máquina o caja la muestra con un simple <img src=qr_image>, sin librerías de QR. El mismo par también lo devuelve GET /status mientras la orden esté pendiente — ideal si la pantalla se reinicia.- Mismo código, otro país: solo cambia la moneda. El webhook
checkout.completedes idéntico al de Argentina y Brasil. - Montos enteros: el guaraní no tiene centavos.
150000.50devuelve 400. - Sin CVU: en este riel
cvuvienenull— no hay transferencia, hay tarjeta. - Sandbox completo: con
sk_test_el flujo se prueba con/simulate, igual que los demás rieles.
import { RecaSmart } from "@recasmart/sdk";
const reca = new RecaSmart();
// PYG → tarjeta vía Bancard, automático
const checkout = await reca.checkouts.create({
amount: 150000, // guaraníes, solo enteros
currency: "PYG",
description: "Plan Pro - Paraguay",
external_reference: "order_py_001",
});
// checkout.cvu es null en este riel:
// el pagador paga con tarjeta en payment_url
console.log(checkout.payment_url);Cobrar en máquinas físicas
qr_image listo para su pantalla, y despacha cuando el estado pasa a completed. Funciona en los 3 países con el mismo código: currency elige el riel (ARS→Transferencias 3.0, BRL→PIX, PYG→Bancard QR).- Device keys: cada terminal lleva su propia key atada a ella (se emite desde el dashboard o vía
POST /api/private/pos/:id/device-key, con rotación automática). 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 corto: el QR vive 5 minutos por default (
expires_in_seconds, 60–3600). El polling de estado es público: la máquina no expone su key para consultar. - Confirmación en segundos: como alternativa al polling, el webhook
checkout.completedfirmado llega al backend del operador — útil para flotas con backend central que comanda las máquinas. - Sucursales: cada terminal tiene
store_branch— las liquidaciones y el dashboard agrupan por sucursal, ideal para cadenas de supermercados.
# La máquina (vending, caja de súper, kiosco)
# pide su QR con su DEVICE KEY:
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",
"external_reference": "vend12-slot4",
"expires_in_seconds": 300
}'Emisión Masiva de QRs Interoperables
- QR Físico (interoperable_qr_data): El payload crudo que debes usar para que la imprenta grabe un QR cuadrado en tus facturas físicas de papel o PDFs. Un cliente podrá escanearlo y abonar nativamente sin fricción.
- Fallback/Link (recasmart_url): Ideal para incrustar un botón "Pagar Ahora" en el PDF o correo electrónico si no pueden escanear el QR físico con su cámara. Llevándolos al Magic Checkout.
- Doble Vencimiento e Intereses: Al declarar
second_amount, tanto el QR físico nativo como el Web URL exigen el segundo importe automáticamente si el cliente intenta pagar en mora (después delfirst_due_date).
curl -X POST "https://recasmart.online/api/public/invoices/bulk" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"invoices": [
{
"amount": 15000.00,
"first_due_date": "2026-04-10T23:59:59Z",
"second_amount": 17500.00,
"second_due_date": "2026-04-20T23:59:59Z",
"external_reference": "FACT-10023",
"currency": "ARS"
}
]
}'Embeber Checkout
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>Consulta de Transacciones
| Parámetro | Tipo | Descripción |
|---|---|---|
| status | string | PENDING, COMPLETED, FAILED |
| start_date | date | Formato YYYY-MM-DD |
| end_date | date | Formato YYYY-MM-DD |
| limit | number | Default: 50 |
| offset | number | Para paginación (default: 0) |
curl "https://recasmart.online/api/public/transactions?status=COMPLETED&start_date=2026-01-01&end_date=2026-02-01&limit=20" \
-H "Authorization: Bearer sk_live_..."Gestión de Liquidaciones
| Parámetro | Tipo | Descripción |
|---|---|---|
| start_date | YYYY-MM-DD | Fecha inicio de payout (ej: 2026-01-01) |
| end_date | YYYY-MM-DD | Fecha fin de payout (ej: 2026-02-28) |
| limit | number | Default: 20 |
| offset | number | Para paginación (default: 0) |
- Conciliación bancaria automatizada
- Detalle de comisiones e impuestos
- Historial completo de payouts
- Ordenadas por fecha de payout (más reciente primero)
curl "https://recasmart.online/api/public/settlements?limit=10" \
-H "Authorization: Bearer sk_live_..."Cobros Recurrentes
- SaaS y software: licencia mensual/anual sin recordatorios manuales.
- Membresías y gimnasios: cuota mensual automática.
- Servicios profesionales: honorarios recurrentes o retainers.
- Planes a medida: bimestral, trimestral, anual — cualquier intervalo.
| Parámetro | Tipo | Descripción |
|---|---|---|
| name* | string | Nombre del plan (2-100 chars) |
| amount* | number | Monto a cobrar por período |
| currency | string | ARS (default), USD, BRL |
| interval_unit | string | "month" (default) o "day" |
| interval_count | number | Cada cuántos intervalos. Default: 1 |
| trial_period_days | number | Días de prueba gratis (0-90) |
| grace_period_days | number | Días antes de pasar a past_due (0-30, default: 3) |
| description | string | Descripción del plan |
| Parámetro | Tipo | Descripción |
|---|---|---|
| plan_id* | UUID | ID del plan al que se suscribe |
| customer.name* | string | Nombre del suscriptor |
| customer.email* | string | Email para notificaciones de cobro |
| customer.external_id | string | Tu ID interno del cliente |
| external_reference | string | Tu referencia de suscripción |
| webhook_url | string | URL para webhooks de esta suscripción |
| trial_period_days | number | Sobreescribe días de prueba del plan |
pendingEsperando primer pagotrialingEn período de pruebaactiveAl corriente de pagospast_duePago vencido, en graciacancelledCanceladaexpiredExpiradasubscription.createdNueva suscripción registradasubscription.activatedPrimer pago confirmadosubscription.renewedNuevo período generadosubscription.payment_succeededCuota pagada con éxitosubscription.payment_failedCuota no cobradasubscription.past_duePasó al período de graciasubscription.cancelledSuscripción canceladacustomer_portal_url donde el cliente puede ver el estado, historial de cobros y pagar cuotas pendientes — sin intervención tuya.month / 1Mensualmonth / 3Trimestralmonth / 12Anualday / 7Semanalcurl -X POST "https://recasmart.online/api/public/subscriptions/plans" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Plan Mensual Pro",
"description": "Acceso completo a la plataforma",
"amount": 5000,
"currency": "ARS",
"interval_unit": "month",
"interval_count": 1,
"trial_period_days": 7,
"grace_period_days": 3
}'Webhooks Firmados
checkout.completedcheckout.failedcheckout.expiredorder.completedrefund.createdorder.failed| Parámetro | Tipo | Descripción |
|---|---|---|
| checkout_id* | string | ID del checkout |
| transaction_id* | string | ID de la transacción |
| status* | string | COMPLETED / FAILED / EXPIRED |
| amount* | number | Monto cobrado |
| currency* | string | ARS / USD / BRL / PYG |
| external_reference* | string | Tu ID de orden |
| paid_at* | string | Fecha de pago (ISO 8601) |
| timestamp* | string | Fecha del evento |
Si tu servidor responde con un código distinto a 2xx:
1 min → 2 min → 4 min → 1 hora (máx. 4 intentos)
{
"type": "checkout.completed",
"data": {
"checkout_id": "14b1abb3-1458-4f3d-8740-83e457a4596e",
"transaction_id": "a3f8c2d1-9b7e-4f3a-bc21-5d8e1f2a9c4b",
"status": "COMPLETED",
"amount": 1500.50,
"currency": "ARS",
"external_reference": "ORDER_123",
"paid_at": "2026-02-19T12:05:22Z"
},
"timestamp": "2026-02-19T12:05:23Z"
}Verificar Firma HMAC
X-RecaSmart-Signaturesha256=firma_hmacX-RecaSmart-TimestampUnix timestamp- Verificá sobre el body CRUDO — re-serializar el JSON parseado reordena las claves y rompe la firma. Es la causa #1 de "firma inválida".
- Verifica la firma antes de procesar el webhook
- Rechaza timestamps > 5 minutos (replay attack)
- Responde
200 OKinmediatamente, procesa async - Tu endpoint debe ser idempotente
import { constructEvent } from "@recasmart/sdk";
// Next.js App Router
export async function POST(req: Request) {
const body = await req.text(); // ← CRUDO, sin parsear
// Valida firma + ventana anti-replay.
// Lanza WebhookSignatureError si no valida.
const event = await constructEvent(
body,
req.headers,
process.env.RECASMART_WEBHOOK_SECRET!
);
if (event.type === "checkout.completed") {
await activarCuenta(event.data.external_reference);
}
return new Response("ok");
}E-commerce. Sin código.
WooCommerce
Soporte nativo para checkout, gestión de órdenes y webhooks automáticos. Compatible con HPOS.
Descargar PluginTiendanube
Integración oficial por OAuth2. Habilita transferencias y PIX en tu tienda en 3 clics.
Conectar Tienda1. Descarga el plugin ZIP desde nuestro portal.
2. En WordPress: Plugins → Añadir nuevo → Subir.
3. Configuración: Ingresa tu API Key y Webhook Secret.
4. Verifica el endpoint de webhook: ?wc-api=recasmartRecaSmart MCP Server
@recasmart/mcp le da a tu asistente de IA la capacidad de integrar y probar cobros por vos: crea checkouts, simula pagos en sandbox, verifica que tu webhook los reciba y diagnostica firmas inválidas. Elegí tu herramienta en las pestañas de la derecha → el JSON es el mismo en todas, solo cambia dónde va el archivo.- Atajo total:
npx @recasmart/mcp initcrea la credencial sandbox desde tu cuenta (autorizás en el navegador) y configura tu cliente en un solo paso. - Node 18+ instalado (el server corre con
npx, no hay que instalar nada más). - Usá una key
sk_test_: el sandbox no requiere KYC y el agente puede simular pagos libremente. - En Windows, si el cliente no encuentra
npx, usá"command": "cmd", "args": ["/c", "npx", "-y", "@recasmart/mcp"]. - Para verificar la conexión, pedile al agente: "llamá a recasmart_status" — te dice ambiente y permisos.
- Cualquier otro cliente MCP funciona con el mismo bloque
mcpServers. - Sin API key: desde claude.ai conectás el MCP como custom connector y autorizás con tu cuenta (OAuth). Ver la pestaña claude.ai (OAuth).
El MCP remoto es también un authorization server: implementa el descubrimiento de RFC 9728, registro dinámico de clientes (RFC 7591) y authorization code con PKCE. Alcanza con darle https://recasmart.online/api/mcp a un cliente compatible: te va a mandar a una pantalla de consentimiento donde ves qué permisos pide y con qué cuenta los estás dando.
- Cada app conectada recibe su propia credencial sandbox; nunca ve una key de producción.
- Si tenés 2FA activo, el consentimiento te pide el código igual que crear una key a mano.
- Se corta desde Developers → API Keys, revocando la key
MCP – <app> (OAuth).
sk_test_ todo está habilitado (no hay plata real). Con sk_live_ las escrituras se bloquean salvo RECASMART_ALLOW_LIVE=true — y simular pagos nunca funciona en producción.# Un solo comando desde tu proyecto:
claude mcp add recasmart \
-e RECASMART_API_KEY=sk_test_... \
-- npx -y @recasmart/mcp
# O compartilo con tu equipo versionando .mcp.json
# en la raíz del repo:
# {
# "mcpServers": {
# "recasmart": {
# "command": "npx",
# "args": ["-y", "@recasmart/mcp"],
# "env": { "RECASMART_API_KEY": "sk_test_..." }
# }
# }
# }Seguridad y Aislamiento
Multi-tenancy robusto y protección de datos
Aislamiento de Organización
Cada request es validado a nivel de middleware. El merchant_id se deriva del hash SHA-256 de tu API Key, asegurando que tus consultas jamás puedan acceder a datos de otra organización.
Hashing de Keys
No guardamos tus API Keys en texto plano. Almacenamos únicamente el hash irrevertible, protegiéndote incluso en caso de una filtración de base de datos.
Firma de Webhooks
Cada notificación enviada por RecaSmart viaja firmada con HMAC-SHA256 usando tu webhook_secret personal, garantizando autenticidad e integridad.
Conformidad Regional
Nuestros sistemas cumplen con normativas de protección de datos personales de Argentina, Brasil y Paraguay, manejando la información sensible bajo estrictos estándares de seguridad. En cobros con tarjeta (Bancard), los datos de la tarjeta viven solo en el iframe del procesador: nunca tocan RecaSmart.
¿Listo para escalar tus cobros?
Únete a los cientos de comercios que ya están transformando sus finanzas con RecaSmart.