APIs principales
Documentos recibidos y DistDFe
8 endpoints
La Manifestación del Destinatario permite que el destinatario de una NF-e se posicione formalmente sobre una factura emitida contra su CNPJ. Hay 4 tipos de eventos previstos por la autoridad fiscal, cada uno con su propio significado legal.
Tipos de Evento
| Código | Nombre | Significado | Justificación |
|---|---|---|---|
| 210210 | Conocimiento de la Operación | El destinatario toma conocimiento de la NF-e, pero aún no la ha confirmado ni rechazado. Generalmente es el primer evento enviado, y es requisito para descargar el XML completo vía DistDFe. | No obligatoria |
| 210200 | Confirmación de la Operación | El destinatario confirma que la operación ocurrió y la mercancía/servicio fue recibido. Evento final, comprueba la recepción. | No obligatoria |
| 210220 | Desconocimiento de la Operación | El destinatario declara que NO reconoce la operación (sospecha de fraude, uso indebido del CNPJ, etc.). | Obligatoria (15-255 caracteres) |
| 210240 | Operación No Realizada | El destinatario reconoce la operación pero declara que NO se concretó (devolución, rechazo de recepción, etc.). | Obligatoria (15-255 caracteres) |
Regla de secuencia: Tras enviar Conocimiento (210210), se puede enviar Confirmación (210200) O Desconocimiento (210220) U Operación No Realizada (210240). Confirmación/Desconocimiento/No Realizada son estados finales — no pueden sobreescribirse.
Atención: El CNPJ enviado en el campo
cnpj debe ser el del destinatario de la NF-e (quien manifiesta) y debe estar registrado en el sistema vinculado al token utilizado. De lo contrario autoridad fiscal devolverá el rechazo "El autor del evento difiere del destinatario de la NF-e".
Códigos cStat de Retorno
| cStat | Significado |
|---|---|
| 135 | ✅ Evento registrado con éxito |
| 573 | ✅ Duplicidad de evento — ya registrado anteriormente (tratado como éxito) |
| 236 | ❌ Clave de acceso inválida |
| 491 | ❌ Manifestación ya registrada — no se puede sobrescribir estado final |
| 596 | ❌ CNPJ del destinatario difiere del informado |
| 656 | ❌ Consumo indebido (rate limit) |
POST
/api/invoice/manifestEnviar evento de manifestación del destinatario
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| chave | string | Sí | Clave de acceso de la NF-e — 44 dígitos |
| cnpj | string | Sí | CNPJ del destinatario (quien manifiesta) — 14 dígitos, sin formato. Debe estar registrado en el sistema |
| tipo_evento | int | Sí | Código del evento: 210200, 210210, 210220 o 210240 |
| justificativa | string | Condicional | Obligatoria para 210220 y 210240. Entre 15 y 255 caracteres. Ignorada para 210200 y 210210 |
Secuencia (nSeqEvento): calculada automáticamente. Para la misma combinación (cnpj + chave + tipo_evento) se incrementa en cada llamada — así los duplicados devuelven
cStat: 573 y se graban sin error.
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| id | string | ObjectId interno del registro de manifestación (usado en /get_xml) |
| chave | string | Clave de acceso de la NF-e manifestada |
| cnpj | string | CNPJ del destinatario que manifestó |
| tipo_evento | int | Código del evento enviado (210200/210210/210220/210240) |
| desc_evento | string | Descripción textual del evento (texto original autoridad fiscal) |
| nProt | string | Número de protocolo autoridad fiscal — comprobante del evento |
| cStat | int | Código de estado autoridad fiscal. 135 = registrado, 573 = duplicidad (también aceptado) |
| xMotivo | string | Mensaje descriptivo del retorno autoridad fiscal |
| nSeqEvento | int | Secuencia del evento asignada automáticamente |
| xml_url | string | URL pública del XML del procEvento (firmado y protocolizado) almacenado en OSS |
POST
/api/invoice/manifest/listListar manifestaciones
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| cnpj | string | No | Filtrar por CNPJ del destinatario. Si se omite, lista de todos los CNPJ del usuario |
| chave | string | No | Filtrar por clave NF-e específica (44 dígitos) |
| start_create_time | string/long | No | Fecha inicial. Acepta: "dd/MM/yyyy", "yyyy-MM-dd", "dd/MM/yyyy HH:mm:ss" o Unix timestamp en segundos. Considera 00:00:00 UTC si solo es fecha |
| end_create_time | string/long | No | Fecha final. Mismo formato. Si solo es fecha, considera 23:59:59.999 UTC |
| page | int | No | Número de página (por defecto 1) |
| page_size | int | No | Items por página (por defecto 20, máximo 100) |
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| total | int | Total de registros que cumplen los filtros (sin importar la paginación) |
| page | int | Página actual devuelta |
| page_size | int | Tamaño de página devuelto |
| list[].id | string | ObjectId interno del registro |
| list[].chave | string | Clave de acceso de la NF-e manifestada |
| list[].cnpj | string | CNPJ del destinatario que manifestó |
| list[].tipo_evento | int | Código del evento (210200/210210/210220/210240) |
| list[].desc_evento | string | Descripción textual del evento |
| list[].justificativa | string | Justificación enviada (solo para 210220/210240) |
| list[].nProt | string | Protocolo autoridad fiscal del evento |
| list[].nSeqEvento | int | Secuencia del evento |
| list[].cStat | int | Código de estado autoridad fiscal |
| list[].xMotivo | string | Mensaje descriptivo del retorno autoridad fiscal |
| list[].xml_url | string | URL pública del XML del procEvento en OSS |
| list[].create | string | Fecha/hora UTC del registro (formato yyyy-MM-dd HH:mm:ss) |
Orden: los registros se devuelven del más reciente al más antiguo (por
create descendente).
POST
/api/invoice/manifest/get_xmlObtener XML de la manifestación
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | string | Sí | ObjectId de la manifestación — devuelto por /manifest o /manifest/list |
Errores Comunes
| Mensaje | Causa |
|---|---|
| id inválido | El valor no es un ObjectId válido |
| manifestação não encontrada | El ObjectId existe pero no pertenece al usuario del token, o fue eliminado |
Permite consultar y descargar NFe y eventos destinados a su CNPJ vía el servicio NFeDistribuicaoDFe de la autoridad fiscal (Ambiente Nacional). La captura es incremental por NSU (Número Sequencial Único) — cada llamada solo descarga lo que aún no se ha capturado.
Tipos de Documento Retornados
| doc_type | Qué es | Contenido |
|---|---|---|
| resNFe | Resumen de NFe | Metadatos básicos (clave, valor, emisor, situación). Llega ANTES de enviar Conocimiento — no contiene productos/impuestos |
| procNFe | NFe completa autorizada | XML completo de la NF-e (con productos, impuestos, transporte, etc.). Solo viene DESPUÉS de que el destinatario envíe Conocimiento (210210) en la clave |
| resEvento | Resumen de evento | Metadatos del evento (clave, tipo, secuencia, motivo) |
| procEvento | Evento completo | XML completo del evento (CC-e, cancelación, manifestaciones de otros destinatarios sobre sus notas) |
Flujo recomendado:
- Llame
/received/sync— descarga todos los documentos nuevos - Liste con
/received/listfiltrando pordoc_type: "resNFe"para ver notas sin Conocimiento - Para cada clave de interés, llame
/invoice/manifestcontipo_evento: 210210 - Llame
/received/syncde nuevo — ahora autoridad fiscal devuelve losprocNFe(XML completo) de las claves manifestadas - Use
/received/get_xmlpara obtener la URL del XML y descargar/procesar
Rate limit de la autoridad fiscal: autoridad fiscal permite como máximo 1 llamada DistDFe por hora por CNPJ. Si se excede, devuelve
cStat: 656 (Consumo Indebido). En el entorno de homologación la regla es más permisiva.
Códigos cStat de Retorno de DistDFe
| cStat | Significado |
|---|---|
| 137 | ✅ Ningún documento encontrado (fin normal del loop) |
| 138 | ✅ Documentos encontrados — el loop continúa |
| 656 | ❌ Consumo indebido — esperar 1h y reintentar |
| 252 | ❌ Ambiente diferente del informado (producción vs homologación) |
| 280 | ❌ Certificado expirado o inválido |
POST
/api/invoice/received/syncSincronizar documentos recibidos
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| cnpj | string | Sí | CNPJ de la empresa destinataria — 14 dígitos, sin formato. Debe estar registrado en el sistema vinculado al token |
| max_iterations | int | No | Número máximo de llamadas a la autoridad fiscal por ejecución. Cada llamada descarga hasta 50 documentos. Por defecto 50 (≈2.500 docs), máximo 200 |
Cómo funciona:
- Lee el último
ultNSUpersistido para ese (uid + cnpj) - Hace loop llamando a la autoridad fiscal hasta
cStat ≠ 138o alcanzarmax_iterations - Descomprime los XML (gzip) devueltos
- Persiste cada documento en
w_invoice_receivedcon upload del XML en OSS - Actualiza
ultNSUymaxNSUenw_invoice_received_sync - Deduplica por
(uid + cnpj + nsu)— llamadas repetidas no duplican
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| cnpj | string | CNPJ destinatario consultado |
| uf | string | UF del destinatario usada en la consulta |
| initial_nsu | long | NSU de inicio — el último procesado antes de esta ejecución |
| ult_nsu | long | Nuevo último NSU tras la sincronización |
| max_nsu | long | Mayor NSU disponible en la autoridad fiscal AN en el momento de la consulta |
| pending | long | Documentos aún pendientes (max_nsu - ult_nsu). Si > 0, llame /sync de nuevo para descargar el resto |
| iterations | int | Cuántas llamadas a la autoridad fiscal se hicieron en esta ejecución |
| last_cstat | int | Último cStat devuelto por la autoridad fiscal. 137 es fin normal, 656 es rate limit |
| last_motivo | string | Mensaje descriptivo del último retorno autoridad fiscal |
| stats.resNFe | int | Cantidad de resúmenes de NFe descargados en esta ejecución |
| stats.procNFe | int | Cantidad de NFe completas descargadas |
| stats.resEvento | int | Cantidad de resúmenes de evento descargados |
| stats.procEvento | int | Cantidad de eventos completos descargados |
| stats.skipped | int | Documentos omitidos (duplicados o error de parseo aislado) |
Volumen inicial: empresas que nunca han sincronizado pueden tener cientos o miles de documentos históricos. La primera ejecución puede tardar más e interrumpirse por
max_iterations. Verifique pending en la respuesta — si > 0, llame de nuevo (respetando el rate limit).
POST
/api/invoice/received/listListar documentos recibidos
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| cnpj | string | No | Filtrar por CNPJ destinatario (su CNPJ). Si se omite, lista de todos los del usuario |
| doc_type | string | No | Filtrar por tipo de documento: resNFe, procNFe, resEvento o procEvento |
| chave | string | No | Filtrar por clave de acceso (44 dígitos) |
| emitente_cnpj | string | No | Filtrar por CNPJ del emisor de la NF-e (proveedor) |
| start_create_time | string/long | No | Fecha inicial. Acepta "dd/MM/yyyy", ISO o Unix timestamp |
| end_create_time | string/long | No | Fecha final. Mismo formato |
| page | int | No | Número de página (por defecto 1) |
| page_size | int | No | Items por página (por defecto 20, máximo 100) |
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| total | int | Total de registros que cumplen los filtros |
| page | int | Página actual |
| page_size | int | Tamaño de página |
| list[].id | string | ObjectId interno (use en /received/get_xml) |
| list[].nsu | long | NSU asignado por la autoridad fiscal a este documento |
| list[].doc_type | string | Tipo de documento: resNFe, procNFe, resEvento, procEvento |
| list[].schema | string | Schema del documento (ej. resNFe_v1.01.xsd) |
| list[].chave | string | Clave de acceso de la NF-e (44 dígitos) |
| list[].cnpj_destinatario | string | CNPJ destinatario (su CNPJ) |
| list[].emitente_cnpj | string | CNPJ del emisor de la NF-e (proveedor) |
| list[].emitente_nome | string | Razón social del emisor |
| list[].valor | decimal | Valor total de la NF-e (vNF) |
| list[].dh_emi | string | Fecha/hora de emisión de la NF-e |
| list[].serie | int | Serie de la NF-e (solo en procNFe) |
| list[].number | long | Número de la NF-e (solo en procNFe) |
| list[].tp_nf | int | Tipo de operación: 0=Entrada, 1=Salida (desde la óptica del emisor) |
| list[].c_sit_nfe | int | Situación de la NF-e (en resNFe): 1=Autorizada, 2=Denegada, 3=Cancelada |
| list[].tp_evento | int | Código del evento (en resEvento/procEvento). Ej: 110110=CC-e, 110111=Cancelación, 210210=Conocimiento |
| list[].desc_evento | string | Descripción textual del evento |
| list[].n_seq_evento | int | Secuencia del evento |
| list[].dh_evento | string | Fecha/hora del evento (solo eventos) |
| list[].xml_url | string | URL pública del XML del documento en OSS |
| list[].create | string | Fecha/hora UTC de la captura |
Orden: los registros se devuelven por NSU descendente (más reciente primero).
POST
/api/invoice/received/get_xmlObtener XML del documento recibido
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | string | Sí | ObjectId del documento — devuelto en /received/list |
Sobre el XML devuelto:
resNFe— El XML es solo el resumen, NO contiene productos/impuestos. Úselo para auditoría/triage antes de enviar ConocimientoprocNFe— XML completo y firmado, equivalente al generado en la emisión. Listo para importar al ERP del clienteprocEvento— XML del evento completo con firma y protocolo
Errores Comunes
| Mensaje | Causa |
|---|---|
| id inválido | El valor no es un ObjectId válido |
| documento recebido não encontrado | El ObjectId existe pero no pertenece al usuario del token |
POST
/api/invoice/received/get_prodConsultar productos de la NF-e recibida
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| chave | string | Sí | Clave de acceso de 44 dígitos de la NF-e (modelo 55). El dígito verificador se valida antes de consultar a SEFAZ |
| ciencia_nota | bool | No | Predeterminado false. Con true, si SEFAZ aún no libera el XML completo, el endpoint registra el Acuse de la Operación (evento 210210) con el certificado de la empresa y consulta de nuevo |
| ambiente | int | No | 1 producción (predeterminado) o 2 homologación |
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| chave | string | Clave de acceso consultada |
| total_itens | number | Cantidad de ítems de la nota |
| itens | array | Un objeto por ítem (det) de la NF-e |
| itens[].nItem | number | Número del ítem dentro de la nota |
| itens[].prod | object | Grupo prod del layout de la NF-e, con los nombres originales de las etiquetas. Cantidades e importes vienen como número; códigos como cProd, NCM y cEAN vienen como texto, preservando ceros a la izquierda. Las etiquetas que se repiten en el layout (NVE, DI, detExport, rastro) vienen siempre como lista |
| itens[].infAdProd | string | Información adicional del ítem, cuando exista |
Cómo SEFAZ entrega el XML
- La empresa destinataria proviene del token; no envíe CNPJ en el cuerpo.
- La consulta usa la distribución de documentos (DistDFe) en el Ambiente Nacional, con el certificado de la propia empresa.
- Sin manifestación, SEFAZ devuelve solo el resumen, sin ítems. Use
ciencia_nota: truepara liberar el XML completo. - El Acuse solo declara conocimiento de la nota: no confirma la recepción de la mercancía ni impide la cancelación por el emisor.
- Una nota recién autorizada puede tardar horas hasta que el Ambiente Nacional la distribuya. Mientras tanto la respuesta es nota no localizada.
- Una nota emitida por la propia empresa no se le distribuye; consulte con el token de la empresa destinataria.
- La consulta no graba nada. Solo el Acuse, cuando se activa, registra un evento en SEFAZ.
Errores Comunes
| Mensaje | Causa |
|---|---|
| Chave inserida inválida / 发票密钥无效 | Clave sin 44 dígitos, con carácter no numérico o con dígito verificador incorrecto |
| Apenas NF-e modelo 55 pode ser consultada pela chave | La clave es de NFC-e (modelo 65), que SEFAZ no distribuye |
| empresa não encontrada para este token | El token no está vinculado a ninguna empresa registrada |
| empresa não possui certificado configurado | La empresa no tiene certificado A1 válido en el registro |
| nenhum documento localizado para esta chave e este CNPJ... | El Ambiente Nacional aún no distribuyó la nota, el ambiente es otro, o la empresa no es la destinataria |
| esta nota foi emitida por este CNPJ e a SEFAZ não a distribui ao próprio emitente | Consulta de nota de salida con el token de quien la emitió (SEFAZ 641) |
| SEFAZ devolveu apenas o resumo da nota (sem itens)... | Nota aún sin Acuse; llame con ciencia_nota=true |
| consumo indevido: a SEFAZ bloqueou consultas repetidas | Límite de SEFAZ por CNPJ; espere antes de reintentar |
Cuando la bandera
ciencia_nota provoca el envío o encuentra un Acuse ya registrado, la respuesta de error trae data.ciencia con el resultado del evento. En los demás errores la respuesta tiene solo success y message.POST
/api/invoice/received/get_sync_statusConsultar estado de sincronización
Encabezados obligatorios
| Encabezado | Tipo | Descripción |
|---|---|---|
| token | string | Token de la empresa |
| sign | string | Firma MD5: MD5(token + path + body + timestamp) |
| timestamp | string | Unix timestamp en segundos (ventana de 5 minutos) |
Campos
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| cnpj | string | Sí | CNPJ de la empresa destinataria — 14 dígitos, sin formato |
Campos de la Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| cnpj | string | CNPJ consultado |
| uf | string | UF del destinatario usada en la última sincronización (ausente si nunca sincronizó) |
| ult_nsu | long | Último NSU procesado. 0 = nunca sincronizó |
| max_nsu | long | Mayor NSU disponible en la autoridad fiscal en la última sincronización |
| pending | long | Documentos pendientes (max_nsu - ult_nsu). Si > 0, hay nuevos documentos en la autoridad fiscal |
| last_sync | string | Fecha/hora UTC de la última sincronización exitosa. null si nunca sincronizó |
Uso típico: llame a este endpoint antes de
/received/sync para decidir si necesita llamar a la autoridad fiscal. Este endpoint no consume el rate limit de la autoridad fiscal — solo lee el estado local de MongoDB.