TF Fiscal

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ódigoNombreSignificadoJustificació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

cStatSignificado
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)

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
chavestringSíClave de acceso de la NF-e — 44 dígitos
cnpjstringSíCNPJ del destinatario (quien manifiesta) — 14 dígitos, sin formato. Debe estar registrado en el sistema
tipo_eventointSíCódigo del evento: 210200, 210210, 210220 o 210240
justificativastringCondicionalObligatoria 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

CampoTipoDescripción
idstringObjectId interno del registro de manifestación (usado en /get_xml)
chavestringClave de acceso de la NF-e manifestada
cnpjstringCNPJ del destinatario que manifestó
tipo_eventointCódigo del evento enviado (210200/210210/210220/210240)
desc_eventostringDescripción textual del evento (texto original autoridad fiscal)
nProtstringNúmero de protocolo autoridad fiscal — comprobante del evento
cStatintCódigo de estado autoridad fiscal. 135 = registrado, 573 = duplicidad (también aceptado)
xMotivostringMensaje descriptivo del retorno autoridad fiscal
nSeqEventointSecuencia del evento asignada automáticamente
xml_urlstringURL pública del XML del procEvento (firmado y protocolizado) almacenado en OSS
POST/api/invoice/manifest/list

Listar manifestaciones

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
cnpjstringNoFiltrar por CNPJ del destinatario. Si se omite, lista de todos los CNPJ del usuario
chavestringNoFiltrar por clave NF-e específica (44 dígitos)
start_create_timestring/longNoFecha 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_timestring/longNoFecha final. Mismo formato. Si solo es fecha, considera 23:59:59.999 UTC
pageintNoNúmero de página (por defecto 1)
page_sizeintNoItems por página (por defecto 20, máximo 100)

Campos de la Respuesta

CampoTipoDescripción
totalintTotal de registros que cumplen los filtros (sin importar la paginación)
pageintPágina actual devuelta
page_sizeintTamaño de página devuelto
list[].idstringObjectId interno del registro
list[].chavestringClave de acceso de la NF-e manifestada
list[].cnpjstringCNPJ del destinatario que manifestó
list[].tipo_eventointCódigo del evento (210200/210210/210220/210240)
list[].desc_eventostringDescripción textual del evento
list[].justificativastringJustificación enviada (solo para 210220/210240)
list[].nProtstringProtocolo autoridad fiscal del evento
list[].nSeqEventointSecuencia del evento
list[].cStatintCódigo de estado autoridad fiscal
list[].xMotivostringMensaje descriptivo del retorno autoridad fiscal
list[].xml_urlstringURL pública del XML del procEvento en OSS
list[].createstringFecha/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_xml

Obtener XML de la manifestación

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
idstringSíObjectId de la manifestación — devuelto por /manifest o /manifest/list

Errores Comunes

MensajeCausa
id inválidoEl valor no es un ObjectId válido
manifestação não encontradaEl 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_typeQué esContenido
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:
  1. Llame /received/sync — descarga todos los documentos nuevos
  2. Liste con /received/list filtrando por doc_type: "resNFe" para ver notas sin Conocimiento
  3. Para cada clave de interés, llame /invoice/manifest con tipo_evento: 210210
  4. Llame /received/sync de nuevo — ahora autoridad fiscal devuelve los procNFe (XML completo) de las claves manifestadas
  5. Use /received/get_xml para 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

cStatSignificado
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/sync

Sincronizar documentos recibidos

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
cnpjstringSíCNPJ de la empresa destinataria — 14 dígitos, sin formato. Debe estar registrado en el sistema vinculado al token
max_iterationsintNoNú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 ultNSU persistido para ese (uid + cnpj)
  • Hace loop llamando a la autoridad fiscal hasta cStat ≠ 138 o alcanzar max_iterations
  • Descomprime los XML (gzip) devueltos
  • Persiste cada documento en w_invoice_received con upload del XML en OSS
  • Actualiza ultNSU y maxNSU en w_invoice_received_sync
  • Deduplica por (uid + cnpj + nsu) — llamadas repetidas no duplican

Campos de la Respuesta

CampoTipoDescripción
cnpjstringCNPJ destinatario consultado
ufstringUF del destinatario usada en la consulta
initial_nsulongNSU de inicio — el último procesado antes de esta ejecución
ult_nsulongNuevo último NSU tras la sincronización
max_nsulongMayor NSU disponible en la autoridad fiscal AN en el momento de la consulta
pendinglongDocumentos aún pendientes (max_nsu - ult_nsu). Si > 0, llame /sync de nuevo para descargar el resto
iterationsintCuántas llamadas a la autoridad fiscal se hicieron en esta ejecución
last_cstatintÚltimo cStat devuelto por la autoridad fiscal. 137 es fin normal, 656 es rate limit
last_motivostringMensaje descriptivo del último retorno autoridad fiscal
stats.resNFeintCantidad de resúmenes de NFe descargados en esta ejecución
stats.procNFeintCantidad de NFe completas descargadas
stats.resEventointCantidad de resúmenes de evento descargados
stats.procEventointCantidad de eventos completos descargados
stats.skippedintDocumentos 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/list

Listar documentos recibidos

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
cnpjstringNoFiltrar por CNPJ destinatario (su CNPJ). Si se omite, lista de todos los del usuario
doc_typestringNoFiltrar por tipo de documento: resNFe, procNFe, resEvento o procEvento
chavestringNoFiltrar por clave de acceso (44 dígitos)
emitente_cnpjstringNoFiltrar por CNPJ del emisor de la NF-e (proveedor)
start_create_timestring/longNoFecha inicial. Acepta "dd/MM/yyyy", ISO o Unix timestamp
end_create_timestring/longNoFecha final. Mismo formato
pageintNoNúmero de página (por defecto 1)
page_sizeintNoItems por página (por defecto 20, máximo 100)

Campos de la Respuesta

CampoTipoDescripción
totalintTotal de registros que cumplen los filtros
pageintPágina actual
page_sizeintTamaño de página
list[].idstringObjectId interno (use en /received/get_xml)
list[].nsulongNSU asignado por la autoridad fiscal a este documento
list[].doc_typestringTipo de documento: resNFe, procNFe, resEvento, procEvento
list[].schemastringSchema del documento (ej. resNFe_v1.01.xsd)
list[].chavestringClave de acceso de la NF-e (44 dígitos)
list[].cnpj_destinatariostringCNPJ destinatario (su CNPJ)
list[].emitente_cnpjstringCNPJ del emisor de la NF-e (proveedor)
list[].emitente_nomestringRazón social del emisor
list[].valordecimalValor total de la NF-e (vNF)
list[].dh_emistringFecha/hora de emisión de la NF-e
list[].serieintSerie de la NF-e (solo en procNFe)
list[].numberlongNúmero de la NF-e (solo en procNFe)
list[].tp_nfintTipo de operación: 0=Entrada, 1=Salida (desde la óptica del emisor)
list[].c_sit_nfeintSituación de la NF-e (en resNFe): 1=Autorizada, 2=Denegada, 3=Cancelada
list[].tp_eventointCódigo del evento (en resEvento/procEvento). Ej: 110110=CC-e, 110111=Cancelación, 210210=Conocimiento
list[].desc_eventostringDescripción textual del evento
list[].n_seq_eventointSecuencia del evento
list[].dh_eventostringFecha/hora del evento (solo eventos)
list[].xml_urlstringURL pública del XML del documento en OSS
list[].createstringFecha/hora UTC de la captura
Orden: los registros se devuelven por NSU descendente (más reciente primero).
POST/api/invoice/received/get_xml

Obtener XML del documento recibido

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
idstringSí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 Conocimiento
  • procNFe — XML completo y firmado, equivalente al generado en la emisión. Listo para importar al ERP del cliente
  • procEvento — XML del evento completo con firma y protocolo

Errores Comunes

MensajeCausa
id inválidoEl valor no es un ObjectId válido
documento recebido não encontradoEl ObjectId existe pero no pertenece al usuario del token
POST/api/invoice/received/get_prod

Consultar productos de la NF-e recibida

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
chavestringSí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_notaboolNoPredeterminado 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
ambienteintNo1 producción (predeterminado) o 2 homologación

Campos de la Respuesta

CampoTipoDescripción
chavestringClave de acceso consultada
total_itensnumberCantidad de ítems de la nota
itensarrayUn objeto por ítem (det) de la NF-e
itens[].nItemnumberNúmero del ítem dentro de la nota
itens[].prodobjectGrupo 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[].infAdProdstringInformació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: true para 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

MensajeCausa
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 chaveLa clave es de NFC-e (modelo 65), que SEFAZ no distribuye
empresa não encontrada para este tokenEl token no está vinculado a ninguna empresa registrada
empresa não possui certificado configuradoLa 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 emitenteConsulta 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 repetidasLí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_status

Consultar estado de sincronización

Encabezados obligatorios

EncabezadoTipoDescripción
tokenstringToken de la empresa
signstringFirma MD5: MD5(token + path + body + timestamp)
timestampstringUnix timestamp en segundos (ventana de 5 minutos)

Campos

CampoTipoObligatorioDescripción
cnpjstringSíCNPJ de la empresa destinataria — 14 dígitos, sin formato

Campos de la Respuesta

CampoTipoDescripción
cnpjstringCNPJ consultado
ufstringUF del destinatario usada en la última sincronización (ausente si nunca sincronizó)
ult_nsulongÚltimo NSU procesado. 0 = nunca sincronizó
max_nsulongMayor NSU disponible en la autoridad fiscal en la última sincronización
pendinglongDocumentos pendientes (max_nsu - ult_nsu). Si > 0, hay nuevos documentos en la autoridad fiscal
last_syncstringFecha/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.