Anular y cerrar el día
Dos flujos que también son de a dos: uno los pide tu backend, el otro los confirma el terminal.
Anular un pago
Anular es deshacer un pago que ya se confirmó con la tarjeta. Lo pide tu backend:
curl -X POST https://dev.api.spuntodeventa.com/api/v1/merchants/MERCHANT-001/transactions/ORD-123456/cancellation \
-H "Authorization: Bearer <tu-token>"
Sin cuerpo: la orden ya la identifica la ruta.
El pago no queda anulado todavía: pasa a VOID_PENDING. Igual que el pago, la anulación necesita que el aparato la ejecute contra el banco y la confirme:
POST /api/v1/pos-terminals/98202003219630/transactions/ORD-123456/cancellation/commit
x-pos-signature: <firma>
x-pos-timestamp: 2026-07-29T18:40:00Z
También sin cuerpo — lo cual importa para la firma: se firma cadena vacía.
Con eso el pago llega a VOIDED, que es definitivo.
Cancelar es descartar un pago que el terminal aún no confirmó: la orden muere en CANCELED y nunca hubo tarjeta. Anular es revertir uno que sí se cobró: PAID → VOID_PENDING → VOIDED. Las dos usan la misma ruta /cancellation; lo que cambia es el estado desde el que sales.
Cerrar el lote
Al final de la jornada el terminal cuadra su caja contra el banco y le cuenta a SPIDI cómo le fue. Lo envía el POS, firmado:
POST /api/v1/pos-terminals/98202003219630/settlements
x-pos-signature: <firma>
x-pos-timestamp: 2026-07-29T23:59:00Z
Content-Type: application/json
{
"batchNumber": "B-10293",
"transactionCount": 12,
"closedAt": "2026-07-29T23:26:51.187Z",
"currencyReference": "USD",
"terminal": "98202003219630",
"debitBatch": "DB-9901"
}
Obligatorios: batchNumber, transactionCount, closedAt y currencyReference.
Leer los cierres desde tu backend
Aquí volvemos al token. Para el cuadre contable, tu ERP pide el último cierre de un terminal:
curl "https://dev.api.spuntodeventa.com/api/v1/merchants/MERCHANT-001/pos-terminals/98202003219630/settlements?sort=-closedAt&size=1" \
-H "Authorization: Bearer <tu-token>"
{
"title": "Último Cierre de Lote",
"data": [
{
"batchNumber": "B-10293",
"transactionCount": 12,
"closedAt": "2026-07-29T23:26:51.187Z",
"currencyReference": "USD",
"terminal": "98202003219630",
"debitBatch": "DB-9901"
}
]
}
El terminal escribe los cierres con su firma; tu backend los lee con el token. Es la misma información vista desde los dos lados del mostrador.