Recepción: los e-CF que le envían sus proveedores¶
Ser emisor electrónico también obliga a recibir e-CF de terceros. De esa parte se encarga esta
API: exponemos los servicios que el estándar define (/fe/recepcion/api/ecf y
/fe/aprobacioncomercial/api/ecf), respondemos el Acuse de Recibo firmado (ARECF) y
archivamos lo recibido. A usted le quedan dos recursos:
| Endpoint | Para qué | Permiso |
|---|---|---|
GET /api/v1/received-documents |
Ver los e-CF que sus proveedores le enviaron (los 100 más recientes). | received:read |
POST /api/v1/received-documents/{eNCF}/commercial-approval |
Aceptar o rechazar comercialmente uno de esos e-CF. | received:approve |
Ambos actúan en nombre de su empresa, declarada con el parámetro emisor_rnc de la consulta (en el
listado) o con emisor.rnc en el cuerpo JSON (en la aprobación)
(autenticación): aquí no hay identificador con prefijo, porque el
comprobante es de un tercero.
El acuse y la aprobación son cosas distintas. El acuse de recibo (automático, al llegarnos el XML) sólo dice que el comprobante llegó firmado y válido en forma. La aprobación comercial es su conformidad con la operación, y es opcional: se puede aceptar, rechazar (con motivo) o no pronunciarse nunca.
Listado de recibidos¶
{
"status": "success",
"message": "Consulta exitosa.",
"data": [
{
"id": 512,
"emisor_rnc": "131880738",
"ecf_type_code": "31",
"e_ncf": "E310000000099",
"total_amount": 2360,
"recibido": true,
"motivo_no_recibido": null,
"acuse_emitido_en": "10-08-2026 09:14:22"
},
{
"id": 511,
"emisor_rnc": "131888888",
"ecf_type_code": "32",
"e_ncf": "E320000000043",
"total_amount": 1180,
"recibido": false,
"motivo_no_recibido": 3,
"acuse_emitido_en": "10-08-2026 08:59:01"
}
]
}
| Campo | Qué es |
|---|---|
id |
Identificador interno del registro recibido. |
emisor_rnc |
⚠️ El RNC del proveedor que envió el e-CF — no confundirlo con el emisor_rnc de la petición, que es el de su empresa. |
ecf_type_code |
Tipo del e-CF recibido (31, 32, …). |
e_ncf |
El número del comprobante que le facturaron. |
total_amount |
Monto total del comprobante recibido. |
recibido |
true = acusamos recibo (llegó firmado y válido en forma); false = se rechazó con el motivo de al lado. |
motivo_no_recibido |
Código del motivo cuando recibido es false (ver tabla). |
acuse_emitido_en |
Cuándo se emitió el acuse (d-m-Y H:i:s). |
Sin paginación ni filtros: devuelve los 100 más recientes (por la fecha del acuse), y cada elemento es el resumen justo para un listado.
Motivos de no recepción que pueden aparecer en el listado:
| Código | Motivo |
|---|---|
3 |
Envío duplicado: ya habíamos recibido ese e-NCF. |
4 |
El comprador del e-CF no corresponde a su empresa. |
Los motivos 1 (no cumple la especificación) y 2 (firma no válida) no se guardan: un XML sin
firma de confianza no llega a registrarse, así que nunca aparece en este listado.
Que un e-CF esté aquí no demuestra que la DGII lo aceptó: demuestra que llegó firmado. Para comprobar su validez fiscal,
GET /api/v1/received-documents/{eNCF}/dgii-status(consultas-dgii.md).
El listado no trae track_id: un comprobante recibido no es una emisión suya y no hay ningún
TrackID que mostrarle. El TrackID que tendría ese e-CF es el que la DGII le dio a su emisor (a su
proveedor) al transmitirlo; por eso la validez fiscal se consulta con el RNC del emisor y el e-NCF, y
en esa respuesta el RNC que aparece es el del proveedor. Cuándo aparece el track_id y cuándo no, en
estados.md.
Aprobación comercial¶
Acepta o rechaza la transacción de un e-CF recibido. Al emitirla, construimos el ACECF, lo firmamos y lo transmitimos a la DGII. El ACECF identifica el comprobante con el RNC del emisor (su proveedor) y el e-NCF, y su empresa figura como compradora.
POST /api/v1/received-documents/E310000000099/commercial-approval
Authorization: Bearer <su-token>
Content-Type: application/json
{
"emisor": { "rnc": "133802074" },
"estado": 1,
"motivo_rechazo": null
}
| Campo | Reglas |
|---|---|
emisor.rnc |
Su empresa (la que recibió), como en todo cuerpo JSON (autenticación). |
estado |
1 acepta la operación, 2 la rechaza. |
motivo_rechazo |
Obligatorio si estado es 2; texto libre de hasta 250 caracteres. |
Respuesta 202:
{
"status": "success",
"message": "Aprobación comercial emitida y transmitida a la DGII.",
"data": {
"e_ncf": "E310000000099",
"estado": 1,
"motivo_rechazo": null,
"aceptada_por_dgii": true,
"mensajes_dgii": [],
"emitida_en": "10-08-2026 10:03:44"
}
}
- No hay TrackID en la aprobación comercial, ni en la respuesta ni después: el servicio de la DGII
la resuelve en la misma llamada (como el resumen RFCE) y el campo queda
nullsiempre. Lo que confirma la transmisión esaceptada_por_dgii(el código de la DGII:true= la recibió como aprobada,false= la recibió como rechazada) y, si la DGII advirtiera algo,mensajes_dgii. Cuándo aparece eltrack_id(nunca en el202, llega al transmitir y jamás en el resumen RFCE), en estados.md. - Es idempotente en la práctica: reintentar con el mismo
estadodevuelve la aprobación ya emitida, no una segunda.
Errores¶
| Código | Cuándo |
|---|---|
404 |
Ese e-NCF no consta como recibido para su empresa: «No se encontró el e-CF recibido.», con el texto largo en data.detalle. |
422 |
Validación: falta estado, motivo_rechazo al rechazar, etc. → data.detalle y data.errores por campo (cómo leerlos). |
422 |
Reglas de negocio, en data.detalle: rechazar sin motivo, aprobar un e-CF que no superó el acuse (recibido: false), o volver a aprobar con otro estado (la conformidad se declara una sola vez). |
503 |
El servicio de la DGII no está disponible; reintente (envelope). |
401/403 |
Token o permisos, como en toda la API (autenticación). |
Referencias¶
- Entrega del e-CF al receptor — la otra cara: lo que pasa con los e-CF que usted emite (y su acuse).
- Consultas en vivo contra la DGII — validez fiscal de un recibido (
dgii-status). - README — envelope, autenticación y errores comunes.