Consultas en vivo contra la DGII¶
Tres endpoints que preguntan a la DGII en el momento, en lugar de leer nuestro registro. Existen porque los dos registros pueden divergir, y cuando divergen el que vale es el de ellos.
| Endpoint | Para qué |
|---|---|
GET /api/v1/documents/{identificador}/dgii-status |
Estado de un e-CF suyo en la DGII, y en qué se diferencia de lo que tenemos |
GET /api/v1/documents/{identificador}/track-ids |
Los envíos que la DGII registra para ese e-CF |
GET /api/v1/received-documents/{eNCF}/dgii-status |
Si un comprobante que le enviaron tiene validez fiscal |
Todos requieren el token de siempre (Authorization: Bearer …) y sólo devuelven comprobantes de una
empresa de las que su token tiene habilitadas
(tokens-y-permisos.md). Cómo se dice cuál:
- Los dos de un e-CF suyo se piden por su identificador (el RNC del
emisor seguido del e-NCF, p. ej.
133802074E310000000077), y la empresa es su prefijo: no llevanemisor_rnc. Si lo mandan, tiene que ser el mismo. - El de un e-CF que recibió es de un tercero: el e-NCF no es suyo, así que ahí la empresa va, como siempre,
en el parámetro
emisor_rnc.
La consulta que conviene conocer: validez fiscal de lo que recibe¶
Cuando un proveedor le envía un e-CF, verificamos su firma digital antes de acusar recibo. Eso no significa que el comprobante sea válido ante la DGII. La firma demuestra quién lo emitió y que no se alteró; que la DGII lo haya aceptado es otra cosa, y puede haberlo rechazado.
Antes de dar por bueno un crédito fiscal:
GET /api/v1/received-documents/E310000000099/dgii-status?emisor_rnc=133802074
Authorization: Bearer <su-token>
{
"status": "success",
"message": "Consulta exitosa.",
"data": {
"encontrado": true,
"valido_fiscalmente": false,
"status_code": 6,
"status": "rejected_dgii",
"codigo_dgii": 2,
"estado_dgii": "Rechazado",
"rnc_emisor": "131880738",
"e_ncf": "E310000000099",
"monto_total": 2360,
"total_itbis": 360,
"fecha_emision": "10-08-2026",
"fecha_firma": "10-08-2026 09:14:22",
"rnc_comprador": "133802074",
"codigo_seguridad": "aBc123",
"id_extranjero": null,
"emisor_rnc": "131880738",
"acuse_emitido": true,
"monto_registrado": 2360
}
}
acuse_emitido: true con valido_fiscalmente: false es justo el caso interesante: el comprobante
llegó bien y aun así no sustenta nada.
Ojo con
emisor_rncen la respuesta. En esta respuesta (y en las deGET /api/v1/received-documents),emisor_rnces el RNC del proveedor que envió el e-CF, no el parámetro de la petición: el parámetroemisor_rncde la consulta identifica a su empresa (la que recibió el comprobante). En el ejemplo, la consulta va por133802074(su empresa) y el comprobante lo emitió131880738.
Estado de un e-CF propio, con las discrepancias¶
Además de lo que devuelve la DGII, la respuesta trae el identificador, nuestro_status y una lista
discrepancias —vacía cuando todo cuadra:
{
"status": "success",
"message": "Consulta exitosa.",
"data": {
"encontrado": true,
"valido_fiscalmente": true,
"status_code": 4,
"status": "accepted_dgii",
"codigo_dgii": 1,
"estado_dgii": "Aceptado",
"rnc_emisor": "133802074",
"e_ncf": "E310000000077",
"monto_total": 1180,
"total_itbis": 180,
"fecha_emision": "10-08-2026",
"fecha_firma": "10-08-2026 09:14:22",
"rnc_comprador": "131880738",
"codigo_seguridad": "aBc123",
"id_extranjero": null,
"identificador": "133802074E310000000077",
"nuestro_status_code": 8,
"nuestro_status": "unresolved",
"discrepancias": [
"El estado en la DGII es \"accepted_dgii\" y aquí está registrado como \"unresolved\"."
]
}
}
Se comparan tres cosas: el estado, el monto total y el código de seguridad. Ese último es el que importa de verdad: sale del hash de la firma, así que si no coincide, el comprobante que la DGII tiene registrado no es el que firmamos aquí.
Cuándo usarla:
- Un documento en
unresolved(se agotó el sondeo automático) — es la forma de cerrarlo. - Cuadre periódico contra su contabilidad.
- Cualquier duda sobre un comprobante del que no le llegó respuesta.
Los envíos de un e-CF¶
{
"status": "success",
"message": "Consulta exitosa.",
"data": {
"e_ncf": "E310000000077",
"identificador": "133802074E310000000077",
"nuestro_track_id": "b4c1…",
"envios": [
{ "track_id": "b4c1…", "estado_dgii": "Aceptado", "status": "accepted_dgii", "fecha_recepcion": "2026-08-12T09:00:00" },
{ "track_id": "9af0…", "estado_dgii": "Rechazado", "status": "rejected_dgii", "fecha_recepcion": "2026-08-10T09:00:00" }
],
"transmitido_mas_de_una_vez": true
}
}
Un mismo e-NCF puede tener más de un envío: la propia DGII lo advierte ("se pueden obtener múltiples TrackIds cuando se remiten varios e-CF con el mismo número de comprobante fiscal"). Pasa cuando un envío llega y su respuesta se pierde. Los envíos vienen del más reciente al más antiguo.
nuestro_track_id es el que tenemos registrado para el documento: null mientras no se haya transmitido
(y siempre en el resumen de la factura de consumo, que no genera TrackID); al transmitirse llega con
in_process_dgii y los estados finales lo conservan
(estados.md).
No hace falta vigilarlo a mano en el caso normal: antes de retransmitir un comprobante cuyo envío anterior falló, comprobamos si la DGII ya lo tiene y adoptamos su TrackID en lugar de mandarlo otra vez. Este endpoint es para cuando quiere verlo usted.
El resumen (RFCE) de la factura de consumo¶
La factura de consumo (tipo 32) por debajo de RD$250.000 se transmite como resumen (RFCE), que no genera TrackID (ecf-32.md). Eso cambia lo que responden estas consultas para esos documentos:
| Consulta | Qué responde para un resumen |
|---|---|
GET /documents/{identificador}/dgii-status |
Funciona igual que en los demás tipos: la consulta de estado se hace por e-NCF y la norma la extiende a los comprobantes remitidos como resumen. Es la forma de preguntarle a la DGII por una factura de consumo. Trae nuestro_status y discrepancias como siempre. |
GET /documents/{identificador}/track-ids |
No está pensada para el resumen: no genera TrackID, así que nuestro_track_id es null y envios sale vacío ("envios": [], con transmitido_mas_de_una_vez: false) y la respuesta es un 200, no un error (comprobado contra testecf: la DGII contesta «TrackId no encontrado» a ese e-NCF y la API lo traduce a «sin envíos»). Que salga vacío no significa que la DGII no tenga el comprobante: use dgii-status, que sí lo encuentra por e-NCF. |
Un documento de otro tipo también puede mostrar envios vacío, pero por otra razón: si la DGII aún no
registra ningún envío para ese e-NCF (por ejemplo, porque no llegó a transmitirse).
En el uso normal no necesita estas consultas para un resumen: se resuelve en la misma llamada de transmisión y
GET /api/v1/documents/{identificador}ya trae el estado final.
Errores¶
| Código | Cuándo |
|---|---|
404 |
El identificador no es de un e-CF de esa empresa (o, en la consulta de un recibido, el e-NCF no existe para la empresa indicada en emisor_rnc): «No se encontró el documento.» o «No se encontró el e-CF recibido.», con el texto largo en data.detalle. Se responde igual si no existe y si es de otra empresa. |
422 |
Se manda emisor_rnc junto a un identificador cuyo prefijo es otro RNC: «La petición declara más de una empresa.» |
503 |
El servicio de consulta de la DGII no responde — vuelva a intentarlo, no es un error de su petición |
Todos llevan el envelope de siempre (cómo leerlo), con la explicación en
data.detalle. El 503, en concreto:
{
"status": "error",
"message": "El servicio de consulta de la DGII no está disponible en este momento.",
"data": {
"detalle": "La DGII no respondió o contestó con un error. No es un fallo de su petición: reintente en unos minutos."
}
}
El texto técnico de lo que respondió la DGII (o de por qué no respondió) no se devuelve: no le serviría para
corregir nada y no es de su petición. Si el 503 persiste, contáctenos con la hora y el identificador del documento.
Estas consultas no se cachean: el objetivo es saber qué dice la DGII ahora.