Saltar al contenido principal

Anulaciones (ANECF)

La Anulacion de e-NCF (ANECF) se usa para reportar a la DGII rangos de eNCF que no seran utilizados. Zarela genera el XML ANECF, lo valida contra anecf.xsd, lo firma y lo envia.

Requiere el scope tenant:admin.

Prevalidar

Genera el ANECF sin enviarlo: valida rangos/documentos y comprueba contra el XSD.

POST /{environment}/anulaciones-ecf/prevalidar
curl -X POST \
https://ecf.api.zarela.do/eCF/anulaciones-ecf/prevalidar \
-H 'X-API-KEY: zk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"annulmentDate": "2026-06-03T10:30:00-04:00",
"cancellations": [
{
"ecfType": "E31",
"sequences": [
{ "from": "E310000000150", "to": "E310000000160" }
]
}
]
}'

Firmar y enviar

POST /{environment}/anulaciones-ecf
curl -X POST \
https://ecf.api.zarela.do/eCF/anulaciones-ecf \
-H 'X-API-KEY: zk_live_...' \
-H 'Idempotency-Key: anecf-cierre-2026-06-e31-150-160' \
-H 'Content-Type: application/json' \
-d '{
"annulmentDate": "2026-06-03T10:30:00-04:00",
"cancellations": [
{
"ecfType": "E31",
"sequences": [
{ "from": "E310000000150", "to": "E310000000160" }
]
}
],
"submit": true
}'

Campos del cuerpo

CampoRequeridoDescripcion
rncEmisornoRNC emisor; por defecto el de la cuenta del API key.
annulmentDatenoFecha de la anulacion; por defecto la fecha actual.
cancellationssiBloques de anulacion, uno por tipo de e-CF (alias: ranges).
cancellations[].ecfTypesiTipo de comprobante del bloque (E31..E47).
cancellations[].sequencessiRangos de eNCF a anular dentro del bloque.
cancellations[].sequences[].fromsiPrimer eNCF del rango (alias: desde).
cancellations[].sequences[].tonoUltimo eNCF del rango (alias: hasta); por defecto igual a from para anular un solo eNCF.
submitnotrue firma y envia; false solo construye/valida. Por defecto true.

Cuando submit es true, el header Idempotency-Key es obligatorio. Reutiliza la misma clave únicamente con los mismos rangos. Si la clave ya fue usada con rangos diferentes, la API responde 409 ANECF_IDEMPOTENCY_CONFLICT.

Todos los eNCF de un bloque deben coincidir con su ecfType (por ejemplo, un rango E31... en un bloque E31); de lo contrario la API responde 400.

Respuesta

202 cuando se envio a la DGII (200 si submit:false):

{
"ok": true,
"annulmentId": "9b2c...",
"totalAnnulled": 11,
"status": "accepted",
"signedXml": "<ANECF>...</ANECF>",
"dgii": { "codigo": "...", "trackId": "..." },
"annulment": { "id": "9b2c...", "status": "accepted", "totalAnnulled": 11 }
}
statusSignificado
builtANECF construido (no enviado).
signedFirmado.
acceptedAceptado por la DGII.
rejectedRechazado por la DGII.
failedError durante el proceso.
uncertainLa solicitud pudo llegar a la DGII, pero Zarela no pudo confirmar el resultado. No la reenvies automaticamente.

Consultar una anulacion

GET /{environment}/anulaciones-ecf/{annulmentId}
curl -X GET \
https://ecf.api.zarela.do/eCF/anulaciones-ecf/9b2c... \
-H 'X-API-KEY: zk_live_...'

Devuelve { "ok": true, "annulment": { ... } } con el estado actual de la anulacion.

Reconciliar un resultado incierto

Solo usa esta operacion cuando el estado sea uncertain y tengas una confirmacion externa verificable del resultado:

POST /{environment}/anulaciones-ecf/{annulmentId}/reconciliar
curl -X POST \
https://ecf.api.zarela.do/eCF/anulaciones-ecf/9b2c.../reconciliar \
-H 'X-API-KEY: zk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"outcome": "accepted",
"evidence": {
"source": "dgii-status-query",
"reference": "track-o-referencia-dgii",
"observedAt": "2026-06-03T15:00:00-04:00",
"details": { "codigo": "0" }
}
}'

Para ANECF, outcome admite accepted o rejected. La reconciliacion no vuelve a enviar la solicitud y no puede cambiarse posteriormente con otra evidencia. Si no tienes confirmacion suficiente, conserva el estado uncertain y contacta soporte con el annulmentId y correlationId.

Prevalida primero

Ejecuta prevalidar antes de enviar para confirmar que los rangos son validos y el XML cumple el XSD. Asi evitas rechazos de la DGII.