POST /reversals aplica solo a CARD y solicita el extorno total de una venta aprobada. Conserva el operationNumber original.
Cancelación y extorno
En QR, únicamente cancelas o inhabilitas el código generado. Ni
/cancel ni refund devuelven un monto pagado; /reversals no aplica. Si aparece transaction.state: "AUTORIZADO" en una consulta 200/00 después de solicitar cancelación, conserva el pago aprobado y registra la discrepancia para revisión.
Una cancelación fallida permite evaluar el extorno cuando GET /payments/{operationNumber} confirma el cobro CARD como transaction.state: "AUTORIZADO" en una consulta 200/00. Usa el operationNumber de esa venta; el error de cancelación no genera un extorno automático.
Requisitos por método
Antes del POST, verifica que no exista un extorno completado o en curso. No dupliques la solicitud mientras falte resolución.
Solicitud
Envía al mismo host y puerto de la autorización:
No envíes monto, moneda, método ni datos de tarjeta. El extorno es total.
Connection: close y Cache-Control: no-store. Abre una conexión por petición. HTTP 202 añade Retry-After: 2; espera dos segundos antes de consultar el extorno.
Respuestas del POST
La forma normal conserva
operationNumber, status, resultCode, resultMessage, authorizationCode y completedAt (fecha ISO 8601 UTC o null si no aplica). Ejemplo de extorno aprobado; no representa una prueba ejecutada:
REVERSED con 00, 16 o 17. Conserva los códigos SDK sin normalizaciones adicionales. El cuerpo compacto de UNKNOWN utiliza message, no resultMessage.
Forma compacta de HTTP 502 (esquema, no evidencia de prueba):
Consulta del extorno explícito
GET /reversals/{operationNumber} consulta el estado local guardado por la app. El cobro y el extorno son resultados independientes. Encontrar transaction.state: "AUTORIZADO" en GET /payments/{operationNumber} no confirma ni descarta el extorno; consulta este último en /reversals/{operationNumber}.
Estados del extorno
DENIED, ERROR y UNKNOWN no confirman un extorno exitoso. UNKNOWN no debe tratarse como un pendiente de cobro con HTTP 202.
Recuperación e idempotencia
- Ante timeout o desconexión, consulta la misma referencia: el timeout no determina el resultado financiero.
- Si el mismo extorno está
SEARCHING,PROCESSINGoPENDING, el POST devuelve202sin iniciar otro. - Si ya fue
REVERSED, devuelve200con el resultado guardado sin repetir el extorno; si fueNOT_FOUND, devuelve404sin otro intento. - Tras un resultado final
DENIED,UNKNOWNoERROR, un nuevoPOST /reversalscon la misma referencia puede ejecutar otro intento real. Esta capacidad no autoriza reintentos automáticos ante incertidumbre: consulta, revisa el resultado financiero y decide antes de reenviar. - Otra referencia activa devuelve
409 POS_BUSY. Serializa operaciones por terminal. - No reenvíes en paralelo ni cambies el cuerpo. Consulta antes de cualquier reenvío permitido.
- No sustituyas un resultado confirmado por un
PENDINGtardío ni inicies otra venta mientras no conozcas el resultado anterior.

