Anular un e-CF

Anular un e-CF

La DGII distingue dos operaciones que suelen confundirse. Cuál toca depende de una sola pregunta: ¿la DGII ya aceptó el comprobante?

Sí, fue aceptado → se anula con una nota de crédito (E34) por el total exacto, con reference.reason_code = 1. Es un documento más de POST /api/v1/documents.
No llegó a la DGII (secuencia sin usar, vencida en la ventana de 72 h, descartada) → se declara con una anulación de rangos (ANECF): POST /api/v1/sequences/annul.

Anular un comprobante aceptado: nota de crédito

POST /api/v1/documents
curl -X POST https://api.fiscalflowsupport.com/api/v1/documents \
  -H "X-API-Key: ffs_live_ejemplodeclavenoreal000000000000000000" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "34",
    "items": [ ...los mismos ítems del original... ],
    "totals": { ...los mismos totales del original... },
    "buyer": { "rnc": "131880681", "name": "Comercial Dominicana SRL" },
    "reference": {
      "encf": "E310000000001",
      "date": "14-08-2026",
      "reason_code": "1",
      "reason": "Venta cancelada por el cliente"
    }
  }'

Reglas que FiscalFlow comprueba antes de gastar un e-NCF: la referencia es obligatoria, el e-NCF referenciado es de serie E y no es a su vez una nota, el comprador coincide con el del original, y el código 1 exige que el total de la nota iguale el del original. Una nota parcial lleva código 3.

Declarar secuencias no utilizadas: ANECF

POST /api/v1/sequences/annul
curl -X POST https://api.fiscalflowsupport.com/api/v1/sequences/annul \
  -H "X-API-Key: ffs_live_ejemplodeclavenoreal000000000000000000" \
  -H "Content-Type: application/json" \
  -d '{
    "ranges": [
      { "from": "E310000000120", "to": "E310000000125" },
      { "from": "E320000000009", "to": "E320000000009" }
    ]
  }'
import requests

r = requests.post(
    "https://api.fiscalflowsupport.com/api/v1/sequences/annul",
    headers={"X-API-Key": "ffs_live_ejemplodeclavenoreal000000000000000000"},
    json={"ranges": [{"from": "E310000000120", "to": "E310000000125"}]},
)
print(r.json()["data"]["id"])
Parameter Type Required Description
ranges array Required Hasta 10 rangos. Cada uno con from y to (e-NCF de serie E, 13 caracteres, mismo tipo). to es opcional para un solo número.
ranges.*.type string Optional Tipo de comprobante (31…47). Se deduce del e-NCF si se omite.
external_ref string Optional Referencia propia, idempotente por organización.

Se rechaza con 422 ENCF_ALREADY_USED cualquier rango que contenga un e-NCF aceptado, en proceso o pendiente de transmisión: esos no se anulan por ANECF. Los e-NCF de documentos vencidos en la ventana de 72 h se declaran solos, una vez al día, sin llamar a este endpoint.

Consultar el resultado

La anulación es un documento de tipo ANECF: GET /api/v1/documents/{id} devuelve su estado (processing, accepted, rejected) y la respuesta de la DGII.

Deprecado: POST /api/v1/cancellations. Modelaba la anulación al revés (exigía un comprobante aceptado y enviaba un ANECF, que la DGII no acepta para eso). Hoy es un adaptador de un solo e-NCF sobre sequences/annul, responde con cabeceras Deprecation y Sunset, y se retira el 27 de septiembre de 2026 (HTTP 410).