Changelog
Acá listamos cambios que afectan a integradores: endpoints nuevos, campos agregados/cambiados, deprecaciones. Mejoras del dashboard o internas no entran.
2026-08
expires_inenPOST /v1/payments(2026-08-29). Los pagos directos ahora aceptan un plazo, igual que el checkout hospedado: mín60s, máx86400. Vencido, el pago pasa aexpiredy recibíspayment.expired. El default depende del proveedor: 3600 s paradinelcoybancard, y sin vencimiento paratransferencia(el comprador va al banco y sube el comprobante horas después — ponerle un default rompería ese flujo). Unexpires_inexplícito gana siempre. Ver Expiración.- La página hospedada avisa y devuelve al comercio al vencer (2026-08-29). El checkout hospedado muestra un contador con el tiempo restante; al llegar a cero cierra el formulario de tarjeta, se lo explica al comprador y a los 5 segundos lo redirige a tu
cancel_urlcon?status=expired&reference=...&checkout_session_id=.... Antes se quedaba trabado en una página muerta. Si ya manejás la vuelta del comprador, agregá el casoexpired— si no, va a caer en tu rama genérica de cancelación. Ver Expiración. - Cuatro campos nuevos en el payload de webhook (2026-08-29). Aditivos, no rompen nada:
expires_at(el plazo del intento),expired_at(cuándo lo marcamos vencido),confirmed_after_expiryyrecovered_from_status. Los dos últimos identifican una confirmación que llegó fuera de la ventana: el formulario de tarjeta vive en el dominio del proveedor y un pago puede aprobarse justo después del vencimiento. Si manejás stock o cupo, usalos para decidir si honrás el pago o lo revertís. Ver confirmaciones fuera de ventana. - Correcciones de documentación (2026-08-29). La doc de webhooks describía un payload con wrapper
datay clavesevent_type/event_iden el body que nunca existió: el payload real es plano, el tipo viene enevent, y elevent_idsolo en el headerX-Ingalca-Event-Id. También estaba mal documentado queamountes un entero (es un string decimal,"150000.00") y quecurrencyes opcional enPOST /v1/payments(es requerido). El código no cambió — solo la documentación, que ahora refleja lo que la API viene devolviendo. Si escribiste tu handler siguiendo esos ejemplos, revisalo. - Checkout hospedado (2026-08-04).
POST /v1/checkout-sessionscrea una sesión de pago y te devuelve unaurla la que redirigís el browser del comprador. Él elige método (Dinelco, Bancard o transferencia) y paga en una página hospedada por nosotros con tu logo y tus colores; vos no construís UI de pago ni embebés iframes. Al terminar vuelve a tusuccess_url/cancel_url, y la confirmación llega por webhook como siempre. Ver Checkout hospedado. - Bancard disponible como proveedor de pago (2026-08).
POST /v1/paymentsaceptaprovider=bancardpara cobro con tarjeta (pago ocasional): el cliente tipea la tarjeta dentro del iframe de Bancard —embebido en tu UI vía elcheckout_urlque te devolvemos, proxeado por el gateway— y el 3DS lo maneja Bancard. La confirmación llega por callback y te la reenviamos comopayment.confirmed/payment.failed. La reversa (POST /v1/payments/{id}/reverse) funciona el mismo día, antes de la liquidación. Solo PYG. Las tarjetas guardadas con Bancard (catastro + cobro con token) llegan en una fase posterior. Ver Elegir método de pago.
2026-07
return_urlcon deep links + guía de integración móvil (2026-07-16).POST /v1/cardsyPOST /v1/paymentsaceptan ahora un camporeturn_url(opcional en integraciones web, obligatorio en apps móviles). Cuando termina el 3DS el proxy redirige a esa URL con?status=X&card_id=Y(opayment_id). Acepta http/https además de esquemas custom (fixapp://,com.fix.app://) para integrar conSFSafariViewController(iOS) yCustom Tabs(Android) usando deep links — el patrón necesario porque los WebView modernos bloquean cookies third-party y rompen el 3DS. Sinreturn_urlla comunicación sigue siendopostMessagecomo antes. Fix relacionado del mismo commit:POST /v1/cardsahora siempre envía unreturnUrlválido a Dinelco (antes se colabanullcuando el integrador no lo mandaba y Dinelco cancelaba el 3DS con “cancelado por el cliente” aunque el OTP hubiera sido correcto). Ver guía mobile para ejemplos por stack.checkout_urlproxeado por el gateway (2026-07-16).POST /v1/cards(Dinelco) devuelve un nuevo camporegistration.checkout_urlque embebés como<iframe src>— servimos el HTML del checkout desdeapi.pay.ingalca.comy proxeamos al proveedor por atrás. Tu app nunca ve URLs ni tokens del proveedor.POST /v1/paymentscon Dinelco (sincard_id) suma un bloquedata.checkoutcon el mismo shape. Los eventos del iframe llegan comopostMessagenormalizados en tu vocabulario:ingalca.registry.completed/.failed/.cancelledpara catastro,ingalca.checkout.*para pagos. Los campos crudos anteriores (integrity_token,session_id,validate_url) siguen en la respuesta como internos — usácheckout_url. Ver guía de catastro y reference de pagos.- Eliminar tarjetas (borrado lógico) + dedup de catastros (2026-07-15).
DELETE /v1/cards/{id}ahora responde204y hace un borrado lógico (la tarjeta quedadeleted, sale del listado y no es cobrable); emitimoscard.deleted. Además, re-catastrar la misma tarjeta ya no acumula duplicados: la registración anterior del mismocustomer_idcon igual número enmascarado/marca/tipo pasa adeletedautomáticamente. Antes elDELETEdevolvía501. Dinelco no expone unregister remoto — si lo habilita, elDELETElo va a usar sin cambiar el contrato. - Idempotencia por
reference(2026-07-14).POST /v1/cards/{id}/chargeyPOST /v1/paymentsdeduplican porreference: reenviar el mismo request (mismareference, mismo body) devuelve el pago original con200, sin cobrar de nuevo; la mismareferencecon otroamount/card_id/currencydevuelve409 REFERENCE_ALREADY_USED. El replay devuelve el resultado original aunque haya terminadofailed— para reintentar de verdad, usá unareferencenueva. Ver idempotencia.
2026-05
target_originacepta múltiples dominios (2026-05-12). Podés mandartarget_origincomo array enPOST /v1/paymentsyPOST /v1/cardspara listar todos los orígenes (dominios/subdominios) desde donde podés embeber el iframe de Dinelco. La forma string (un solo origen) sigue funcionando. Ver Sobre target_origin.- Notificaciones por email configurables (2026-05-02). Te avisamos por email cuando un webhook agota reintentos o cuando un cliente sube un comprobante de transferencia para revisar. Configurás en Configuración → Webhooks → Notificaciones por email. Throttle: máx 1 email por hora (webhooks fallidos) / 30 min (comprobantes).
- Aprobar/rechazar comprobantes vía API (2026-05). Endpoints
POST /v1/payments/{id}/confirmyPOST /v1/payments/{id}/rejectpara automatizar la aprobación de transferencias si tenés tu propia lógica.
2026-04
- Customers como entidad referencial (2026-04). Endpoints
GET /v1/customersyGET /v1/customers/{id}. Auto-create al crear pagos o tarjetas concustomer.customerId. Webhookpayment.*ahora incluyecustomer_id(external_id) en el payload. Ver guía de customers. - Reversa de pagos Dinelco (2026-04).
POST /v1/payments/{id}/reversepara Dinelco antes del corte de liquidación. Webhookpayment.reversed. Mensaje específico cuando ya pasó la ventana (responseCode: 90019). Ver guía de reversa. - Pago Failed (no Pending) cuando falla el create (2026-04). Antes los pagos con payload inválido quedaban como
pendingfantasma. Ahora se marcanfailedconrejection_reason= mensaje del provider. - Sección
/cardsen el dashboard del tenant (2026-04). Listado read-only con drawer.
Si tenés un caso particular o preguntas sobre algún cambio, escribinos a desarrollo@ingalca.com.