Crear cobros
Creás un cobro con un referenceId tuyo, un monto, una descripción y al menos una fecha de vencimiento. El pagador paga a un CVU (o se concilia por su CUIL).
Campos principales (cobro standard)
referenceId | requerido | Tu llave de reconciliación. 8–100 caracteres: letras, números, - y _. |
amount | opcional | Monto en pesos, hasta 2 decimales, máx 10.000.000. Sin amount, el cobro nace en estado draft. |
description | requerido | Descripción del cobro (3–500 caracteres). |
dueDates | requerido | 1 o 2 fechas de vencimiento (ver Formatos de vencimiento). |
surcharge | condicional | Recargo del segundo vencimiento. Requerido solo con 2 dueDates (day-only) y amount. |
conciliationType | opcional | "cvu" (default) o "cuil". Ver la guía Conciliación. |
sendWhatsappNotification / sendEmailNotification | opcional | Avisos al pagador por canal. Ver la guía Notificaciones. |
webhookUrl | opcional | Webhook exclusivo para este cobro (HTTPS). Ver la guía Webhooks. |
metadata | opcional | Pares clave-valor (string→string) para reconciliación libre: los adjuntás al crear el cobro y vuelven idénticos en el GET individual y en cada webhook. Máx 50 claves, clave ≤40 chars, valor ≤500 chars (solo strings), 8 KB en total. Funciona igual en single y bulk (per-item). |
customer | requerido | Datos del pagador. name es requerido; taxDocument es requerido en modo cuil. Podés validarlo contra ARCA antes de crear el cobro. Ver Conciliación → Validar al pagador. |
Ver ejemplo
Formatos de vencimiento (dueDates)
Podés vencer por día O en el minuto exacto (datetime), ideal para casos de vida corta: eventos, estacionamiento, reservas. El vencimiento datetime SÍ dispara webhook al expirar (evento payment_request.expired); el day-only solo cambia el estado.
Cada vencimiento acepta uno de dos formatos:
Ej. "2026-02-15". Vence al fin del día en hora Argentina. Debe ser posterior a hoy y como máximo a 35 días. Es el único formato que admite 2 vencimientos (con surcharge).
Zona opcional: sin zona se asume hora Argentina; "Z" es UTC; o un offset como -03:00. Debe ser como mínimo dentro de 3 minutos y como máximo a 35 días. NO admite segundo vencimiento: es para casos de vida corta (eventos, estacionamiento). Al vencer, dispara webhook.
Ciclo de vida
draft | Borrador: creado sin amount. No envía notificaciones y admite un solo vencimiento. |
pending | Pendiente de pago. |
partial_payment | Pago parcial recibido; queda saldo. |
total_payment | Pagado en su totalidad. |
overdue | Vencido sin pago. |
partial_overdue | Vencido con pago parcial. |
canceled | Cancelado manualmente con POST /payment-request/{referenceId}/cancel. |
Cobro de checkout (widget)
Con type: "checkout" el cobro nace sin pagador y sin CVU. Mandás lo indispensable y te devolvemos un paymentRequestId para abrir el widget embebido. El pagador se identifica adentro del widget con su CUIL o DNI, y recién ahí se le asigna el CVU al que transferir. Es el modo para un e-commerce, donde no conocés al comprador antes de la compra.
type | requerido | El valor exacto "checkout". Si lo omitís, el cobro es standard. |
referenceId | requerido | Tu llave de reconciliación, igual que en un cobro standard. |
amount | requerido | Acá SÍ es obligatorio: sin monto el widget no tiene qué mostrar. No existe el estado draft en este modo. |
description | requerido | Descripción del cobro que ve el pagador. |
expiresInMinutes | opcional | Minutos de vida del cobro. Default 15, mínimo 3, máximo 60. Reemplaza a dueDates: no calculás fechas. |
webhookUrl | opcional | Webhook exclusivo para este cobro, igual que en standard. |
metadata | opcional | Pares clave-valor, igual que en standard. |
Ver ejemplo
Cobros masivos (bulk)
POST /payment-request/bulk crea entre 1 y 100 cobros en una sola llamada, de forma atómica (all-or-nothing) y siempre en modo CUIL.
- Body: { "paymentRequests": [ ... ] }. Entre 1 y 100 items (máximo 100), siempre en modo CUIL. Cada item es como el cobro individual sin conciliationType, con customer.taxDocument obligatorio (CUIL de 11 dígitos o DNI de 7-8).
- 201: todos los cobros comparten un CVU (sharedCvu) y los datos de acreditación (accountInfo). La respuesta trae batchId, total, created y un paymentRequests[] con { referenceId, state }.
- 400: validación estructural (Joi). Array vacío, más de 100 items, o campos de un item fuera de contrato.
- 422: validación de negocio. No se crea ningún cobro y la respuesta { message, errors: [{ index, referenceId, reason }] } reporta TODOS los items que fallan, no solo el primero. Los reason vienen en inglés, por ejemplo "Duplicate referenceId within the batch", "The referenceId already exists for this integration", "The taxDocument does not resolve to a valid CUIL".
- El bulk prohíbe type y expiresInMinutes: ya es CUIL-only con taxDocument obligatorio por ítem, así que no hay tipo que derivar.