DC-e
代电商平台 / 企业开具 DC-e(模型 99,Declaração de Conteúdo Eletrônica):接入流程、Webhook 载荷、错误模型、状态机与联调清单。
能力概述与接入流程
DC-e(模型 99,Declaração de Conteúdo Eletrônica,Ajuste SINIEF 05/2021)是随非纳税人寄件货物流转的电子内容申报单,由电商平台代其发件,或由企业自发。主体注册、证书关联、Webhook 登记与 NF-e 完全共用;资源段沿用文档原文 dc-e,所有单据级操作都挂在 /dc-e/{dceId} 之下。
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1 注册主体 | POST /openapi/v2/empresas | 与 NF-e 相同,新增可选 emissaoDCe 段;emissaoNFeProduto / emissaoDCe 至少传一个,只做 DC-e 可不传 NF-e 块;请求体带 id 即更新 |
| 2 关联证书 | POST /openapi/v1/empresas/{empresaId}/certificadoDigital | 与 NF-e 相同 |
| 3 登记回调 | POST /openapi/v1/webhooks | 与 NF-e 相同;DC-e 结果复用同一回调地址 |
| 4 发行 | POST /openapi/v2/empresas/{empresaId}/dc-e | 受理即返回 200 无内容,异步向 SEFAZ 授权 |
| 5 查询 | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | 状态、协议、XML / DACE 下载链接、入参回显 |
| 6 取消 | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | 授权后 24 小时内,异步:200 无内容,结果经 Webhook |
鉴权与 NF-e 完全相同:请求头 token / timestamp / sign,sign = MD5(token + path + body + timestamp) 小写十六进制;path 含 /openapi 前缀与路径变量、不含查询串;GET / DELETE 无 body 时取空串;有 body 的 DELETE(取消带理由)按 JSON 原文去 CR/LF 参与签名。参见认证与签名。
前提
- 主体须已审批通过、证书可用(否则
DCe00008)。DC-e 的授权方为 SEFAZ-PR(DC-e 国家门户列出的唯一授权方),任何 UF 的主体都送 PR 授权方。 - 主体须配置 DC-e 发行参数:
emissaoDCe.tipoEmitente与模型 99 号段(sequencialDCe/serieDCe),缺一即DCe00004。 - 一期支持两种主体类型:
Marketplace(电商平台代非纳税人卖家 / 个人发件)与OwnIssuer(企业自发)。Carrier可登记但发行被拒(10019013),待 SVRS 发布新 schema 包后放开。 - 请求里的
ambiente必须与主体当前环境一致,否则DCe00004(文档语义 "not configured for the informed environment")。注册后主体处于认证测试环境(Homologacao);切生产是运营动作、不开 API,切换前传ambiente=Producao会收到DCe00004。 - 一期只支持正常发行(
tpEmis=1),离线应急二期。
主体注册:emissaoDCe 配置段
注册开票主体请求体新增可选段(其余字段不变):
"emissaoDCe": {"ambienteProducao": {"tipoEmitente": "Marketplace","sequencialDCe": 1,"serieDCe": "1","siteMarketplace": "https://loja.exemplo.com.br"}}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
tipoEmitente | string | 是 | Marketplace / OwnIssuer(文档别名 EmissorProprio)/ Carrier(别名 Transportadora,登记可、发行拒) |
sequencialDCe | integer | 是 | 起始 nDC(1-999999999),平台从该号起连续取号 |
serieDCe | string | 是 | 系列(0-999,不超过 3 位) |
siteMarketplace | string | Marketplace 必填 | 平台站点(2-120 字符),进 XML Marketplace/Site 与 DACE |
- 未传
emissaoDCe的主体不会开通 DC-e:注册仍成功,但响应dceHabilitado=false,发行时收到DCe00004。请在注册当场核对该字段。 - 补开 DC-e、抬高起始号或修正联系信息:带
id重传注册报文。模型 99 号段只升不降;完整更新规则见注册开票主体。
端点
| 端点 | 用途 |
|---|---|
| 发行 DC-e | POST /openapi/v2/empresas/{empresaId}/dc-e,受理返回 HTTP 200 无内容;按 id 幂等 |
| 查询 DC-e | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId},状态、协议、下载链接与入参回显 |
| 取消 DC-e | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId},异步,授权后 24 小时内 |
Webhook 回调载荷
复用 NF-e 的 Webhook 登记与签名头,回调地址通过注册 Webhook登记。投递请求头:平台签名五头(X-Tffiscal-Event / X-Tffiscal-Event-Id / X-Tffiscal-Delivery-Id / X-Tffiscal-Timestamp / X-Tffiscal-Signature)之外,同时带 token 与 x-token 两个同值头(登记 webhook 时的令牌原样回传),接收端校验任一即可。
事件码与兼容载荷(tipo="DC-e",14 个字段顺序固定):
| 事件码 | 触发 | dceStatus |
|---|---|---|
dce.authorized | 授权 100 | Autorizada |
dce.rejected | SEFAZ 驳回或任务终局失败(含单据编号前的失败,此时无 chave) | Negada(dceMotivoStatus 为 cStat - 原因;终局失败无 cStat 时只有原因) |
dce.canceled | 取消登记成功(135 / 136 / 155) | Cancelada(dceDataAutorizacao 为取消登记时刻、dceNumeroProtocolo 为取消事件协议号) |
dce.cancel_rejected | 取消被 SEFAZ 拒绝或取消任务终局失败 | CancelamentoNegado(单据仍为已授权,带授权协议号 / 摘要 / XML 链接) |
载荷字段
| 字段 | 类型 | 说明 |
|---|---|---|
tipo | string | 固定 DC-e |
empresaId | string | 主体标识 |
dceId | string | 发行时传入的 id,请以此字段关联回调 |
dceStatus | string | Autorizada / Negada / Cancelada / CancelamentoNegado |
dceMotivoStatus | string | 驳回或取消被拒时为 cStat - xMotivo,终局失败时为失败原因;其余为 null |
dceLinkDace | string | 按 chave 懒渲染的 DACE 链接(授权 / 取消回调);驳回时为 null |
dceLinkXml | string | XML 下载链接;无授权 XML 时为 null |
dceNumero | string | DC-e 号;单据未编号时为 null |
dceSerie | string | DC-e 系列;单据未编号时为 null |
dceChaveAcesso | string | 44 位访问密钥;单据未编号时为 null |
dceDataEmissao | string | 开票时刻;编号前失败时为受理时刻 |
dceDataAutorizacao | string | 授权时刻;dce.canceled 中为取消登记时刻;其余为 null |
dceNumeroProtocolo | string | 授权协议号;dce.canceled 中为取消事件协议号;驳回时为 null |
dceDigestValue | string | 已授权单据的签名摘要;驳回与 dce.canceled 中为 null |
dce.authorized
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Autorizada", "dceMotivoStatus": null,"dceLinkDace": "https://api.v2.tffiscal.com/openapi/files/dace/35260940673061000134990010000000011100000012?token=...", "dceLinkXml": "https://api.v2.tffiscal.com/openapi/files/xml/7?token=...","dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "41260940673061000134990010000000011101234567","dceDataEmissao": "2026-09-06T12:00:00Z", "dceDataAutorizacao": "2026-09-06T12:00:03Z","dceNumeroProtocolo": "141260000000001", "dceDigestValue": "tasG40Ic6Zh7PIBiLEEH7Hb940Y=" }
dce.rejected
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Negada","dceMotivoStatus": "225 - Rejeicao: Falha no schema XML", "dceLinkDace": null, "dceLinkXml": null,"dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": null, "dceNumeroProtocolo": null, "dceDigestValue": null }
单据编号前失败(主体未配置 DC-e / 号段缺失 / 报文映射失败等终局失败,单据未编号、无 chave):同样收到 dce.rejected,单据事实字段为 null,dceMotivoStatus 为失败原因,dceDataEmissao 为受理时刻。请以 dceId 关联,不要假定 dceChaveAcesso 一定有值:
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Negada","dceMotivoStatus": "Empresa não configurada para emissão de DC-e", "dceLinkDace": null, "dceLinkXml": null,"dceNumero": null, "dceSerie": null, "dceChaveAcesso": null, "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": null, "dceNumeroProtocolo": null, "dceDigestValue": null }
dce.canceled
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Cancelada", "dceMotivoStatus": null,"dceLinkDace": "https://.../openapi/files/dace/35260940673061000134990010000000011100000012?token=...", "dceLinkXml": "https://.../openapi/files/xml/7?token=...","dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": "2026-09-06T15:00:00Z", "dceNumeroProtocolo": "141260000000099", "dceDigestValue": null }
dce.cancel_rejected
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "CancelamentoNegado","dceMotivoStatus": "594 - Rejeicao: O numero de sequencia do evento informado e maior que o permitido","dceLinkDace": null, "dceLinkXml": "https://.../openapi/files/xml/7?token=...", "dceNumero": "1", "dceSerie": "1","dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z", "dceDataAutorizacao": null,"dceNumeroProtocolo": "141260000000001", "dceDigestValue": "tasG40Ic6Zh7PIBiLEEH7Hb940Y=" }
dceLinkDace 在授权 / 取消回调里为按 chave 懒渲染的 DACE 链接(投递时刻不渲染,首次下载才渲染归档);两个链接与查询接口同形(/openapi/files/{kind}/{ref}?token=…),有效期取租户级设置(缺省 7 天)。参见文件下载。
错误模型
错误形状与 NF-e 相同:业务错误为 [{ "codigo", "mensagem" }](HTTP 400;单据 / 任务不存在 HTTP 404,codigo 为 DCe0001),鉴权层错误为平台信封(401 / 403 / 429,见认证与签名)。文档给出示例码的情形沿用文档码值,其余 codigo 为平台错误码数字串,mensagem 随请求语言本地化(葡语为文档原文)。
| codigo | HTTP | 场景 | 处置 |
|---|---|---|---|
DCe0001 | 404 | dceId 不存在、非本主体,或取消时单据尚未物化 | 核对 id 与 empresaId;Pendente 单据待授权后再取消 |
10003000 | 404 | empresaId 不存在 | 核对 empresaId |
DCe00004 | 400 | 主体未配置 DC-e 发行(缺 tipoEmitente / 模型 99 号段 / Marketplace 站点),或 ambiente 与主体当前环境不一致 | 注册时传 emissaoDCe 或带 id 更新补配;按主体当前环境提交,切生产联系运营 |
DCe00005 / DCe00006 / DCe00007 | 400 | Marketplace / Carrier 主体未传 remetente / remetente.endereco 缺失 / 巴西发件方缺 cpfCnpj | 补发件方信息 |
DCe00008 | 400 | 主体不可发行(未审批 / 证书未就绪) | 等待审批 / 关联证书 |
DCe00009 | 400 | 巴西收件方缺 cpfCnpj | 补收件方证件 |
GW001 | 400 | 市政 IBGE 码不存在或与 uf 不一致 | 核对 cidade / uf |
10019005 / 10019006 | 400 | 同请求并发重复 / 该 CNPJ 待处理任务超限 | 稍后重试 |
10019007 | 400 | 号段无法确定(多个启用号段) | 联系运营收敛号段 |
10019013 | 400 | 主体类型 Carrier 当前不支持发行 | 改用 Marketplace / OwnIssuer 主体 |
10019018 – 10019022 | 400 | 明细不合法 / 枚举或格式非法 / 承运商 CNPJ 不合法 / 附加信息超长 / autorizacaoDownloadXml 不合法 | 按 mensagem 修正 |
10019030 / 10019031 | 400 | 同 id 报文不同 / 生产环境同 id 已有在途或已授权单据 | 换 id 或沿用原报文 / 查询原单 |
10019040 / 10019041 / 10019042 / 10019043 | 400 | 状态不允许取消 / 超 24 小时窗口 / 取消已受理 / 理由不合法 | 见取消 DC-e |
10019048 | 400 | dataEmissao 超出允许窗口(超前 > 5 分钟或回溯 > 30 天) | 改用当前时刻或省略 dataEmissao |
10001001 | 400 | 请求字段校验失败(每字段一条);注册 / 更新契约错误 | 按 mensagem 修正 |
各端点的错误码清单见发行 DC-e、查询 DC-e与取消 DC-e。发行阶段的 SEFAZ 驳回不走 HTTP 错误,而是查询结果 Negada + Webhook dce.rejected;取消阶段的 SEFAZ 拒绝同理走 dce.cancel_rejected。
状态机
受理(POST 200)─→ Pendente ─取号 + 送 SEFAZ─┬─ cStat 100 ─→ Autorizada ─DELETE 200─→ CancelamentoPendente ─┬─ 135/136/155 ─→ Cancelada│ └─ SEFAZ 拒绝 ─→ Autorizada(Webhook CancelamentoNegado)├─ 其他终局 cStat ─→ Negada└─ 参数无法解析 / 重投超限 ─→ Falha(可同 id 重提)
Pendente期间 SEFAZ 瘫痪(108 / 109)由平台退避重试,一期无应急改道;重复发行(451 / 452 / 539)由平台先查采认。Negada/Falha后同一id可重新提交(按新报文重开);Autorizada后同一id再提交只会命中幂等。
注意事项
- chave 的 CNPJ 是平台主体:第 7-20 位永远是授权发行方(Marketplace 主体或自发企业)的 CNPJ,CPF 发件人只出现在 XML 的
emit组与 DACE 的 REMETENTE 块。 - 认证测试环境收件人名固定:
tpAmb=2时 XML 与 DACE 的收件人名为DCE EMITIDA EM AMBIENTE DE HOMOLOGACAO(SEFAZ 校验 598),查询回显仍为原文。 - 24 小时取消窗口:自授权时刻起算,超时只能保留单据;DC-e 官方只有取消事件,没有更正信函与作废号段。
- Carrier 暂不支持:当前官方 schema 的
tpEmit只允许 Marketplace / 企业自发,承运商主体登记后发行会被10019013拒绝。 - DACE:A4 纵向,按需渲染并缓存;取消后重渲染带
CANCELADA水印;认证测试环境带SEM VALOR FISCAL - HOMOLOGAÇÃO水印。 - 授权方:全部 UF 的 DC-e 送 SEFAZ-PR 授权方,二维码指向
https://www.fazenda.pr.gov.br/dce/qrcode?chDCe={chave}&tpAmb={tpAmb}。
联调清单
- 认证测试环境完成主体注册(带
emissaoDCe,确认响应dceHabilitado=true)、证书关联、Webhook 登记(收端同时接受token/x-token)。 - 发行一张最小 DC-e(发行 DC-e页面的示例),查询到
Autorizada,下载 XML 与 DACE,收到dce.authorized回调。 - 同
id重发一次,确认返回 200 且未产生第二张单据;改一条明细重发,确认10019030。 - 取消单据,确认 200 无内容、查询到
CancelamentoPendente→Cancelada,收到dce.canceled回调,DACE 带水印。 - 对已取消单据再次取消,确认
10019040;对不存在的 id 查询,确认 404DCe0001。 - 故意传错(
ambiente=Producao、cidade=9999999、缺remetente),确认收到 400 错误数组且码值为DCe00004/GW001/DCe00005。 - 对未开通 DC-e 的主体发行,确认
DCe00004;带id重传注册报文把sequencialDCe抬高,确认 200 且后续单据从新号起;再传更小的号,确认 40010001001。
