TF Fiscal

核心接口

进项凭证与 DistDFe

8 个接口

收件人表明允许 NF-e 的收件人对针对其 CNPJ 开具的发票正式表明立场。 税务局定义了 4 种事件类型,每种都有其法律含义。

事件类型

代码名称含义理由
210210 操作知悉 收件人确认 NF-e 存在但尚未确认或拒绝。通常是发送的第一个事件,是通过 DistDFe 下载完整 XML 的前提条件。 非必填
210200 操作确认 收件人确认交易已发生且商品/服务已收到。最终事件,证明已收到。 非必填
210220 操作否认 收件人声明不承认该交易(涉嫌欺诈、CNPJ 被滥用等)。 必填(15-255 字符)
210240 操作未执行 收件人承认该交易但声明实际并未发生(退货、拒收等)。 必填(15-255 字符)
顺序规则:发送知悉(210210)后,可以发送确认(210200)或否认(210220)或未执行(210240)。确认/否认/未执行是最终状态,无法覆盖。
注意:cnpj 字段中发送的 CNPJ 必须是 NF-e 的收件人(表明者),且必须在与所用令牌绑定的系统中注册。否则税务局将返回拒绝信息"事件作者与 NF-e 收件人不符"。

cStat 返回码

cStat含义
135✅ 事件已成功登记
573✅ 事件重复 — 已经登记(视为成功)
236❌ 无效的访问密钥
491❌ 表明已登记 — 无法覆盖最终状态
596❌ 收件人 CNPJ 与提供的不符
656❌ 不当使用(速率限制)
POST/api/invoice/manifest

发送收件人表明事件

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
chavestring是NF-e 访问密钥 — 44 位
cnpjstring是收件人 CNPJ(表明者)— 14 位,无格式。必须在系统中注册
tipo_eventoint是事件代码:210200、210210、210220 或 210240
justificativastring有条件对于 210220 和 210240 必填。15-255 字符。对于 210200 和 210210 被忽略
序列(nSeqEvento):自动计算。对于相同的组合(cnpj + chave + tipo_evento),每次调用都会递增 — 因此重复将返回 cStat: 573 并被无错误地保存。

响应字段

字段类型说明
idstring表明记录的内部 ObjectId(在 /get_xml 中使用)
chavestring表明的 NF-e 访问密钥
cnpjstring表明的收件人 CNPJ
tipo_eventoint发送的事件代码(210200/210210/210220/210240)
desc_eventostring事件文本说明(税务局原文)
nProtstring税务局协议号 — 事件回执
cStatint税务局状态码。135 = 已登记,573 = 重复(也被接受)
xMotivostring税务局描述性返回消息
nSeqEventoint自动分配的事件序列
xml_urlstring存储在 OSS 中的 procEvento XML(已签名并附协议)的公共 URL
POST/api/invoice/manifest/list

表明记录列表

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
cnpjstring否按收件人 CNPJ 筛选。如省略,将列出用户所有 CNPJ 的记录
chavestring否按特定 NF-e 密钥(44 位)筛选
start_create_timestring/long否开始日期。接受格式:"dd/MM/yyyy"、"yyyy-MM-dd"、"dd/MM/yyyy HH:mm:ss" 或 Unix 时间戳(秒)。仅日期时按 00:00:00 UTC 处理
end_create_timestring/long否结束日期。相同格式。仅日期时按 23:59:59.999 UTC 处理
pageint否页码(默认 1)
page_sizeint否每页项目数(默认 20,最大 100)

响应字段

字段类型说明
totalint符合筛选条件的记录总数(与分页无关)
pageint返回的当前页
page_sizeint返回的页大小
list[].idstring记录的内部 ObjectId
list[].chavestring表明的 NF-e 访问密钥
list[].cnpjstring表明的收件人 CNPJ
list[].tipo_eventoint事件代码(210200/210210/210220/210240)
list[].desc_eventostring事件文本说明
list[].justificativastring发送的理由(仅 210220/210240 填充)
list[].nProtstring事件的税务局协议号
list[].nSeqEventoint事件序列
list[].cStatint税务局状态码
list[].xMotivostring税务局描述性返回消息
list[].xml_urlstringOSS 中 procEvento XML 的公共 URL
list[].createstring记录的 UTC 时间戳(格式 yyyy-MM-dd HH:mm:ss)
排序:记录按从新到旧排序返回(按 create 降序)。
POST/api/invoice/manifest/get_xml

获取表明事件 XML

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
idstring是表明的 ObjectId — 由 /manifest 或 /manifest/list 返回

常见错误

消息原因
id inválido该值不是有效的 ObjectId
manifestação não encontradaObjectId 存在但不属于令牌的用户,或已删除

通过税务局(国家环境)的 NFeDistribuicaoDFe 服务,可以查询和下载发送到您的 CNPJ 的 NFe 和事件。捕获按 NSU(唯一顺序号)增量进行 — 每次调用仅下载尚未捕获的内容。

返回的文档类型

doc_type是什么内容
resNFe NFe 摘要 基本元数据(密钥、金额、发行方、状态)。在发送知悉事件之前到达 — 不包含产品/税务信息
procNFe 完整授权 NFe 完整的 NF-e XML(含产品、税务、运输等)。仅在收件人对该密钥发送知悉(210210)之后才可获得
resEvento 事件摘要 事件元数据(密钥、类型、序列、原因)
procEvento 完整事件 完整的事件 XML(CC-e、取消、其他收件人的表明等)
推荐流程:
  1. 调用 /received/sync — 下载所有新文档
  2. 使用 /received/list 并以 doc_type: "resNFe" 筛选查看未知悉的发票
  3. 对感兴趣的每个密钥,使用 tipo_evento: 210210 调用 /invoice/manifest
  4. 再次调用 /received/sync — 现在税务局返回已表明密钥的 procNFe(完整 XML)
  5. 使用 /received/get_xml 获取 XML URL 并下载/处理
税务局速率限制:税务局允许每个 CNPJ 每小时最多调用 1 次 DistDFe。超出则返回 cStat: 656(不当使用)。在测试环境中,此规则更宽松。

DistDFe 返回的 cStat 代码

cStat含义
137✅ 未找到文档(循环正常结束)
138✅ 找到文档 — 循环继续
656❌ 不当使用 — 等待 1 小时后重试
252❌ 环境与告知的不同(生产 vs 测试)
280❌ 证书过期或无效
POST/api/invoice/received/sync

同步进项凭证

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
cnpjstring是收件人公司 CNPJ — 14 位,无格式。必须在与令牌绑定的系统中注册
max_iterationsint否每次执行的税务局最大调用次数。每次调用最多下载 50 个文档。默认 50(约 2,500 个文档),最大 200
工作原理:
  • 读取为该 (uid + cnpj) 持久化的最新 ultNSU
  • 循环调用税务局,直到 cStat ≠ 138 或达到 max_iterations
  • 解压返回的 XML(gzip)
  • 将每个文档持久化到 w_invoice_received 并将 XML 上传到 OSS
  • 更新 w_invoice_received_sync 中的 ultNSU 和 maxNSU
  • 按 (uid + cnpj + nsu) 去重 — 重复调用不会重复

响应字段

字段类型说明
cnpjstring查询的收件人 CNPJ
ufstring查询中使用的收件人州代码
initial_nsulong起始 NSU — 本次运行前最后处理的 NSU
ult_nsulong同步后新的最后 NSU
max_nsulong查询时国家环境(AN) 中可用的最大 NSU
pendinglong仍待处理的文档 (max_nsu - ult_nsu)。如果 > 0,请再次调用 /sync 下载其余
iterationsint本次执行中调用税务局的次数
last_cstatint税务局返回的最后一个 cStat。137 是正常结束,656 是速率限制
last_motivostring税务局最后一次返回的描述性消息
stats.resNFeint本次运行下载的 NFe 摘要数
stats.procNFeint下载的完整 NFe 数
stats.resEventoint下载的事件摘要数
stats.procEventoint下载的完整事件数
stats.skippedint跳过的文档(重复或单个解析错误)
初始量:从未同步过的公司可能有数百到数千个历史文档。首次运行可能耗时较长,并可能因 max_iterations 而中断。检查响应中的 pending — 如果 > 0,请再次调用(遵守速率限制)。
POST/api/invoice/received/list

进项凭证列表

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
cnpjstring否按收件人 CNPJ(您的 CNPJ)筛选。如省略,将列出用户所有记录
doc_typestring否按文档类型筛选:resNFe、procNFe、resEvento 或 procEvento
chavestring否按访问密钥(44 位)筛选
emitente_cnpjstring否按 NF-e 发行方 CNPJ(供应商)筛选
start_create_timestring/long否开始日期。接受 "dd/MM/yyyy"、ISO 或 Unix 时间戳
end_create_timestring/long否结束日期。相同格式
pageint否页码(默认 1)
page_sizeint否每页项目数(默认 20,最大 100)

响应字段

字段类型说明
totalint符合筛选条件的记录总数
pageint当前页
page_sizeint页大小
list[].idstring内部 ObjectId(在 /received/get_xml 中使用)
list[].nsulong税务局分配给此文档的 NSU
list[].doc_typestring文档类型:resNFe、procNFe、resEvento、procEvento
list[].schemastring文档架构(例如 resNFe_v1.01.xsd)
list[].chavestringNF-e 访问密钥(44 位)
list[].cnpj_destinatariostring收件人 CNPJ(您的 CNPJ)
list[].emitente_cnpjstringNF-e 发行方 CNPJ(供应商)
list[].emitente_nomestring发行方公司名称
list[].valordecimalNF-e 总金额 (vNF)
list[].dh_emistringNF-e 开具日期/时间
list[].serieintNF-e 系列(仅 procNFe 填充)
list[].numberlongNF-e 编号(仅 procNFe 填充)
list[].tp_nfint操作类型:0=入库,1=出库(从发行方角度)
list[].c_sit_nfeintNF-e 状态(在 resNFe 中):1=已授权,2=已拒绝,3=已取消
list[].tp_eventoint事件代码(在 resEvento/procEvento 中)。例如:110110=CC-e,110111=取消,210210=知悉
list[].desc_eventostring事件文本说明
list[].n_seq_eventoint事件序列
list[].dh_eventostring事件日期/时间(仅事件)
list[].xml_urlstringOSS 中文档 XML 的公共 URL
list[].createstring捕获的 UTC 时间戳
排序:记录按 NSU 降序返回(最新优先)。
POST/api/invoice/received/get_xml

获取进项凭证 XML

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
idstring是文档的 ObjectId — 由 /received/list 返回
关于返回的 XML:
  • resNFe — XML 仅为摘要,不包含产品/税务。用于知悉前的审计/分类
  • procNFe — 完整签名 XML,与开具时生成的相同。可直接导入客户的 ERP
  • procEvento — 带签名和协议的完整事件 XML

常见错误

消息原因
id inválido该值不是有效的 ObjectId
documento recebido não encontradoObjectId 存在但不属于令牌的用户
POST/api/invoice/received/get_prod

查询进项发票商品明细

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
chavestring是NF-e 的 44 位访问密钥(55 型)。校验位在请求 SEFAZ 之前本地校验
ciencia_notabool否默认 false。为 true 时,若 SEFAZ 尚未放开完整 XML,接口会用企业证书登记知悉声明(事件 210210)并重新查询
ambienteint否1 生产(默认)或 2 测试

响应字段

字段类型说明
chavestring本次查询的访问密钥
total_itensnumber发票商品行数量
itensarray每个发票商品行(det)一个对象
itens[].nItemnumber商品行在发票中的序号
itens[].prodobjectNF-e 布局中的 prod 组,保留原始标签名。数量与金额为数字;cProd、NCM、cEAN 等代码为字符串,保留前导零。布局中可重复的标签(NVE、DI、detExport、rastro)一律为数组
itens[].infAdProdstring商品行附加信息(如有)
SEFAZ 如何下发 XML
  • 收票企业来自 token,请求体中无需传 CNPJ。
  • 查询走全国环境的单据分发(DistDFe),使用企业本身的数字证书。
  • 未做任何声明时,SEFAZ 只返回摘要,不含商品明细。传 ciencia_nota: true 可解锁完整 XML。
  • 知悉声明仅表示知道该发票存在:既不确认收货,也不阻止开票方取消。
  • 刚授权的发票可能需要数小时才会被全国环境分发,在此之前返回「未找到发票」。
  • 企业自己开具的发票不会分发给自己,请用收票企业的 token 查询。
  • 查询本身不写入任何数据;只有触发知悉声明时才会在 SEFAZ 登记事件。

常见错误

消息原因
Chave inserida inválida / 发票密钥无效密钥不足 44 位、含非数字字符,或校验位不正确
Apenas NF-e modelo 55 pode ser consultada pela chave该密钥属于 NFC-e(65 型),SEFAZ 不分发此类单据
empresa não encontrada para este token该 token 未关联任何已登记的公司
empresa não possui certificado configurado公司档案中没有有效的 A1 证书
nenhum documento localizado para esta chave e este CNPJ...全国环境尚未分发该发票、环境不符,或该公司不是收票方
esta nota foi emitida por este CNPJ e a SEFAZ não a distribui ao próprio emitente用开票方自己的 token 查询销项发票(SEFAZ 641)
SEFAZ devolveu apenas o resumo da nota (sem itens)...该发票尚未提交知悉声明,请传 ciencia_nota=true
consumo indevido: a SEFAZ bloqueou consultas repetidasSEFAZ 按 CNPJ 限流,请稍后重试
当 ciencia_nota 触发事件或发现已登记的知悉声明时,错误响应会带上 data.ciencia,其中是事件结果。其他错误只返回 success 与 message。
POST/api/invoice/received/get_sync_status

查询同步状态

必需的头部

头部类型说明
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

字段

字段类型必填说明
cnpjstring是收件人公司 CNPJ — 14 位,无格式

响应字段

字段类型说明
cnpjstring查询的 CNPJ
ufstring上次同步中使用的收件人州代码(如从未同步,则不存在)
ult_nsulong最后处理的 NSU。0 = 从未同步
max_nsulong上次同步时税务局中可用的最大 NSU
pendinglong待处理文档 (max_nsu - ult_nsu)。如果 > 0,则税务局中有新文档
last_syncstring上次成功同步的 UTC 日期/时间。如从未同步,则为 null
典型用法:在调用 /received/sync 之前调用此端点,以决定是否需要调用税务局。此端点不消耗税务局速率限制 — 它仅读取本地 MongoDB 状态。