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?
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
/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
/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.
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).