factadesarrolladores API 0.1.0-esqueleto

Anular un documento sellado

Anular no es borrar. POST /v1/dte/{codigoGeneracion}/invalidate produce un evento aparte: su propio documento firmado, con su propio código de generación y su propio sello del Ministerio. El documento original no desaparece de ningún registro — cambia de estado, y esta ruta devuelve el sello que lo prueba. No hay forma de deshacer una anulación.

Los tres tipos no son intercambiables

CAT-024 del catálogo oficial define tres motivos, y cada uno exige cosas distintas:

TipoQué esExige
1Error en el documentomotivo y codigoGeneracionReemplazo — emita primero el documento correcto
2Rescisión de la operaciónNinguno de los dos — nombrar un reemplazo aquí es un error
3OtroIgual que el 1: motivo y codigoGeneracionReemplazo
curlTerminal · error con reemplazo
curl -X POST "$FACTA_API_BASE_URL/v1/dte/7875BC7A-9580-441D-94E4-FA455E9D8BD0/invalidate" \
  -H "X-Facta-Key: $FACTA_API_KEY" \
  -H "X-Facta-Sign-Key: $FACTA_SIGN_KEY" \
  -H "Idempotency-Key: anulacion-venta-00417" \
  -H "Content-Type: application/json" \
  -d '{
        "tipoAnulacion": 1,
        "motivo": "El precio unitario iba sin el descuento pactado",
        "codigoGeneracionReemplazo": "9C1E77A2-0B44-4E0F-9E31-0C2A6F4D1B88",
        "responsable": { "nombre": "Ana Rivas", "tipoDocumento": "36", "numDocumento": "06142803901121" },
        "solicita": { "nombre": "Beto Cruz", "tipoDocumento": "13", "numDocumento": "012345678" }
      }'

responsable es quien responde por la anulación ante Hacienda; solicita es quien la pidió — pueden ser la misma persona, pero el esquema los pide siempre por separado.

Solo se anula lo que tiene sello

Un documento rechazado nunca existió para Hacienda, así que no hay nada que anular: su correlativo lo reutiliza el documento corregido, no un evento de anulación (§167 de la normativa).

Por qué exige Idempotency-Key sin gastar correlativo

Anular no reserva un número nuevo, pero sí exige Idempotency-Key igual que las rutas que sí gastan uno: un reintento por timeout mandaría un segundo evento de anulación contra un documento que el primero ya anuló, y eso es exactamente el tipo de duplicado que esta cabecera existe para prevenir en cualquier operación irreversible, gaste o no un correlativo.

Anular algo que ya estaba anulado

No es un error. La respuesta es 200 con yaEstabaInvalidado: true, y no se manda ningún evento nuevo al Ministerio. Un reintento que en cambio recibiera un error enseñaría a hacer algo peor: forzar una segunda anulación sobre un documento que ya la tiene.

Otras guías

Escriba para buscar Por ejemplo: idempotencia, contingencia, 422, emitir.

moverse Enter abrir Esc cerrar