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.
inboundDocumentIdLos 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
| Campo | Requerido | Descripcion |
|---|---|---|
decision | si | accept o reject (tambien se aceptan aceptado/rechazado). |
rejectionReason | no | Motivo del rechazo comercial (alias: detalleMotivoRechazo). |
approvalDate | no | Fecha 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.status | Significado |
|---|---|
built | ACECF construido (sin firmar ni enviar). |
signed | Firmado, pendiente de despacho. |
sent | Enviado al emisor/PSFE de contraparte. |
dispatch_failed | Firmado pero fallo el envio (respuesta 502); el ACECF queda registrado. |
uncertain | El 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.
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.