REST API v2.5 系统运行正常

NFE API 文档

欢迎来到TF Fiscal API文档。这是一个完整的巴西电子发票(NF-e)发行、查询和取消API。支持自动计算税款(ICMS、IPI、PIS/COFINS),生成XML,SEFAZ授权以及与管理系统的集成。

list_alt

API重要字段

关键字段解释

本部分解释了NFE API中最重要且对正确发行发票至关重要的字段。

⚠️ 注意:这些字段的正确配置对于有效发行发票至关重要。请始终参考现行税务法规。
字段 描述 可能值 重要性
invoice_type 公司类型(法人/自然人) juridica, fisica 高 - 定义税收制度
nature_of_operation 操作性质(销售、退货等) 例如:VENDA, DEVOLUCAO 高 - 确定CFOP
transaction_type 交易类型(进/出) ENTRADA, SAIDA 高 - 引导税务流程
model 发票模型 nfe, nfce 高 - 文档模型
issuance_type 发行类型(正常、应急) NORMAL, CONTINGENCIA 中 - 发行模式
ambiente 处理环境 PRODUCAO, HOMOLOGACAO 高 - 定义SEFAZ目的地
cliente 客户/买方类型 CONSUMIDOR, CONTRIBUINTE 高 - 影响税款
products.origem 产品来源(国内/进口) 08 高 - 決定征税
products.indicador_total 产品是否计入发票总额 true, false 中 - 用于样品项目
💡 提示:对于产品,origem字段至关重要:0-国内,1-直接进口外国产品,2-在国内市场购买的外国产品等。请参考完整的商品来源表。
sync_alt

发票发行流程

完整的NF-e发行流程图

从公司创建到最终文件生成的完整巴西电子发票发行流程。

business

1. 创建公司

创建巴西本地公司的税务信息

send

2. 信息推送

订单数据(用户、地址、产品税款)

receipt

3. 发行发票

处理并发送给SEFAZ授权

assignment_returned

4. 返回结果

发行状态和NF-e数据

description

5. 生成文件

发票的XML和PDF

published_with_changes

税务验证

与SEFAZ验证

check_circle

成功

error

失败

初始配置
数据处理
税务发行
正面结果
📊 详细流程: 流程遵循逻辑顺序:(1) 公司配置 → (2) 接收订单数据 → (3) 处理和发行NF-e → (4) 返回状态 → (5) 生成文件。決策点(税务验证)決定发行是否获得SEFAZ授权。
flash_on

端点快速参考

NFE API所有端点

API中所有可用端点的完整概述。使用此表作为瀏览文档的快速参考。

基础URL
https://api.tffiscal.com
路径 HTTP方法 功能
receipt NFC-e (消费者电子发票)
/api/nfce/company/create POST 注册NFC-e企业
/api/nfce/company/update POST 更新NFC-e企业
/api/nfce/company/get POST 查询NFC-e企业
/api/nfce/create POST 开具NFC-e
/api/nfce/cancel POST 取消NFC-e
/api/nfce/get_detail POST 查询NFC-e
/api/nfce/get_danfe POST 获取NFC-e DANFE
description NFS-e (服务电子发票)
/api/nfse/create POST 开具NFS-e
/api/nfse/cancel POST 取消NFS-e
/api/nfse/get_danfse POST 获取DANFSE (PDF)
/api/nfse/get_xml POST 下载NFS-e XML
📋 重要说明:
  • 所有端点都需要通过标头进行认证: sign, timestamp, token
  • 要创建公司和列出公司,请使用分销商令牌(b2b_token)
  • Content-Type必须始终为 application/json;charset=utf-8
  • 响应遵循带有successmessagedata字段的JSON标准
200

成功

请求处理成功

400

客户端错误

无效或缺少数据

500

服务器错误

服务器内部错误

account_balance

NFE API

巴西电子发票(NF-e)

用于巴西电子发票(NF-e)发行、查询和取消的完整API。支持自动计算税款(ICMS、IPI、PIS/COFINS),生成XML,SEFAZ授权以及与管理系统的集成。目前支持为整个巴西境内的产品发行发票。

基础URL(生产环境)
https://api.tffiscal.com/v1
认证
标头:sign, timestamp, token
要求
有效的A1数字证书

sync_alt 系统流程

input 输入数据
  • 客户信息
  • 产品数据
  • 税务信息
  • 运输数据
settings 处理
  • 数据验证
  • 税款计算
  • XML生成
  • SEFAZ授权
download 输出
  • 发票XML
  • 发票PDF
  • DANFE(辅助文档)
  • 授权状态

主要端点

POST /api/company/create
注册新的开票公司

在分销商(b2b)账户下注册开票公司。当公司数据已有时使用此端点。要从数字证书自动提取数据,请使用 /api/company/v2/create

必需请求头

请求头类型说明
tokenstring分销商令牌(b2b — 账户必须具有 isb2b=true
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
标识
cnpj *string开票公司 CNPJ
name *string公司名称
ie *string州注册号(Inscrição Estadual)
invoice_type *string税务制度(例如:"simples_nacional""normal"
unit *string单位类型
emailstring公司电子邮件
地址
cep *string邮政编码
address *string街道地址
house_number *string地址门牌号
town *string街区
city *string城市
state *stringUF(州缩写)
数字证书
cert_file *stringA1 数字证书(.pfx 或 .p12)的 HTTPS URL
cert_pwd *string证书密码
编号和设置
serie *intNF-e 系列
number *int编号的初始值
is_create_category_templateboolean自动创建默认税务类别。默认值:true

* 必填字段。

载荷示例

        {
          "cnpj": "12345678000199",
          "name": "Empresa Exemplo LTDA",
          "ie": "123456789",
          "invoice_type": "simples_nacional",
          "unit": "UN",
          "email": "contact@example.com",
          "cep": "01001000",
          "address": "Example Street",
          "house_number": "100",
          "town": "Downtown",
          "city": "São Paulo",
          "state": "SP",
          "cert_file": "https://example.com/cert.pfx",
          "cert_pwd": "senha_do_certificado",
          "serie": 1,
          "number": 1
        }

响应

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/company/v2/create
使用证书自动填充注册公司

/api/company/create 的简化版本:API 验证数字证书并通过内部查询自动提取公司名称、IE、地址等数据。只有 cnpjcert_filecert_pwd 是必填的。

必需请求头

请求头类型说明
tokenstring分销商令牌(b2b — 账户必须具有 isb2b=true
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
cnpj *string开票公司 CNPJ
cert_file *stringA1 数字证书(.pfx 或 .p12)的 HTTPS URL
cert_pwd *string证书密码
is_create_category_templateboolean自动创建默认税务类别。默认值:true

* 必填字段。

载荷示例

        {
          "cnpj": "12345678000199",
          "cert_file": "https://example.com/cert.pfx",
          "cert_pwd": "senha_do_certificado"
        }

响应

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/company/edit
编辑公司数据

更新开票公司数据。只发送要更改的字段 — 除 company_id 外,所有字段都是可选的。CNPJ 不可修改:发送会返回错误。更新 cep 时,系统自动解析 stateCodeibge。当 cert_filecert_pwd 一起发送时,证书在保存前会经过验证。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
company_id *string要编辑的公司 ID
namestring公司名称
invoice_typestring税务制度
iestring州注册号
unitstring单位类型
emailstring电子邮件
cepstring邮政编码(自动更新 stateCodeibge
addressstring街道地址
house_numberstring门牌号
townstring街区
citystring城市
statestringUF
cert_filestring新证书(.pfx 或 .p12)的 HTTPS URL。与 cert_pwd 一起发送时,在保存前进行验证
cert_pwdstring新证书密码
serieint新 NF-e 系列
numberint新初始编号

* 必填字段。发送 cnpj 会返回错误。

载荷示例

                {
                  "company_id": "comp_789012",
                  "name": "Nova Razão Social LTDA",
                  "email": "new@company.com",
                  "cep": "01310100"
                }

响应

                {
                  "success": true
                }
GET /api/company/get_list
列出分销商公司

分页列出分销商(b2b)账户下的开票公司。参数通过 查询字符串 传递。

必需请求头

请求头类型说明
tokenstring分销商令牌(b2b — 账户必须具有 isb2b=true
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
page *int页码(≥ 1)
page_size *int每页大小(1–20)

* 必填字段。

调用示例

GET /api/company/get_list?page=1&page_size=10

响应

        {
          "success": true,
          "data": {
            "companys": [
              {
                "company_id": "comp_789012",
                "invoice_type": "simples_nacional",
                "token": "eyJhbGciOiJIUzI1NiIs...",
                "cnpj": "12345678000199",
                "name": "Empresa Exemplo LTDA",
                "ie": "123456789",
                "unit": "UN",
                "email": "contact@example.com",
                "cep": "01001000",
                "address": "Example Street",
                "house_number": "100",
                "town": "Downtown",
                "city": "São Paulo",
                "state": "SP",
                "cert_file": "https://example.com/cert.pfx",
                "cert_pwd": "***",
                "serie": 1,
                "number": 142
              }
            ],
            "page": 1,
            "total": 8,
            "total_pages": 1
          }
        }
GET /api/company/get_detail
已认证公司的详情

返回由 token 请求头标识的公司的完整数据,包括已注册的税务类别列表。不接受 body 或查询字符串。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

调用示例

GET /api/company/get_detail

响应

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "name": "Empresa Exemplo LTDA",
            "token": "eyJhbGciOiJIUzI1NiIs...",
            "invoice_type": "simples_nacional",
            "cnpj": "12345678000199",
            "ie": "123456789",
            "unit": "UN",
            "email": "contact@example.com",
            "cep": "01001000",
            "address": "Example Street",
            "house_number": "100",
            "town": "Downtown",
            "city": "São Paulo",
            "state": "SP",
            "cert_file": "https://example.com/cert.pfx",
            "cert_pwd": "***",
            "serie": 1,
            "number": 142,
            "categorys": [
              {
                "category_id": "cat_001",
                "descricao": "Venda de mercadoria",
                "disable_difal": false,
                "desconta_icms_pis_cofins": false
              }
            ]
          }
        }
GET /api/company/get_cep_detail
通过 CEP 查询地址

解析巴西 CEP(邮政编码),返回 UF、IBGE 自治市代码和地址数据。用于填写公司和客户地址。需要分销商(b2b)账户。

必需请求头

请求头类型说明
tokenstring分销商令牌(b2b — 账户必须具有 isb2b=true
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
cep *string巴西 CEP(8 位,可带或不带连字符)

* 必填字段。

调用示例

GET /api/company/get_cep_detail?cep=01001000

响应

        {
          "success": true,
          "data": {
            "cep": "01001-000",
            "uf": "SP",
            "ibge": 3550308,
            "logradouro": "Praça da Sé",
            "bairro": "Sé",
            "localidade": "São Paulo",
            "ddd": "11"
          }
        }
GET /api/company/get_export_invoice_month_files
列出已生成的每月导出文件

返回当前年度(时区 America/Sao_Paulo)该公司已生成的每月导出文件列表。每个月最多可以有 4 个文件:1 个 Excel 电子表格(仅 Success 状态)+ 3 个 XML(按 SuccessCanceledVoided 状态各一个)。仅显示实际已导出的文件 — 使用 /api/invoice/get_xml 生成新文件。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

调用示例

GET /api/company/get_export_invoice_month_files

响应

字段类型说明
files[]array可用文件列表
files[].urlstringOSS 上的文件 URL
files[].yearint期间年份
files[].monthstring月份(1–12)
files[].typestring文件类型:"xlsx""xml"
files[].statusstring文件中发票的状态:"Success""Canceled""Voided"
files[].createdatetime文件生成时间

响应示例

        {
          "success": true,
          "data": {
            "files": [
              {
                "url": "https://oss.example.com/.../2024_01_success.xlsx",
                "year": 2024,
                "month": "1",
                "type": "xlsx",
                "status": "Success",
                "create": "2024-02-01T03:15:00Z"
              },
              {
                "url": "https://oss.example.com/.../2024_01_success.zip",
                "year": 2024,
                "month": "1",
                "type": "xml",
                "status": "Success",
                "create": "2024-02-01T03:15:30Z"
              }
            ]
          }
        }
GET /api/category/get_list
列出产品类别

返回所有可用的税务分类类别。

POST /api/invoice/create
开具新发票

开具 NF-e(型号 55)。开票公司通过 token 请求头识别,请勿在请求体中传入 company_id

必需请求头

请求头类型说明
tokenstring开票公司的令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstring秒级 Unix 时间戳(5 分钟有效窗口)

Body — 顶层字段

字段类型说明
标识和操作
idstring客户端提供的唯一 ID 用于幂等性(组成去重键)
nature_of_operation *string操作性质(如:"商品销售")
transaction_type *string类型: "0"=入库, "1"=出库, "2"=进口, "3"=出口
model *string文档型号: "55"=NF-e
issuance_type *string开具类型 ("1"=正常, "9"=应急, 等)
ambiente *string"1"=生产, "2"=测试
finalidadestring用途: "1"=正常, "2"=补充, "3"=调整, "4"=退货
ref_nfe_chavestring引用 NF-e 的 44 位访问密钥(补充/调整/退货用)
is_reopenboolean重新打开/覆盖之前已开具的 NF-e
dh_sai_entstring出入库日期时间(ISO 8601)。默认: 当前时间戳
金额和折扣
total_discount_amountdecimal发票总折扣
trocodecimal找零(NFC-e 常见)
segurodecimal保险金额(按比例分摊到各产品的 XML vSeg 字段)
outras_despesasdecimal其他费用(按比例分摊到各产品的 XML vOutro 字段)
指示符和附加信息
ind_finalstring最终消费者: "0"=B2B, "1"=B2C
ind_presstring到场指示符: "1"=面对面, "2"=互联网, "3"=电话服务等
informacoes_complementaresstring补充信息(写入 infAdic.infCpl
informacoes_fiscostring税务机关信息(写入 infAdic.infAdFisco

Body — cliente(对象,必填)

对于国内操作(transaction_type 0 或 1): cpfcnpjnameenderecobairro(最少 2 个字符)、cityufcep 为必填。对于进口/出口(transaction_type 2 或 3): 仅 name 为必填。
字段类型说明
cpfstring客户 CPF(cnpj 的替代)
cnpjstring客户 CNPJ(cpf 的替代)
iestring州注册号(Inscrição Estadual)
name *string公司名称 / 客户姓名
enderecostring地址(街道)
complementostring地址补充
numerostring地址门牌号
bairrostring街区(国内操作最少 2 个字符)
citystring城市
ufstring州(UF)— 会被从 CEP 解析出的 UF 覆盖
cepstring邮政编码(验证 UF 和城市)
telefonestring电话
emailstring电子邮件
id_estrangeirostring外国 ID(用于进口/出口)
c_paisintBACEN 国家代码。默认: 1058(巴西)
x_paisstring国家名称。默认: "BRASIL"

Body — products[](数组,至少 1 项)

每个产品需要税务信息: 通过 category_id(引用预注册的税务类别),或者 impostos/tax_info 对象(内联配置),二选其一。
字段类型说明
codigostring产品内部代码
name *string产品描述(CJK 字符会被剔除)
ncm *string8 位 NCM
ceststringCEST 代码(适用 ICMS-ST 时必填)
gtinstringGTIN / 条形码
gtin_tributavelstring计税单位 GTIN
count *decimal数量
unit *string商业单位(如: "UN"、"KG"、"MT")
unit_price *decimal单价
total_price *decimal项目总价
discount_pricedecimal项目折扣
origem *int商品来源 (0=国产, 1=进口—直接进口, 等)
indicador_total *int是否计入 NF-e 总额: 0=否, 1=是
category_idstring预注册的税务类别 ID(若不传 impostos/tax_info 则必填)
impostosobject内联税务配置(category_id 的替代)。结构见下
tax_infoobjectimpostos 别名(相同结构)
disable_difalboolean禁用此项的 DIFAL 计算
desconta_icms_pis_cofinsboolean仅对此项目从 PIS/COFINS 计税基础中扣除 ICMS(覆盖类别设置)
iiobject进口税 — CFOP 3.xxx 时必填。结构见下
import_declarationsarray进口报关单(DI) — 当 transaction_type="2" 时必填。结构见下
nItemPedint采购订单项目 (I61)。从根 id 取得的 xPed 所引用订单内的项目顺序号。有效范围: 1–999999。默认: 省略。

Body — products[].impostos / products[].tax_info

字段类型说明
industriastring基准行业/税率(别名: aliquota
icms
icms.codigo_cfopstringCFOP
icms.situacao_tributariastringICMS 的 CST/CSOSN
icms.industriastringICMS 行业
icms.tipo_pessoastring人员类型(PF/PJ)
icms.codigo_beneficio_fiscalstringcBenef(税收优惠代码)
ipi
ipi.codigo_enquadramentostringIPI 法律分类代码
ipi.situacao_tributariastringIPI 的 CST
ipi.aliquotastringIPI 税率
ipi.tipo_pessoastring人员类型
pis
pis.situacao_tributariastringPIS 的 CST
pis.aliquotastringPIS 税率
pis.tipo_pessoastring人员类型
cofins
cofins.situacao_tributariastringCOFINS 的 CST
cofins.aliquotastringCOFINS 税率
cofins.tipo_pessoastring人员类型
is(选择税)
is.cenariostringIS 场景
is.situacao_tributariastringIS 的 CST
is.aliquotastringIS 税率
is.tipo_pessoastring人员类型
ibs_cbs(税制改革)
ibs_cbs.situacao_tributariastringIBS/CBS 的 CST
ibs_cbs.tipo_pessoastring人员类型
ibs_cbs.classificacao_tributariastringIBS/CBS 税务分类
difal
difal.disable_difalboolean禁用项目的 DIFAL(产品级 disable_difal 的替代)

Body — products[].ii(进口税)

字段类型说明
vBCdecimalII 计算基础
vDespAdudecimal海关费用
vIIdecimalII 金额
vIOFdecimalIOF 金额

Body — products[].import_declarations[]

字段类型说明
nDIstringDI 编号
dDIstring (date)DI 日期
xLocDesembstring清关地点
UFDesembstring清关州
dDesembstring (date)清关日期
cExportadorstring出口商代码
tpViaTranspint国际运输方式
tpIntermedioint中介类型
vAFRMMdecimalAFRMM 金额
additionsarrayDI 附加项(字段: nAdicaonSeqAdiccFabricantevDescDInDraw

Body — shipping_address / delivery_address(对象,可选)

shipping_address 是取货地点(物理出发地,与开票方不同时使用)。delivery_address 是配送地点(物理目的地,与客户不同时使用)。指定时两个对象均需: cpfcnpjnameenderecobairro(最少 2 个字符)、cityufcep。两个对象结构相同。
字段类型说明
cpfstringCPF(cnpj 的替代)
cnpjstringCNPJ(cpf 的替代)
iestring州注册号
name *string公司名称 / 姓名
endereco *string地址
complementostring地址补充
numberstring门牌号(注意: 字段名为 number,不是 numero
bairro *string街区
city *string城市
uf *string
cep *string邮政编码
telefonestring电话
emailstring电子邮件

Body — transportation(对象,可选)

transportation 省略,系统假定 transport_mode="9"(无运费)。
字段类型说明
transport_modestring运费模式: "0"=开票方承担, "1"=收件方承担, "2"=第三方承担, "3"=发件人自行运输, "4"=收件人自行运输, "9"=无运费
freight_amountdecimal运费总额
carrier_info — 承运商
carrier_info.cpfstring承运商 CPF(cnpj 的替代)
carrier_info.cnpjstring承运商 CNPJ(cpf 的替代)
carrier_info.iestring州注册号
carrier_info.namestring公司名称
carrier_info.enderecostring地址
carrier_info.citystring城市
carrier_info.ufstring
carrier_info.cepstring邮政编码
vehicle_info — 车辆
vehicle_info.platestring车牌
vehicle_info.ufstring车牌州
vehicle_info.rntcstringRNTC(国家货物承运商登记)
trailer_info — 拖车(与 vehicle_info 结构相同)
trailer_info.platestring拖车车牌
trailer_info.ufstring
trailer_info.rntcstringRNTC
packages[] — 包裹
packages[].qtyint数量
packages[].gross_weightdecimal毛重
packages[].net_weightdecimal净重
packages[].packaging_typestring包装类型
packages[].numberstring编号
packages[].markstring标记
packages[].sealsarray<string>封条
transport_tax_retention_info — 运费 ICMS 代扣
transport_tax_retention_info.freight_service_amountdecimal运输服务金额
transport_tax_retention_info.tax_basedecimal代扣计算基础
transport_tax_retention_info.tax_ratedecimal代扣税率
transport_tax_retention_info.cfopstringCFOP
transport_tax_retention_info.cepstring邮政编码

Body — pag_info[](数组,可选)

省略时系统假定 [{ "payment_method": "01", "payment_indicator": "0" }](现金、一次性付清)。
字段类型说明
payment_method *string支付方式: "01"=现金, "02"=支票, "03"=信用卡, "04"=借记卡, "05"=店内信用, "10"=食品券, "11"=餐券, "15"=银行账单, "17"=PIX, "90"=无支付, "99"=其他
payment_indicator *string指示符: "0"=一次性付清, "1"=分期
payment_valuedecimal支付金额
card_info — 卡片信息(用于 payment_method 03/04)
card_info.integration_type *string终端集成类型(指定 card_info 时必填)
card_info.brand_code *string卡品牌(指定 card_info 时必填)
card_info.acquirer_cnpjstring收单方 CNPJ
card_info.authorization_codestring授权码

* 必填字段。

简化示例

{
  "nature_of_operation": "Venda de mercadoria",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "cliente": {
    "cpf": "12345678909",
    "name": "Cliente Exemplo",
    "endereco": "Rua Exemplo",
    "numero": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000",
    "email": "cliente@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Produto Exemplo",
      "ncm": "85176277",
      "count": 2,
      "unit": "UN",
      "unit_price": 150.00,
      "total_price": 300.00,
      "category_id": "SEU_CATEGORY_ID",
      "origem": 0,
      "indicador_total": 1
    }
  ],
  "pag_info": [
    { "payment_method": "01", "payment_indicator": "0", "payment_value": 300.00 }
  ]
}

完整示例(所有字段)

{
  "id": "PEDIDO-2026-0001",
  "nature_of_operation": "Venda de mercadoria",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "finalidade": "1",
  "ref_nfe_chave": "",
  "is_reopen": false,
  "dh_sai_ent": "",
  "total_discount_amount": 0.00,
  "troco": 0.00,
  "seguro": 0.00,
  "outras_despesas": 0.00,
  "ind_final": "1",
  "ind_pres": "9",
  "informacoes_complementares": "Entrega via transportadora",
  "informacoes_fisco": "ICMS recolhido conforme legislação",
  "cliente": {
    "cpf": "",
    "cnpj": "12345678000199",
    "ie": "123456789",
    "name": "Cliente Exemplo LTDA",
    "endereco": "Av. Paulista",
    "numero": "1000",
    "complemento": "Sala 200",
    "bairro": "Bela Vista",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "telefone": "11999998888",
    "email": "cliente@exemplo.com",
    "id_estrangeiro": "",
    "c_pais": 1058,
    "x_pais": "BRASIL"
  },
  "shipping_address": {
    "cnpj": "98765432000111",
    "name": "Depósito Origem LTDA",
    "ie": "987654321",
    "endereco": "Rua do Depósito",
    "number": "50",
    "complemento": "Galpão 3",
    "bairro": "Industrial",
    "city": "Guarulhos",
    "uf": "SP",
    "cep": "07000000",
    "telefone": "11988887777",
    "email": "deposito@exemplo.com"
  },
  "delivery_address": {
    "cnpj": "12345678000199",
    "name": "Cliente Exemplo LTDA",
    "ie": "123456789",
    "endereco": "Rua de Entrega",
    "number": "25",
    "complemento": "Loja 2",
    "bairro": "Centro",
    "city": "Campinas",
    "uf": "SP",
    "cep": "13010000",
    "telefone": "11977776666",
    "email": "entrega@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Notebook Dell",
      "ncm": "84713012",
      "cest": "",
      "gtin": "7891234567890",
      "gtin_tributavel": "7891234567890",
      "count": 2,
      "unit": "UN",
      "unit_price": 3500.00,
      "total_price": 7000.00,
      "discount_price": 0.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001",
      "nItemPed": 1
    },
    {
      "codigo": "PROD002",
      "name": "Mouse sem fio",
      "ncm": "84716053",
      "count": 5,
      "unit": "UN",
      "unit_price": 80.00,
      "total_price": 400.00,
      "origem": 0,
      "indicador_total": 1,
      "nItemPed": 2,
      "impostos": {
        "icms": {
          "codigo_cfop": "5102",
          "situacao_tributaria": "00",
          "industria": "",
          "tipo_pessoa": "juridica",
          "codigo_beneficio_fiscal": ""
        },
        "ipi": {
          "codigo_enquadramento": "999",
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "pis": {
          "situacao_tributaria": "01",
          "aliquota": "0.65",
          "tipo_pessoa": "juridica"
        },
        "cofins": {
          "situacao_tributaria": "01",
          "aliquota": "3.00",
          "tipo_pessoa": "juridica"
        },
        "ibs_cbs": {
          "situacao_tributaria": "000",
          "tipo_pessoa": "juridica",
          "classificacao_tributaria": "000001"
        }
      }
    }
  ],
  "transportation": {
    "transport_mode": "1",
    "freight_amount": 150.00,
    "carrier_info": {
      "cnpj": "11222333000144",
      "ie": "112223334",
      "name": "Transportadora Exemplo LTDA",
      "endereco": "Rod. BR-101, km 50",
      "city": "Santos",
      "uf": "SP",
      "cep": "11000000"
    },
    "vehicle_info": {
      "plate": "ABC1D23",
      "uf": "SP",
      "rntc": "12345"
    },
    "trailer_info": {
      "plate": "DEF4G56",
      "uf": "SP",
      "rntc": "67890"
    },
    "packages": [
      {
        "qty": 3,
        "gross_weight": 12.500,
        "net_weight": 11.000,
        "packaging_type": "CAIXA",
        "number": "001-003",
        "mark": "FRAGIL",
        "seals": ["LACRE001", "LACRE002"]
      }
    ],
    "transport_tax_retention_info": {
      "freight_service_amount": 150.00,
      "tax_base": 150.00,
      "tax_rate": 12.00,
      "cfop": "5932",
      "cep": "11000000"
    }
  },
  "pag_info": [
    {
      "payment_indicator": "1",
      "payment_method": "03",
      "payment_value": 7400.00,
      "card_info": {
        "integration_type": "1",
        "brand_code": "01",
        "acquirer_cnpj": "01234567000189",
        "authorization_code": "AUTH987654"
      }
    }
  ]
}
GET /api/invoice/get_list
NF-e 列表(分页)

分页列出公司的 NF-e。参数通过 查询字符串(query string)传递(不在 body 中)。时间过滤可选,但若使用则需同时传入 start_create_timeend_create_time

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
page *int页码(≥ 1)
page_size *int每页大小(1–50)
start_create_timelongUnix 时间戳(毫秒) — 起始(需要 end_create_time
end_create_timelongUnix 时间戳(毫秒) — 结束
statusstring按状态过滤(值: "Authorized""Canceled""Processing""Rejected" 等)

* 必填字段。

调用示例

GET /api/invoice/get_list?page=1&page_size=20&status=Authorized

响应

        {
          "success": true,
          "data": {
            "list": [
              {
                "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
                "chave": "35210112345678901234567890123456789012345678",
                "status": "Authorized",
                "create": "2024-01-10T10:30:00Z",
                "issue_time": "2024-01-10T10:31:00Z"
              }
            ],
            "page": 1,
            "total": 142,
            "total_pages": 8
          }
        }
GET /api/invoice/get_detail
查询 NF-e 详情

通过 UUID 返回特定 NF-e 的详情。包括 XML URL、DANFE URL(完整、简化、标签)和元数据。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
uuid *stringNF-e UUID

* 必填字段。

调用示例

GET /api/invoice/get_detail?uuid=65f8b9a1c2d3e4f5a6b7c8d9

响应

        {
          "success": true,
          "data": {
            "id": "order-2024-0001",
            "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
            "chave": "35210112345678901234567890123456789012345678",
            "serie": 1,
            "number": 100,
            "status": "Authorized",
            "total_price": 300.00,
            "xml": "https://oss.example.com/.../chave.xml",
            "danfe": "https://oss.example.com/.../chave.pdf",
            "danfe_simples": "https://oss.example.com/.../chave_simplie.pdf",
            "danfe_etiqueta": "https://oss.example.com/.../chave_etiqueta.pdf",
            "create": "2024-01-10T10:30:00Z",
            "issue_time": "2024-01-10T10:31:00Z"
          }
        }
POST /api/invoice/refresh
更新发票状态

查询 SEFAZ 上 NF-e 的当前状态并更新本地记录。当开票卡在处理中或应急状态时使用。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
uuid *string要查询的 NF-e 的 UUID

* 必填字段。

载荷示例

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }
POST /api/invoice/cancel
取消发票

取消已授权的 NF-e。发送给 SEFAZ 的理由是固定的: "Erro no preenchimento da nota fiscal." — 无法通过载荷配置。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
uuid *string要取消的 NF-e 的 UUID(由 /api/invoice/create 返回的内部标识符)

* 必填字段。

载荷示例

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }
POST /api/invoice/invalid
作废编号范围

作废一段未授权的 NF-e 编号范围(不要与取消混淆 — 取消适用于已授权的发票)。该操作在 SEFAZ 上记录,不可撤销。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
modelo *string文档型号: "55"=NF-e, "65"=NFC-e。(注意: 字段名为 modelo,不是 model
ambiente *string"1"=生产, "2"=测试
serie *int要作废的编号系列
start_number *int范围起始编号
end_number *int范围结束编号
motivo *string作废理由(SEFAZ 要求至少 15 个字符)

* 必填字段。

载荷示例

        {
          "modelo": "55",
          "ambiente": "2",
          "serie": 1,
          "start_number": 100,
          "end_number": 105,
          "motivo": "Falha no sistema durante a emissao do lote"
        }
POST /api/invoice/get_danfe
获取 NF-e 的 DANFE(PDF)

返回 NF-e DANFE 的三个 URL:完整 DANFE(PDF)、简化 DANFE 的 PDF(小票格式)和简化 DANFE 的 PNG(标签图片)。PDF 按需从授权 XML 生成,并缓存在 OSS。后续调用时,如果发票状态未更改,则返回现有缓存;如果状态已更改(例如发票被取消),则重新生成 PDF。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

Body

字段类型说明
uuid ⚠stringNF-e 内部 UUID(由 /api/invoice/create 返回)
chave ⚠stringNF-e 访问密钥(44 位)

uuidchave 二选一,必填。

请求示例

                {
                  "uuid": "abc123-def456-..."
                }

响应

                {
                  "success": true,
                  "data": {
                    "danfe": "https://storage.../uid/dd-MM-yyyy/companyId/.pdf",
                    "danfe_simples": "https://storage.../uid/cnpj/dd-MM-yyyy/_simplie.pdf",
                    "danfe_simples_png": "https://storage.../uid/cnpj/dd-MM-yyyy/_simplie.png"
                  }
                }

响应字段

字段类型说明
danfestring完整 DANFE PDF 的 URL(A4 格式)
danfe_simplesstring简化 DANFE PDF 的 URL(小票格式)
danfe_simples_pngstring简化 DANFE PNG(标签图片)的 URL

错误响应

消息原因
uuid/chave不能为空uuidchave 都未发送
发票不存在未找到该 token 用户的发票,或缺少授权 XML
发票详情不存在未找到发票详情(带协议)
获取PDF失败:<原因>从 XML 生成 PDF 失败
POST /api/invoice/get_xml
XML/Excel 批量导出(异步)

为用户发票启动异步批量导出任务,按时间段和状态过滤。可生成 Excel 表格(仅元数据)或包含 XML 的 ZIP 包。第一次调用创建任务并返回 status: "Processing";使用相同参数的后续调用返回进度,直到 status: "Success"url 字段包含下载链接。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body

字段类型说明
type *string输出格式:"excel"(元数据表格)或其他值(如 "xml")— XML 的 ZIP
statusstring按发票状态过滤(如 "Success""Canceled""Voided")。type=excel 时内部转为小写
monthint月份(1–12)。如提供,覆盖 start_create_time/end_create_time;使用 America/Sao_Paulo 时区和当前年份(若月份在未来则使用上一年)
start_create_timelong时间段开始(Unix 时间戳,毫秒)
end_create_timelong时间段结束(Unix 时间戳,毫秒)

* 必填字段。

请求示例

                {
                  "type": "xml",
                  "status": "Success",
                  "month": 5
                }

响应 — 处理中

                {
                  "success": true,
                  "data": {
                    "status": "Processing",
                    "progress_count": 120,
                    "total_count": 543,
                    "url": ""
                  }
                }

响应 — 已完成

                {
                  "success": true,
                  "data": {
                    "status": "Success",
                    "progress_count": 543,
                    "total_count": 543,
                    "url": "https://storage.../exports/uid/.zip"
                  }
                }

响应字段

字段类型说明
statusstring任务执行时为 "Processing",文件准备就绪时为 "Success"
progress_countint已处理的发票数量
total_countint待处理发票总数
urlstring最终文件下载 URL(status = Processing 时为空字符串)
幂等性: 任务通过参数哈希(uid + token + 时间段 + status + type)去重。使用相同参数的重复调用返回同一任务的进度,不会触发新的执行。

错误响应

消息原因
发票类型字段不能为空type 缺失
POST /api/invoice/consultar_status
在 SEFAZ 查询 NF-e/NFC-e 状态

通过 NfeConsultaProtocolo4 服务,使用访问密钥(44 位)直接在 SEFAZ 查询 NF-e 或 NFC-e 的当前状态。适用于 token 公司开具的自有发票以及通过 DistDFe 捕获的第三方发票。模型(NF-e/NFC-e)从密钥的 20-21 位自动检测。

必需请求头

请求头类型说明
tokenstring企业 token(其证书将用于查询)
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

Body

字段类型说明
chave *string访问密钥(44 位数字)。发行者 UF 从 0-1 位置提取;模型从 20-21 位置提取(55=NF-e,65=NFC-e)。

* 必填字段。

请求示例

        {
          "chave": "35260512345678000199550010000000011000000018"
        }

响应

        {
          "success": true,
          "message": "Sucesso",
          "data": {
            "chave": "35260512345678000199550010000000011000000018",
            "status": "autorizada",
            "cstat": 100,
            "motivo": "Autorizado o uso da NF-e"
          }
        }

响应字段

字段类型说明
chavestring查询的访问密钥
statusstring规范化状态(见下表)
cstatintSEFAZ 原始 cStat 代码
motivostringSEFAZ 原始 xMotivo 消息

状态映射

statusSEFAZ cStat含义
autorizada100, 150NF-e 已授权使用
cancelada101, 151已取消(即使 cStat=100,如果有关联的取消事件也返回)
denegada110, 301, 302SEFAZ 拒绝使用
inutilizada102号码已作废(号码范围)
nao_encontrada217NF-e 在 SEFAZ 数据库中不存在
desconhecido其他未映射的 cStat — 查看原始 cstatmotivo

错误响应

消息原因
chave inválida: deve ter 44 dígitos密钥缺失、大小非 44 或包含非数字字符
empresa não possui certificado configuradotoken 公司未注册 cert_file
SEFAZ retornou resposta vaziaSEFAZ 未返回响应(超时、宕机)
erro ao consultar SEFAZ: <详情>调用服务时异常(无效 XML、超时、证书过期等)
POST /api/category/create
创建税务类别

创建一个绑定到已认证公司的新税务类别(税务模板)。每个类别聚合 ICMS、IPI、PIS、COFINS 场景,并可选包含 IBS/CBS 和 IS。要编辑现有类别,请使用 /api/category/edit

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body — 顶层

字段类型说明
descricao *string类别说明
category_idstring自定义 ID。省略时自动生成为 "TF" + 递增数字
disable_difalboolean禁用此类别的 DIFAL 计算。默认值:false
desconta_icms_pis_cofinsboolean从 PIS/COFINS 计税基础中扣除 ICMS(计税基础 = vProd − vICMS)。默认: false
icms[] *arrayICMS 场景(结构见下)
ipi[] *arrayIPI 场景(结构见下)
pis[] *arrayPIS 场景(结构见下)
cofins[] *arrayCOFINS 场景(结构见下)
ibs_cbs[]arrayIBS/CBS 场景 — 税制改革(结构见下)
is[]arrayIS 场景 — 选择税(结构见下)

Body — icms[]

字段类型说明
tipo_tributacao *stringICMS 课税类型
cenario *string场景(例如:"saida_dentro_estado""saida_fora_estado""padrao"
tipo_pessoa *string"fisica""juridica"
codigo_cfop *stringCFOP
situacao_tributaria *stringICMS 的 CST/CSOSN
nao_contribuinteboolean非纳税客户
aliquota_importacaostring进口税率
aliquota_creditodecimal信用税率(Simples Nacional 用百分比)
aliquota_diferimentodecimal递延百分比
aliquota_diferimentoFcpstringFCP 递延(注意:字段使用 camelCase diferimentoFcp
aliquota_reducaodecimalICMS 基础减免百分比
aliquota_reducaoStdecimalICMS-ST 基础减免百分比(注意:reducaoSt camelCase)
motivo_desoneracaostringICMS 免税理由代码
motivo_desoneracaoStstringICMS-ST 免税理由代码(注意:camelCase)
按州税率 — 可选
aliquota_mva[]array按 UF 的 MVA — 项:{ estado, aliquota }
aliquota_icms[]array按 UF 的 ICMS 税率 — 项:{ estado, aliquota }
aliquota_icms_st[]array按 UF 的 ICMS-ST 税率 — 项:{ estado, aliquota }
aliquota_fcp[]array按 UF 的 FCP 税率 — 项:{ estado, aliquota }
aliquota_fcp_st[]array按 UF 的 FCP-ST 税率 — 项:{ estado, aliquota }
beneficio_fiscal[]array按 UF 的税收优惠代码 — 项:{ estado, codigo }

Body — ipi[]

字段类型说明
cenario *string场景
tipo_pessoa *string"fisica""juridica"
situacao_tributaria *stringIPI 的 CST
codigo_enquadramento *string法律分类代码
aliquota *stringIPI 税率

Body — pis[]cofins[](相同结构)

字段类型说明
cenario *string场景
tipo_pessoa *string"fisica""juridica"
situacao_tributaria *stringPIS/COFINS 的 CST
aliquota *string税率

Body — ibs_cbs[](税制改革)

字段类型说明
cenario *string场景
tipo_pessoa *string"fisica""juridica"
situacao_tributaria *stringIBS/CBS 的 CST
classificacao_tributaria *string税务分类

Body — is[](选择税)

字段类型说明
cenario *string场景
tipo_pessoa *string"fisica""juridica"
situacao_tributaria *stringIS 的 CST
aliquota *stringIS 税率

* 必填字段。

最小示例

        {
          "descricao": "Venda de mercadoria padrão",
          "icms": [{
            "tipo_tributacao": "normal",
            "cenario": "padrao",
            "tipo_pessoa": "juridica",
            "codigo_cfop": "5102",
            "situacao_tributaria": "00"
          }],
          "ipi":  [{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "99", "codigo_enquadramento": "999", "aliquota": "0" }],
          "pis":  [{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "01", "aliquota": "0.65" }],
          "cofins":[{ "cenario": "padrao", "tipo_pessoa": "juridica", "situacao_tributaria": "01", "aliquota": "3" }]
        }

响应

        {
          "success": true,
          "data": {
            "category_id": "TF123"
          }
        }
GET /api/category/get_detail
税务类别详情

返回税务类别的完整配置:所有 ICMS、IPI、PIS、COFINS、IBS/CBS 场景,包括按 UF 的数组(MVA、税率、税收优惠)。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
category_id *string税务类别 ID

* 必填字段。

调用示例

GET /api/category/get_detail?category_id=TF123

响应

        {
          "success": true,
          "data": {
            "category_id": "TF123",
            "descricao": "Venda de mercadoria padrão",
            "disable_difal": false,
            "desconta_icms_pis_cofins": false,
            "icms": [{
              "tipo_tributacao": "normal",
              "cenario": "padrao",
              "tipo_pessoa": "juridica",
              "nao_contribuinte": false,
              "codigo_cfop": "5102",
              "situacao_tributaria": "00",
              "aliquota_importacao": "",
              "aliquota_credito": 0,
              "aliquota_reducao": 0,
              "aliquota_reducao_st": 0,
              "motivo_desoneracao": "",
              "motivo_desoneracao_st": "",
              "aliquota_icms": [{"estado":"SP","aliquota":18}]
            }],
            "ipi":    [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"99","codigo_enquadramento":"999","aliquota":"0"}],
            "pis":    [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"01","aliquota":"0.65"}],
            "cofins": [{"cenario":"padrao","tipo_pessoa":"juridica","situacao_tributaria":"01","aliquota":"3"}],
            "ibs_cbs":[]
          }
        }
GET /api/category/get_list
列出税务类别

分页列出已认证公司的税务类别。每项仅返回 category_iddescricao — 使用 /api/category/get_detail 获取完整配置。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
page *int页码(≥ 1)
page_size *int每页大小(1–50)

* 必填字段。

调用示例

GET /api/category/get_list?page=1&page_size=20

响应

        {
          "success": true,
          "data": {
            "list": [
              { "category_id": "TF123", "descricao": "Venda de mercadoria padrão" },
              { "category_id": "TF124", "descricao": "Devolução de venda" }
            ],
            "page": 1,
            "total": 2,
            "total_pages": 1
          }
        }
POST /api/category/edit
编辑税务类别

编辑现有的税务类别。请求体与 /api/category/create 相同,唯一区别是 category_id 必填且必须与现有类别匹配。Upsert 完全替换 icmsipipiscofinsibs_cbsis 数组 — 请发送所有更新后的场景(不会按场景合并)。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

完整的 body 结构记录在 /api/category/create。此处仅 category_id 处理不同:

字段类型说明
category_id *string要编辑的类别 ID(必须存在,否则返回错误)
descricao *string说明
icms[] *arrayICMS 场景(完全替换)
ipi[] *arrayIPI 场景
pis[] *arrayPIS 场景
cofins[] *arrayCOFINS 场景
ibs_cbs[]arrayIBS/CBS 场景(可选)
is[]arrayIS 场景(可选)
disable_difalboolean默认值:false
desconta_icms_pis_cofinsboolean默认: false

* 必填字段。每个数组的内部字段(icms[].codigo_cfop 等),请参见 /api/category/create

响应

        {
          "success": true,
          "data": {
            "category_id": "TF123"
          }
        }
POST /api/category/delete
删除税务类别

从公司中删除税务类别。不可逆的操作。绑定到此类别的产品仍会引用已删除的 category_id,因此 NFe 开票将失败 — 删除前请先更新产品。

必需请求头

请求头类型说明
tokenstring公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
category_id *string要删除的类别 ID

* 必填字段。

载荷示例

        {
          "category_id": "TF123"
        }

响应

        {
          "success": true
        }
POST /api/invoice/return
开具退货 NF-e

从原始 NF-e 开具退货 NF-e(型号 55,用途 4)。支持两种模式:全额退货(通过 uuidchave 引用原始发票)或 部分/自定义退货(通过 return_detail 提供完整 body)。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body — 顶层字段

字段类型说明
uuidstring原始 NF-e 的 UUID(如果没有 chave 则必填;return_detail 模式不使用)
chavestring原始 NF-e 的 44 位访问密钥(return_detail 模式必填;简易模式下作为 uuid 的替代)
cfop *string退货 CFOP(例如:"1202""1411""2202""5202""5411""6202"
natureza_operacaostring操作性质(例如:"Devolução de venda")。接受别名:nature_of_operation
return_detailobject退货 NF-e 的完整 body。与 /api/invoice/create 结构相同,有 1 处差异:return_detail.cliente 中的地址门牌号字段是 number(英文),不是 numero。省略时为全额退货并克隆原始 NF-e。

* 必填字段。uuidchave 也必填(仅其中一个)。

示例 — 全额退货

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
          "cfop": "5202",
          "natureza_operacao": "Devolução de venda"
        }

示例 — 通过 return_detail 部分退货

        {
          "chave": "35210112345678901234567890123456789012345678",
          "cfop": "5202",
          "natureza_operacao": "Devolução parcial",
          "return_detail": {
            "nature_of_operation": "Devolução parcial",
            "transaction_type": "1",
            "model": "55",
            "issuance_type": "1",
            "ambiente": "2",
            "cliente": { "cnpj": "12345678000199", "name": "Fornecedor", "endereco": "...", "bairro": "...", "city": "...", "uf": "SP", "cep": "01001000" },
            "products": [ { "name": "...", "ncm": "...", "count": 1, "unit": "UN", "unit_price": 100, "total_price": 100, "category_id": "...", "origem": 0, "indicador_total": 1 } ]
          }
        }

code 发票发行完整示例

带运输的完整示例

{
  "nature_of_operation": "Venda de mercadoria",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_final": "0",
  "ind_pres": "1",
  "cliente": {
    "cnpj": "12345678000199",
    "ie": "123456789",
    "name": "Empresa Cliente Ltda",
    "endereco": "Rua Exemplo",
    "number": "123",
    "complemento": "Sala 45",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01234567",
    "telefone": "11999999999",
    "email": "contato@empresa.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Smartphone XYZ",
      "ncm": "85171210",
      "cest": "2804000",
      "count": 2,
      "unit": "UN",
      "unit_price": 1500.00,
      "total_price": 3000.00,
      "category_id": "SEU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1"
    }
  ],
  "transportation": {
    "transport_mode": "0",
    "freight_amount": 30.00,
    "carrier_info": {
      "cnpj": "12345678000188",
      "name": "Transportadora Expressa",
      "endereco": "Rua da Transportadora",
      "city": "São Paulo",
      "uf": "SP"
    },
    "vehicle_info": {
      "plate": "ABC1234",
      "uf": "SP",
      "rntc": "123456"
    },
    "packages": [
      {
        "qty": 1,
        "packaging_type": "CX",
        "gross_weight": 2.500,
        "net_weight": 2.000
      }
    ]
  },
  "shipping_address": {
    "cnpj": "12345678000199",
    "name": "Remetente Ltda",
    "endereco": "Rua do Remetente",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000"
  },
  "delivery_address": {
    "cnpj": "98765432000111",
    "name": "Destinatário Ltda",
    "endereco": "Rua do Destinatário",
    "number": "200",
    "bairro": "Centro",
    "city": "Rio de Janeiro",
    "uf": "RJ",
    "cep": "20040020"
  },
  "pag_info": [
    {
      "payment_method": "03",
      "payment_indicator": "0",
      "card_info": {
        "integration_type": "1",
        "brand_code": "01"
      }
    }
  ],
  "informacoes_complementares": "Sem informações adicionais",
  "informacoes_fisco": "ICMS recolhido conforme legislação"
}
💡 信息: 此示例包括截图中提到的所有重要字段,包括运输、详细税务信息和支付。请根据您的具体需求调整值。

进口完整示例

{
  "id": "PED-IMP-001",
  "nature_of_operation": "Importacao para revenda",
  "transaction_type": "2",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "finalidade": "1",
  "ind_final": "0",
  "ind_pres": "9",
  "cliente": {
    "name": "EXPORTADOR EXTERIOR CO LTD",
    "endereco": "Pudong District",
    "numero": "456",
    "city": "Shanghai",
    "id_estrangeiro": "CN-EXP-001",
    "c_pais": 1600,
    "x_pais": "CHINA"
  },
  "products": [
    {
      "name": "Fonte chaveada 12V 2A Quickfitting",
      "codigo": "123450000888",
      "ncm": "85044090",
      "count": 2,
      "unit": "PC",
      "unit_price": 0.25,
      "total_price": 0.50,
      "origem": 1,
      "indicador_total": "1",
      "category_id": "YOUR_CATEGORY_ID",
      "import_declarations": [
        {
          "nDI": "2312345678",
          "dDI": "2026-04-12",
          "xLocDesemb": "PORTO DE SANTOS",
          "UFDesemb": "SP",
          "dDesemb": "2026-04-15",
          "tpViaTransp": 1,
          "vAFRMM": 0.01,
          "tpIntermedio": 1,
          "cExportador": "EXP-CN-001",
          "additions": [
            {
              "nAdicao": 1,
              "nSeqAdic": 1,
              "cFabricante": "FAB-CN-001",
              "vDescDI": 0,
              "nDraw": ""
            }
          ]
        }
      ]
    },
    {
      "name": "Quick fitting MA",
      "codigo": "123450000157",
      "ncm": "85044090",
      "count": 2,
      "unit": "PC",
      "unit_price": 0.25,
      "total_price": 0.50,
      "origem": 1,
      "indicador_total": "1",
      "category_id": "YOUR_CATEGORY_ID",
      "ii": {
        "vBC": 0.50,
        "vDespAdu": 0.00,
        "vII": 0.00,
        "vIOF": 0.00
      },
      "import_declarations": [
        {
          "nDI": "2312345678",
          "dDI": "2026-04-12",
          "xLocDesemb": "PORTO DE SANTOS",
          "UFDesemb": "SP",
          "dDesemb": "2026-04-15",
          "tpViaTransp": 1,
          "vAFRMM": 1.00,
          "tpIntermedio": 1,
          "cExportador": "EXP-CN-001",
          "additions": [
            {
              "nAdicao": 1,
              "nSeqAdic": 2,
              "cFabricante": "FAB-CN-001",
              "vDescDI": 0,
              "nDraw": ""
            }
          ]
        }
      ]
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}
💡 信息: NFe进口示例 (CFOP 3.xxx)。与国内 NFe 的差异:
  • transaction_type: "2" — 入库(进口)操作。
  • cliente 没有 cnpj/cpf/uf/cep;使用 id_estrangeiroc_pais(BACEN 表 — 中国 = 1600)和 x_pais
  • category_id 必须指向具有 CFOP 3.xxx 和与进口兼容的 CST/CSOSN 的税务类别。
  • 产品 origem = 1(外国 — 直接进口)或 2(外国 — 在国内市场购买)。
  • 当 CFOP 为 3.xxx 时,ii 区块(进口税)为必填。数值来自报关员开具的 DI(vBC、vDespAdu、vII、vIOF)。测试时可为零。
  • import_declarations 区块(进口申报)包含通关数据:nDI、dDI、通关地点/UF/日期、运输方式、中介、出口商和附加。
  • tpViaTransp = 1(海运)时,vAFRMM 为必填。

vpn_key 认证

所有请求必须包含以下标头:

标头 类型 必需 描述
Content-Type string application/json;charset=utf-8
sign string 请求的数字签名
timestamp string 请求的UTC时间戳
token string 认证令牌

注意: 要创建公司和获取公司列表,请使用分销商令牌(b2b_token)。

签名算法(SIGN)

static string GetSign(string AppKey, string Path, string bodyString, string timestamp)
{
    string input = AppKey + Path + bodyString + timestamp;
    using (MD5 md5 = MD5.Create())
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] hashBytes = md5.ComputeHash(inputBytes);
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("x2"));
        }
        return sb.ToString();
    }
}
重要: 计算 sign 时,GET 请求的 Path 需要包含查询字符串。例如:/api/nfce/category/get_detail?category_id=TF123。POST 请求的 Path 仅为路径(如:/api/company/create)。

percent 详细税务参数

scale_balance ICMS参数
征税场景
padrao saida_fora_estado saida_dentro_estado entrada_fora_estado entrada_dentro_estado
税务状況(CST)
00:全额征税
02:免税
10:带ICMS征税
20:降低计算基数
30:免税或非征税
40:免税
41:非征税
50:暂停
51:延期
60:先前已征收ICMS
70:降低和征收
90:其他
pie_chart PIS/COFINS参数
征税场景
padrao saida_fora_estado saida_dentro_estado entrada_fora_estado entrada_dentro_estado
税务状況(CST)
01:征税操作(正常税率)
02:征税操作(差别税率)
03:征税操作(免税)
04:征税操作(暂停)
05:征税操作(ST)
06:征税操作(零税率)
07:免税操作
08:非征税操作
09:暂停征税操作
49:其他输出操作
50:抵免权(自身操作)
51:抵免权(採购)
52:贷方记录
53:借方记录
54:贷方记录(逾期)
55:借方记录(逾期)
56:推定抵免
60:推定抵免(採购)
61:推定抵免(进口)
62:推定抵免(农业活动)
63:推定抵免(其他)
64:推定抵免(非生成)
65:推定抵免(替代)
66:推定抵免(替代)
67:推定抵免(出口)
70:无抵免权的採购操作
71:免税採购操作
72:暂停採购操作
73:零税率採购操作
74:非征税採购操作
75:替代採购操作
98:其他输入操作
99:其他操作
💡 信息: tipo_pessoa字段接受fisica(自然人)或juridica(法人)值。对于PIS/COFINS,aliquota字段应格式化为带两位小数的字符串(例如:"1.65")。

credit_card 支付参数

支付指示器
0 现金
1 信用
支付方式
01 现金
02 支票
03 信用卡
04 借记卡
05 商店信用
10 餐券
11 餐饮券
12 礼品券
13 燃油券
15 银行票据
90 无支付
99 其他
卡品牌
01 Visa
02 Mastercard
03 American Express
04 Sorocred
05 Diners Club
06 Elo
07 Hipercard
08 Aura
09 Cabal
99 其他

bug_report XML问题排查

warning 拒绝 225 - XML Schema失败

当尝试取消、下载XML、作廢号码或对未在SEFAZ数据库中成功注册的NF-e进行声明时发生。

1
验证NF-e是否已获得授权(状态"已授权")
2
如果未授权,重新发行NF-e
3
如果未使用,作廢号码
lightbulb SEFAZ在线验证

使用官方验证器识别XML问题:

https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx

常见问题: 地址不完整,NCM无效,值格式错误,缺少必填字段。

error SEFAZ错误代码

代码 描述 解決方案
217 发行日期过于滞后 在应急情況下发行或正规化
404 收件人CNPJ/CPF无效 验证客户文档
563 操作不允许的CFOP 审查操作CFOP

其他端点

4. 列出类别: GET /api/category/get_list
5. 类别详情: GET /api/category/get_detail
6. 编辑类别: POST /api/category/edit
7. 删除类别: POST /api/category/delete
CFOP(操作财政代码)示例:
5102 从第三方购买的商品销售 - 州内
6102 从第三方购买的商品销售 - 州际
6108 从第三方购买的商品销售 - 州际(自然人)
1000 商品入库
speed

限制和速率限制

API使用政策

按计划限制
免费计划 100次请求/天
基础计划 1,000次请求/天
专业计划 10,000次请求/天
企业计划 定制
transport_mode的值:
0 发货人承担运费(CIF)
1 收货人承担运费(FOB)
2 第三方承担运费
3 发货人自有运输
4 收货人自有运输
9 无运输发生
CFOP(操作财政代码)示例:
5102 从第三方购买的商品销售 - 州内
6102 从第三方购买的商品销售 - 州际
6108 从第三方购买的商品销售 - 州际(自然人)
1000 商品入库

assessment NFe 报告

生成已开具电子发票(NF-e)的详细报告, 支持按期间、状态和操作类型进行篩选。 适用于财务监控、审计和管理控制。

1. 已开具发票报告

GET /api/invoice/report

请求参数(Query)

参数 必填 类型 描述
company_id String 公司ID
start_date Date 期间开始日期(YYYY-MM-DD)
end_date Date 期间结束日期(YYYY-MM-DD)
status String 按状态篩选:AUTHORIZEDCANCELEDDENIEDALL(默认)
model String 文件模型:nfenfceall(默认)
format String 输出格式:json(默认)、 csvpdf
page Integer 页码(默认:1)
per_page Integer 每页记录数(默认:50,最大:200)

请求示例

GET /api/invoice/report?company_id=comp_123456&start_date=2024-01-01&end_date=2024-01-31&status=AUTHORIZED&format=json

响应示例

{
  "success": true,
  "data": {
    "summary": {
      "total_invoices": 152,
      "total_value": 458320.50,
      "authorized": 145,
      "canceled": 5,
      "denied": 2
    },
    "invoices": [
      {
        "invoice_id": "nf_789012",
        "number": 1045,
        "series": 1,
        "access_key": "35210112345678901234...",
        "status": "AUTHORIZED",
        "issue_date": "2024-01-10T10:30:00Z",
        "total_value": 3000.00,
        "customer_name": "Empresa Cliente Ltda",
        "customer_document": "12.345.678/0001-99",
        "nature_of_operation": "VENDA",
        "model": "nfe"
      }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 50,
      "total_pages": 4,
      "total_records": 152
    }
  }
}

2. 期间摘要报告

GET /api/invoice/report/summary

返回按月分组的财务操作合併摘要, 包含价值、数量和税务总计。

请求参数(Query)

参数 必填 类型 描述
company_id String 公司ID
year Integer 参考年份(例:2024)
group_by String 分组方式:month(默认)、 weekday

响应示例

{
  "success": true,
  "data": {
    "company_id": "comp_123456",
    "year": 2024,
    "periods": [
      {
        "period": "2024-01",
        "total_invoices": 152,
        "total_value": 458320.50,
        "total_tax": 82497.69,
        "authorized": 145,
        "canceled": 5,
        "denied": 2
      },
      {
        "period": "2024-02",
        "total_invoices": 178,
        "total_value": 523180.75,
        "total_tax": 94172.54,
        "authorized": 170,
        "canceled": 6,
        "denied": 2
      }
    ]
  }
}

3. 导出报告

POST /api/invoice/report/export

生成并导出PDF或CSV格式的完整报告。 导出以异步方式处理,完成后返回下载URL。

请求负载

{
  "company_id": "comp_123456",
  "start_date": "2024-01-01",
  "end_date": "2024-12-31",
  "format": "pdf",
  "status": "ALL",
  "include_details": true,
  "include_taxes": true
}

响应示例

{
  "success": true,
  "message": "报告处理中",
  "data": {
    "report_id": "rpt_abc123",
    "status": "processing",
    "estimated_time": "30s",
    "callback_url": "https://api.tffiscal.com/v1/report/status/rpt_abc123"
  }
}

处理完成后的响应

{
  "success": true,
  "data": {
    "report_id": "rpt_abc123",
    "status": "completed",
    "download_url": "https://storage.tffiscal.com/reports/rpt_abc123.pdf",
    "expires_at": "2024-02-01T23:59:59Z",
    "file_size": "2.4 MB"
  }
}
💡 提示:使用 format=csv 参数将数据与ERP系统或电子表格集成。 PDF格式适用于演示和财务审计。
⚠️ 注意:每次查询允许的最大期间为12个月。 对于完整的年度报告,请使用导出端点 (/report/export)。 大量数据的查询可能需要几秒钟来处理。

vpn_key TF Hub全局认证

TF Hub的所有API都使用统一的认证系统。

必需标头

标头 描述
X-API-Key 字符串 仪表板提供的API密钥
X-Timestamp Unix时间戳 请求时间戳(毫秒)
X-Signature 字符串 HMAC-SHA256签名

point_of_sale NFC-e — 电子消费者发票

Base URL (生产环境)
https://api.tffiscal.com
认证
Headers: sign, timestamp, token
要求
有效的A1数字证书 (.pfx 或 .p12)
CSC (纳税人安全码)
CSC ID (SEFAZ中的CSC标识符)

NFC-e(模型65)是面向最终消费者的零售电子税务文件,适用于现场销售或送货上门。它取代了旧的税务收据(ECF)。

NFC-e 特点:
  • 始终为州内交易 — 无 DIFAL
  • 无 IPI(工业产品税)
  • 现场销售时收件人可选(ind_pres: "1"
  • 送货上门时收件人必填(ind_pres: "4"
  • 需要 CSC(纳税人安全码)用于生成二维码

认证

所有 NFC-e 接口使用与主 API 相同的认证方式:

请求头类型说明
tokenstring企业令牌(注册时获取)
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒),5分钟有效窗口
重要: 计算 sign 时,GET 请求的 path 需要包含查询字符串。例如:/api/nfce/category/get_detail?category_id=TF123。POST 请求的 path 仅为路径(如:/api/nfce/company/create)。

compare_arrows NFe 与 NFC-e — 集成商需要了解什么?

如果您已经集成了 NFe(模型55),那么集成 NFC-e(模型65) 非常类似。 以下是您需要了解的关键差异。

apartment 企业注册

方面NFe /api/company/createNFC-e /api/nfce/company/create
基本字段 cnpj、name、alias、ie、invoice_type、地址、数字证书 与 NFe 相同 — 相同的必填字段
CSC 不使用 必填csc_idcsc(从 SEFAZ 门户获取)
系列号 / 编号 serienumber serie_nfcenumber_nfce — 与 NFe 独立编号
返回的令牌 相同的 token — 如果企业已存在,NFC-e 字段将自动添加
提示: 如果企业已注册 NFe,只需使用相同的 CNPJ 调用 /api/nfce/company/create。 系统会识别已有企业并添加 NFC-e 字段(CSC、系列号、编号)。token 保持不变。

receipt_long 发票开具

方面NFe /api/invoice/createNFC-e /api/nfce/create
收件人 始终必填(CNPJ/CPF、姓名、完整地址) 现场销售可选;仅送货上门时必填ind_pres: "4"
在场指示符 不使用 必填ind_pres"1" 现场,"4" 送货上门
计算的税种 ICMS、PIS、COFINS、IPI、DIFAL(跨州) ICMS、PIS、COFINS — 无 IPI、无 DIFAL(始终州内交易)
CFOP 不固定(5xxx 州内、6xxx 跨州) 始终为 5xxx(州内交易)— 例如:5102
支付信息 可选 必填pag_info 包含支付方式(现金、PIX、银行卡等)
产品字段 相同 — 相同结构(codigo、name、ncm、count、unit、unit_price、total_price、category_id、cfop、origem)
取消 24小时内 30分钟内(各州不同)
DANFE A4 PDF 热敏小票(80mm纸卷)带二维码
总结: 如果您已集成 NFe,集成 NFC-e 只需:
  1. 注册企业的 CSC(/api/nfce/company/create
  2. 将开票接口切换为 /api/nfce/create
  3. 在请求体中添加 ind_prespag_info
  4. 移除 IPI/DIFAL 相关数据(如有)
POST /api/nfce/company/create
注册 NFC-e 公司

注册(或更新)用于 NFC-e 开票的公司。公司名称、IE、地址和其他数据通过 SintegraWS 从 CNPJ 自动提取。如果 CNPJ 已存在于用户中,则更新 NFC-e 字段并返回现有公司。

必需请求头

请求头类型说明
tokenstring分销商令牌(b2b)
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
cnpj *string开票公司 CNPJ
cert_file *stringA1 数字证书(.pfx 或 .p12)的 HTTPS URL
cert_pwd *string证书密码
csc_id *stringSEFAZ 的 CSC(纳税人安全代码)ID
csc *stringCSC 令牌(与 SEFAZ 共享的密钥)
serie_nfceintNFC-e 系列
number_nfceintNFC-e 初始编号
telefonestring公司电话

* 必填字段。其他数据(名称、IE、地址等)通过 SintegraWS 从 CNPJ 自动提取。

载荷示例

        {
          "cnpj": "12345678000199",
          "cert_file": "https://example.com/cert.pfx",
          "cert_pwd": "senha_do_certificado",
          "csc_id": "000001",
          "csc": "ABCDEF0123456789",
          "serie_nfce": 1,
          "number_nfce": 1,
          "telefone": "11999999999"
        }

响应

        {
          "success": true,
          "message": "NFC-e 公司已注册",
          "data": {
            "company_id": "comp_789012",
            "token": "eyJhbGciOiJIUzI1NiIs..."
          }
        }
POST /api/nfce/company/update
更新 NFC-e 公司数据

更新由 token 请求头标识的 NFC-e 公司。Body 中所有字段都是可选的 — 只发送要修改的字段。更新 cep 时,系统自动解析 stateCodeibge。当 cert_filecert_pwd 一起发送时,证书在保存前会经过验证。

必需请求头

请求头类型说明
tokenstringNFC-e 公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body(所有字段可选 — 至少发送 1 个)

字段类型说明
标识
namestring公司名称
aliasstring商号
iestring州注册号
invoice_typestring税务制度
emailstring电子邮件
telefonestring电话
地址
cepstring邮政编码(自动更新 stateCodeibge
addressstring街道地址
house_numberstring门牌号
complementostring补充
townstring街区
citystring城市
statestringUF
NFC-e
csc_idstringCSC ID
cscstringCSC 令牌
serie_nfceint系列
number_nfceint下一个编号
cert_filestring新 A1 证书(.pfx 或 .p12)的 HTTPS URL
cert_pwdstring证书密码

Body 中至少 1 个字段必填。CNPJ 不可修改。

载荷示例

        {
          "alias": "Centro Store - Branch 02",
          "telefone": "11988888888",
          "serie_nfce": 2,
          "number_nfce": 1
        }

响应

        {
          "success": true,
          "message": "NFC-e 公司已成功更新"
        }
POST /api/nfce/company/get
查询 NFC-e 公司

返回由 token 请求头标识的 NFC-e 公司数据。注意:方法是 POST,但 body 中无字段 — 公司仅通过令牌解析。

必需请求头

请求头类型说明
tokenstringNFC-e 公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

为空。可以发送 {}

响应

        {
          "success": true,
          "data": {
            "company_id": "comp_789012",
            "cnpj": "12345678000199",
            "name": "Empresa Exemplo LTDA",
            "alias": "Centro Store",
            "ie": "123456789",
            "invoice_type": "simples_nacional",
            "email": "contact@company.com",
            "telefone": "11999999999",
            "cep": "01001000",
            "address": "Example Street",
            "house_number": "100",
            "complemento": "Room 5",
            "town": "Centro",
            "city": "São Paulo",
            "state": "SP",
            "state_code": "SP",
            "cert_file": "https://example.com/cert.pfx",
            "csc_id": "000001",
            "csc": "ABCDEF0123456789",
            "serie_nfce": 1,
            "number_nfce": 42
          }
        }

NFC-e 税种管理

税种定义了NFC-e开票时应用于产品的税务规则。与NFe不同,NFC-e仅适用于州内销售,因此结构更加简化:每种税只需一个对象,无需多个场景。

注意: NFC-e税种与NFe税种分开存储。每个税种包含ICMS、PIS、COFINS和IBS/CBS配置。本节所有接口均需在header中传入 tokensigntimestamp
POST /api/nfce/category/create
创建 NFC-e 税务类目

创建一个 NFC-e 税务类目。每个类目只有单一场景(州内出库),ICMS、PIS、COFINS 和 IBS/CBS 使用扁平对象(不是数组,因为 NFC-e 不允许单一类目下有多个场景)。不包含 IPI。

必需请求头

请求头类型说明
tokenstringNFC-e 企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body(根)

字段类型说明
descricao *string类目描述
codigo_cfop *stringCFOP 代码(如 5102、5405)
icms *objectICMS 配置(扁平对象)
pis *objectPIS 配置(扁平对象)
cofins *objectCOFINS 配置(扁平对象)
ibs_cbsobjectIBS/CBS 配置(税制改革,可选)

icms

字段类型说明
situacao_tributaria *stringCST/CSOSN(如 102、500)
aliquota_reducaodecimal计税基础减免百分比
motivo_desoneracaostring免税理由代码
aliquota_icmsarray各州税率:[{ "estado": "SP", "aliquota": 18.00 }]
aliquota_fcparray各州 FCP:[{ "estado": "SP", "aliquota": 0.00 }]
beneficio_fiscalarray各州税收优惠:[{ "estado": "SP", "codigo": "SP800001" }]

pis / cofins

字段类型说明
situacao_tributaria *stringPIS/COFINS 的 CST
aliquota *string百分比税率(如 "0.00"、"1.65"、"7.60")

ibs_cbs(可选)

字段类型说明
situacao_tributaria *stringIBS/CBS 的 CST
classificacao_tributaria *string税务分类代码

* 必填字段。

请求示例

        {
          "descricao": "Bebidas não alcoólicas",
          "codigo_cfop": "5102",
          "icms": {
            "situacao_tributaria": "102",
            "aliquota_icms": [
              { "estado": "SP", "aliquota": 18.00 }
            ]
          },
          "pis": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "cofins": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "ibs_cbs": {
            "situacao_tributaria": "000",
            "classificacao_tributaria": "000001"
          }
        }

响应

        {
          "success": true,
          "data": {
            "category_id": "TF00001"
          }
        }
GET /api/nfce/category/get_detail
获取 NFC-e 税务类目详情

返回 NFC-e 税务类目的完整数据(描述、CFOP、ICMS、PIS、COFINS 和 IBS/CBS)。

必需请求头

请求头类型说明
tokenstringNFC-e 企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

查询参数

字段类型说明
category_id *stringNFC-e 类目 ID

* 必填字段。

请求示例

GET /api/nfce/category/get_detail?category_id=TF00001

响应

        {
          "success": true,
          "data": {
            "category_id": "TF00001",
            "descricao": "Bebidas não alcoólicas",
            "codigo_cfop": "5102",
            "icms": {
              "situacao_tributaria": "102",
              "aliquota_icms": [
                { "estado": "SP", "aliquota": 18.00 }
              ],
              "aliquota_fcp": [
                { "estado": "SP", "aliquota": 0.00 }
              ],
              "beneficio_fiscal": [
                { "estado": "SP", "codigo": "SP800001" }
              ]
            },
            "pis": {
              "situacao_tributaria": "99",
              "aliquota": "0.00"
            },
            "cofins": {
              "situacao_tributaria": "99",
              "aliquota": "0.00"
            },
            "ibs_cbs": {
              "situacao_tributaria": "000",
              "classificacao_tributaria": "000001"
            }
          }
        }
GET /api/nfce/category/get_list
NFC-e 税务类目列表

返回已认证企业下注册的 NFC-e 税务类目的分页列表。

必需请求头

请求头类型说明
tokenstringNFC-e 企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

查询参数

字段类型说明
page *int页码(最小 1)
page_size *int每页条数(1~50)

* 必填字段。

请求示例

GET /api/nfce/category/get_list?page=1&page_size=20

响应

        {
          "success": true,
          "data": {
            "list": [
              { "category_id": "TF00001", "descricao": "Bebidas não alcoólicas" },
              { "category_id": "TF00002", "descricao": "Alimentos industrializados" }
            ],
            "page": 1,
            "total": 2,
            "total_pages": 1
          }
        }
POST /api/nfce/category/edit
编辑 NFC-e 税务类目
注意:/api/nfce/category/create 端点结构相同,但增加了必填字段 category_idicmspiscofinsibs_cbs 字段会被整体替换(不合并)。

必需请求头

请求头类型说明
tokenstringNFC-e 企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

额外字段

字段类型说明
category_id *string待编辑的类目 ID

* 必填字段。

请求示例

        {
          "category_id": "TF00001",
          "descricao": "Bebidas não alcoólicas — atualizado",
          "codigo_cfop": "5102",
          "icms": {
            "situacao_tributaria": "102",
            "aliquota_icms": [
              { "estado": "SP", "aliquota": 18.00 }
            ]
          },
          "pis": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "cofins": {
            "situacao_tributaria": "99",
            "aliquota": "0.00"
          },
          "ibs_cbs": {
            "situacao_tributaria": "000",
            "classificacao_tributaria": "000001"
          }
        }

响应

        {
          "success": true,
          "data": {
            "category_id": "TF00001"
          }
        }
POST /api/nfce/category/delete
删除 NFC-e 税务类别

删除 NFC-e 税务类别。不可逆操作。绑定到此类别的产品仍会引用已删除的 category_id — 请先更新它们。

必需请求头

请求头类型说明
tokenstringNFC-e 公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
category_id *string要删除的 NFC-e 类别 ID

* 必填字段。

载荷示例

        {
          "category_id": "TF123"
        }

响应

        {
          "success": true
        }
POST /api/nfce/create
开具 NFC-e

开具 NFC-e(模型 65,始终为州内出库,无运输)。与 NFe 端点的主要区别:消费者对象名为 client(不是 cliente);地址号为 client.number;消费者为可选;不存在 impostos.ipishipping_addressdelivery_addresstransportationpag_info 中的金额字段名为 amount

必需请求头

请求头类型说明
tokenstringNFC-e 企业 token
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

Body(根)

字段类型说明
nature_of_operation *string操作性质(如 "商品销售")
issuance_type *string开具类型:"1"(正常)、"9"(NFC-e 离线应急)
ambiente *string"1" 生产、"2" 同源
products *array商品列表(详见下文)
idstring外部标识符
ind_presstring买家出席:"1" 现场(默认)、"4" 上门配送、"5" 经营场所外现场、"9" 不适用
ind_intermedstring"0" 无中介、"1" 市场平台。当 ind_pres = 2、3、4 时必填
total_discount_amountdecimal发票总折扣
trocodecimal找零金额
segurodecimal保险金额
outras_despesasdecimal其他附加费用
informacoes_complementaresstring给消费者的补充信息
informacoes_fiscostring给税务机关的信息
clientobject消费者数据(可选 — 见表格)
pag_infoarray付款(默认:现金 — 见表格)

client(可选)

仅在消费者已识别时填写。CPF 或 CNPJ 仅传数字。

字段类型说明
cpfstringCPF(设定为自然人)
cnpjstringCNPJ(法人)
iestring州登记号
namestring姓名 / 法人名称
enderecostring街道
numberstring地址号 (注意:与 NFe 不同,NFe 使用 numero)
complementostring补充
bairrostring街区
citystring城市
ufstring州(若提供 CEP 则验证)
cepstring邮政编码(仅数字)
telefonestring电话
emailstring电子邮箱

products[](每项)

字段类型说明
name *string商品名称(CJK 字符会被剥离)
ncm *stringNCM(8 位)
count *decimal数量
unit *string商业单位(如 "UN"、"KG")
unit_price *decimal单价
total_price *decimal项目总金额
origem *int商品原产地(0..8)
indicador_total *int1 = 计入发票总额;0 = 不计入
category_id ⚠stringNFC-e 税务类目 ID(未发送 impostos 时必填)
impostos ⚠object手动税(category_id 的替代,无 IPI)
tax_info ⚠objectimpostos 的别名(结构相同)。仅在 impostos 缺失时使用
codigostring内部商品代码
ceststringCEST
gtinstring商业 GTIN/EAN
gtin_tributavelstring应税 GTIN
discount_pricedecimal项目折扣
nItemPedint采购订单项目 (I61)。从根 id 取得的 xPed 所引用订单内的项目顺序号。有效范围: 1–999999。默认: 省略。

pag_info[](每项)

字段类型说明
payment_indicator *string"0" 现付、"1" 赊账
payment_method *string付款方式(01=现金、03=信用卡、04=借记卡、17=PIX、99=其他 等)
amountdecimal此方式支付的金额
card_info.integration_typestring"1" 集成、"2" 未集成(卡 03/04 时必填)
card_info.brand_codestring卡品牌(卡 03/04 时必填)
card_info.acquirer_cnpjstring收单方 CNPJ
card_info.authorization_codestring授权代码

* 必填字段。⚠ category_idimpostostax_info 三选一,必填。

简化示例

{
  "nature_of_operation": "Venda de mercadoria",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_pres": "1",
  "client": {
    "cpf": "12345678909",
    "name": "Consumidor Final"
  },
  "products": [
    {
      "name": "Refrigerante 2L",
      "ncm": "22021000",
      "count": 2,
      "unit": "UN",
      "unit_price": 10.50,
      "total_price": 21.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001"
    }
  ],
  "pag_info": [
    {
      "payment_indicator": "0",
      "payment_method": "17",
      "amount": 21.00
    }
  ]
}

完整示例(所有字段)

{
  "id": "PEDIDO-2026-0001",
  "nature_of_operation": "Venda de mercadoria",
  "issuance_type": "1",
  "ambiente": "2",
  "ind_pres": "1",
  "ind_intermed": "0",
  "total_discount_amount": 0.00,
  "troco": 0.00,
  "seguro": 0.00,
  "outras_despesas": 0.00,
  "informacoes_complementares": "Pedido entregue na loja",
  "informacoes_fisco": "ICMS recolhido conforme legislação",
  "client": {
    "cpf": "12345678909",
    "cnpj": "",
    "ie": "",
    "name": "Consumidor Final",
    "endereco": "Rua das Flores",
    "number": "100",
    "complemento": "Sala 5",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01001000",
    "telefone": "11999998888",
    "email": "cliente@exemplo.com"
  },
  "products": [
    {
      "codigo": "PROD001",
      "name": "Refrigerante 2L",
      "ncm": "22021000",
      "cest": "0300100",
      "gtin": "7891234567890",
      "gtin_tributavel": "7891234567890",
      "count": 2,
      "unit": "UN",
      "unit_price": 10.50,
      "total_price": 21.00,
      "discount_price": 0.00,
      "origem": 0,
      "indicador_total": 1,
      "category_id": "TF00001",
      "nItemPed": 1
    },
    {
      "codigo": "PROD002",
      "name": "Salgadinho 100g",
      "ncm": "19053100",
      "count": 1,
      "unit": "UN",
      "unit_price": 8.00,
      "total_price": 8.00,
      "origem": 0,
      "indicador_total": 1,
      "impostos": {
        "icms": {
          "codigo_cfop": "5102",
          "situacao_tributaria": "102",
          "industria": "",
          "tipo_pessoa": "juridica"
        },
        "pis": {
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "cofins": {
          "situacao_tributaria": "99",
          "aliquota": "0.00",
          "tipo_pessoa": "juridica"
        },
        "ibs_cbs": {
          "situacao_tributaria": "000",
          "tipo_pessoa": "juridica",
          "classificacao_tributaria": "000001"
        }
      }
    }
  ],
  "pag_info": [
    {
      "payment_indicator": "0",
      "payment_method": "03",
      "amount": 24.00,
      "card_info": {
        "integration_type": "1",
        "brand_code": "01",
        "acquirer_cnpj": "01234567000189",
        "authorization_code": "AUTH123456"
      }
    }
  ]
}

响应

        {
          "success": true,
          "data": {
            "uuid": "abc123...",
            "chave": "35..."
          }
        }
POST /api/nfce/cancel
取消 NFC-e

取消已授权的 NFC-e。与 NFe 不同,这里取消原因由客户提供并转发给 SEFAZ。SEFAZ 取消窗口很短(通常授权后 15-30 分钟)。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
chave *stringNFC-e 的 44 位访问密钥(注意:这里是 chave,而非其他端点中的 uuid
motivo *string取消理由(SEFAZ 要求最少 15 个字符)

* 必填字段。

载荷示例

        {
          "chave": "35210112345678901234650010000000051234567890",
          "motivo": "Cancelamento por erro de operacao do caixa"
        }
GET /api/nfce/get_detail
查询 NFC-e 详情

通过 UUID 返回特定 NFC-e 的详情。包括 XML 和 DANFE(热敏小票)的 URL,以及提供时的客户数据。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名(path 包含查询字符串)
timestampstring秒级 Unix 时间戳

查询字符串

参数类型说明
uuid *stringNFC-e UUID

* 必填字段。

调用示例

GET /api/nfce/get_detail?uuid=65f8b9a1c2d3e4f5a6b7c8d9

响应

        {
          "success": true,
          "data": {
            "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
            "chave": "35210112345678901234650010000000051234567890",
            "serie": 1,
            "number": 5,
            "status": "Authorized",
            "modelo": "nfce",
            "total_price": 145.90,
            "nprot": "135210000123456",
            "motivo": "",
            "xml": "https://oss.example.com/.../chave.xml",
            "danfe": "https://oss.example.com/.../chave_nfce.pdf",
            "client_cpf": "12345678909",
            "client_cnpj": "",
            "client_name": "Cliente",
            "create": "2024-01-10T10:30:00Z",
            "issue_time": "2024-01-10T10:31:00Z"
          }
        }
POST /api/nfce/get_danfe
生成 / 获取 NFC-e DANFE(热敏小票)

返回 NFC-e DANFE(电子财政小票)的 PDF URL,包含用于 SEFAZ 查询的 QR 码。按需生成并按哈希(访问密钥 + 状态)缓存;重复调用返回现有 URL。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
uuid *stringNFC-e UUID(注意:这里是 uuid,与 cancel 使用的 chave 不同)

* 必填字段。

载荷示例

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }

响应

        {
          "success": true,
          "data": {
            "danfe": "https://oss.example.com/.../chave_nfce.pdf"
          }
        }

codeNFC-e 完整示例

示例 1 — 现场销售(无收件人)

{
  "nature_of_operation": "Venda de mercadoria", "ambiente": "2", "ind_pres": "1",
  "products": [{ "codigo": "001", "name": "Refrigerante 350ml", "ncm": "22021000", "count": 3,
    "unit": "UN", "unit_price": 5.50, "total_price": 16.50, "category_id": "BEVERAGES",
    "origem": "0", "indicador_total": "1", "cfop": "5102" }],
  "pag_info": [{ "payment_indicator": "0", "payment_method": "17" }]
}

示例 2 — 送货上门(含收件人)

{
  "nature_of_operation": "Venda de mercadoria", "ambiente": "2", "ind_pres": "4",
  "client": { "cpf": "12345678900", "name": "Maria Silva", "endereco": "Rua das Flores",
    "number": "456", "bairro": "Jardim Primavera", "city": "São Paulo", "uf": "SP", "cep": "04567000" },
  "products": [{ "codigo": "PIZZA01", "name": "Pizza Grande Marguerita", "ncm": "19059090", "count": 1,
    "unit": "UN", "unit_price": 45.90, "total_price": 45.90, "category_id": "FOOD",
    "origem": "0", "indicador_total": "1", "cfop": "5102" }],
  "pag_info": [{ "payment_indicator": "0", "payment_method": "03" }],
  "frete": 8.00, "informacoes_complementares": "Entrega em até 40 minutos"
}

tune NFe 调整 / 补充

补充NFe和调整NFe是为了更正已授权发票的税务值而开具的新发票。 与CC-e不同(CC-e仅更正登记信息),这些发票允许修改税额、数量和价格。

补充NFe(finalidade = 2):
  • 用于增加在原始发票中申报不足的金额
  • 价格补充、数量或税额的补充
  • 例如:开具了ICMS为12%的发票,但正确税率为18% — 开具补充发票补差额
调整NFe(finalidade = 3):
  • 用于法规规定的各种税务调整
  • 库存调整、税收抵免转移、税务合规化
  • 例如:ICMS核算调整、分支机构之间的税收抵免转移
重要:
  • 两者都是新发票 — 生成新的访问密钥和新编号
  • 必须通过 ref_nfe_chave 字段引用原始发票(44位密钥)
  • 原始发票必须已授权
  • 每张消耗1个额度(与正常开票相同)

认证

使用与NFe开票相同的接口和认证方式:

Header类型描述
token string 企业令牌(注册时获取)
sign string MD5签名:MD5(token + path + body + timestamp)
timestamp string Unix时间戳(秒)(5分钟窗口)

description NFS-e - 电子服务发票

NFS-e API 允许开具、取消和查询电子服务发票。系统自动检测公司所在城市并路由到正确的 API:

  • 圣保罗 (SP) - 通过 Nota Fiscal Paulistana (SOAP) 开具
  • 其他城市 - 通过国家 API (ADN/SEFIN) 开具

集成方无需担心使用哪个 API - 只需发送数据,系统会根据公司注册的城市 IBGE 代码自动路由。

端点方法描述
/api/nfse/createPOST开具 NFS-e
/api/nfse/cancelPOST取消 NFS-e
/api/nfse/get_danfsePOST获取 DANFSE (PDF)
/api/nfse/get_xmlPOST下载 XML
POST /api/nfs/company/create
注册企业以开具 NFS-e

注册(或更新)用于 NFS-e 开具的企业。如果该 CNPJ 已存在于用户下,则仅更新 NFS-e 字段和证书;否则创建新企业并返回专用 token。注意路径:/api/nfs/...(无 "e"),与其他 NFS-e 端点不同。

必需请求头

请求头类型说明
tokenstring集成商 B2B token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body

字段类型说明
cnpj *string企业 CNPJ(仅数字)
name *string法人名称
cep *string邮政编码(仅数字)
address *string街道
house_number *string地址号
town *string街区
city *string城市
state *string州(2 位,如 "SP")
cert_file *stringA1 数字证书(.pfx)的 URL
cert_pwd *string数字证书密码
im *string市政登记号(Inscrição Municipal)
codigo_municipio_nfse *string开具市政的 IBGE 代码
codigo_servico_nfse *string默认服务代码(LC 116)
aliasstring商号
iestring州登记号
invoice_typestring税务体制
unitstring单位 / 分支
emailstring联系邮箱
telefonestring电话
complementostring地址补充
cnae_nfsestring默认活动 CNAE
serie_nfseintNFS-e 初始序列
number_nfseintNFS-e 初始编号
regime_especial_tributacaoint特殊税制代码
optante_simples_nacionalbool是否加入 Simples Nacional

* 必填字段。

请求示例

        {
          "cnpj": "43649380000100",
          "name": "Empresa Exemplo LTDA",
          "alias": "示例",
          "ie": "ISENTO",
          "invoice_type": "simples_nacional",
          "email": "contact@example.com",
          "telefone": "11999999999",
          "cep": "03027020",
          "address": "示例街",
          "house_number": "86",
          "complemento": "2 楼",
          "town": "中心",
          "city": "São Paulo",
          "state": "SP",
          "cert_file": "https://storage.example.com/cert.pfx",
          "cert_pwd": "senha-do-certificado",
          "im": "12345678",
          "codigo_municipio_nfse": "3550308",
          "codigo_servico_nfse": "07498",
          "cnae_nfse": "6201501",
          "serie_nfse": 1,
          "number_nfse": 1,
          "regime_especial_tributacao": 0,
          "optante_simples_nacional": true
        }

响应

        {
          "success": true,
          "message": "Empresa cadastrada para NFS-e",
          "data": {
            "company_id": 12345,
            "token": "token-dedicado-da-empresa"
          }
        }

注意: 返回的 token 必须在其他 NFS-e 调用(/api/nfse/create/cancel/get_danfse/get_xml)中使用。如果企业已存在,消息将为 "Empresa atualizada para NFS-e",返回的 token 是现有 token。

POST /api/nfse/create
开具 NFS-e

必需请求头

请求头类型描述
tokenstring公司令牌
signstringMD5 签名: MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒)(5分钟窗口)

请求体

{
  "ambiente": "1",
  "id": "REF-001",
  "descricao_servico": "Desenvolvimento de sistemas",
  "valor_servico": 10000.00,
  "aliquota_iss": 2.90,
  "iss_retido": false,
  "codigo_servico": "",
  "cnae": "",
  "valor_deducoes": 0,
  "desconto_incondicionado": 0,
  "desconto_condicionado": 0,
  "valor_iss": 0,
  "valor_pis": 0,
  "valor_cofins": 0,
  "valor_inss": 0,
  "valor_ir": 0,
  "valor_csll": 0,
  "tomador": {
    "cnpj": "43649380000100",
    "cpf": "",
    "name": "EMPRESA TOMADORA LTDA",
    "email": "contato@empresa.com",
    "telefone": "11999999999",
    "inscricao_municipal": "",
    "cep": "03027020",
    "endereco": "Rua Exemplo",
    "numero": "86",
    "complemento": "Andar 2",
    "bairro": "Centro",
    "city": "Sao Paulo",
    "uf": "SP",
    "codigo_municipio": "3550308"
  }
}

主要字段

字段类型描述
ambientestring"1" = 生产环境, "2" = 测试环境
idstring外部参考 ID(可选)
descricao_servicostring服务描述(必填)
valor_servicodecimal服务总金额(R$)(必填)
aliquota_issdecimalISS 税率(%)(例:2.90)
iss_retidobooleanfalse = 未代扣, true = 由付款方代扣
valor_issdecimalISS 值覆盖。如果大于 0,覆盖自动计算 (base_calculo × aliquota_iss ÷ 100)。默认:自动计算
codigo_servicostring服务代码。留空则使用公司默认值
cnaestringCNAE。留空则使用公司默认值
tomadorobject服务接受方数据(必填)

付款方字段

字段类型描述
cnpjstring付款方 CNPJ(仅数字)
cpfstring付款方 CPF(使用 cnpj 或 cpf)
namestring名称/公司名(必填)
emailstring付款方邮箱
telefonestring电话
cepstring邮编(必填)
enderecostring地址(必填)
numerostring门牌号(必填)
complementostring补充地址
bairrostring街区(必填)
citystring城市
ufstring州(2位)
codigo_municipiostringIBGE 城市代码

成功响应

{
  "success": true,
  "data": {
    "_id": "661234abcdef...",
    "uuid": "guid-unico",
    "status": "autorizada",
    "nfse": "48",
    "serie": 1,
    "chave": "Z685RI9C",
    "codigoVerificacao": "Z685RI9C",
    "modelo": "nfse",
    "tipoEmissao": "paulistana",
    "danfse": "https://nfe.prefeitura.sp.gov.br/contribuinte/notaprintpdf.aspx?..."
  }
}
POST /api/nfse/cancel
取消 NFS-e

必需请求头

请求头类型描述
tokenstring公司令牌
signstringMD5 签名
timestampstringUnix 时间戳(秒)

请求体

{
  "chave": "Z685RI9C",
  "motivo": "Cancelamento da NFS-e por erro na emissao"
}

字段

字段类型描述
chavestringNFS-e 验证码(必填)
motivostring取消原因(必填,最少15个字符)

成功响应

{
  "success": true,
  "message": "Nota de servico cancelada com sucesso"
}
POST /api/nfse/get_danfse
获取 DANFSE (PDF)

必需请求头

请求头类型描述
tokenstring公司令牌
signstringMD5 签名
timestampstringUnix 时间戳(秒)

请求体

{
  "chave": "Z685RI9C"
}

字段

字段类型描述
chavestringNFS-e 验证码(必填)

响应

{
  "success": true,
  "data": {
    "danfse": "https://nfe.prefeitura.sp.gov.br/contribuinte/notaprintpdf.aspx?..."
  }
}

注意: 对于 Paulistana (SP),返回市政厅的 PDF 直接 URL。对于国家 API,返回 base64 格式的 PDF。

POST /api/nfse/get_xml
下载 NFS-e XML

必需请求头

请求头类型描述
tokenstring公司令牌
signstringMD5 签名
timestampstringUnix 时间戳(秒)

请求体

{
  "chave": "Z685RI9C"
}

字段

字段类型描述
chavestringNFS-e 验证码(必填)

响应

{
  "success": true,
  "data": {
    "dpsXml": "<PedidoEnvioRPS>...</PedidoEnvioRPS>",
    "nfseXml": "<RetornoEnvioRPS>...</RetornoEnvioRPS>"
  }
}

dpsXml: 发送到市政厅/ADN 的 XML。 nfseXml: 包含开具结果的返回 XML。

POST /api/invoice/create
开具补充NFe(finalidade = 2)

必填请求头

Header类型描述
tokenstring企业令牌
signstringMD5签名:MD5(token + path + body + timestamp)
timestampstringUnix时间戳(秒)(5分钟窗口)

Payload

{
  "finalidade": "2",
  "ref_nfe_chave": "CHAVE_NFE_AQUI",
  "nature_of_operation": "Complemento de preço",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "ind_final": "1",
  "ind_pres": "2",
  "cliente": {
    "cpf": "264.438.800-72",
    "name": "Nome do Destinatário",
    "endereco": "Rua Example",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "indIEDest": "9"
  },
  "products": [
    {
      "codigo": "001",
      "name": "Complemento de valor - Produto X",
      "ncm": "82100090",
      "count": 1,
      "unit": "UN",
      "unit_price": 5.00,
      "total_price": 5.00,
      "category_id": "SEU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1",
      "cfop": "5102"
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}

特定字段

字段类型描述
finalidadestring"2" 表示补充(必填)
ref_nfe_chavestring原始发票访问密钥 — 44位(必填)
说明: 其余字段与 /api/invoice/create 正常开票接口的格式相同。请参阅NFe开票文档了解所有字段的详细信息。
付款: 在补充发票中,付款方式通常为 "90"(无付款),因为这仅是税务值的补充。

成功响应

{
  "success": true,
  "data": {
    "uuid": "a1b2c3d4-e5f6-...",
    "chave": "35260312345678000195550010000004051234567890",
    "status": "Success",
    "motivo": "Autorizado o uso da NF-e",
    "nfe": 405,
    "serie": 1,
    "danfe": "https://storage.../danfe.pdf",
    "xml": "https://storage.../xml.xml"
  }
}
POST /api/invoice/create
开具调整NFe(finalidade = 3)

必填请求头

Header类型描述
tokenstring企业令牌
signstringMD5签名:MD5(token + path + body + timestamp)
timestampstringUnix时间戳(秒)(5分钟窗口)

Payload

{
  "finalidade": "3",
  "ref_nfe_chave": "CHAVE_NFE_AQUI",
  "nature_of_operation": "Ajuste fiscal",
  "transaction_type": "1",
  "model": "55",
  "issuance_type": "1",
  "ambiente": "1",
  "ind_final": "1",
  "ind_pres": "2",
  "cliente": {
    "cpf": "264.438.800-72",
    "name": "Nome do Destinatário",
    "endereco": "Rua Example",
    "number": "100",
    "bairro": "Centro",
    "city": "São Paulo",
    "uf": "SP",
    "cep": "01310100",
    "indIEDest": "9"
  },
  "products": [
    {
      "codigo": "001",
      "name": "Ajuste fiscal - Regularização",
      "ncm": "82100090",
      "count": 1,
      "unit": "UN",
      "unit_price": 0.01,
      "total_price": 0.01,
      "category_id": "SEU_CATEGORY_ID",
      "origem": "0",
      "indicador_total": "1",
      "cfop": "5949"
    }
  ],
  "pag_info": [
    {
      "payment_method": "90",
      "payment_indicator": "0"
    }
  ]
}

特定字段

字段类型描述
finalidadestring"3" 表示调整(必填)
ref_nfe_chavestring原始发票访问密钥 — 44位(必填)
可用的 finalidade 值:
描述
1正常(默认)
2补充
3调整
4退货
补充与调整的区别:
  • 补充(2): 补充原始发票的金额(价格、税额、申报不足的数量)
  • 调整(3): 法规规定的税务调整(合规化、税收抵免转移、库存调整)

edit_note CC-e — 电子更正函

CC-e(电子更正函)是附加在NF-e上的事件,允许更正已授权发票的信息, 但不能修改税务值。依据 Ajuste SINIEF 01/07 规范。

可以通过CC-e更正的内容:
  • 收件人或发件人的地址
  • 收件人的公司名称(不更改CNPJ/CPF)
  • 税务操作代码(CFOP),前提是不改变税种
  • 商品描述
  • 附加数据和补充信息
不能通过CC-e更正的内容:
  • 税务值(计税基数、税率、税额)
  • 商品的数量和金额
  • 发件人或收件人的CNPJ/CPF
  • 影响税款计算的数据
规则:
  • 只有状态为已授权(Success)的发票才能接收CC-e
  • 更正文本必须在15到1000个字符之间
  • 同一张发票最多可以发送20个CC-e
  • 每个CC-e消耗1个额度

认证

所有CC-e接口使用与主API相同的认证方式:

Header类型描述
token string 企业令牌(注册时获取)
sign string MD5签名:MD5(token + path + body + timestamp)
timestamp string Unix时间戳(秒)(5分钟窗口)
POST /api/invoice/cce/send
发送更正函(CC-e)

向 SEFAZ 发送 CC-e(事件 110110),以更正已授权的 NF-e 的数据。序列号(nSeqEvento)会自动计算 — 请勿发送。只能更正非财务数据(不能更正金额、CNPJ、IE 等)。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
uuidstringNF-e UUID(如果没有 chave 则必填)
chavestringNF-e 的 44 位访问密钥(如果没有 uuid 则必填)
correcao *string更正文本(SEFAZ 限制:15–1000 个字符)

* 必填字段。uuidchave 至少一个也必填。

载荷示例

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9",
          "correcao": "Corrigir nome do destinatario para Empresa XYZ LTDA"
        }

响应

        {
          "success": true,
          "data": {
            "nProt": "135210000123456",
            "nSeqEvento": 1,
            "xml": "https://oss.example.com/.../cce.xml"
          }
        }
POST /api/invoice/cce/get_list
列出 NF-e 的 CC-e

返回特定 NF-e 发出的所有 CC-e(更正函),按从最新到最旧排序。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
uuidstringNF-e UUID(如果没有 chave 则必填)
chavestringNF-e 的 44 位访问密钥(如果没有 uuid 则必填)

uuidchave 至少一个必填。

载荷示例

        {
          "uuid": "65f8b9a1c2d3e4f5a6b7c8d9"
        }

响应

        {
          "success": true,
          "data": {
            "items": [
              {
                "id": "65fa1b2c3d4e5f6a7b8c9d0e",
                "detail": "Corrigir nome do destinatario para Empresa XYZ LTDA",
                "nProt": "135210000123456",
                "nSeqEvento": 1,
                "date": "15/01/2024 14:30:00",
                "pdfUrl": "https://oss.example.com/.../cce_seq1.pdf",
                "xmlUrl": "https://oss.example.com/.../cce.xml"
              }
            ],
            "total": 1
          }
        }
POST /api/invoice/cce/download_pdf
下载 CC-e PDF

返回 CC-e 的 PDF URL。PDF 在首次调用时按需生成(从发票 XML + CC-e XML 渲染)并存储在 OSS 中;后续调用返回现有 URL。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
cce_id *string/api/invoice/cce/get_listid 字段返回的 CC-e ID(ObjectId)

* 必填字段。

载荷示例

        {
          "cce_id": "65fa1b2c3d4e5f6a7b8c9d0e"
        }

响应

        {
          "success": true,
          "data": {
            "url": "https://oss.example.com/.../cce_seq1.pdf"
          }
        }
POST /api/invoice/cce/download_xml
下载 CC-e XML

返回签名后的 CC-e XML URL(在提交到 SEFAZ 后已存储在 OSS 中)。

必需请求头

请求头类型说明
tokenstring开票公司令牌
signstringMD5 签名
timestampstring秒级 Unix 时间戳

Body

字段类型说明
cce_id *string/api/invoice/cce/get_listid 字段返回的 CC-e ID(ObjectId)

* 必填字段。

载荷示例

        {
          "cce_id": "65fa1b2c3d4e5f6a7b8c9d0e"
        }

响应

        {
          "success": true,
          "data": {
            "url": "https://oss.example.com/.../cce.xml"
          }
        }

how_to_reg 收件人表明 (Manifestação do Destinatário)

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

事件类型

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

cStat 返回码

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

必需的头部

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

Payload

{
  "chave": "35260514200166000187550010000000011000000018",
  "cnpj": "14200166000187",
  "tipo_evento": 210210,
  "justificativa": "Operação reconhecida pelo destinatário"
}

字段

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

成功响应

{
  "success": true,
  "message": "data",
  "data": {
    "id": "67341a8f5d4e1f2a3b4c5d6e",
    "chave": "35260514200166000187550010000000011000000018",
    "cnpj": "14200166000187",
    "tipo_evento": 210210,
    "desc_evento": "Ciencia da Operacao",
    "nProt": "135260000123456",
    "cStat": 135,
    "xMotivo": "Evento registrado e vinculado a NF-e",
    "nSeqEvento": 1,
    "xml_url": "https://storage.../manifestacao/13-05-2026/352605...210210_1.xml"
  }
}

响应字段

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

示例 — 带理由的否认(210220)

{
  "chave": "35260514200166000187550010000000011000000018",
  "cnpj": "14200166000187",
  "tipo_evento": 210220,
  "justificativa": "Operação desconhecida pelo destinatário, sem pedido vinculado ao fornecedor informado"
}
POST /api/invoice/manifest/list
列出已发送的表明(历史记录)

必需的头部

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

Payload

{
  "cnpj": "14200166000187",
  "chave": "",
  "start_create_time": "01/05/2026",
  "end_create_time": "31/05/2026",
  "page": 1,
  "page_size": 20
}

字段

字段类型必填说明
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

成功响应

{
  "success": true,
  "message": "成功",
  "data": {
    "total": 2,
    "page": 1,
    "page_size": 20,
    "list": [
      {
        "id": "67341a8f5d4e1f2a3b4c5d6e",
        "chave": "35260514200166000187550010000000011000000018",
        "cnpj": "14200166000187",
        "tipo_evento": 210210,
        "desc_evento": "Ciencia da Operacao",
        "justificativa": "Operação reconhecida pelo destinatário",
        "nProt": "135260000123456",
        "nSeqEvento": 1,
        "cStat": 135,
        "xMotivo": "Evento registrado e vinculado a NF-e",
        "xml_url": "https://storage.../...210210_1.xml",
        "create": "2026-05-13 14:25:33"
      }
    ]
  }
}

响应字段

字段类型说明
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事件的 SEFAZ 协议号
list[].nSeqEventoint事件序列
list[].cStatintSEFAZ 状态码
list[].xMotivostringSEFAZ 描述性返回消息
list[].xml_urlstringOSS 中 procEvento XML 的公共 URL
list[].createstring记录的 UTC 时间戳(格式 yyyy-MM-dd HH:mm:ss
排序:记录按从新到旧排序返回(按 create 降序)。
POST /api/invoice/manifest/get_xml
获取特定表明的 XML URL

必需的头部

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

Payload

{
  "id": "67341a8f5d4e1f2a3b4c5d6e"
}

字段

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

成功响应

{
  "success": true,
  "message": "data",
  "data": {
    "id": "67341a8f5d4e1f2a3b4c5d6e",
    "chave": "35260514200166000187550010000000011000000018",
    "tipo_evento": 210210,
    "xml_url": "https://storage.../manifestacao/13-05-2026/352605...210210_1.xml"
  }
}

常见错误

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

cloud_download DistDFe 捕获 — 接收的 NFe

通过 SEFAZ(国家环境)的 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 — 现在 SEFAZ 返回已表明密钥的 procNFe(完整 XML)
  5. 使用 /received/get_xml 获取 XML URL 并下载/处理
SEFAZ 速率限制:SEFAZ 允许每个 CNPJ 每小时最多调用 1 次 DistDFe。超出则返回 cStat: 656(不当使用)。在测试环境中,此规则更宽松。

DistDFe 返回的 cStat 代码

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

必需的头部

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

Payload

{
  "cnpj": "26638419000167",
  "max_iterations": 50
}

字段

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

成功响应

{
  "success": true,
  "message": "data",
  "data": {
    "cnpj": "26638419000167",
    "uf": "SP",
    "initial_nsu": 0,
    "ult_nsu": 2323,
    "max_nsu": 2323,
    "pending": 0,
    "iterations": 8,
    "last_cstat": 137,
    "last_motivo": "Nenhum documento localizado",
    "stats": {
      "resNFe": 3,
      "procNFe": 4,
      "resEvento": 336,
      "procEvento": 5,
      "skipped": 0
    }
  }
}

响应字段

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

必需的头部

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

Payload

{
  "cnpj": "26638419000167",
  "doc_type": "resNFe",
  "chave": "",
  "emitente_cnpj": "",
  "start_create_time": "01/05/2026",
  "end_create_time": "31/05/2026",
  "page": 1,
  "page_size": 20
}

字段

字段类型必填说明
cnpjstring按收件人 CNPJ(您的 CNPJ)筛选。如省略,将列出用户所有记录
doc_typestring按文档类型筛选:resNFeprocNFeresEventoprocEvento
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

成功响应

{
  "success": true,
  "message": "成功",
  "data": {
    "total": 3,
    "page": 1,
    "page_size": 20,
    "list": [
      {
        "id": "6a04a70d3201b5a62f3ac2f8",
        "nsu": 2318,
        "doc_type": "resNFe",
        "schema": "resNFe_v1.01.xsd",
        "chave": "35260563845920000120550020000085471156822656",
        "cnpj_destinatario": "26638419000167",
        "emitente_cnpj": "63845920000120",
        "emitente_nome": "MEGA ONLINE LTDA",
        "valor": 1.00,
        "dh_emi": "2026-05-13 14:05:35",
        "serie": 0,
        "number": 0,
        "tp_nf": 1,
        "c_sit_nfe": 3,
        "tp_evento": 0,
        "desc_evento": "",
        "n_seq_evento": 0,
        "dh_evento": null,
        "xml_url": "https://storage.../received/13-05-2026/...resNFe_2318.xml",
        "create": "2026-05-13 16:30:05"
      }
    ]
  }
}

响应字段

字段类型说明
totalint符合筛选条件的记录总数
pageint当前页
page_sizeint页大小
list[].idstring内部 ObjectId(在 /received/get_xml 中使用)
list[].nsulongSEFAZ 分配给此文档的 NSU
list[].doc_typestring文档类型:resNFeprocNFeresEventoprocEvento
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 URL

必需的头部

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

Payload

{
  "id": "6a04a70d3201b5a62f3ac2f8"
}

字段

字段类型必填说明
idstring文档的 ObjectId — 由 /received/list 返回

成功响应

{
  "success": true,
  "message": "data",
  "data": {
    "id": "6a04a70d3201b5a62f3ac2f8",
    "nsu": 2318,
    "doc_type": "resNFe",
    "chave": "35260563845920000120550020000085471156822656",
    "xml_url": "https://storage.../received/13-05-2026/...resNFe_2318.xml"
  }
}
关于返回的 XML:
  • resNFe — XML 仅为摘要,不包含产品/税务。用于知悉前的审计/分类
  • procNFe — 完整签名 XML,与开具时生成的相同。可直接导入客户的 ERP
  • procEvento — 带签名和协议的完整事件 XML

常见错误

消息原因
id inválido该值不是有效的 ObjectId
documento recebido não encontradoObjectId 存在但不属于令牌的用户
POST /api/invoice/received/get_sync_status
查询当前 DistDFe 同步状态(不调用 SEFAZ)

必需的头部

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

Payload

{
  "cnpj": "26638419000167"
}

字段

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

响应 — 已同步的公司

{
  "success": true,
  "message": "成功",
  "data": {
    "cnpj": "26638419000167",
    "uf": "SP",
    "ult_nsu": 2323,
    "max_nsu": 2323,
    "pending": 0,
    "last_sync": "2026-05-13 16:30:05"
  }
}

响应 — 从未同步过的公司

{
  "success": true,
  "message": "成功",
  "data": {
    "cnpj": "26638419000167",
    "ult_nsu": 0,
    "max_nsu": 0,
    "pending": 0,
    "last_sync": null
  }
}

响应字段

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

local_shipping MDF-e — 电子税务文档清单

MDF-e API(模型 58,PL-MDFe 3.00 布局)支持运输清单的开具、查询、取消和关闭。MDF-e 聚合与运输操作关联的 NF-e 和/或 CT-e,支持 4 种模式:公路、航空、水路和铁路。所有运营信息(司机、车辆、承包商、CIOT、通行券、付款)都在 /create 主体中 — 开具后没有新增/修改事件。

端点方法说明
/api/mdfe/createPOST开具 MDF-e
/api/mdfe/consultPOST查询 MDF-e 状态
/api/mdfe/cancelPOST取消 MDF-e(授权后 24 小时内)
/api/mdfe/closePOST关闭 MDF-e(行程结束后)
POST /api/mdfe/create
开具 MDF-e

从提交的主体中开具 MDF-e。serienMDFcMDFcDVcUFdhEmimodtpEmisprocEmiverProc 字段由服务器自动计算。客户端仅发送业务字段。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

Body — 根

字段类型说明
ide *objectMDF-e 标识
emit *object发行者数据
infModal *object模式信息(四个中仅一个:rodoaereoaquavferrov)
infDoc *object关联税务文档
tot *object货物合计
prodPredobject主要货物产品
segarray保险信息
lacresarrayMDF-e 封条
autXMLarray授权访问 XML 的 CNPJ/CPF
infAdicobject附加信息(税务机关和纳税人)
infRespTecobject技术负责人(CNPJ、联系人、邮箱等)

ide — 标识

字段类型说明
tpAmb *int环境:1=生产,2=同源
tpEmit *int发行者类型:1=承运商,2=自有货物,3=运输服务提供商
modal *string模式:"1"=公路,"2"=航空,"3"=水路,"4"=铁路
UFIni *string行程开始的 UF(2 个字母)
UFFim *string行程结束的 UF
infMunCarrega[] *array装载市:[{ cMunCarrega, xMunCarrega }]
infPercurso[]array路线的 UF:[{ UFPer }]
tpTranspstring承运商类型(公路)
dhIniViagemstring行程开始日期/时间(ISO 8601)
indCanalVerdestring绿色通道指示器
indCarregaPosteriorstring后续装载指示器

emit — 发行者

字段类型说明
CNPJ ⚠string发行者 CNPJ(14 位)
CPF ⚠string发行者 CPF(11 位)
IEstring州登记号
xNome *string法人名称
xFantstring商号
enderEmitobject地址:{ xLgr, nro, xCpl, xBairro, cMun, xMun, CEP, UF, fone, email }

infModal — 公路模式(modal="1")

字段类型说明
rodo.veicTracao *object牵引车辆:{ placa, tara, RENAVAM, capKG, capM3, tpRod, tpCar, UF, condutor[], prop }
rodo.veicTracao.condutor[] *array司机:[{ xNome, CPF }] — 最少 1
rodo.veicReboque[]array拖车(与 veicTracao 相同结构,无司机)
rodo.infANTTobjectANTT 信息:{ RNTRC, infCIOT[], valePed, infContratante[], infPag[] }
rodo.codAgPortostring港口预约代码
rodo.lacRodo[]array模式封条:[{ nLacre }]

infModal — 航空模式(modal="2")

字段类型说明
aereo.nac *string飞机国籍标志
aereo.matr *string飞机注册号
aereo.nVoo *string航班号
aereo.cAerEmb *string登机机场 IATA 代码
aereo.cAerDes *string目的机场 IATA 代码
aereo.dVoo *string航班日期(YYYY-MM-DD)

infModal — 水路模式(modal="3")

字段类型说明
aquav.irin *string船舶 IRIN
aquav.tpEmb *string船舶类型(2 位)。使用 ≥ 10 的值以避免 Zeus 内部 byte 截断(例:"10""11")
aquav.cEmbar *string船舶代码
aquav.xEmbar *string船舶名称
aquav.nViag *string航次号。不能以零开头(schema 验证) — 使用 "1""100" 等。
aquav.cPrtEmb *string登船港代码
aquav.cPrtDest *string目的港代码
aquav.prtTransstring转运港
aquav.tpNavstring航行类型
aquav.infTermCarreg[]array装载码头:[{ cTermCarreg, xTermCarreg }]
aquav.infTermDescarreg[]array卸载码头
aquav.infEmbComb[]array船队船舶:[{ cEmbComb, xBalsa }]
aquav.infUnidCargaVazia[]array空货物单元
aquav.infUnidTranspVazia[]array空运输单元

infModal — 铁路模式(modal="4")

字段类型说明
ferrov.trem *object火车数据:{ xPref, dhTrem, xOri, xDest, qVag }
ferrov.vag[] *array车厢:[{ pesoBC, pesoR, tpVag, serie, nVag, nSeq, TU }] — 最少 1。Zeus/SEFAZ 约束: serie 必须正好 3 位(使用 100+,例:"100");nVag 仅接受数字(内部为 long,例:"100001");nSeq 可选 1-3 位。

infDoc — 关联文档

字段类型说明
infMunDescarga[] *array卸货市 — 最少 1
infMunDescarga[].cMunDescarga *string市 IBGE 代码
infMunDescarga[].xMunDescarga *string市名称
infMunDescarga[].infNFe[]array关联 NF-e:[{ chNFe, SegCodBarras, indReentrega, infUnidTransp[], peri[] }]
infMunDescarga[].infCTe[]array关联 CT-e
infMunDescarga[].infMDFeTransp[]array运输 MDF-e(转包)

prodPred — 主要产品

字段类型说明
tpCarga *string货物类型:"01"=散装固体,"02"=散装液体,"03"=冷藏,"04"=集装箱,"05"=一般货物,"06"=新散装,"07"=危险品,"08"=加压散装
xProd *string主要产品描述
cEANstringGTIN/EAN
NCMstringNCM
infLotacaoobject批次:{ infLocalCarrega{CEP,latitude,longitude}, infLocalDescarrega{...} }

tot — 合计

字段类型说明
vCarga *decimal货物总值(> 0)
cUnid *string单位代码:"01"=KG,"02"=TON
qCarga *decimal货物总量(> 0)
qCTeintQuantidade de 关联 CT-e
qNFeint关联 NF-e 数量
qMDFeint关联 MDF-e 数量

* 必填字段。⚠ CNPJCPF 至少其中一个为必填项。

简化示例 — 公路模式

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "1",
            "UFIni": "SP",
            "UFFim": "ES",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ],
            "infPercurso": [
              { "UFPer": "MG" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "RUA EXEMPLO",
              "nro": "100",
              "xBairro": "CENTRO",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "rodo": {
              "veicTracao": {
                "placa": "ABC1D23",
                "tara": 8000,
                "condutor": [
                  { "xNome": "João da Silva", "CPF": "12345678909" }
                ],
                "tpRod": "01",
                "tpCar": "01"
              }
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3205200",
                "xMunDescarga": "Vila Velha",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL"
          },
          "tot": {
            "vCarga": 50000.00,
            "cUnid": "01",
            "qCarga": 1500.00
          }
        }

简化示例 — 航空模式

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "2",
            "UFIni": "SP",
            "UFFim": "RJ",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA AEREA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV AEROPORTO",
              "nro": "5000",
              "xBairro": "CUMBICA",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "aereo": {
              "nac": "PT",
              "matr": "ABC1234",
              "nVoo": "AB1234",
              "cAerEmb": "GRU",
              "cAerDes": "GIG",
              "dVoo": "2026-05-21"
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3304557",
                "xMunDescarga": "Rio de Janeiro",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL"
          },
          "tot": {
            "vCarga": 25000.00,
            "cUnid": "01",
            "qCarga": 500.00
          }
        }

简化示例 — 水路模式

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "3",
            "UFIni": "SP",
            "UFFim": "PA",
            "infMunCarrega": [
              { "cMunCarrega": "3548500", "xMunCarrega": "SANTOS" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "NAVEGACAO EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV PORTUARIA",
              "nro": "200",
              "xBairro": "PORTO",
              "cMun": "3548500",
              "xMun": "SANTOS",
              "UF": "SP"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "aquav": {
              "irin": "1234567",
              "tpEmb": "10",
              "cEmbar": "1234",
              "xEmbar": "EMBARCACAO EXEMPLO",
              "nViag": "1",
              "cPrtEmb": "BRSSZ",
              "cPrtDest": "BRBEL"
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "1501402",
                "xMunDescarga": "Belém",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "01",
            "xProd": "GRAOS DE SOJA"
          },
          "tot": {
            "vCarga": 500000.00,
            "cUnid": "02",
            "qCarga": 50.00
          }
        }

简化示例 — 铁路模式

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "modal": "4",
            "UFIni": "MG",
            "UFFim": "SP",
            "infMunCarrega": [
              { "cMunCarrega": "3106200", "xMunCarrega": "BELO HORIZONTE" }
            ]
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "FERROVIA EXEMPLO LTDA",
            "enderEmit": {
              "xLgr": "AV FERROVIARIA",
              "nro": "300",
              "xBairro": "INDUSTRIAL",
              "cMun": "3106200",
              "xMun": "BELO HORIZONTE",
              "UF": "MG"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "ferrov": {
              "trem": {
                "xPref": "F123",
                "dhTrem": "2026-05-21T08:00:00-03:00",
                "xOri": "BELO HORIZONTE",
                "xDest": "SANTOS",
                "qVag": 2
              },
              "vag": [
                {
                  "pesoBC": 30.000,
                  "pesoR": 30.000,
                  "tpVag": "Gôndola",
                  "serie": "100",
                  "nVag": "100001",
                  "nSeq": "1",
                  "TU": 28.000
                },
                {
                  "pesoBC": 30.000,
                  "pesoR": 30.000,
                  "tpVag": "Gôndola",
                  "serie": "101",
                  "nVag": "100002",
                  "nSeq": "2",
                  "TU": 28.000
                }
              ]
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3548500",
                "xMunDescarga": "Santos",
                "infNFe": [
                  { "chNFe": "35260512345678000199550010000000011000000018" }
                ]
              }
            ]
          },
          "prodPred": {
            "tpCarga": "01",
            "xProd": "MINERIO DE FERRO"
          },
          "tot": {
            "vCarga": 800000.00,
            "cUnid": "02",
            "qCarga": 56.00
          }
        }

完整示例(所有字段) — 公路模式

        {
          "ide": {
            "tpAmb": 2,
            "tpEmit": 2,
            "tpTransp": "1",
            "modal": "1",
            "UFIni": "SP",
            "UFFim": "ES",
            "infMunCarrega": [
              { "cMunCarrega": "3550308", "xMunCarrega": "SAO PAULO" }
            ],
            "infPercurso": [
              { "UFPer": "MG" }
            ],
            "dhIniViagem": "2026-05-21T08:00:00-03:00",
            "indCanalVerde": "1",
            "indCarregaPosterior": "0"
          },
          "emit": {
            "CNPJ": "12345678000199",
            "IE": "123456789012",
            "xNome": "TRANSPORTADORA EXEMPLO LTDA",
            "xFant": "Exemplo Transportes",
            "enderEmit": {
              "xLgr": "RUA EXEMPLO",
              "nro": "100",
              "xCpl": "GALPAO A",
              "xBairro": "CENTRO",
              "cMun": "3550308",
              "xMun": "SAO PAULO",
              "CEP": "01001000",
              "UF": "SP",
              "fone": "1133334444",
              "email": "contato@exemplo.com"
            }
          },
          "infModal": {
            "versaoModal": "3.00",
            "rodo": {
              "infANTT": {
                "RNTRC": "12345678",
                "infCIOT": [
                  { "CIOT": "1234567890", "CNPJ": "12345678000199" }
                ],
                "valePed": {
                  "categCombVeic": "01",
                  "disp": [
                    {
                      "CNPJForn": "98765432000111",
                      "CNPJPg": "12345678000199",
                      "nCompra": "VP001",
                      "vValePed": 250.00,
                      "tpValePed": "01"
                    }
                  ]
                },
                "infContratante": [
                  {
                    "xNome": "EMPRESA CONTRATANTE LTDA",
                    "CNPJ": "11222333000144"
                  }
                ],
                "infPag": [
                  {
                    "xNome": "João da Silva",
                    "CPF": "12345678909",
                    "Comp": [
                      { "tpComp": "01", "vComp": 5000.00, "xComp": "Frete contratado" }
                    ],
                    "vContrato": 5000.00,
                    "indAltoDesemp": "1",
                    "indPag": "0",
                    "infBanc": {
                      "codBanco": "001",
                      "codAgencia": "1234",
                      "PIX": "12345678909"
                    }
                  }
                ]
              },
              "veicTracao": {
                "cInt": "VT001",
                "placa": "ABC1D23",
                "RENAVAM": "12345678901",
                "tara": 8000,
                "capKG": 25000,
                "capM3": 80,
                "prop": {
                  "CNPJ": "12345678000199",
                  "RNTRC": "12345678",
                  "xNome": "TRANSPORTADORA EXEMPLO LTDA",
                  "IE": "123456789012",
                  "UF": "SP",
                  "tpProp": "0"
                },
                "condutor": [
                  { "xNome": "João da Silva", "CPF": "12345678909" },
                  { "xNome": "Maria Souza", "CPF": "98765432100" }
                ],
                "tpRod": "01",
                "tpCar": "01",
                "UF": "SP"
              },
              "veicReboque": [
                {
                  "cInt": "VR001",
                  "placa": "DEF4G56",
                  "RENAVAM": "98765432109",
                  "tara": 3500,
                  "capKG": 30000,
                  "capM3": 90,
                  "tpCar": "02",
                  "UF": "SP"
                }
              ],
              "lacRodo": [
                { "nLacre": "LACRE001" },
                { "nLacre": "LACRE002" }
              ]
            }
          },
          "infDoc": {
            "infMunDescarga": [
              {
                "cMunDescarga": "3205200",
                "xMunDescarga": "Vila Velha",
                "infNFe": [
                  {
                    "chNFe": "35260512345678000199550010000000011000000018",
                    "SegCodBarras": "",
                    "indReentrega": "0",
                    "infUnidTransp": [
                      {
                        "tpUnidTransp": "1",
                        "idUnidTransp": "UT001",
                        "qtdRat": 100.000,
                        "lacUnidTransp": [{ "nLacre": "LACRE-UT-001" }],
                        "infUnidCarga": [
                          {
                            "tpUnidCarga": "1",
                            "idUnidCarga": "UC001",
                            "qtdRat": 100.000,
                            "lacUnidCarga": [{ "nLacre": "LACRE-UC-001" }]
                          }
                        ]
                      }
                    ],
                    "peri": []
                  }
                ]
              }
            ]
          },
          "seg": [
            {
              "infResp": {
                "respSeg": "1",
                "CNPJ": "12345678000199"
              },
              "infSeg": {
                "xSeg": "SEGURADORA EXEMPLO SA",
                "CNPJ": "55666777000188"
              },
              "nApol": "APOL-2026-001",
              "nAver": ["AV001", "AV002"]
            }
          ],
          "prodPred": {
            "tpCarga": "05",
            "xProd": "CARGA GERAL",
            "cEAN": "7891234567890",
            "NCM": "84713012",
            "infLotacao": {
              "infLocalCarrega": {
                "CEP": "01001000",
                "latitude": "-23.5505",
                "longitude": "-46.6333"
              },
              "infLocalDescarrega": {
                "CEP": "29100000",
                "latitude": "-20.3297",
                "longitude": "-40.2925"
              }
            }
          },
          "tot": {
            "qCTe": 0,
            "qNFe": 1,
            "qMDFe": 0,
            "vCarga": 50000.00,
            "cUnid": "01",
            "qCarga": 1500.00
          },
          "lacres": [
            { "nLacre": "LACRE-GERAL-001" }
          ],
          "autXML": [
            { "CNPJ": "11222333000144" }
          ],
          "infAdic": {
            "infAdFisco": "Documento emitido em conformidade com a legislação vigente",
            "infCpl": "Transporte com escolta armada"
          },
          "infRespTec": {
            "CNPJ": "12345678000199",
            "xContato": "Suporte Técnico",
            "email": "suporte@exemplo.com",
            "fone": "1133334444"
          }
        }

成功响应

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "nMDF": 1,
            "serie": 1,
            "protocolo": "135260000123456",
            "xml": "https://storage.../mdfe/2026-05-21/35260512345678000199580010000000011000000018.xml"
          }
        }
POST /api/mdfe/consult
查询 MDF-e 状态

使用访问密钥直接在 SEFAZ 查询 MDF-e 状态。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body

字段类型说明
chMDFe *stringMDF-e 访问密钥(44 位)

* 必填字段。

请求示例

        {
          "chMDFe": "35260512345678000199580010000000011000000018"
        }

响应

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 100,
            "xMotivo": "Autorizado o uso do MDF-e",
            "protocolo": "135260000123456",
            "dhRecbto": "2026-05-21T10:30:00-03:00",
            "encerrado": false,
            "cancelado": false
          }
        }
POST /api/mdfe/cancel
取消 MDF-e

取消已授权的 MDF-e。窗口: 授权后最多 24 小时。如果 MDF-e 已关闭,则不允许。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body

字段类型说明
chMDFe *stringMDF-e 访问密钥(44 位)
xJust *string取消理由(根据 SEFAZ 要求最少 15 个字符)

* 必填字段。

请求示例

        {
          "chMDFe": "35260512345678000199580010000000011000000018",
          "xJust": "Cancelamento por erro no preenchimento dos dados do veiculo"
        }

响应

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 135,
            "xMotivo": "Evento registrado e vinculado a MDF-e",
            "nProt": "135260000123457",
            "dhRegEvento": "2026-05-21T11:00:00-03:00"
          }
        }
POST /api/mdfe/close
关闭 MDF-e

在行程结束时关闭 MDF-e。关闭后,无法再取消。dtEnccUFcMun 字段是可选的 — 省略时,系统将从原始 MDF-e 推断(当前日期、发行人的 UF 和市)。

必需请求头

请求头类型说明
tokenstring发行企业 token
signstringMD5 签名
timestampstringUnix 时间戳(秒)

Body

字段类型说明
chMDFe *stringMDF-e 访问密钥(44 位)
dtEncstring关闭日期(YYYY-MM-DD)。默认:当前日期
cUFint关闭发生地 UF 的 IBGE 代码。默认:发行者的 UF
cMunstring市 IBGE 代码 onde ocorreu o encerramento. Default: município do emitente

* 必填字段。

请求示例

        {
          "chMDFe": "35260512345678000199580010000000011000000018",
          "dtEnc": "2026-05-22",
          "cUF": 32,
          "cMun": "3205200"
        }

响应

        {
          "success": true,
          "data": {
            "chMDFe": "35260512345678000199580010000000011000000018",
            "cStat": 135,
            "xMotivo": "Evento registrado e vinculado a MDF-e",
            "nProt": "135260000123458",
            "dhRegEvento": "2026-05-22T18:00:00-03:00"
          }
        }

vpn_key SSO — 通过令牌自动登录

基础 URL(生产)
https://api.tffiscal.com
认证
Headers: sign, timestamp, token
票据有效期
60 秒 — 一次性使用

SSO(单点登录)允许您的 ERP 为用户生成直接访问 TFiscal 的链接,用户无需输入凭据即可以所选语言自动登录到相应的公司。

工作原理:
  • ERP 调用 POST /api/sso/create_ticket 并发送公司令牌。
  • TFiscal 返回一个包含一次性不透明票据的 redirectUrl
  • ERP 将用户浏览器重定向到该 URL。
  • 页面消费票据后,用户自动登录到公司面板。
⚠️ 安全: 真实的公司令牌永远不会出现在 URL 中。仅将短期票据(有效期 60 秒,一次性)暴露给浏览器。
POST /api/sso/create_ticket
生成自动登录链接

生成一个一次性票据,可在 60 秒内使用,将用户自动登录到与该令牌对应的公司面板。

必需的 Headers

Header类型描述
tokenstring公司令牌(与开具 NF-e 使用的相同)
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 秒级时间戳(5 分钟窗口)

Payload

{
  "token": "TOKEN_DA_EMPRESA",
  "language": "br",
  "page": "emitir_nfe"
}

字段

字段必填类型描述
tokenstring公司令牌(w_company.token)— 与 /api/invoice/create 使用的相同
languagestring界面语言:brenzhesjako。默认:br
pagestring登录后的着陆页。接受的值:emitir_nfe。为空或缺失时打开默认面板(/company/kanban)。

成功响应

{
  "success": true,
  "message": "ticket",
  "ticket": "nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg",
  "redirectUrl": "https://www.tffiscal.com/sso#ticket=nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg",
  "expiresInSeconds": 60,
  "expiresAt": "2026-04-24T18:34:56.0000000Z"
}

响应字段

字段类型描述
successboolean成功生成票据时为 true
ticketstring不透明票据(随机,32 字节 base64url)
redirectUrlstringERP 应将用户浏览器重定向到的完整 URL
expiresInSecondsnumber有效期秒数(始终为 60)
expiresAtstringUTC 过期时间(ISO 8601)

错误响应

消息原因
Token 为必填项body 中未发送 token 字段
无效的 Token令牌与任何已注册的公司不匹配
此令牌绑定了多家公司。请发送您要访问的特定公司令牌。集成商令牌绑定了多家公司 — 请发送具体公司的令牌
Rate limit exceeded同一令牌每分钟调用超过 30 次
POST /api/sso/consume_ticket
消费票据并获取会话 JWT

/api/sso/create_ticket 生成的票据兑换为 TFiscal 会话 JWT。此端点由前端(路由 /sso)调用,需要 sign/timestamp 请求头 — 不透明的票据本身就是凭证。每个票据只能消费一次,60 秒后过期。

Body

字段类型说明
ticket *stringcreate_ticket 返回的票据

* 必填字段。

请求示例

        {
          "ticket": "nXk9sz6I6KHOt_OM72ZmfyU5p1eOet5k5Bd3AFZtspg"
        }

成功响应

        {
          "success": true,
          "message": "Login succeeded",
          "access_token": "eyJhbGciOi...",
          "type": "user",
          "uid": 1234,
          "company_id": 5678,
          "language": "br",
          "page": "emitir_nfe"
        }

响应字段

字段类型说明
access_tokenstring会话 JWT(有效期 365 天)。在 TFiscal 调用的 Authorization 请求头中使用
typestring用户类型(useradmin 等)
uidint内部用户 ID
company_idintcreate_ticket 中选择的企业 ID
languagestringcreate_ticket 中选择的语言(始终规范化)
pagestring目标页面(未设置时为空字符串)

错误响应

消息原因
Ticket inválidoBody 中没有 ticket 字段
Ticket inválido ou expirado票据不存在、已被消费或超过 60 秒过期时间
Rate limit exceeded同一 IP 每分钟消费超过 60 次
Sessão inválida关联到该票据的用户不再存在

lock 限制与安全

票据特性

特性
有效期生成后 60 秒
使用一次性 — 消费后无法重用
速率限制每个令牌每分钟 30 个票据 · 每个 IP 每分钟 60 次消费
存储具有自动 TTL 的 MongoDB — 过期票据自动删除

导航限制

通过 SSO 认证的用户有权访问相应公司的页面(/invoice/company/*)。尝试访问其他区域(分销商面板、综合报表、管理)将自动重定向到公司面板。

登录后的会话

在将票据交换为 JWT 后,用户拥有 TFiscal 的正常会话(JWT 有效期 365 天,与传统登录相同)。60 秒仅是生成票据打开链接之间的时间窗口 — 之后用户将保持正常登录直到注销。

⚠️ 重要: create_ticket 必须由 ERP 仅在服务器端调用。切勿直接从浏览器调用此端点 — 这会在前端暴露公司令牌。

badge 会计师(Contador)

用于查询与企业绑定的会计师注册数据的 API。适用于需要获取负责某企业会计师完整资料的外部财务系统。

POST /api/accountant/get_info
获取与企业绑定的会计师信息

返回与指定企业绑定的会计师的完整注册数据。会计师必须事先绑定到该企业(相同 CNPJ),且提供的邮箱必须与注册一致。

必需请求头

请求头类型说明
tokenstring企业 token 或集成商 B2B token
signstringMD5 签名:MD5(token + path + body + timestamp)
timestampstringUnix 时间戳(秒,5 分钟窗口)

Body

字段类型说明
companyId *int绑定到 token 的企业 ID
accountantId *string会计师 ObjectId(24 位十六进制)
email *string会计师邮箱(必须与注册一致)

* 必填字段。

请求示例

      {
        "companyId": 12345,
        "accountantId": "5f3a8b9c1d2e4f5a6b7c8d9e",
        "email": "accountant@office.com"
      }

成功响应

      {
        "success": true,
        "data": {
          "email": "accountant@office.com",
          "officeDocumentType": "CNPJ",
          "officeDocument": "12345678000199",
          "officeName": "会计事务所 LTDA",
          "responsibleName": "张 三",
          "crc": "SP123456/O-7",
          "accountantCpf": "12345678909",
          "workAddress": "示例街 100 - 中心 - São Paulo/SP",
          "site": "https://office.com",
          "landline": "1133334444",
          "mobile": "11999998888",
          "assistantName": "李 四",
          "assistantEmail": "lisi@office.com",
          "assistantPhone": "11988887777",
          "observations": "周一至周五,9 点至 18 点"
        }
      }

响应字段

字段类型说明
emailstring会计师主邮箱
officeDocumentTypestring事务所证件类型:"CNPJ" 或 "CPF"
officeDocumentstring事务所证件(仅数字)
officeNamestring事务所法人名 / 名称
responsibleNamestring负责会计师姓名
crcstringCRC 号(巴西地区会计委员会)
accountantCpfstring会计师 CPF(仅数字)
workAddressstring办公地址
sitestring事务所网站
landlinestring固定电话
mobilestring手机
assistantNamestring助理姓名
assistantEmailstring助理邮箱
assistantPhonestring助理电话
observationsstring注册自由备注

错误响应

消息原因
会计师ID参数异常或不存在accountantId 缺失或不是有效的 ObjectId
该会计师邮箱异常或不存在email 无效或未注册
发票账号{companyId}异常或不存在companyId 不属于该 token 用户
该会计师未绑定该发票账号会计师未绑定到指定企业