Saltar al contenido principal

Aprobacion comercial (ACECF)

Cuando recibes un e-CF de un emisor (documento inbound), como receptor electronico puedes responder con un Acuse Comercial (ACECF) indicando si aceptas o rechazas comercialmente el documento. Zarela genera, firma y envia el ACECF.

Requiere el scope tenant:admin.

Flujo

Zarela recibe los e-CF inbound por el endpoint publico y los pone a tu disposicion con un inboundDocumentId.

Donde obtengo el inboundDocumentId

Los documentos inbound recibidos se listan en el portal de Zarela (seccion Recepcion DGII). Para automatizar el flujo, configura un webhook y procesa el evento dgii.public.receiver.ecf.received; el identificador llega en data.payload.inboundDocumentId.

Generar y enviar ACECF

POST /{environment}/inbound-dgii/{inboundDocumentId}/aprobacion-comercial
curl -X POST \
https://ecf.api.zarela.do/eCF/inbound-dgii/{inboundDocumentId}/aprobacion-comercial \
-H 'X-API-KEY: zk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"decision": "accept"
}'

Ejemplo de rechazo comercial:

curl -X POST \
https://ecf.api.zarela.do/eCF/inbound-dgii/{inboundDocumentId}/aprobacion-comercial \
-H 'X-API-KEY: zk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"decision": "reject",
"rejectionReason": "Mercancia no recibida"
}'

Campos del cuerpo

CampoRequeridoDescripcion
decisionsiaccept o reject (tambien se aceptan aceptado/rechazado).
rejectionReasonnoMotivo del rechazo comercial (alias: detalleMotivoRechazo).
approvalDatenoFecha de la decision; por defecto la fecha actual.

Respuesta

202 cuando el ACECF se desacho a la contraparte, 200 cuando solo se construyo/firmo:

{
"ok": true,
"inboundId": "1f6d...",
"encf": "E310000000045",
"commercialApproval": {
"status": "sent",
"decision": "accept",
"estado": "Aceptado",
"signed": true,
"targetUrl": "https://psfe-contraparte.example/fe/aprobacioncomercial/api/ecf",
"xsd": { "validated": true, "ok": true }
}
}
commercialApproval.statusSignificado
builtACECF construido (sin firmar ni enviar).
signedFirmado, pendiente de despacho.
sentEnviado al emisor/PSFE de contraparte.
dispatch_failedFirmado pero fallo el envio (respuesta 502); el ACECF queda registrado.
uncertainEl envio pudo completarse, pero no fue posible confirmar el resultado. No repitas otra decision.

La respuesta es idempotente: si repites la misma decision sobre el mismo documento, recibes el acuse ya registrado con idempotent: true.

Consultar la aprobacion comercial

GET /{environment}/inbound-dgii/{inboundDocumentId}/aprobacion-comercial
curl -X GET \
https://ecf.api.zarela.do/eCF/inbound-dgii/{inboundDocumentId}/aprobacion-comercial \
-H 'X-API-KEY: zk_live_...'

Devuelve el estado actual de la aprobacion comercial del documento inbound.

Reconciliar una entrega incierta

Si el estado es uncertain, no vuelvas a enviar la aprobacion. Cuando tengas confirmacion verificable de la contraparte, registra el resultado:

POST /{environment}/inbound-dgii/{inboundDocumentId}/aprobacion-comercial/reconciliar
curl -X POST \
https://ecf.api.zarela.do/eCF/inbound-dgii/{inboundDocumentId}/aprobacion-comercial/reconciliar \
-H 'X-API-KEY: zk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"outcome": "sent",
"evidence": {
"source": "counterparty-confirmation",
"reference": "ticket-proveedor-42",
"observedAt": "2026-06-03T15:00:00-04:00",
"details": { "acknowledged": true }
}
}'

Para ACECF, outcome admite sent o dispatch_failed. La operacion no redespacha el XML y el resultado reconciliado no puede sustituirse por otro posteriormente.

Plazos DGII

La aprobacion o rechazo comercial es una respuesta opcional, pero si tu empresa la utiliza debe integrarla en su proceso de recepcion y conciliacion. Consulta con tu equipo fiscal el calendario aplicable y evita dejar decisiones operativas sin seguimiento.