{"openapi":"3.0.0","components":{"examples":{},"headers":{},"parameters":{},"requestBodies":{},"responses":{},"schemas":{"PostWebhookPaymentRequestBody":{"type":"object","additionalProperties":false,"description":"Payload de los eventos `payment_request.payment_received` y `payment_request.expired`.","required":["referenceId","requestedAmount","paidAmount","remainingAmount","activeDueDateIndex","activeDueDate","activeDueDateAmount","totalDueDates","event","livemode","stateType"],"properties":{"referenceId":{"type":"string","description":"El mismo referenceId que enviaste al crear el cobro. Usalo para identificar la entidad correspondiente de tu lado."},"requestedAmount":{"type":"number","format":"double","description":"Monto original solicitado, sin recargos."},"paidAmount":{"type":"number","format":"double","description":"Monto pagado acumulado. Puede ser parcial."},"thisPaymentAmount":{"type":"number","format":"double","description":"Monto de ESTE pago: la transacción que disparó el webhook. A diferencia de `paidAmount` (acumulado), refleja solo lo pagado en este evento. Ausente cuando el evento no corresponde a una transacción de pago."},"reconciledPayerCuil":{"type":"number","format":"double","description":"CUIL/CUIT de la cuenta que transfirió, si se conoce. En modo CUIL es el usado para imputar."},"reconciledPayerName":{"type":"string","description":"Nombre del titular de la cuenta que hizo la transferencia."},"reconciledPayerCbu":{"type":"string","description":"CBU/CVU de origen de quien hizo la transferencia."},"remainingAmount":{"type":"number","format":"double","description":"Monto que falta pagar en el vencimiento activo, calculado como activeDueDateAmount - paidAmount. Nunca es negativo. Es 0 cuando stateType es total_payment, aunque el pago haya quedado corto por menos de $1."},"activeDueDateIndex":{"type":"number","format":"double","description":"Índice del vencimiento activo (base 1)."},"activeDueDate":{"type":"string","format":"date-time","description":"Vencimiento activo, ISO-8601."},"activeDueDateAmount":{"type":"number","format":"double","description":"Monto total del vencimiento activo, con recargos incluidos."},"totalDueDates":{"type":"number","format":"double","description":"Cantidad de vencimientos configurados para este cobro."},"upcomingDueDateIndex":{"type":"number","format":"double","description":"Índice del próximo vencimiento. Solo si hay un próximo vencimiento y el cobro no está saldado."},"upcomingDueDate":{"type":"string","format":"date-time","description":"Próximo vencimiento, ISO-8601. Solo si hay un próximo vencimiento y el cobro no está saldado."},"upcomingDueDateAmount":{"type":"number","format":"double","description":"Monto total del próximo vencimiento, con recargos incluidos. Solo si hay un próximo vencimiento y el cobro no está saldado."},"upcomingAmountToPay":{"type":"number","format":"double","description":"Lo que faltaría pagar si el cobro pasa al próximo vencimiento. Solo si hay un próximo vencimiento y el cobro no está saldado."},"event":{"$ref":"#/components/schemas/IntegrationWebhookEventType","description":"Discriminador del evento: enrutá por este campo. El estado actual del recurso viaja en `stateType`, que es la fuente de verdad para decidir la acción."},"livemode":{"type":"boolean","description":"true solo en producción con un evento real; false en cualquier otro ambiente y cuando el evento lo disparó el botón de prueba (POST /my-integration/test-webhook). Ante la duda, false."},"stateType":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado actual del cobro."},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Metadata del integrador, devuelta en cada payload de webhook. Ausente (no null) cuando el cobro se creó sin metadata."}}},"PostWebhookUnmatchedPaymentBody":{"type":"object","additionalProperties":false,"description":"Payload del evento `payment.unmatched`: llegó dinero a uno de tus CVU de cobranza y no se pudo imputar a un cobro. Lleva la transferencia y nunca el estado de un cobro, porque casi siempre no hay ningún cobro al que referirse.","required":["event","livemode","reason","amount","operationDate","merchantUserId","merchantTaxId","merchantName"],"properties":{"event":{"type":"string","enum":["payment.unmatched"],"description":"Siempre `payment.unmatched` en este payload. Enrutá por este campo."},"livemode":{"type":"boolean","description":"true solo en producción con un evento real; false en cualquier otro ambiente y cuando el evento lo disparó el botón de prueba. Ante la duda, false."},"reason":{"$ref":"#/components/schemas/UnmatchedPaymentReason","description":"Por qué no se pudo imputar la transferencia. Lo que tenés que hacer depende del motivo."},"amount":{"type":"number","format":"double","description":"Monto recibido, en pesos con dos decimales: la misma unidad que el resto de los montos de estos webhooks."},"operationDate":{"type":"string","format":"date-time","description":"Cuándo se hizo la transferencia, ISO-8601."},"payerCuil":{"type":"number","format":"double","description":"CUIL del pagador, cuando se conoce."},"payerName":{"type":"string","description":"Nombre del titular de la cuenta del pagador, cuando se conoce."},"payerCbuCvu":{"type":"string","description":"Cuenta de origen del pago, 22 dígitos. Puede ser un CBU (cuenta bancaria) o un CVU (cuenta virtual de un PSP): comparten formato y dígito verificador, y cuál es depende de desde dónde transfirió el pagador. El nombre del campo admite ambos y no afirma ninguno."},"creditCvu":{"type":"string","description":"El CVU de cobranza donde se acreditó el dinero."},"merchantUserId":{"type":"string","description":"Comercio al que llegó la transferencia. Es el mismo valor que devuelve `merchantUserId` en `GET /me`."},"merchantTaxId":{"type":"string","description":"CUIT/CUIL del titular de la cuenta del comercio que recibió la transferencia, sin guiones. Es el mismo valor que `accountHolderTaxId` en `GET /me`."},"merchantName":{"type":"string","description":"Nombre de fantasía del comercio que recibió la transferencia. Es el mismo valor que `fantasyName` en `GET /me`."},"tenantKey":{"type":"string","description":"Clave de la sede (tenant) a la que está vinculado ese comercio. Se omite cuando el comercio no tiene sede; nunca viaja como `null`. No sirve para identificar al comercio: para eso usá `merchantTaxId` o `merchantUserId`."},"paymentRequest":{"type":"object","additionalProperties":false,"required":["dueDate"],"description":"El cobro al que probablemente correspondía el dinero. Solo está presente cuando se pudo identificar uno; si no, no aparece. Va ANIDADO a propósito: plano, `referenceId` quedaría en el mismo lugar que en los eventos payment_request, y un integrador que no distinga por `event` marcaría como pagada una reserva con dinero que nunca se imputó.","properties":{"referenceId":{"type":"string","description":"Tu propia referencia. Ausente si nunca nos diste una: por eso lo que distingue un pago \"atribuido\" es la presencia de este objeto, no de referenceId."},"dueDate":{"type":"string","format":"date-time","description":"Vencimiento de ese cobro, con el mismo formato que dueDate en los eventos payment_request, para que ambos informen el mismo instante para el mismo cobro."}}}}},"IntegrationWebhookEventType":{"type":"string","enum":["payment_request.payment_received","payment_request.expired","payment.unmatched","refund.succeeded","refund.failed"],"description":"Discriminador del evento. Enrutá por este campo; actuá según el estado del recurso."},"UnmatchedPaymentReason":{"type":"string","enum":["expired","already_paid","canceled","no_cuil_match","no_pending","ambiguous"],"description":"Motivo por el que no se imputó la transferencia. no_cuil_match o no_pending pueden re-imputarse al identificar o corregir al pagador, si cumplen las condiciones del cobro. no_cuil_match también puede corresponder a un cobro vencido; ambiguous no atribuye la transferencia a ningún cobro. El comercio puede revisar e imputar manualmente desde su cuenta, incluso desde otro CVU suyo o a un cobro vencido; se emite payment_request.payment_received. No automatices devoluciones ni vuelvas a cobrar sin consultar el cobro."},"PostWebhookRefundBody":{"type":"object","additionalProperties":false,"description":"Payload de los eventos `refund.succeeded` y `refund.failed`: una devolución terminó. Es la misma devolución que devuelve `GET /refunds/{refundId}`, más los datos del comercio.","required":["event","livemode","merchantUserId","merchantTaxId","merchantName","refundId","paymentRequest","origin","trigger","status","requestedAmount","refundedAmount","reason","items"],"properties":{"event":{"type":"string","enum":["refund.succeeded","refund.failed"],"description":"`refund.succeeded` si volvió toda la plata. `refund.failed` si al menos una parte no se pudo devolver, aunque otra sí: mirá `status` y `refundedAmount`."},"livemode":{"type":"boolean","description":"true solo en producción con un evento real; false en cualquier otro ambiente y cuando el evento lo disparó el botón de prueba. Ante la duda, false."},"merchantUserId":{"type":"string","description":"Comercio que devolvió la plata. Es el mismo valor que devuelve `merchantUserId` en `GET /integration/me`."},"merchantTaxId":{"type":"string","description":"CUIT/CUIL del titular de la cuenta del comercio, sin guiones. Es el mismo valor que `accountHolderTaxId` en `GET /integration/me`."},"merchantName":{"type":"string","description":"Nombre de fantasía del comercio. Es el mismo valor que `fantasyName` en `GET /integration/me`."},"tenantKey":{"type":"string","description":"Clave de la sede (tenant) a la que está vinculado ese comercio. Se omite cuando el comercio no tiene sede; nunca viaja como `null`. No sirve para identificar al comercio: para eso usá `merchantTaxId` o `merchantUserId`."},"refundId":{"type":"string","description":"Id de la devolución. Sirve para consultarla con `GET /refunds/{refundId}`."},"paymentRequest":{"type":"object","nullable":true,"additionalProperties":false,"description":"El cobro devuelto. `null` en una devolución automática de una transferencia que no se imputó a ningún cobro.","required":["referenceId","state"],"properties":{"referenceId":{"type":"string","description":"Tu referencia del cobro."},"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del cobro al momento del aviso: `refunded`, `partially_refunded`, o el de antes si no volvió nada."}}},"origin":{"type":"string","enum":["api","merchant","chyta","auto"],"description":"Quién pidió la devolución: vos por API, el comercio desde el portal, soporte de ChytaPay, o una regla automática de tu integración."},"trigger":{"type":"string","nullable":true,"enum":["unmatched","partial","excess"],"description":"Solo en `auto`: transferencia sin cobro, pago de menos o sobrante de un pago de más."},"status":{"type":"string","enum":["succeeded","failed","partially_failed"],"description":"Estado final de la devolución."},"requestedAmount":{"type":"number","description":"Monto pedido, en pesos con dos decimales."},"refundedAmount":{"type":"number","description":"Monto que efectivamente volvió al pagador, en pesos con dos decimales."},"reason":{"type":"string","nullable":true,"description":"Motivo que se cargó al pedirla."},"items":{"type":"array","description":"Una transferencia de vuelta por cada pago devuelto.","items":{"type":"object","additionalProperties":false,"required":["amount","status"],"properties":{"amount":{"type":"number","description":"Pesos, dos decimales."},"status":{"type":"string","enum":["pending","processing","succeeded","failed"]}}}}}},"IntegrationMessageError":{"description":"Respuesta breve de los handlers (sin code ni id).","properties":{"message":{"type":"string"}},"required":["message"],"type":"object","additionalProperties":true},"IntegrationUnauthorizedError":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"type":"string"}],"description":"Gateway desplegado: JSON con message; middleware directo: texto plano."},"IntegrationApiError":{"description":"Error JSON procesado por el middleware; los errores de autenticación pueden ser texto plano.","properties":{"code":{"type":"string"},"message":{"type":"string"},"id":{"type":"string"},"validationDetails":{"items":{"properties":{"message":{"type":"string"},"field":{"type":"string"}},"required":["message","field"],"type":"object"},"type":"array"}},"required":["code","message"],"type":"object","additionalProperties":true},"IntegrationBadRequestError":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"type":"string"}],"description":"400 de validación o de datos de autenticación incompletos."},"IntegrationForbiddenError":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}],"description":"403 de vínculo ausente (texto o JSON) o ProductionAccessRevokedError (JSON)."},"IntegrationNotFoundError":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}],"description":"404 de autenticación en texto o de recurso en JSON."},"IntegrationPaymentRequestState":{"enum":["draft","pending","total_payment","canceled","overdue","partial_payment","partial_overdue","refunded","partially_refunded"],"type":"string"},"GetAllPaymentRequestsResponseBody":{"properties":{"paymentRequestId":{"type":"string","description":"ID interno del cobro en ChytaPay."},"referenceId":{"type":"string","description":"El `referenceId` que asignaste al crear el cobro."},"amount":{"type":"number","format":"double","description":"Monto del primer vencimiento; 0 si es borrador sin monto."},"paidAmount":{"type":"number","format":"double","description":"Monto pagado acumulado."},"dueDate":{"type":"string","description":"Primera fecha de vencimiento UTC (YYYY-MM-DD); cadena vacía si no tiene detalle."},"status":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del listado en inglés, igual que `state` en el GET por referencia."},"customer":{"properties":{"email":{"type":"string"},"phoneNumber":{"type":"string","description":"Teléfono concatenado y normalizado, incluido el código de país."},"name":{"type":"string"}},"required":["name"],"type":"object","description":"Datos del pagador."},"createdAt":{"type":"string","description":"Fecha de creación del cobro (ISO).","format":"date-time"}},"required":["paymentRequestId","referenceId","amount","paidAmount","dueDate","status","customer","createdAt"],"type":"object","additionalProperties":true},"PaymentRequestType":{"description":"Tipo de cobro.\n\nNo es un preset: cambia qué campos se aceptan, qué invariantes valen y qué\ndevuelve el create. Por eso es un tipo y no un flag.\n\n- `standard`: el cobro de siempre. Lo que se creó hasta hoy sin mandar nada.\n- `checkout`: se paga con el widget embebido. Nace sin `customer` y sin cuenta\n  asignada, con vencimiento en minutos; el pagador aporta su documento adentro\n  del widget y recién ahí se le asigna el CVU.","enum":["standard","checkout"],"type":"string"},"Record_string.string_":{"properties":{},"additionalProperties":{"type":"string"},"type":"object"},"PaymentRequestCustomerResponseBody":{"properties":{"name":{"type":"string"},"phoneNumber":{"properties":{"number":{"type":"string"},"countryCode":{"type":"string"}},"required":["number","countryCode"],"type":"object"},"email":{"type":"string"},"taxDocument":{"type":"string","description":"CUIL/DNI del pagador. Presente solo cuando `conciliationType` es 'cuil'."}},"required":["name"],"type":"object","additionalProperties":true},"CheckoutCustomerResponseBody":{"description":"El customer de un cobro `type: 'checkout'`: solo el documento precargado.","properties":{"taxDocument":{"type":"string","example":"20304050609"}},"required":["taxDocument"],"type":"object","additionalProperties":true},"PostPaymentRequestResponseBody":{"properties":{"type":{"$ref":"#/components/schemas/PaymentRequestType","description":"Tipo con el que quedó el cobro. `standard` si no se envió `type`."},"expiresInMinutes":{"type":"number","format":"double","description":"Minutos de vida configurados. Presente solo en `type: 'checkout'`."},"paymentRequestId":{"type":"string","description":"ID del cobro en ChytaPay (UUID): pasalo como `paymentId` al widget."},"referenceId":{"type":"string","description":"El mismo `referenceId` que enviaste en el request."},"amount":{"type":"number","format":"double","description":"Monto del cobro (ausente si se creó en borrador sin monto)."},"description":{"type":"string","description":"Descripción del cobro."},"dueDates":{"items":{"type":"string"},"type":"array","description":"Fechas YYYY-MM-DD o YYYY-MM-DDTHH:MM[:SS], con Z, offset o sin zona (-03:00)."},"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del cobro (pendiente, parcial, pagado, borrador, etc.)."},"surcharge":{"properties":{"value":{"type":"number","format":"double"},"type":{"type":"string","enum":["percentage","fixed"]}},"required":["value","type"],"type":"object","description":"Recargo configurado, presente si se envió con tipo distinto de `none`."},"calculatedAmounts":{"items":{"properties":{"isOriginalAmount":{"type":"boolean","description":"True si es el monto original sin recargo (primer vencimiento)."},"surchargeApplied":{"type":"number","format":"double","description":"Monto del recargo aplicado (solo presente si hay surcharge)."},"amount":{"type":"number","format":"double","description":"Monto total a pagar en ese vencimiento."},"dueDate":{"type":"string","description":"Fecha o instante del vencimiento; GET y PATCH lo recortan a fecha UTC."}},"required":["amount","dueDate"],"type":"object"},"type":"array","description":"Monto calculado para cada vencimiento (incluye el recargo aplicado al segundo)."},"sendWhatsappNotification":{"type":"boolean","description":"Canal WhatsApp habilitado para las notificaciones de este cobro."},"sendEmailNotification":{"type":"boolean","description":"Canal email habilitado para las notificaciones de este cobro."},"sendWhatsappPaymentConfirmation":{"type":"boolean","description":"Valor efectivamente persistido para el aviso de confirmación de pago.\nAusente cuando no se especificó, y ahí rige el comportamiento por defecto del\nmodo de conciliación.\n\nEn un cobro creado por lote puede diferir de lo que enviaste para ese ítem:\nel valor es del lote, así que ítems en desacuerdo se colapsan. Leerlo acá es\nla forma de saber con qué quedó."},"reminderNotificationDate":{"type":"string","description":"Fecha del recordatorio de pago configurado (si se envió).","format":"date"},"deferredInitialNotificationDate":{"type":"string","description":"Fecha de la notificación inicial diferida (si se envió).","format":"date"},"webhookUrl":{"type":"string","description":"URL de webhook propia del cobro, tal como se persistió. Ausente (no `null`)\nsi el cobro no definió una URL per-request. El despacho a esta URL usa un\n`validation-token` vacío.","example":"https://hooks.example.com/pay"},"metadata":{"$ref":"#/components/schemas/Record_string.string_","description":"Metadata del integrador, devuelta tal cual se envió en el request.\nAusente (no `null`) cuando el cobro se creó sin metadata.","example":{"order_id":"abc-123","tenant":"acme"}},"customer":{"anyOf":[{"$ref":"#/components/schemas/PaymentRequestCustomerResponseBody"},{"$ref":"#/components/schemas/CheckoutCustomerResponseBody"}],"description":"Datos del pagador, tal como se enviaron en el request. En `type: 'checkout'`\ntrae solo `taxDocument`, y solo si se precargó."},"CVU":{"type":"string","description":"CVU donde el pagador debe transferir para pagar este cobro.\n\nAUSENTE en `type: 'checkout'`: el cobro nace sin cuenta y el CVU se asigna\nrecién cuando el pagador se identifica en el widget. El widget lo lee del\nsummary; el comercio no lo necesita."},"bankAccountInfo":{"properties":{"bankName":{"type":"string","description":"Nombre del banco."},"accountHolderTaxId":{"type":"string","description":"CUIT del titular de la cuenta."},"accountHolderName":{"type":"string","description":"Nombre del titular de la cuenta."}},"required":["bankName","accountHolderTaxId","accountHolderName"],"type":"object","description":"Datos bancarios del titular de la cuenta de cobro (la sede/comercio que recibe\nel dinero). Ausente en `type: 'checkout'` por el mismo motivo que `CVU`."}},"required":["type","referenceId","description","dueDates","state","sendWhatsappNotification","sendEmailNotification"],"type":"object","additionalProperties":true},"Record_string.unknown_":{"properties":{},"additionalProperties":{},"type":"object"},"IntegrationConflictError":{"description":"Conflicto de un cobro o su pagador.","properties":{"error":{"type":"string"},"message":{"type":"string"},"referenceId":{"type":"string"},"data":{"$ref":"#/components/schemas/Record_string.unknown_"}},"required":["error","message"],"type":"object","additionalProperties":true},"IntegrationDailyLimitError":{"description":"Cupos diarios: las propiedades presentes dependen de `code`.","properties":{"code":{"type":"string"},"message":{"type":"string"},"availableAt":{"type":"string"},"maxRequestsPerDay":{"type":"number","format":"double"},"maxMessagesPerDay":{"type":"number","format":"double"},"requestedMessages":{"type":"number","format":"double"},"availableAtUnixSeconds":{"type":"number","format":"double"},"maxLookupsPerDay":{"type":"number","format":"double"}},"required":["code","message"],"type":"object","additionalProperties":true},"PaymentRequestType.STANDARD":{"enum":["standard"],"type":"string"},"ConciliationMode":{"enum":["cvu","cuil"],"type":"string"},"IntegrationSurchargeInputType":{"type":"string","enum":["percentage","fixed","none"],"description":"Tipo de recargo que aceptan los integradores externos en la entrada.\n\"percentage\" es el valor público canónico. Internamente se guarda \"%\";\nla traducción en el borde está en paymentRequest.surchargeMapper."},"PostStandardPaymentRequestBody":{"description":"Cobro `standard`: el de siempre. El pagador se declara al crear y el CVU se le\nasigna en ese momento.","properties":{"referenceId":{"type":"string","description":"ID de referencia único, generado por tu sistema, para identificar este cobro.\nEl mismo valor se devuelve en el webhook y en las consultas, así podés vincular\nel evento con la entidad de tu sistema (factura, pedido, socio, etc.).\n\nSi operás varias cuentas/sedes bajo la misma integración, podés prefijar un\nidentificador en este campo —debe seguir siendo único por cobro—, por ejemplo\n\"SEDE01-FACT00123\".\n\nLargo: 8 a 100 caracteres. Solo letras, números, guion (-) y guion bajo (_).","example":"SEDE01-FACT00123"},"description":{"type":"string","description":"Descripción del cobro que ve el pagador. Largo: 3 a 500 caracteres.","example":"Cuota mes de marzo"},"webhookUrl":{"type":"string","description":"URL de webhook propia de este cobro. Si se envía, REEMPLAZA por completo la\nURL global de la integración para los eventos de ESTE cobro.\n\nDebe ser HTTPS y de hasta 2048 caracteres. El despacho a esta URL usa un\n`validation-token` vacío (`\"\"`): al proveer tu propia URL controlás el\nrouting y no dependés del token de validación global de la integración.","example":"https://hooks.example.com/pay"},"metadata":{"$ref":"#/components/schemas/Record_string.string_","description":"Pares clave-valor arbitrarios (string → string) para asociar a este cobro.\nSe devuelven en cada respuesta y webhook. Máximo 50 claves; clave de hasta\n40 caracteres; valor de hasta 500; total serializado de hasta 8192 bytes.","example":{"order_id":"abc-123","tenant":"acme"}},"type":{"$ref":"#/components/schemas/PaymentRequestType.STANDARD","description":"Tipo de cobro. Se puede omitir: `standard` es el default.","example":"standard"},"amount":{"type":"number","format":"double","description":"Monto del cobro en pesos, mandá hasta 2 decimales (máximo 200.000.000).\n\nOpcional: si se omite, el cobro se crea en estado borrador\n(DRAFT), no se envían notificaciones y solo se admite 1 vencimiento. El monto se\ncompleta después con PATCH /payment-request/{referenceId}.","example":15000.5,"maximum":200000000},"dueDates":{"items":{"type":"string"},"type":"array","description":"Fechas YYYY-MM-DD o YYYY-MM-DDTHH:MM[:SS], con Z, offset o sin zona (-03:00). El primer elemento es el PRIMER\nvencimiento; el segundo (opcional) es el SEGUNDO vencimiento.\n\nReglas:\n- 1 o 2 fechas (solo 1 si no se envía `amount`, estado borrador).\n- Cada fecha debe ser posterior a hoy y como máximo a 35 días de hoy.\n- Con hora: un solo vencimiento, al menos 3 minutos en el futuro. Sin zona\n  se interpreta -03:00; en borradores enviá siempre un offset explícito.\n- Entre las 21 y 24 de Argentina la validación usa el día UTC: elegí pasado mañana.\nLos ejemplos de fecha son ilustrativos: reemplazalos por fechas futuras dentro del límite.\n- El recargo (`surcharge`) se aplica sobre el segundo vencimiento.\nEjemplo ilustrativo de formato: `[\"2030-01-15\", \"2030-01-25\"]`.\nReemplazá esas fechas por vencimientos futuros dentro del límite."},"customer":{"properties":{"taxDocument":{"type":"string","description":"CUIL (11 dígitos) o DNI (7-8 dígitos) del pagador.\nObligatorio cuando `conciliationType` es 'cuil'; ignorado en modo 'cvu'.","example":"20304050609"},"email":{"type":"string","description":"Email del pagador.","example":"juan@example.com"},"phoneNumber":{"properties":{"number":{"type":"string","description":"Código de área + número, 6 a 20 caracteres: dígitos, +, -, paréntesis y espacios.","example":"1112345678"},"countryCode":{"type":"string","description":"Código de país con prefijo +.","example":"+54"}},"required":["number","countryCode"],"type":"object"},"name":{"type":"string","description":"Nombre del pagador. Largo: 2 a 150 caracteres.","example":"Juan Pérez"}},"required":["name"],"type":"object","description":"Datos del pagador.\n\n`phoneNumber` es obligatorio si `sendWhatsappNotification` es true; `email` es\nobligatorio si `sendEmailNotification` es true; `taxDocument` es obligatorio si\n`conciliationType` es 'cuil'."},"conciliationType":{"$ref":"#/components/schemas/ConciliationMode","description":"Modo de conciliación del cobro:\n- 'cvu' (default): el pagador transfiere al CVU del cobro; se concilia por la transferencia.\n- 'cuil': se concilia por el CUIL/DNI del pagador; requiere `customer.taxDocument`.","example":"cvu"},"surcharge":{"properties":{"value":{"type":"number","format":"double","description":"Valor del recargo: monto en pesos si es 'fixed', porcentaje 0-100 si es 'percentage', 0 si es 'none'. El recargo fijo admite como máximo 200.000.000; mandá hasta 2 decimales."},"type":{"$ref":"#/components/schemas/IntegrationSurchargeInputType","description":"Tipo de recargo: 'fixed' (monto fijo en pesos), 'percentage' (porcentaje 0-100), 'none' (sin recargo)."}},"required":["value","type"],"type":"object","description":"Recargo que se aplica al segundo vencimiento (cuando se envían 2 fechas).\n- Obligatorio si hay `amount` y 2 vencimientos.\n- No debe enviarse si no hay `amount` (estado borrador).","example":{"type":"fixed","value":100}},"sendWhatsappNotification":{"type":"boolean","description":"Enviar la solicitud de cobro y sus recordatorios por WhatsApp.\n\nSi se omite, decide la configuración de WhatsApp de tu integración, donde el aviso\narranca apagado: se envía si ChytaPay lo habilitó, lo prendiste por defecto y el cobro\ntiene `amount` y `customer.phoneNumber`. Si no, no se envía y el cobro se crea igual.\nEn `true` requiere `customer.phoneNumber` y que ChytaPay haya habilitado el aviso\npara tu integración (si no, 403); en `false` no se envía.\nDebe ser false (o omitirse) cuando no hay `amount`.\n\nEn `/bulk`, si otro item del lote manda `true`, es obligatorio en todo item con\n`amount` (si no, 400)."},"sendEmailNotification":{"type":"boolean","description":"Enviar la solicitud de cobro y sus recordatorios por email.\nObligatorio si se envía `amount`; requiere `customer.email`.\nDebe ser false (o omitirse) cuando no hay `amount`."},"sendWhatsappPaymentConfirmation":{"type":"boolean","description":"Enviar al pagador el aviso de confirmación por WhatsApp cuando el cobro se paga.\nEs independiente de `sendWhatsappNotification`, que solo gobierna la solicitud de\ncobro y sus recordatorios. No afecta el email de aviso al comercio.\n\nSi se omite, decide la configuración de WhatsApp de tu integración: si ChytaPay\nhabilitó la confirmación y la usás por defecto, en 'cvu' se envía y en 'cuil' no;\nsi no, no se envía. En `true` se envía en ambos modos y requiere que ChytaPay haya\nhabilitado la confirmación para tu integración (si no, 403); en `false` no se\nenvía en ninguno.","example":false},"reminderNotificationDate":{"type":"string","description":"\nFecha (YYYY-MM-DD) del recordatorio de pago. Si se omite, se usa el default\n(1 día antes del vencimiento). Debe ser posterior a hoy, anterior al primer\nvencimiento y —si hay notificación diferida— posterior a esa fecha.\nSolo válido cuando se envía `amount`.","format":"date\nEjemplo de formato: `2030-01-10`. Usá una fecha futura antes del vencimiento."},"deferredInitialNotificationDate":{"type":"string","description":"\nFecha (YYYY-MM-DD) para diferir el envío de la notificación INICIAL del cobro,\nen vez de enviarla al crearlo. Debe ser posterior a hoy y anterior al primer\nvencimiento. Solo válido cuando se envía `amount`.","format":"date\nEjemplo de formato: `2030-01-10`. Usá una fecha futura antes del vencimiento."}},"required":["referenceId","description","dueDates","customer"],"type":"object","additionalProperties":true},"PaymentRequestType.CHECKOUT":{"enum":["checkout"],"type":"string"},"PostCheckoutPaymentRequestBody":{"description":"Cobro `checkout`: se paga con el widget embebido. Nace sin pagador y sin CVU;\nlos dos se resuelven cuando el pagador se identifica adentro del widget.\n\nNo acepta los campos de `standard` (`dueDates`, `conciliationType`,\n`surcharge` ni los de notificación): enviarlos devuelve 400. De `customer`\nacepta solo `taxDocument`, como precarga.","properties":{"referenceId":{"type":"string","description":"ID de referencia único, generado por tu sistema, para identificar este cobro.\nEl mismo valor se devuelve en el webhook y en las consultas, así podés vincular\nel evento con la entidad de tu sistema (factura, pedido, socio, etc.).\n\nSi operás varias cuentas/sedes bajo la misma integración, podés prefijar un\nidentificador en este campo —debe seguir siendo único por cobro—, por ejemplo\n\"SEDE01-FACT00123\".\n\nLargo: 8 a 100 caracteres. Solo letras, números, guion (-) y guion bajo (_).","example":"SEDE01-FACT00123"},"description":{"type":"string","description":"Descripción del cobro que ve el pagador. Largo: 3 a 500 caracteres.","example":"Cuota mes de marzo"},"webhookUrl":{"type":"string","description":"URL de webhook propia de este cobro. Si se envía, REEMPLAZA por completo la\nURL global de la integración para los eventos de ESTE cobro.\n\nDebe ser HTTPS y de hasta 2048 caracteres. El despacho a esta URL usa un\n`validation-token` vacío (`\"\"`): al proveer tu propia URL controlás el\nrouting y no dependés del token de validación global de la integración.","example":"https://hooks.example.com/pay"},"metadata":{"$ref":"#/components/schemas/Record_string.string_","description":"Pares clave-valor arbitrarios (string → string) para asociar a este cobro.\nSe devuelven en cada respuesta y webhook. Máximo 50 claves; clave de hasta\n40 caracteres; valor de hasta 500; total serializado de hasta 8192 bytes.","example":{"order_id":"abc-123","tenant":"acme"}},"type":{"$ref":"#/components/schemas/PaymentRequestType.CHECKOUT","description":"Tipo de cobro. Obligatorio y con este valor exacto.","example":"checkout"},"amount":{"type":"number","format":"double","description":"Monto del cobro en pesos, mandá hasta 2 decimales (máximo 200.000.000).\nObligatorio: el widget no tiene qué mostrar sin monto.","example":15000.5,"maximum":200000000},"expiresInMinutes":{"type":"number","format":"double","description":"Minutos de vida del cobro, solo en `type: 'checkout'`. Default 15, mínimo 3,\nmáximo 60. Es el reemplazo de `dueDates` para este tipo: no calculás fechas.\n\nAl vencer, el cobro pasa a `overdue` y se dispara el webhook\n`payment_request.expired`, igual que cualquier vencimiento con hora.","example":15,"default":15,"minimum":3,"maximum":60},"customer":{"properties":{"taxDocument":{"type":"string","example":"20304050609"}},"required":["taxDocument"],"type":"object","description":"Precarga del pagador, si ya lo conocés (usuario registrado). Solo\n`taxDocument`: DNI (7-8 dígitos) o CUIL/CUIT (11, con dígito verificador).\n\nNo asigna CVU ni define al pagador: el widget arranca con este documento en\nvez de pedirlo, y el pagador puede cambiarlo. Cualquier otro campo de\n`customer` devuelve 400."}},"required":["referenceId","description","type","amount"],"type":"object","additionalProperties":true},"PostPaymentRequestRequestBody":{"description":"Body del create. Es una de las dos formas, segun `type`, y cada una tiene sus\npropios campos obligatorios.","oneOf":[{"$ref":"#/components/schemas/PostStandardPaymentRequestBody"},{"$ref":"#/components/schemas/PostCheckoutPaymentRequestBody"}]},"PostPaymentRequestBulkResponseBody":{"description":"Respuesta 201 del endpoint bulk. El detalle de cada cobro se consulta con\nGET /payment-request/{referenceId}. El CVU es compartido a nivel batch.","properties":{"batchId":{"type":"string","description":"ID del batch creado."},"total":{"type":"number","format":"double","description":"Cantidad total de cobros solicitados (= paymentRequests.length)."},"created":{"type":"number","format":"double","description":"Cantidad de cobros efectivamente creados."},"sharedCvu":{"type":"string","description":"CVU compartido por todos los cobros del batch."},"accountInfo":{"properties":{"bankName":{"type":"string","description":"Nombre del banco."},"accountHolderTaxId":{"type":"string","description":"CUIT del titular de la cuenta."},"accountHolderName":{"type":"string","description":"Nombre del titular de la cuenta."}},"required":["bankName","accountHolderTaxId","accountHolderName"],"type":"object","description":"Datos bancarios del titular de la cuenta de cobro (a nivel batch)."},"paymentRequests":{"items":{"properties":{"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado inicial del cobro (pending o draft)."},"referenceId":{"type":"string","description":"El `referenceId` que enviaste para este cobro."}},"required":["state","referenceId"],"type":"object"},"type":"array","description":"Una entrada por cobro creado, en el mismo orden del request."}},"required":["batchId","total","created","sharedCvu","accountInfo","paymentRequests"],"type":"object","additionalProperties":true},"PostPaymentRequestBulkItemError":{"description":"Detalle de un error de pre-validación de un item del bulk.","properties":{"index":{"type":"number","format":"double","description":"Índice (0-based) del item dentro del array `paymentRequests`."},"referenceId":{"type":"string","description":"El `referenceId` del item que falló (o el valor recibido, aunque sea inválido)."},"reason":{"type":"string","description":"Razón del rechazo (referenceId duplicado, CUIL sin candidatos, etc.)."}},"required":["index","referenceId","reason"],"type":"object","additionalProperties":true},"PostPaymentRequestBulkValidationErrorBody":{"description":"Respuesta 422 del endpoint bulk: la pre-validación encontró errores y NO se\ncreó ningún cobro. Reporta TODOS los items que fallaron, no solo el primero.","properties":{"message":{"type":"string"},"errors":{"items":{"$ref":"#/components/schemas/PostPaymentRequestBulkItemError"},"type":"array"}},"required":["message","errors"],"type":"object","additionalProperties":true},"Pick_PostStandardPaymentRequestBody.Exclude_keyofPostStandardPaymentRequestBody.conciliationType-or-type-or-customer-or-webhookUrl-or-dueDates-or-reminderNotificationDate-or-deferredInitialNotificationDate__":{"properties":{"amount":{"type":"number","format":"double","description":"Monto del cobro en pesos, mandá hasta 2 decimales (máximo 200.000.000).\n\nOpcional: si se omite, el cobro se crea en estado borrador\n(DRAFT), no se envían notificaciones y solo se admite 1 vencimiento. El monto se\ncompleta después con PATCH /payment-request/{referenceId}.","example":15000.5,"maximum":200000000},"surcharge":{"properties":{"value":{"type":"number","format":"double"},"type":{"$ref":"#/components/schemas/IntegrationSurchargeInputType"}},"required":["value","type"],"type":"object","description":"Recargo que se aplica al segundo vencimiento (cuando se envían 2 fechas).\n- Obligatorio si hay `amount` y 2 vencimientos.\n- No debe enviarse si no hay `amount` (estado borrador).","example":{"type":"fixed","value":100}},"sendWhatsappNotification":{"type":"boolean","description":"Enviar la solicitud de cobro y sus recordatorios por WhatsApp.\n\nSi se omite, decide la configuración de WhatsApp de tu integración, donde el aviso\narranca apagado: se envía si ChytaPay lo habilitó, lo prendiste por defecto y el cobro\ntiene `amount` y `customer.phoneNumber`. Si no, no se envía y el cobro se crea igual.\nEn `true` requiere `customer.phoneNumber` y que ChytaPay haya habilitado el aviso\npara tu integración (si no, 403); en `false` no se envía.\nDebe ser false (o omitirse) cuando no hay `amount`.\n\nEn `/bulk`, si otro item del lote manda `true`, es obligatorio en todo item con\n`amount` (si no, 400)."},"sendEmailNotification":{"type":"boolean","description":"Enviar la solicitud de cobro y sus recordatorios por email.\nObligatorio si se envía `amount`; requiere `customer.email`.\nDebe ser false (o omitirse) cuando no hay `amount`."},"sendWhatsappPaymentConfirmation":{"type":"boolean","description":"Enviar al pagador el aviso de confirmación por WhatsApp cuando el cobro se paga.\nEs independiente de `sendWhatsappNotification`, que solo gobierna la solicitud de\ncobro y sus recordatorios. No afecta el email de aviso al comercio.\n\nSi se omite, decide la configuración de WhatsApp de tu integración: si ChytaPay\nhabilitó la confirmación y la usás por defecto, en 'cvu' se envía y en 'cuil' no;\nsi no, no se envía. En `true` se envía en ambos modos y requiere que ChytaPay haya\nhabilitado la confirmación para tu integración (si no, 403); en `false` no se\nenvía en ninguno.","example":false},"referenceId":{"type":"string","description":"ID de referencia único, generado por tu sistema, para identificar este cobro.\nEl mismo valor se devuelve en el webhook y en las consultas, así podés vincular\nel evento con la entidad de tu sistema (factura, pedido, socio, etc.).\n\nSi operás varias cuentas/sedes bajo la misma integración, podés prefijar un\nidentificador en este campo —debe seguir siendo único por cobro—, por ejemplo\n\"SEDE01-FACT00123\".\n\nLargo: 8 a 100 caracteres. Solo letras, números, guion (-) y guion bajo (_).","example":"SEDE01-FACT00123"},"description":{"type":"string","description":"Descripción del cobro que ve el pagador. Largo: 3 a 500 caracteres.","example":"Cuota mes de marzo"},"metadata":{"$ref":"#/components/schemas/Record_string.string_","description":"Pares clave-valor arbitrarios (string → string) para asociar a este cobro.\nSe devuelven en cada respuesta y webhook. Máximo 50 claves; clave de hasta\n40 caracteres; valor de hasta 500; total serializado de hasta 8192 bytes.","example":{"order_id":"abc-123","tenant":"acme"}}},"required":["referenceId","description"],"type":"object"},"Omit_PostStandardPaymentRequestBody.conciliationType-or-type-or-customer-or-webhookUrl-or-dueDates-or-reminderNotificationDate-or-deferredInitialNotificationDate_":{"$ref":"#/components/schemas/Pick_PostStandardPaymentRequestBody.Exclude_keyofPostStandardPaymentRequestBody.conciliationType-or-type-or-customer-or-webhookUrl-or-dueDates-or-reminderNotificationDate-or-deferredInitialNotificationDate__"},"Pick_PostStandardPaymentRequestBody-at-customer.Exclude_keyofPostStandardPaymentRequestBody-at-customer.taxDocument__":{"properties":{"name":{"type":"string","description":"Nombre del pagador. Largo: 2 a 150 caracteres.","example":"Juan Pérez"},"phoneNumber":{"properties":{"number":{"type":"string"},"countryCode":{"type":"string"}},"required":["number","countryCode"],"type":"object"},"email":{"type":"string","description":"Email del pagador.","example":"juan@example.com"}},"required":["name"],"type":"object"},"Omit_PostStandardPaymentRequestBody-at-customer.taxDocument_":{"$ref":"#/components/schemas/Pick_PostStandardPaymentRequestBody-at-customer.Exclude_keyofPostStandardPaymentRequestBody-at-customer.taxDocument__"},"PostPaymentRequestBulkItemBody":{"allOf":[{"$ref":"#/components/schemas/Omit_PostStandardPaymentRequestBody.conciliationType-or-type-or-customer-or-webhookUrl-or-dueDates-or-reminderNotificationDate-or-deferredInitialNotificationDate_"},{"properties":{"customer":{"allOf":[{"$ref":"#/components/schemas/Omit_PostStandardPaymentRequestBody-at-customer.taxDocument_"},{"properties":{"taxDocument":{"type":"string","description":"CUIL (11 dígitos) o DNI (7-8 dígitos) del pagador. Obligatorio.","example":"20304050609"}},"required":["taxDocument"],"type":"object"}]},"dueDates":{"items":{"type":"string"},"type":"array","description":"Fechas futuras YYYY-MM-DD, sin hora, hasta 35 días."}},"required":["customer","dueDates"],"type":"object"}],"description":"Item de un request bulk. Es el body del cobro `standard` salvo que NO lleva\n`conciliationType` (el bulk es siempre CUIL), `webhookUrl`, `type` ni `expiresInMinutes`.\nAcepta solo fechas YYYY-MM-DD; enviá un cobro por pagador en cada lote.\nNo uses fechas de aviso diferido ni recordatorio personalizado en bulk. `customer.taxDocument` es\nOBLIGATORIO.\n\nDeriva de la rama `standard` y no de la union: el bulk no acepta checkout, y un\n`Omit` sobre la union se quedaria solo con los campos comunes a las dos ramas."},"PostPaymentRequestBulkRequestBody":{"description":"Body del endpoint `POST /payment-request/bulk`.\nArray de 1 a 100 items; todos se crean de forma atómica (all-or-nothing).","properties":{"paymentRequests":{"items":{"$ref":"#/components/schemas/PostPaymentRequestBulkItemBody"},"type":"array","description":"Lista de cobros a crear (1 a 100). Todos comparten el mismo CVU del batch.","minItems":1,"maxItems":100}},"required":["paymentRequests"],"type":"object","additionalProperties":true},"Pick_PostPaymentRequestResponseBody.Exclude_keyofPostPaymentRequestResponseBody.customer-or-reminderNotificationDate-or-deferredInitialNotificationDate__":{"properties":{"type":{"$ref":"#/components/schemas/PaymentRequestType","description":"Tipo con el que quedó el cobro. `standard` si no se envió `type`."},"webhookUrl":{"type":"string","description":"URL de webhook propia del cobro, tal como se persistió. Ausente (no `null`)\nsi el cobro no definió una URL per-request. El despacho a esta URL usa un\n`validation-token` vacío.","example":"https://hooks.example.com/pay"},"dueDates":{"items":{"type":"string"},"type":"array","description":"Fechas YYYY-MM-DD o YYYY-MM-DDTHH:MM[:SS], con Z, offset o sin zona (-03:00)."},"amount":{"type":"number","format":"double","description":"Monto del cobro (ausente si se creó en borrador sin monto)."},"surcharge":{"properties":{"value":{"type":"number","format":"double"},"type":{"type":"string","enum":["percentage","fixed"]}},"required":["value","type"],"type":"object","description":"Recargo configurado, presente si se envió con tipo distinto de `none`."},"sendWhatsappNotification":{"type":"boolean","description":"Canal WhatsApp habilitado para las notificaciones de este cobro."},"sendEmailNotification":{"type":"boolean","description":"Canal email habilitado para las notificaciones de este cobro."},"sendWhatsappPaymentConfirmation":{"type":"boolean","description":"Valor efectivamente persistido para el aviso de confirmación de pago.\nAusente cuando no se especificó, y ahí rige el comportamiento por defecto del\nmodo de conciliación.\n\nEn un cobro creado por lote puede diferir de lo que enviaste para ese ítem:\nel valor es del lote, así que ítems en desacuerdo se colapsan. Leerlo acá es\nla forma de saber con qué quedó."},"referenceId":{"type":"string","description":"El mismo `referenceId` que enviaste en el request."},"description":{"type":"string","description":"Descripción del cobro."},"metadata":{"$ref":"#/components/schemas/Record_string.string_","description":"Metadata del integrador, devuelta tal cual se envió en el request.\nAusente (no `null`) cuando el cobro se creó sin metadata.","example":{"order_id":"abc-123","tenant":"acme"}},"expiresInMinutes":{"type":"number","format":"double","description":"Minutos de vida configurados. Presente solo en `type: 'checkout'`."},"paymentRequestId":{"type":"string","description":"ID del cobro en ChytaPay (UUID): pasalo como `paymentId` al widget."},"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del cobro (pendiente, parcial, pagado, borrador, etc.)."},"calculatedAmounts":{"items":{"properties":{"isOriginalAmount":{"type":"boolean"},"surchargeApplied":{"type":"number","format":"double"},"amount":{"type":"number","format":"double"},"dueDate":{"type":"string"}},"required":["amount","dueDate"],"type":"object"},"type":"array","description":"Monto calculado para cada vencimiento (incluye el recargo aplicado al segundo)."},"CVU":{"type":"string","description":"CVU donde el pagador debe transferir para pagar este cobro.\n\nAUSENTE en `type: 'checkout'`: el cobro nace sin cuenta y el CVU se asigna\nrecién cuando el pagador se identifica en el widget. El widget lo lee del\nsummary; el comercio no lo necesita."},"bankAccountInfo":{"properties":{"bankName":{"type":"string"},"accountHolderTaxId":{"type":"string"},"accountHolderName":{"type":"string"}},"required":["bankName","accountHolderTaxId","accountHolderName"],"type":"object","description":"Datos bancarios del titular de la cuenta de cobro (la sede/comercio que recibe\nel dinero). Ausente en `type: 'checkout'` por el mismo motivo que `CVU`."}},"required":["type","dueDates","sendWhatsappNotification","sendEmailNotification","referenceId","description","state"],"type":"object"},"Omit_PostPaymentRequestResponseBody.customer-or-reminderNotificationDate-or-deferredInitialNotificationDate_":{"$ref":"#/components/schemas/Pick_PostPaymentRequestResponseBody.Exclude_keyofPostPaymentRequestResponseBody.customer-or-reminderNotificationDate-or-deferredInitialNotificationDate__"},"Pick_PaymentRequestCustomerResponseBody.Exclude_keyofPaymentRequestCustomerResponseBody.taxDocument__":{"properties":{"name":{"type":"string"},"phoneNumber":{"properties":{"number":{"type":"string"},"countryCode":{"type":"string"}},"required":["number","countryCode"],"type":"object"},"email":{"type":"string"}},"required":["name"],"type":"object"},"Omit_PaymentRequestCustomerResponseBody.taxDocument_":{"$ref":"#/components/schemas/Pick_PaymentRequestCustomerResponseBody.Exclude_keyofPaymentRequestCustomerResponseBody.taxDocument__"},"GetPaymentRequestResponseBody":{"allOf":[{"$ref":"#/components/schemas/Omit_PostPaymentRequestResponseBody.customer-or-reminderNotificationDate-or-deferredInitialNotificationDate_"},{"properties":{"customer":{"$ref":"#/components/schemas/Omit_PaymentRequestCustomerResponseBody.taxDocument_"}},"type":"object"}],"description":"Detalle por referencia. Omite el documento y las fechas de aviso; no devuelve\nconciliationType. Los vencimientos vuelven recortados a fecha UTC, incluso con hora."},"PatchPaymentRequestResponseBody":{"properties":{"referenceId":{"type":"string","description":"El `referenceId` del cobro actualizado."},"previousAmount":{"type":"number","format":"double","nullable":true,"description":"Monto que tenía el cobro antes del PATCH (null si era un borrador sin monto)."},"amount":{"type":"number","format":"double","description":"Nuevo monto del cobro."},"description":{"type":"string","description":"Descripción del cobro."},"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del cobro tras la actualización."},"dueDates":{"items":{"type":"string"},"type":"array","description":"Fechas YYYY-MM-DD o YYYY-MM-DDTHH:MM[:SS], con Z, offset o sin zona (-03:00)."},"surcharge":{"properties":{"value":{"type":"number","format":"double"},"type":{"type":"string","enum":["percentage","fixed"]}},"required":["value","type"],"type":"object","description":"Recargo configurado, si aplica."},"calculatedAmounts":{"items":{"properties":{"isOriginalAmount":{"type":"boolean"},"surchargeApplied":{"type":"number","format":"double"},"amount":{"type":"number","format":"double"},"dueDate":{"type":"string","description":"Fecha o instante del vencimiento; GET y PATCH lo recortan a fecha UTC."}},"required":["amount","dueDate"],"type":"object"},"type":"array","description":"Monto calculado por vencimiento (incluye el recargo aplicado al segundo)."}},"required":["referenceId","previousAmount","amount","description","state","dueDates"],"type":"object","additionalProperties":true},"PatchPaymentRequestRequestBody":{"properties":{"amount":{"type":"number","format":"double","description":"Monto a asignar al cobro (en pesos; mandá hasta 2 decimales; máximo 200.000.000).\nSolo se usa para completar un cobro en estado `draft` (sin monto).","example":15000.5,"maximum":200000000}},"required":["amount"],"type":"object","additionalProperties":true},"PatchPaymentRequestCustomerResponseBody":{"properties":{"referenceId":{"type":"string","description":"El `referenceId` del cobro actualizado."},"customer":{"properties":{"taxDocument":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"properties":{"number":{"type":"string"},"countryCode":{"type":"string"}},"required":["number","countryCode"],"type":"object"},"name":{"type":"string"}},"required":["taxDocument"],"type":"object","description":"Datos del pagador tal como quedaron guardados tras el PATCH."},"CVU":{"type":"string","description":"CVU vigente del cobro después del PATCH."},"cvuChanged":{"type":"boolean","description":"`true` si el documento nuevo colisionaba en el CVU anterior y hubo que mover\nel cobro a otro. Avisale al pagador: el CVU al que tiene que transferir cambió."},"payerChanged":{"type":"boolean","description":"`true` si el cobro quedó apuntando a OTRO pagador (el documento nuevo no\nnormaliza al mismo que tenía). `false` en el caso típico de corrección de\ntipeo sobre la misma persona."},"profileUpdated":{"type":"boolean","description":"`true` si `name`/`phoneNumber`/`email` modificaron el perfil guardado del\npagador. Ese perfil es por persona (no por cobro): si ese pagador tiene otros\ncobros abiertos con este comercio, también los ve actualizados."}},"required":["referenceId","customer","CVU","cvuChanged","payerChanged","profileUpdated"],"type":"object","additionalProperties":true},"PatchPaymentRequestCustomerRequestBody":{"description":"Body de `PATCH /payment-request/{referenceId}/customer`.\n\nPlano a propósito (no envuelto en `customer`): la URL ya dice `/customer` y los\ncampos son idénticos a los del `customer` del POST, así que el integrador reusa\nel mismo objeto. Todo es opcional salvo `taxDocument`: lo que no mandes queda\ncomo estaba.","properties":{"name":{"type":"string","description":"Nombre del pagador. Largo: 2 a 150 caracteres.","example":"Pepe Gomez"},"phoneNumber":{"properties":{"number":{"type":"string","description":"Código de área + número, 6 a 20 caracteres: dígitos, +, -, paréntesis y espacios.","example":"3512345678"},"countryCode":{"type":"string","description":"Código de país con prefijo +.","example":"+54"}},"required":["number","countryCode"],"type":"object"},"email":{"type":"string","description":"Email del pagador.","example":"pepe@example.com"},"taxDocument":{"type":"string","description":"CUIL (11 dígitos) o DNI (7-8 dígitos) del pagador. Obligatorio: es el dato\nque se está corrigiendo y el que define la asignación de CVU.","example":"20000000001"}},"required":["taxDocument"],"type":"object","additionalProperties":true},"CancelPaymentRequestResponseBody":{"properties":{"referenceId":{"type":"string","description":"El `referenceId` del cobro cancelado."},"state":{"$ref":"#/components/schemas/IntegrationPaymentRequestState","description":"Estado del cobro tras la cancelación (siempre \"canceled\")."}},"required":["referenceId","state"],"type":"object","additionalProperties":true},"GetPayerLookupResponseBody":{"description":"Divulgación mínima a propósito: solo los tres campos que necesita una\nconfirmación del tipo \"¿Sos [Nombre]?\". El padrón también devuelve domicilio\nfiscal, condición fiscal y actividades: nada de eso se expone ni debe agregarse.\n\n`name: null` significa que ARCA respondió y ningún titular coincidió (lo más\nprobable es un error de tipeo). Nunca significa \"ARCA no respondió\": eso es un 503.","properties":{"name":{"type":"string","nullable":true,"description":"Razón social (persona jurídica) o \"Nombre Apellido\" (persona humana)."},"taxId":{"type":"string","nullable":true,"description":"CUIL/CUIT con el que se resolvió el nombre. Null cuando no hay coincidencia."},"taxIdType":{"type":"string","enum":["CUIT","CUIL",null],"nullable":true}},"required":["name","taxId","taxIdType"],"type":"object","additionalProperties":true},"PutTenantResponseBody":{"properties":{"message":{"type":"string"}},"required":["message"],"type":"object","additionalProperties":true},"PutTenantRequestBody":{"properties":{"tenantKey":{"type":"string"}},"required":["tenantKey"],"type":"object","additionalProperties":true},"GetMeIntegration":{"properties":{"name":{"type":"string","description":"Nombre de la integración que llama, tal como está registrada en ChytaPay.","example":"Acme School Manager"}},"required":["name"],"type":"object","additionalProperties":true},"GetMeResponseBody":{"properties":{"merchantUserId":{"type":"string","description":"Identificador en ChytaPay de la cuenta de comercio dueña del token. No cambia\nal volver a autorizar, así que podés guardarlo como clave del comercio de tu lado.","example":"0b9d5c1e-6f0a-4c57-9d0e-3a4b8f2c7e11"},"email":{"type":"string","description":"Email de la cuenta de comercio en ChytaPay.","example":"administracion@example.com"},"fantasyName":{"type":"string","description":"Nombre de fantasía que el comercio les muestra a sus pagadores.","example":"Comercio de Prueba"},"accountHolderName":{"type":"string","description":"Titular de la cuenta de cobro. Es el mismo valor que\n`bankAccountInfo.accountHolderName` en las respuestas de los cobros.","example":"Comercio de Prueba S.A."},"accountHolderTaxId":{"type":"string","description":"CUIT del titular de la cuenta. Es el mismo valor que\n`bankAccountInfo.accountHolderTaxId` en las respuestas de los cobros.","example":"30000000007"},"integration":{"$ref":"#/components/schemas/GetMeIntegration","description":"La integración para la que se emitió este token."},"tenantKey":{"type":"string","description":"Clave del tenant al que está vinculado el comercio (ver `PUT /my-integration/tenant`).\nNo viene cuando el comercio no tiene tenant.","example":"instituto-a"},"linkedAt":{"type":"string","description":"Cuándo el comercio autorizó a esta integración, en ISO 8601 UTC. Es la fecha\nde la primera autorización: desvincular y volver a autorizar no la cambia.","example":"2026-03-14T15:09:26.535Z"}},"required":["merchantUserId","email","fantasyName","accountHolderName","accountHolderTaxId","integration","linkedAt"],"type":"object","additionalProperties":true}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"ID Token obtenido mediante OAuth2"}}},"info":{"title":"Chytapay Integration API","version":"1.0.0","description":"API para crear y gestionar solicitudes de pago (cobros) en nombre de las cuentas de comercio conectadas a tu integración.\n\nEsta es una introducción resumida. La guía completa (conceptos, ciclo de vida, crear cobros, conciliación, notificaciones, webhook, cómo probar y preguntas frecuentes) está en la [documentación de Chytapay](https://chytapay.com.ar/api/getting-started).\n\n## Autenticación (OAuth2)\n\nTodos los endpoints requieren un **Bearer token** obtenido por OAuth2 (Authorization Code). El flujo se hace contra la **Auth API** y tiene 3 pasos:\n\n1. `GET /integration/oauth2/authorize` — parámetros: `clientId`, `redirectUri`, `responseType=code`, `scope`, `state`. Redirige al login de ChytaPay, donde el dueño de la cuenta de comercio autoriza el acceso.\n2. La pantalla de Chytapay autentica al comercio y redirige a tu `redirectUri` con `?code=...`. Tu integración no llama al endpoint interno de esa pantalla ni pide la contraseña del comercio.\n3. `POST /integration/oauth2/token` — intercambiás `code` + `clientId` + `clientSecret` + `redirectUri` por los tokens.\n\nAl completar el intercambio, la cuenta de comercio queda **vinculada a tu integración** y ya podés crear cobros en su nombre. Repetís el flujo una vez por cada cuenta de comercio que se suma.\n\nEnviá el token en cada request:\n\n```\nAuthorization: Bearer <id_token>\n```\n\n## Validar al pagador antes de cobrar\n\nEn modo de conciliación `cuil` el cobro se identifica por el documento del pagador, así que un documento mal tipeado hace que el pago no se concilie. Para evitarlo podés confirmar la identidad **antes** de crear el cobro:\n\n1. El pagador ingresa su CUIL/CUIT o DNI.\n2. `GET /payer-lookup?document=...` — devuelve el nombre que ARCA tiene registrado.\n3. Le mostrás *\"¿Sos Juan Pérez?\"* y confirma.\n4. `POST /payment-request` — recién ahí creás el cobro, con el documento ya validado.\n\nDistinguí los dos casos en que no hay nombre, porque piden decisiones opuestas:\n\n| Respuesta | Significa | Qué conviene hacer |\n| --------- | --------- | ------------------ |\n| `200` con `name: null` | ARCA respondió y no hay titular para ese documento | Probablemente un error de tipeo: pedile al pagador que lo corrija |\n| `503` | No pudimos consultar a ARCA | La identidad quedó sin verificar. Reintentá, o dejá seguir el pago sin validación |\n\nLa respuesta trae únicamente `name`, `taxId` y `taxIdType`.\n\nCada consulta descuenta de un cupo diario propio, separado del de creación de cobros. Un CUIL/CUIT cuesta 1 y un DNI cuesta 2, porque el DNI obliga a probar dos CUIL candidatos contra ARCA. Al agotarlo recibís un `429` con `availableAtUnixSeconds`.\n\n### Corregir un cobro ya creado\n\nSi el cobro se creó con el documento equivocado, `PATCH /payment-request/{referenceId}/customer` lo reasigna al pagador correcto sin cancelarlo. Solo aplica a cobros en modo `cuil` que todavía no recibieron pagos.\n\nMirá `cvuChanged` en la respuesta: si el documento nuevo colisionaba en el CVU anterior, el cobro se movió a otro y **tenés que avisarle al pagador el CVU nuevo**.\n\n## Cobros para el Widget (`type: \"checkout\"`)\n\nUn cobro que se paga con el Widget nace **sin CVU**. El documento del pagador todavía no existe cuando lo creás: lo aporta él adentro del widget, y la cuenta se asigna recién cuando se identifica. Lo pedís con `type: \"checkout\"`.\n\n```json\n{\n  \"type\": \"checkout\",\n  \"referenceId\": \"orden-2026-000123\",\n  \"amount\": 15000,\n  \"description\": \"Entrada General - Fecha 12/09\",\n  \"expiresInMinutes\": 15\n}\n```\n\nLa respuesta `201` no trae `CVU` ni `bankAccountInfo`, porque todavía no hay cuenta. El `paymentRequestId` que sí trae es el `paymentId` que le pasás al Widget.\n\n| Campo | `standard` (default) | `checkout` |\n| ----- | -------------------- | ---------- |\n| `amount` | opcional; sin él nace `draft` | requerido |\n| vencimiento | `dueDates`, hasta 35 días | `expiresInMinutes`, de 3 a 60, default 15 |\n| `customer` | requerido | prohibido |\n| `conciliationType` | opcional, default `cvu` | prohibido; el tipo ya define el modo |\n| `dueDates`, `surcharge` | según el caso | prohibidos |\n| notificaciones | opcionales | prohibidas |\n\n**Prohibido, no ignorado.** Mandar cualquiera de esos campos junto con `type: \"checkout\"` devuelve `400` nombrando el campo. Un campo que se acepta y no hace nada engaña más que uno que falla.\n\nEl techo de 60 minutos es la diferencia real con un cobro normal: un checkout retiene una cuenta del pool compartido mientras vive, y un cobro que la retiene 35 días no es un checkout, es una factura.\n\nLa conciliación es siempre por CUIL, derivada del tipo. El bulk prohíbe `type` y `expiresInMinutes`: ya es CUIL-only con `taxDocument` obligatorio por ítem.\n\n**Sin `type`, todo se comporta igual que hoy.** El default se llama `\"standard\"` y es lo que se aplica cuando no mandás el campo.\n\n## Webhooks\n\nLos webhooks no son endpoints de esta API: son llamadas que hacemos **nosotros** contra la URL que configuraste. Por eso no aparecen entre los endpoints de arriba y tienen su propia sección **Webhooks** en el menú, con el payload completo de cada uno.\n\n| Evento | Cuándo se dispara |\n| ------ | ----------------- |\n| `payment_request.payment_received` | Se imputó un pago a uno de tus cobros, total o parcial |\n| `payment_request.expired` | Un cobro con fecha y hora venció sin saldarse; los vencimientos por día no generan este evento |\n| `payment.unmatched` | Entró plata a uno de tus CVU de cobro y **no se pudo imputar** |\n\nReglas que valen para los tres:\n\n- **Ruteá por `event`, actuá por `stateType`.** El mismo `stateType` se alcanza por caminos distintos, así que el evento es el discriminador y el estado es la fuente de verdad para decidir qué hacer.\n- Todos los webhooks salen con `User-Agent: Chytapay-Webhooks/1.0` (la prueba del portal agrega ` (test)`). Si tu CDN o WAF filtra bots, permití ese valor.\n- Verificá `X-Chytapay-Signature` antes de procesar: formato `t=<segundos Unix>,v1=<hex>`, HMAC-SHA256 de `{t}.{cuerpo crudo}` con tu secreto de firma. Compará en tiempo constante y rechazá diferencias de reloj mayores a **300 s**. La firma puede faltar transitoriamente si no pudimos leer el secreto: respondé 401 y lo reintentamos. `validation-token` es adicional; al `webhookUrl` del cobro llega vacío. [Guía de firma](https://chytapay.com.ar/api/webhooks/).\n- **Deduplicá por el header `X-Chytapay-Webhook-Id`.** Un reintento repite el id.\n- Respondé **2xx en menos de 5 s** para confirmar. Cualquier otra cosa se reintenta.\n- **Hacemos hasta 8 intentos en unas 8 h 40 min a 13 h**, con esperas crecientes: 1 min, 5 min, 15 min, 30 min, 1 h, 3 h y 6 h, con jitter de ±20%. Los primeros intentos van juntos a propósito, para que una ventana de deploy de unos minutos de tu lado no te cueste el aviso. Si tu endpoint está caído más que eso, el aviso puede llegarte horas más tarde: no asumas que un webhook que no llegó en el minuto ya no va a llegar.\n- **El webhook no es la vía para avisarle al comprador que su pago entró.** Para eso consultá `GET /payment-request/{referenceId}`, que es instantáneo y no depende de nuestra entrega. El webhook sirve para cerrar tus libros, y para eso conviene además conciliar periódicamente tus cobros pendientes contra ese endpoint: ningún sistema de webhooks es 100%.\n- `livemode` es `true` solo en producción y con un evento real. El botón de prueba y todos los stages que no son producción mandan `false`. Ante la duda, `false`.\n- Recibís solo los eventos a los que estás suscripto. Si algo dejó de llegarte, revisá primero las suscripciones.\n\n### `payment.unmatched` tiene dos formas\n\nEs el único que hay que programar en dos ramas, porque **la plata ya está acreditada pero no está atribuida**:\n\n| Forma | `reason` | Trae `paymentRequest` |\n| ----- | -------- | --------------------- |\n| **Atribuido** — supimos de qué cobro era | `expired`, `already_paid`, `canceled` | Sí |\n| **Sin atribuir** — no pudimos nombrarlo | `no_cuil_match`, `no_pending`, `ambiguous` | No |\n\nTres cosas que conviene tener presentes:\n\n- **`merchantTaxId` y `merchantUserId` te dicen a qué comercio llegó la plata.** `merchantTaxId` es el CUIT/CUIL del titular de la cuenta (el `accountHolderTaxId` de `GET /me`) y `merchantUserId` es el identificador del comercio (el mismo de `/me`), así que no tenés que deducirlos del CVU. `merchantName` es su nombre de fantasía (el `fantasyName` de `/me`), pensado para mostrarlo. `tenantKey` es la clave de la sede y viaja solo si ese comercio está vinculado a una; si no, no aparece (nunca viene como `null`). No lo uses para identificar al comercio.\n- **El `referenceId` va anidado bajo `paymentRequest`, no en la raíz.** Es a propósito: si estuviera plano caería en el mismo lugar donde lo ponen los eventos `payment_request.*`, y un handler que no bifurca por `event` marcaría el cobro como pagado por plata que nunca se imputó. Si tu código lee `body.referenceId` sin mirar el evento, en este webhook te va a dar `undefined`, y eso es lo correcto.\n- **Un pago sin imputar puede revisarse después.** `no_cuil_match` y `no_pending` pueden re-imputarse al identificar o corregir al pagador si cumplen las reglas del cobro. `no_cuil_match` también puede corresponder a un cobro vencido y `ambiguous` no atribuye la transferencia a ningún cobro. El pagador puede identificarse con otro DNI o corregirse mediante PATCH: el re-match automático solo busca en el CVU actual del cobro. La imputación manual permite elegir transferencias de cualquier CVU del mismo comercio y emite `payment_request.payment_received`, incluso si el cobro estaba vencido. No automatices devoluciones solo por el motivo del evento.\n\n## Caracteres permitidos en los campos de texto\n\n**`customer.name` y `description`** aceptan letras de cualquier alfabeto —con acentos, cedillas y diéresis—, números, espacios y puntuación. `Waleska Lourenço`, `João Victor`, `Müller & Co.` y `O'Brien` son todos válidos.\n\n| Campo | Puntuación que acepta, además de letras y números |\n| ----- | ------------------------------------------------- |\n| `customer.name` | `- _ . , : ; ! ? ( ) \\ / & @ ' \"` |\n| `description` | lo anterior más `# $ % * + = [ ] { }` |\n\n**Los demás campos son más estrictos y no aceptan acentos**, porque su formato lo define un tercero (el correo, la red telefónica, tu propio sistema):\n\n| Campo | Acepta |\n| ----- | ------ |\n| `customer.email` | letras y números sin acento, más `@ . _ - +` |\n| `customer.phoneNumber.number` | solo dígitos, `+ - ( )` y espacios |\n| `referenceId` | letras y números sin acento, más `-` y `_` |\n\nLos caracteres que no se ven (de control, bidireccionales, invisibles, de ancho cero y de combinación) no se aceptan en ningún campo. No es una restricción de formato sino de seguridad, porque sirven para falsificar cómo se muestra un nombre, y no va a relajarse. Los emojis tampoco entran: esos sí dan `400` en todos los endpoints.\n\nAhora bien, **los caracteres invisibles no se rechazan igual en todas las rutas**:\n\n| Endpoint | Qué pasa si mandás uno |\n| -------- | ---------------------- |\n| `POST /payment-request` | Se borra en silencio y el cobro se crea igual, con `201`. El valor queda guardado sin ese carácter |\n| `POST /payment-request/bulk` | `400`. No se crea ninguna de las solicitudes del lote |\n| `PATCH /payment-request/{referenceId}/customer` | `400`. No se aplica el cambio |\n\nEn el `POST /payment-request` el borrado alcanza a `referenceId`, `description`, `customer.name`, `customer.email` y `customer.phoneNumber`. Así que ahí **no des por hecho que el texto se guardó tal cual lo mandaste**: la respuesta del `201` te devuelve esos campos ya limpios, comparálos contra lo que enviaste si el valor exacto te importa. Lo más prolijo es sacar los invisibles de tu lado antes de llamar.\n\nEsa diferencia es comportamiento heredado y la vamos a unificar hacia el rechazo. No armes tu integración asumiendo que el `POST` te limpia el texto.\n\nSi un campo trae algo no permitido, la respuesta es `400` e indica **qué campo** y **qué carácter**:\n\n```json\n{\n  \"code\": \"ValidationError\",\n  \"message\": \"'customer.name' contains characters that are not allowed: €\",\n  \"id\": \"38cd3dd9-be5f-41dc-84e9-51084eee27eb\",\n  \"validationDetails\": [\n    {\n      \"field\": \"customer.name\",\n      \"message\": \"\\\"customer.name\\\" contains characters that are not allowed: €\"\n    }\n  ]\n}\n```\n\n`validationDetails` trae **todos** los campos que fallaron, no solo el primero; `message` repite el primero por compatibilidad. Nunca devolvemos el valor que enviaste, únicamente los caracteres ofensivos, porque estos campos suelen contener datos personales.\n\nSi guardás el `id` de la respuesta, podemos rastrear ese request puntual en nuestros logs.\n\n\n## Límites, listado y conciliación\n\nEl monto y el recargo fijo admiten como máximo **200.000.000 pesos**; mandá hasta 2 decimales. Los campos desconocidos se ignoran; los campos conocidos prohibidos\npara una variante devuelven 400. `customer.taxDocument` es obligatorio en modo CUIL:\nun CUIL inválido o un DNI que no resuelve a un CUIL impide crear el cobro.\n\n`dueDates` acepta `YYYY-MM-DD` o `YYYY-MM-DDTHH:MM[:SS]` con `Z`, offset o sin zona\n(`-03:00`). Con hora admite un solo vencimiento, al menos **3 minutos** en el futuro;\nel máximo es **35 días**. Para borradores con hora enviá siempre offset explícito.\nEntre las 21 y 24 de Argentina la validación usa el día UTC: usá pasado mañana en\nfechas sin hora. Los ejemplos de fechas son ilustrativos: reemplazalos por fechas futuras.\nEl bulk admite de **1 a 100** cobros, solo fechas sin hora y un cobro por pagador;\nno admite `webhookUrl`, `type`, `expiresInMinutes` ni `conciliationType`. No uses\nfechas de notificación diferida o recordatorio personalizado en bulk.\n\nEl listado `GET /payment-request` muestra **solo abiertos**, salvo los checkouts\nque vencieron o se cancelaron sin pagador: estos también siguen apareciendo.\nLos demás cobros dejan de aparecer al liberarse la tenencia del CVU. Consultá el estado final con `GET /payment-request/{referenceId}`\ny conciliá periódicamente además de recibir webhooks. Cada ítem del listado trae\n`status` en inglés (`pending`, `partial_payment`, `draft`, etc.), `amount`\n(0 en borradores), `paidAmount`, `dueDate` (primera fecha en UTC), `createdAt` y\n`customer` sin documento y con teléfono concatenado. El GET por referencia devuelve\n`state` en inglés y omite `customer.taxDocument`, las fechas de aviso y\n`conciliationType`; GET y PATCH de monto recortan los vencimientos a fecha UTC.\n\nUn CVU de borrador no recibe pagos imputables hasta completar el monto. El PATCH de\nmonto solo admite `draft`: también rechaza un `pending` sin pagos. Para reintentar\nun POST tras un timeout conservá el mismo `referenceId`; si recibís 409\n`ReferenceIdAlreadyExists`, consultá el existente con GET. Las carreras pueden\nresponder `CustomerAlreadyAssociatedError`. La corrección del pagador puede dar\n409 con `data.reason: no_cuil_candidate`, además de los otros motivos del endpoint.\n\nUn pago corto por **menos de $1** puede saldar el cobro: `stateType: total_payment`\nsiempre trae `remainingAmount: 0`, aunque `paidAmount` sea menor al total exigible.\nLos campos `upcoming*` solo aparecen si hay otro vencimiento y el cobro no está\nsaldado. `reconciledPayerCuil` identifica la cuenta que transfirió si se conoce,\ntambién en modo CVU.\n\n## Errores comunes\n\nLos errores no tienen un único sobre. La validación devuelve `code`, `message`,\n`id` y `validationDetails`; un 404 de recurso puede traer solo `message`; los\nconflictos de cobros usan `error`, `message` y `data` (sin `id`); el 422 del bulk\ntrae `message` y `errors`. Los 429 incluyen `code`, `message` y el cupo/plazo según\nel caso. No se publica `cause`.\n\n- 401: token ausente, inválido o vencido. En los ambientes desplegados el gateway devuelve JSON `{\"message\":\"Unauthorized\"}` antes del middleware; el middleware directo responde texto plano si falta el token.\n- 400 de autenticación: texto plano `Bad request: Missing required authentication data`.\n- 404 de autenticación: texto plano `Integration client not found`.\n- 403 sin vínculo: texto plano `Not authorized as user of integration client`.\n- 403 con `code: ProductionAccessRevokedError`: se revocó el acceso a Producción;\n  reautorizar OAuth no lo resuelve.\n- 503 con `code: IntegrationDailyLimitUnavailableError`: no se pudo chequear el\n  cupo diario; reintentá en unos minutos.\n","license":{"name":"ISC"},"contact":{"name":"Chytapay Support","email":"contacto@chytapay.com.ar","url":"https://chytapay.com.ar/api/getting-started"}},"paths":{"/payment-request":{"get":{"operationId":"getAllPaymentRequests","responses":{"200":{"description":"Listado de cobros.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GetAllPaymentRequestsResponseBody"},"type":"array"}}}},"400":{"description":"Datos inválidos o autenticación incompleta. Esta última devuelve texto plano Bad request: Missing required authentication data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe el grupo de cobro o la integración. La falta de integración responde texto plano; la falta de grupo, JSON con message.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]}},"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Lista solo cobros abiertos de tu integración para el comercio autenticado,\nmás los checkouts sin pagador: estos siguen apareciendo aunque hayan vencido\no se hayan cancelado sin pagador. Los cobros con tenencia de CVU liberada\ndesaparecen del listado. Para el estado final usá GET por referenceId o webhooks.\nFiltra por fecha de creación. Cada ítem trae status en inglés, dueDate\n(primera fecha en UTC), amount (0 en draft), paidAmount, createdAt y customer\nsin taxDocument; phoneNumber es un string concatenado.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[{"description":"Filtra cobros creados desde esta fecha, inclusive. Formato YYYY-MM-DD (fecha inicial del rango).","in":"query","name":"startDate","required":false,"schema":{"type":"string"}},{"description":"Filtra cobros creados hasta esta fecha, inclusive. Formato YYYY-MM-DD (fecha final del rango).","in":"query","name":"endDate","required":false,"schema":{"type":"string"}}]},"post":{"operationId":"postPaymentRequest","responses":{"201":{"description":"Cobro creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPaymentRequestResponseBody"}}}},"400":{"description":"Datos inválidos. Revisá el detalle de validación en el cuerpo del error (campos faltantes, fechas fuera de rango, monto inválido, etc.).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"WhatsApp no habilitado: code WhatsappNotEnabledError si tu integración no tiene WhatsApp, WhatsappNotificationNotAllowedError si no tiene habilitado el aviso del cobro, o WhatsappPaymentConfirmationNotAllowedError si no tiene habilitada la confirmación de pago. Lo habilita ChytaPay. También los 403 de cuenta sin vínculo y de acceso a producción revocado.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe el grupo de cobro o la integración. La falta de integración responde texto plano; la falta de grupo, JSON con message.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]}},"text/plain":{"schema":{"type":"string"}}}},"409":{"description":"Referencia repetida: { error: ReferenceIdAlreadyExists, message, referenceId }. Consultá el cobro con GET. En una carrera también puede recibirse code CustomerAlreadyAssociatedError.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationConflictError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}}}},"429":{"description":"Tope diario alcanzado. El campo `code` dice cuál: `IntegrationDailyRequestLimitExceededError` es el tope de mensajes de WhatsApp de tu integración e `IntegrationGlobalDailyMessageLimitExceededError` es el tope de mensajes compartido por las integraciones self-service. Los dos se reinician a las 00:00 de Argentina.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationDailyLimitError"},"examples":{"Example 1":{}}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}},"503":{"description":"No se pudo verificar el cupo diario: code IntegrationDailyLimitUnavailableError. Reintentá en unos minutos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}}}}},"description":"Crea un nuevo cobro (payment request) en nombre de la cuenta de comercio\nautenticada. El `referenceId` que envíes te volverá idéntico en el webhook para\nque puedas reconciliar el pago con tu sistema.\n\nEl body tiene DOS formas, según `type`, y cada una declara sus propios campos\nobligatorios: `PostStandardPaymentRequestBody` (el default) y\n`PostCheckoutPaymentRequestBody`. Elegí la variante en el schema del request\npara ver los campos de cada una.\n\nLos campos desconocidos se ignoran. Los campos conocidos prohibidos para\nuna variante (por ejemplo customer en checkout) devuelven 400.\n\nEn `standard`, si omitís `amount` el cobro se crea en estado borrador (DRAFT) y\nse completa luego con PATCH. El CVU del borrador no recibe pagos imputables\nhasta completarlo. Si el POST da timeout, reintentá con el mismo referenceId;\nante 409 por referencia repetida, consultá el cobro con GET antes de crear otro.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPaymentRequestRequestBody"}}}}}},"/payment-request/bulk":{"post":{"operationId":"postPaymentRequestBulk","responses":{"201":{"description":"Lote de cobros creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPaymentRequestBulkResponseBody"}}}},"400":{"description":"Datos inválidos (estructura del lote: array vacío, más de 100 items, o campos de algún item fuera de contrato).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"WhatsApp no habilitado: code WhatsappNotEnabledError si tu integración no tiene WhatsApp, WhatsappNotificationNotAllowedError si no tiene habilitado el aviso del cobro, o WhatsappPaymentConfirmationNotAllowedError si no tiene habilitada la confirmación de pago. En el lote, un solo ítem que lo pida rechaza el lote entero. Lo habilita ChytaPay. También los 403 de cuenta sin vínculo y de acceso a producción revocado.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe el grupo de cobro o la integración. La falta de integración responde texto plano; la falta de grupo, JSON con message.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]}},"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"El lote tiene errores de validación. La respuesta incluye `errors: [{ index, referenceId, reason }]` con TODOS los items que fallaron. No se creó ningún cobro.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPaymentRequestBulkValidationErrorBody"},"examples":{"Example 1":{}}}}},"429":{"description":"Tope diario alcanzado. El campo `code` dice cuál: `IntegrationDailyRequestLimitExceededError` es el tope de mensajes de WhatsApp de tu integración e `IntegrationGlobalDailyMessageLimitExceededError` es el tope de mensajes compartido por las integraciones self-service. Los dos se reinician a las 00:00 de Argentina.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationDailyLimitError"},"examples":{"Example 1":{}}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}},"503":{"description":"No se pudo verificar el cupo diario: code IntegrationDailyLimitUnavailableError. Reintentá en unos minutos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}}}}},"description":"Crea un lote de cobros (hasta 100) en una sola llamada, de forma atómica\n(all-or-nothing). Es CUIL-only: cada item requiere `customer.taxDocument` y\ntodos comparten el mismo CVU del lote. Antes de crear nada, se valida el lote\ncompleto; si algún item es inválido (referenceId duplicado o ya existente,\nCUIL sin candidato o pagador repetido en el lote), se devuelve 422 con la lista COMPLETA de errores y no se\ncrea ningún cobro. El detalle de cada cobro se consulta con\nGET /payment-request/{referenceId}.\n\n`sendWhatsappPaymentConfirmation` se guarda a nivel lote, no por cobro. Si los\nitems no coinciden, **gana `false`**: alcanza con que uno pida no recibir el\naviso para que no salga en todo el lote. Consultá el valor que quedó con\nGET /payment-request/{referenceId}.\n\nEs al revés que `sendWhatsappNotification` y `sendEmailNotification`, donde\ngana el que sí quiere. La diferencia es deliberada: esos dos habilitan un canal\nde cobro del propio comercio, mientras que este manda un mensaje a un tercero,\ny mandarle a alguien que pidió no recibir es peor que omitirle el aviso a\nalguien que lo quería.\n\nSi un item omite `sendWhatsappNotification` decide la configuración de tu\nintegración, salvo que otro item del lote mande `false`: ahí el default no aplica.\nSi un item manda `true`, todo item con `amount` tiene que traer el campo (si no, 400).\nComo el canal es del lote, un item con `false` también recibe el aviso si otro manda\n`true` y él tiene teléfono.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPaymentRequestBulkRequestBody"}}}}}},"/payment-request/{referenceId}":{"get":{"operationId":"getPaymentRequestByReferenceId","responses":{"200":{"description":"Detalle del cobro.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPaymentRequestResponseBody"}}}},"400":{"description":"Datos inválidos o autenticación incompleta. Esta última devuelve texto plano Bad request: Missing required authentication data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe un cobro con ese referenceId para tu integración.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Obtiene un cobro puntual por el `referenceId` que asignaste al crearlo.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[{"description":"El identificador único que asignaste al crear el cobro.","in":"path","name":"referenceId","required":true,"schema":{"type":"string"}}]},"patch":{"operationId":"patchPaymentRequest","responses":{"200":{"description":"Cobro actualizado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchPaymentRequestResponseBody"}}}},"400":{"description":"Monto inválido (debe ser positivo, máximo 200.000.000). Mandá hasta 2 decimales.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe un cobro con ese referenceId para tu integración.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"409":{"description":"El cobro no está en draft. Responde error PaymentRequestCannotBeModified, message y data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConflictError"},"examples":{"Example 1":{}}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Completa el monto de un cobro en estado draft. Cualquier otro estado devuelve\n409, incluido pending sin pagos. Se identifica por referenceId.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[{"description":"El identificador único del cobro a actualizar.","in":"path","name":"referenceId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchPaymentRequestRequestBody"}}}}}},"/payment-request/{referenceId}/customer":{"patch":{"operationId":"patchPaymentRequestCustomer","responses":{"200":{"description":"Pagador actualizado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchPaymentRequestCustomerResponseBody"}}}},"400":{"description":"Datos inválidos (taxDocument con formato o dígito verificador incorrecto, nombre/email/teléfono fuera de contrato).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe un cobro con ese referenceId para tu integración, o la integración no tiene grupo de cobro.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"409":{"description":"No se puede cambiar el pagador. `data.reason`: `conciliation_type_not_cuil` (el cobro es modo CVU), `state_not_modifiable` (estado final), `payment_already_received` (ya recibió plata), `no_collision_free_account` (ningún CVU libre para ese documento), `no_cuil_candidate` (el documento no resuelve a ningún CUIL), `missing_notification_contact` (el pagador nuevo no tiene el contacto que requieren los recordatorios), `incomplete_payment_request_data` (el cobro no tiene pagador asociado) o `concurrent_modification` (alguien lo modificó en paralelo: releé y reintentá).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConflictError"},"examples":{"Example 1":{}}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Corrige los datos del pagador de un cobro abierto creado con\n`conciliationType: 'cuil'` —típicamente cuando el CUIL/DNI enviado estaba mal—.\nEl cuerpo es plano y todos los campos son opcionales salvo `taxDocument`: lo que\nno envíes queda como estaba.\n\nReevalúa la asignación de CVU. Si el documento nuevo no colisiona en el CVU\nactual, el cobro lo conserva; si colisiona, se mueve a otro y la respuesta trae\n`cvuChanged: true` con el CVU nuevo —avisale al pagador—. Si ningún CVU puede\nalojar el documento nuevo, no se cambia nada y se devuelve 409.\n\n`name`, `phoneNumber` y `email` se aplican al perfil del pagador, que es por\npersona y **por comercio**, no por cobro ni por integración: ese registro lo\ncomparten todos los cobros de esa persona en el comercio —los de esta\nintegración, los de las otras integraciones del mismo comercio y los que el\ncomercio administra desde la app—. Todos quedan actualizados\n(`profileUpdated` lo indica). Si sólo querés corregir el documento, no mandes\n`name`: un `name` enviado pisa el nombre que ese pagador ya tenía.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[{"description":"El identificador único del cobro cuyo pagador se corrige.","in":"path","name":"referenceId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchPaymentRequestCustomerRequestBody"}}}}}},"/payment-request/{referenceId}/cancel":{"post":{"operationId":"cancelPaymentRequest","responses":{"200":{"description":"Cobro cancelado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelPaymentRequestResponseBody"}}}},"400":{"description":"Datos inválidos o autenticación incompleta. Esta última devuelve texto plano Bad request: Missing required authentication data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"No existe un cobro con ese referenceId para tu integración.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"409":{"description":"El cobro no puede cancelarse en su estado actual (pago parcial, pagado, vencido o ya cancelado).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConflictError"},"examples":{"Example 1":{}}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Cancela un cobro existente por su `referenceId`.\nSolo se pueden cancelar cobros en estado borrador (DRAFT) o pendiente (PENDING).\nCobros con pagos parciales, pagados, vencidos o ya cancelados no pueden cancelarse.","tags":["PaymentRequest"],"security":[{"bearer":[]}],"parameters":[{"description":"El identificador único del cobro a cancelar.","in":"path","name":"referenceId","required":true,"schema":{"type":"string"}}]}},"/payer-lookup":{"get":{"operationId":"getPayerLookup","responses":{"200":{"description":"Nombre registrado para el documento.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPayerLookupResponseBody"}}}},"400":{"description":"El `document` no tiene formato de CUIL/CUIT (11 dígitos) ni de DNI (7-8 dígitos). No se consultó ARCA ni se consumió cupo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"El vínculo se borró durante la llamada: JSON con message Integration not found for this account. Sin vínculo al iniciar, el middleware responde 403.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"429":{"description":"Agotaste el cupo diario de consultas al padrón. Se renueva a las 00:00 (hora Argentina).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationDailyLimitError"},"examples":{"Example 1":{}}}}},"503":{"description":"No se pudo consultar el padrón de ARCA (o el servicio de cupos está degradado). La identidad del pagador NO fue verificada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}}}}},"description":"Devuelve el nombre que ARCA tiene registrado para un documento, para que\npuedas confirmarlo con el pagador (\"¿Sos Juan Pérez?\") antes de crear el cobro.\n\nEstá pensado para validar el documento ANTES de cobrar: si el pagador se\nequivoca al tipear, te enterás acá y no después de haber creado el cobro con\nun documento incorrecto.\n\nLa respuesta es el mínimo indispensable —`name`, `taxId` y `taxIdType`—;\nnunca devuelve domicilio ni datos fiscales.\n\nDistinguí los dos \"no hay nombre\": un **200** con `name: null` significa que\nARCA respondió y no hay titular para ese documento (probablemente un error\nde tipeo, conviene que el pagador lo corrija). Un **503** significa que no\npudimos consultar a ARCA: la identidad quedó sin verificar y vos decidís si\nreintentar o dejar seguir el pago sin validación.\n\nConsumo: cada consulta descuenta de un cupo diario propio (separado del de\ncreación de cobros). Un DNI cuesta 2 y un CUIL/CUIT cuesta 1, porque el DNI\nobliga a probar dos CUIL candidatos contra ARCA.","tags":["PayerLookup"],"security":[{"bearer":[]}],"parameters":[{"description":"CUIL/CUIT (11 dígitos) o DNI (7-8 dígitos) del pagador.","in":"query","name":"document","required":true,"schema":{"type":"string"}}]}},"/my-integration/tenant":{"put":{"operationId":"putTenant","responses":{"200":{"description":"Tenant vinculado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutTenantResponseBody"}}}},"400":{"description":"Datos inválidos. El campo tenantKey es obligatorio y no puede estar vacío.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"},"examples":{"Example 1":{}}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo, sin token: texto plano Unauthorized: No token provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano Not authorized as user of integration client. Acceso a producción revocado: JSON con code ProductionAccessRevokedError; reautorizar OAuth no lo resuelve.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"El tenant no existe o no pertenece a la integración (JSON). Integración inexistente: texto plano Integration client not found.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]}},"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Vincula la cuenta de comercio autenticada a un tenant de la integración,\nidentificado por `tenantKey`. El tenant tiene que existir y pertenecer al\nmismo cliente de integración que el token.\n\nLa operación es idempotente: llamarla de nuevo con el mismo `tenantKey`\ndevuelve 200 sin cambios. Para cambiar de tenant, enviá otro `tenantKey`.\n\nEl usuario y el cliente de integración salen siempre del token: nunca se\naceptan en el body ni en la ruta.","tags":["Tenant"],"security":[{"bearer":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutTenantRequestBody"}}}}}},"/me":{"get":{"operationId":"getMe","responses":{"200":{"description":"Identidad del comercio","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMeResponseBody"},"examples":{"Example 1":{"value":{"merchantUserId":"0b9d5c1e-6f0a-4c57-9d0e-3a4b8f2c7e11","email":"administracion@example.com","fantasyName":"Comercio de Prueba","accountHolderName":"Comercio de Prueba S.A.","accountHolderTaxId":"30000000007","integration":{"name":"Acme School Manager"},"tenantKey":"instituto-a","linkedAt":"2026-03-14T15:09:26.535Z"}}}}}},"400":{"description":"Autenticación incompleta: texto plano Bad request: Missing required authentication data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Token ausente, inválido o vencido: el gateway devuelve JSON con message Unauthorized. En el middleware directo puede responder texto plano.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationMessageError"}},"text/plain":{"schema":{"type":"string"}}}},"403":{"description":"Cuenta sin vínculo: texto plano o JSON con message. Producción revocada: JSON con code ProductionAccessRevokedError.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationApiError"},{"$ref":"#/components/schemas/IntegrationMessageError"}]}},"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"Integración inexistente: texto plano Integration client not found.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationMessageError"},{"$ref":"#/components/schemas/IntegrationApiError"}]}},"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Error interno del servidor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationApiError"}}}}},"description":"Devuelve la identidad de la cuenta de comercio dueña del token y su vínculo\ncon la integración que llama. Es el equivalente al `/userinfo` de OIDC:\nllamalo apenas termina el intercambio OAuth para saber qué comercio acabás\nde conectar, sin decodificar el `idToken`.\n\nEl comercio y la integración salen únicamente del Bearer token. El endpoint\nno recibe parámetros, así que nunca devuelve otro comercio ni datos de otra\nintegración del mismo comercio.\n\n`accountHolderName` y `accountHolderTaxId` son los mismos valores que vienen\nen `bankAccountInfo` al crear un cobro.\n\n`tenantKey` no viene cuando el comercio no está vinculado a un tenant.","tags":["Me"],"security":[{"bearer":[]}],"parameters":[]}}},"servers":[{"url":"https://integration-api.chytapay.com.ar","description":"PROD"},{"url":"https://integration-api.test.chytapay.com.ar","description":"TEST"},{"url":"https://integration-api.dev.chytapay.com.ar","description":"DEV"}],"x-webhooks":{"payment_request.payment_received":{"post":{"tags":["Webhooks"],"summary":"payment_request.payment_received","description":"Se dispara cuando un pago se imputa a uno de tus cobros, total o parcialmente. `thisPaymentAmount` trae lo pagado en ESTE evento; `paidAmount` es el acumulado. Verificá X-Chytapay-Signature antes de procesar: t=<segundos Unix>,v1=<HMAC-SHA256 hexadecimal de {t}.{cuerpo crudo}> con el secreto de firma. Rechazá timestamps con más de 300 s de diferencia usando comparación de firma en tiempo constante. Si falta la firma, respondé 401 para reintentar: puede faltar transitoriamente si no se pudo leer el secreto. validation-token es adicional y llega vacío al webhookUrl del cobro. Deduplicá por X-Chytapay-Webhook-Id. Respondé 2xx en menos de 5 s. Hasta 8 intentos, con esperas de 1, 5, 15, 30, 60, 180 y 360 min, jitter de ±20%. Guía: https://chytapay.com.ar/api/webhooks/.","operationId":"WebhookPaymentReceived","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWebhookPaymentRequestBody"},"example":{"referenceId":"RESERVA-778","requestedAmount":15000,"paidAmount":15000,"thisPaymentAmount":15000,"reconciledPayerCuil":20000000001,"reconciledPayerName":"María Gómez","reconciledPayerCbu":"0000003100010000000001","remainingAmount":0,"activeDueDateIndex":1,"activeDueDate":"2026-08-11T02:59:59.999Z","activeDueDateAmount":15000,"totalDueDates":1,"event":"payment_request.payment_received","livemode":true,"stateType":"total_payment","metadata":{"order_id":"abc-123"}}}},"description":"Ejemplo ficticio de evento ya ocurrido; las fechas ilustran el formato y no se usan para crear cobros."},"responses":{"200":{"description":"Recibido. Cualquier 2xx en menos de 5 s sirve; ante timeout o no-2xx se reintenta."}},"parameters":[{"name":"X-Chytapay-Signature","in":"header","required":false,"description":"Firma HMAC-SHA256; rechazá con 401 si falta o es inválida. Tolerancia recomendada: 300 s.","schema":{"type":"string"},"example":"t=1792605600,v1=<firma-hexadecimal>"},{"name":"X-Chytapay-Webhook-Id","in":"header","required":true,"description":"ID estable entre reintentos; usalo para deduplicar.","schema":{"type":"string","format":"uuid"}}]}},"payment_request.expired":{"post":{"tags":["Webhooks"],"summary":"payment_request.expired","description":"Se dispara solo al vencer un cobro con fecha y hora sin saldarse. Los vencimientos por día no generan este evento. Verificá X-Chytapay-Signature antes de procesar: t=<segundos Unix>,v1=<HMAC-SHA256 hexadecimal de {t}.{cuerpo crudo}> con el secreto de firma. Rechazá timestamps con más de 300 s de diferencia usando comparación de firma en tiempo constante. Si falta la firma, respondé 401 para reintentar: puede faltar transitoriamente si no se pudo leer el secreto. validation-token es adicional y llega vacío al webhookUrl del cobro. Deduplicá por X-Chytapay-Webhook-Id. Respondé 2xx en menos de 5 s. Hasta 8 intentos, con esperas de 1, 5, 15, 30, 60, 180 y 360 min, jitter de ±20%. Guía: https://chytapay.com.ar/api/webhooks/.","operationId":"WebhookPaymentRequestExpired","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWebhookPaymentRequestBody"},"example":{"referenceId":"RESERVA-778","requestedAmount":15000,"paidAmount":0,"remainingAmount":15000,"activeDueDateIndex":1,"activeDueDate":"2026-08-11T18:30:00.000Z","activeDueDateAmount":15000,"totalDueDates":1,"event":"payment_request.expired","livemode":true,"stateType":"overdue"}}},"description":"Ejemplo ficticio de evento ya ocurrido; las fechas ilustran el formato y no se usan para crear cobros."},"responses":{"200":{"description":"Recibido. Cualquier 2xx en menos de 5 s sirve; ante timeout o no-2xx se reintenta."}},"parameters":[{"name":"X-Chytapay-Signature","in":"header","required":false,"description":"Firma HMAC-SHA256; rechazá con 401 si falta o es inválida. Tolerancia recomendada: 300 s.","schema":{"type":"string"},"example":"t=1792605600,v1=<firma-hexadecimal>"},{"name":"X-Chytapay-Webhook-Id","in":"header","required":true,"description":"ID estable entre reintentos; usalo para deduplicar.","schema":{"type":"string","format":"uuid"}}]}},"payment.unmatched":{"post":{"tags":["Webhooks"],"summary":"payment.unmatched","description":"Se dispara cuando llega dinero a uno de tus CVU de cobranza y no se puede imputar a un cobro. El dinero SÍ se acredita; simplemente no queda atribuido.\n\nEl evento tiene DOS formas y tenés que manejar ambas: ATRIBUIDO (`reason` es expired, already_paid o canceled) trae `paymentRequest`; NO ATRIBUIDO (`reason` es no_cuil_match, no_pending o ambiguous) no lo trae. El nombre del evento NO lleva el prefijo `payment_request.` a propósito, porque no cuelga de un cobro. Verificá X-Chytapay-Signature antes de procesar: t=<segundos Unix>,v1=<HMAC-SHA256 hexadecimal de {t}.{cuerpo crudo}> con el secreto de firma. Rechazá timestamps con más de 300 s de diferencia usando comparación de firma en tiempo constante. Si falta la firma, respondé 401 para reintentar: puede faltar transitoriamente si no se pudo leer el secreto. validation-token es adicional y llega vacío al webhookUrl del cobro. Deduplicá por X-Chytapay-Webhook-Id. Respondé 2xx en menos de 5 s. Hasta 8 intentos, con esperas de 1, 5, 15, 30, 60, 180 y 360 min, jitter de ±20%. Guía: https://chytapay.com.ar/api/webhooks/.","operationId":"WebhookPaymentUnmatched","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWebhookUnmatchedPaymentBody"},"example":{"event":"payment.unmatched","livemode":true,"reason":"expired","amount":15000,"operationDate":"2026-08-11T17:58:00.000Z","payerCuil":20000000001,"payerName":"María Gómez","payerCbuCvu":"0000003100010000000001","creditCvu":"0000053600000042260024","merchantUserId":"3f2b8c1e-5a4d-4e7b-9c06-1d2e3f4a5b6c","merchantTaxId":"30000000007","merchantName":"Comercio de Prueba","tenantKey":"sucursal-centro","paymentRequest":{"referenceId":"RESERVA-778","dueDate":"2026-08-11T02:59:59.999Z"}}}},"description":"Ejemplo ficticio de evento ya ocurrido; las fechas ilustran el formato y no se usan para crear cobros."},"responses":{"200":{"description":"Recibido. Cualquier 2xx en menos de 5 s sirve; ante timeout o no-2xx se reintenta."}},"parameters":[{"name":"X-Chytapay-Signature","in":"header","required":false,"description":"Firma HMAC-SHA256; rechazá con 401 si falta o es inválida. Tolerancia recomendada: 300 s.","schema":{"type":"string"},"example":"t=1792605600,v1=<firma-hexadecimal>"},{"name":"X-Chytapay-Webhook-Id","in":"header","required":true,"description":"ID estable entre reintentos; usalo para deduplicar.","schema":{"type":"string","format":"uuid"}}]}},"refund.succeeded":{"post":{"tags":["Webhooks"],"summary":"refund.succeeded","description":"Se dispara cuando una devolución terminó y toda la plata volvió a la cuenta del pagador. Llega para cualquier devolución de un cobro o de una transferencia de tu integración, la pidas vos o no. Verificá X-Chytapay-Signature antes de procesar: t=<segundos Unix>,v1=<HMAC-SHA256 hexadecimal de {t}.{cuerpo crudo}> con el secreto de firma. Rechazá timestamps con más de 300 s de diferencia usando comparación de firma en tiempo constante. Si falta la firma, respondé 401 para reintentar: puede faltar transitoriamente si no se pudo leer el secreto. validation-token es adicional y llega vacío al webhookUrl del cobro. Deduplicá por X-Chytapay-Webhook-Id. Respondé 2xx en menos de 5 s. Hasta 8 intentos, con esperas de 1, 5, 15, 30, 60, 180 y 360 min, jitter de ±20%. Guía: https://chytapay.com.ar/api/webhooks/.","operationId":"WebhookRefundSucceeded","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWebhookRefundBody"},"example":{"event":"refund.succeeded","livemode":true,"merchantUserId":"3f2b8c1e-5a4d-4e7b-9c06-1d2e3f4a5b6c","merchantTaxId":"30000000007","merchantName":"Comercio de Prueba","refundId":"8b1f6a2c-3d4e-4f50-9a61-7b8c9d0e1f23","paymentRequest":{"referenceId":"RESERVA-778","state":"partially_refunded"},"origin":"api","trigger":null,"status":"succeeded","requestedAmount":4000,"refundedAmount":4000,"reason":"Cancelación del cliente","items":[{"amount":4000,"status":"succeeded"}]}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve; ante un no-2xx se reintenta."}}}},"refund.failed":{"post":{"tags":["Webhooks"],"summary":"refund.failed","description":"Se dispara cuando una devolución terminó y al menos una parte no se pudo devolver. Si otra parte sí volvió, `status` es `partially_failed` y `refundedAmount` dice cuánto. La plata que no volvió sigue en la cuenta del comercio. Verificá X-Chytapay-Signature antes de procesar: t=<segundos Unix>,v1=<HMAC-SHA256 hexadecimal de {t}.{cuerpo crudo}> con el secreto de firma. Rechazá timestamps con más de 300 s de diferencia usando comparación de firma en tiempo constante. Si falta la firma, respondé 401 para reintentar: puede faltar transitoriamente si no se pudo leer el secreto. validation-token es adicional y llega vacío al webhookUrl del cobro. Deduplicá por X-Chytapay-Webhook-Id. Respondé 2xx en menos de 5 s. Hasta 8 intentos, con esperas de 1, 5, 15, 30, 60, 180 y 360 min, jitter de ±20%. Guía: https://chytapay.com.ar/api/webhooks/.","operationId":"WebhookRefundFailed","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWebhookRefundBody"},"example":{"event":"refund.failed","livemode":true,"merchantUserId":"3f2b8c1e-5a4d-4e7b-9c06-1d2e3f4a5b6c","merchantTaxId":"30000000007","merchantName":"Comercio de Prueba","refundId":"2c7d9e1a-6b5f-4a3c-8d20-1e4f5a6b7c89","paymentRequest":{"referenceId":"RESERVA-912","state":"partially_refunded"},"origin":"chyta","trigger":null,"status":"partially_failed","requestedAmount":15000,"refundedAmount":10000,"reason":null,"items":[{"amount":10000,"status":"succeeded"},{"amount":5000,"status":"failed"}]}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve; ante un no-2xx se reintenta."}}}}}}