Factuarea APIDevelopers
Añadido

Anulación de cobros

Anula un cobro conservando el registro original y su trazabilidad. El saldo de la factura refleja la anulación y las integraciones reciben el evento correspondiente.

Un pago que se ha devuelto — un adeudo SEPA devuelto, una retrocesión de tarjeta, un efecto impagado — tiene ya una vía propia para registrarse, y la factura que pagaba vuelve al circuito de cobro en lugar de quedarse paid para siempre. Consulta Registrar pagos.

  • Operación nuevaPOST /v1/invoices/{id}/payments/{payment_id}/reversal anula un pago de una factura de venta indicando un reason de un catálogo cerrado (direct_debit_return, card_dispute, misapplied_payment, bounced_effect, recording_error) y una note opcional. Devuelve 200 con el pago ya anulado. Scope: invoices:write — no existe una familia de scopes payments:*.
  • El pago no se borra nunca — conserva su importe, fecha, método y referencia, y gana is_reversed, reversed_at, reversal_reason, reversal_reason_text y reversal_note, los cinco publicados ya en todos los pagos de una factura. Un pago anulado sigue en el ledger: lee is_reversed, no deduzcas la anulación de que una entrada desaparezca.
  • La factura vuelve al circuito de cobro — un importe anulado deja de computar en paid_amount y pending_amount, así que una factura paid pasa a overdue si su vencimiento ya pasó y a sent en caso contrario, y vuelve a admitir un pago. Solo el ledger puede producir esa transición: el endpoint genérico de cambio de estado sigue sin poder sacar una factura de paid.
  • Evento nuevo payment.reversed — cierra el ciclo que payment.received dejaba contado a medias. Su data.reversal lleva el reason y un origin (gateway cuando fue la pasarela la que informó de la devolución, manual cuando lo registró una persona). Consulta Eventos.
  • Tool MCP nueva revert_invoice_payment — el espejo de la ruta para agentes, con el mismo scope invoices:write. Consulta el catálogo de tools.
  • Tres códigos de error nuevos, los tres 422: payment_already_reversed, payment_reversal_reason_invalid y payment_reversal_invalid.

Anular no es rectificar. Un recibo devuelto significa que el cliente recuperó su dinero sin que la operación se minore: la deuda sigue viva y no hay nada que rectificar. Un reembolso genuino sí baja los ingresos y conserva su rectificativa. Un recibo devuelto tampoco es el supuesto de crédito incobrable del art. 80.Cuatro LIVA, que tiene sus propios requisitos formales. Consulta ¿Anulación o rectificativa?.

Corrección de contrato (clientes generados). POST /v1/invoices/{id}/payments y GET /v1/invoices/{id}/payments publicaban en el spec OpenAPI el schema de factura, heredado del prefijo del path, cuando la API devuelve un cobro — y el listado anunciaba además un objeto singular en lugar de un array. Ambas publican ya InvoicePaymentDetail (un array en el listado). Ninguna respuesta ha cambiado por el cable: es una corrección de documentación, no un cambio que rompe, porque ninguna integración tipada podía funcionar contra el tipo anterior. Si usas un SDK generado o el CLI, vuelve a generarlo: tu modelo de estas dos operaciones cambiará.

Nuevos endpoints1

EndpointDescripción
POST/v1/invoices/{invoice}/payments/{payment}/reversalAnular un pago de una factura