CT-e
代承运人开具 CT-e(模型 57,公路模态):接入流程、端点、Webhook 载荷、错误模型、支持范围与联调清单。
概述
CT-e 接口代承运人开具电子运输单据(CT-e,模型 57,公路模态),并支持查询状态、取消,以及登记授权后事件(信函更正、交付凭证、交付失败、服务不符)。主体注册、证书关联、Webhook 注册与 NF-e 完全共用,本文只引用不重复。
路径规范:资源段按单据大类 cte,所有单据级操作都挂在 /openapi/v2/empresas/{empresaId}/cte/{cteId} 之下,其中 cteId 就是发行时传入的 id。
接入流程
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1 注册主体 | 注册主体 | 与 NF-e 相同,承运人也是一个主体 |
| 2 关联证书 | 关联证书 | 与 NF-e 相同 |
| 3 登记回调 | 注册 Webhook | 与 NF-e 相同;CT-e 结果复用同一回调地址 |
| 4 发行 | 发行 CT-e | 受理即返回,异步向 SEFAZ 授权 |
| 5 查询 | 查询 CT-e | 状态、票面、XML / DACTE 下载链接、事件列表 |
| 6 取消 | 取消 CT-e | 授权后 168 小时内 |
| 7 事件 | 见下方端点表 | 信函更正 / 交付凭证 / 交付失败 / 服务不符及其撤销 |
| 8 事件列表 | 事件列表 | 全部已登记事件 |
前提
- 主体须已审批通过、证书可用,且该 CNPJ 在其州税务局有 CT-e 发行资质(IE 登记为运输服务提供者并在 SEFAZ 完成 CT-e 认证)。资质缺失时 SEFAZ 返回
230 - IE do emitente não cadastrada,这是主体侧的税务登记问题,平台无法代为解决。 - 主体须配置 CT-e 号段(模型 57);未配置或存在多个启用号段且请求未指定时返回
10017007。 - 一期只支持公路模态(Rodoviario),其余模态受理即拒(
10017018)。 - 请求里的
ambienteEmissao必须与主体当前环境一致(10017010),见环境。
鉴权
与 NF-e 完全相同:请求头 token / timestamp / sign,sign = MD5(token + path + body + timestamp) 小写十六进制;path 含 /openapi 前缀与路径变量、不含查询串;GET / DELETE 无 body 时取空串;有 body 的 DELETE(取消)按 JSON 原文去 CR/LF 参与签名。算法细节、参考实现与排障见认证与签名。
端点
以下路径均相对于 /openapi/v2/empresas/{empresaId}/cte。
| 方法 | 路径 | 端点 | 事件 |
|---|---|---|---|
| POST | `` | 发行 CT-e | 异步授权 |
| GET | /{cteId} | 查询 CT-e | |
| DELETE | /{cteId} | 取消 CT-e | 110111 |
| POST | /{cteId}/carta-correcao | 信函更正 | 110110 |
| POST | /{cteId}/comprovante-entrega | 交付凭证 | 110180 |
| DELETE | /{cteId}/comprovante-entrega/{protocoloEvento} | 撤销交付凭证 | 110181 |
| POST | /{cteId}/insucesso-entrega | 交付失败 | 110190 |
| DELETE | /{cteId}/insucesso-entrega/{protocoloEvento} | 撤销交付失败 | 110191 |
| POST | /{chaveAcesso}/desacordo | 服务不符 | 610110 |
| DELETE | /{chaveAcesso}/desacordo/{protocoloEvento} | 撤销服务不符 | 610111 |
| GET | /{cteId}/eventos | 事件列表 |
所有事件同步出站,成功返回事件对象(chaveAcesso、tipo、codigo、sequencia、status、motivo、protocolo、data、linkXml)。文本字段会被净化(去变音、折叠空白)后校验长度;坐标按六位小数登记。
注意: 服务不符两个端点是唯一以他人开具的 CT-e 的 chave 寻址的端点:本主体作为该单据的收货方 / 承担方登记事件,事件送往该单据所属州。
Webhook 回调载荷
Webhook 登记与签名头复用 NF-e,见 Webhooks。CT-e 会发出四个事件码:
| 事件码 | 触发 | cteStatus |
|---|---|---|
cte.authorized | 授权 100 | Autorizada |
cte.rejected | SEFAZ 驳回(cStat 非 100) | Negada(cteMotivoStatus 为 cStat - 原因);任务终态失败(Falha)不发回调,请经查询接口获知 |
cte.canceled | 取消 135 | Cancelada |
cte.event.registered | 其他事件登记成功 | 平台信封,data 带 event_code / n_seq / protocolo |
cte.authorized、cte.rejected、cte.canceled
三个单据结果事件使用兼容载荷(tipo="CT-e",字段顺序固定),与 NF-e 的 nfe* 字段平行:
{ "tipo": "CT-e", "empresaId": "1934811222334455", "cteId": "CTE-ORD-1", "cteStatus": "Autorizada", "cteMotivoStatus": null,"cteLinkDacte": "https://.../openapi/files/dacte/3526...?token=...", "cteLinkXml": "https://.../openapi/files/xml/7?token=...", "cteNumero": "1", "cteSerie": "1","cteChaveAcesso": "3526...", "cteDataEmissao": "2026-09-06T12:00:00Z", "cteDataAutorizacao": "2026-09-06T12:00:03Z","cteNumeroProtocolo": "135260000000001", "cteDigestValue": "..." }
| 字段 | 类型 | 说明 |
|---|---|---|
tipo | string | 固定 CT-e |
empresaId | string | 主体标识 |
cteId | string | 发行时传入的 id |
cteStatus | string | Autorizada / Negada / Cancelada |
cteMotivoStatus | string | Negada 时为 cStat - xMotivo;其余为 null |
cteLinkDacte | string | DACTE PDF 下载链接(首次下载触发渲染) |
cteLinkXml | string | 授权 XML(cteProc)下载链接 |
cteNumero | string | CT-e 号码 |
cteSerie | string | CT-e 系列 |
cteChaveAcesso | string | 44 位访问密钥 |
cteDataEmissao | string | 开具时间,ISO-8601 UTC |
cteDataAutorizacao | string | 授权时间,ISO-8601 UTC |
cteNumeroProtocolo | string | SEFAZ 授权协议号 |
cteDigestValue | string | XML 签名的 DigestValue |
cteLinkDacte 与 cteLinkXml 在授权回调里即可用(DACTE 首次下载才渲染);链接不需要签名头、302 跳转,有效期与错误码见文件下载。
cte.event.registered
取消以外的任一授权后事件登记成功时发出(信函更正、交付凭证、交付失败、服务不符及其撤销)。使用平台信封(version / event_id / event_type / occurred_at / data):
{"version": "1.0","event_id": "7312345678901234567","event_type": "cte.event.registered","occurred_at": "2026-09-06T13:00:00Z","data": {"cte_id": "1001","chave": "35260940673061000134570010000000011000000010","external_ref": "CTE-ORD-1","event_code": "110110","n_seq": 1,"protocolo": "135260000000099"}}
| 字段 | 类型 | 说明 |
|---|---|---|
version | string | 载荷版本,1.0 |
event_id | string | 事件标识;重试时保持不变,用于去重 |
event_type | string | cte.event.registered |
occurred_at | string | 登记时间,ISO-8601 UTC |
data.cte_id | string | 平台内部单据标识 |
data.chave | string | 44 位访问密钥 |
data.external_ref | string | 发行时传入的 id |
data.event_code | string | SEFAZ 事件码(110110、110180、110181、110190、110191、610110、610111) |
data.n_seq | integer | 事件序号 |
data.protocolo | string | 事件协议号 |
错误模型
错误形状与 NF-e 相同:业务错误为 [{ "codigo", "mensagem" }](HTTP 400;单据 / 任务不存在 HTTP 404,codigo 为 CTe0001),鉴权层错误为平台信封(401 / 403 / 429,见认证与签名)。
| codigo | 场景 | 处置 |
|---|---|---|
| CTe0001 | cteId 不存在或非本主体 | 核对 id 与 empresaId |
| 10003000 | empresaId 不存在 | 核对 empresaId |
| 10017004 | 主体不可发行(未审批 / 证书未就绪) | 等待审批 / 关联证书 |
| 10017005 / 10017006 | 同请求并发重复 / 该 CNPJ 待处理任务超限 | 稍后重试 |
| 10017007 | 号段无法确定(未配置或多个启用号段未指定) | 配置模型 57 号段 |
| 10017010 | ambienteEmissao 与主体环境不一致 | 按主体环境提交 |
| 10017011 | 市政 IBGE 码不存在 | 核对 codigoIbge |
| 10017012 / 10017013 | 参与方缺失 / 承担方与 IE 指示不符 | 补参与方或改 indicadorIeTomador |
| 10017014 | 单据引用不合法(缺失、chave 校验位错、三种类型混用、前序单据与服务类型不符) | 按发行字段表调整 |
| 10017015 | 单据类型与引用不符(补充 / 替代) | 按 tipo 补 ctesComplementados / cteSubstituido |
| 10017016 | 运费组成合计不等于总额,或 aReceber > 总额 | 修正金额 |
| 10017017 / 10017018 / 10017019 | RNTRC 非法 / 模态不支持 / 枚举或格式非法(mensagem 点名字段) | 按 mensagem 修正 |
| 10017020 / 10017021 / 10017022 / 10017023 / 10017024 / 10017025 | 税参缺失 / 禁传 / 与税制不符 / 跨州非纳税人缺 icmsUfFim / 税率表缺项 / CST 不支持 | 见发行 CT-e 的税参小节 |
| 10017030 | 同 id 报文不同 | 换 id 或沿用原报文 |
| 10017031 | 生产环境同 id 已有在途 / 已授权单据 | 查询原单 |
| 10017040 / 10017041 / 10017042 / 10017043 / 10017044 / 10017045 | 状态不允许事件 / 超取消窗口 / 事件文本非法 / SEFAZ 拒绝事件 / 更正序号超限 / 被撤销事件不存在 | 见取消与各事件端点 |
| 10017048 / 10017049 | 已登记信函更正不可取消 / 信函更正超 720 小时窗口 | 见取消与信函更正端点 |
| 10001001 | 请求字段校验失败(每字段一条) | 按 mensagem 修正 |
发行阶段的 SEFAZ 驳回不走 HTTP 错误,而是查询结果 Negada + Webhook cte.rejected。
支持范围与限制
- 模型 57 CT-e 4.00,公路模态;正常 / 补充 / 替代单;服务类型全部五种。
- 税组 ICMS 00 / 20 / 40 / 41 / 51 / 60 / 90 / OutraUF / SN + ICMSUFFim + vTotTrib;IBS/CBS 二期。
- 应急:SVC(SVC-RS / SVC-SP)与 EPEC 由平台按州配置切换,集成商无感知,查询
tipoEmissao可见;应急授权的单据其后续事件仍送本州正常授权方。 - 不支持:其他模态、多式联运、GTV、CT-e OS(模型 67)、收票(DistDFe)。
联调清单
- 认证测试环境完成主体注册、证书关联、CT-e 号段配置。
- 发行一张最小 CT-e(发行 CT-e 中的示例),查询到
Autorizada,下载 XML 与 DACTE。 - 同
id重发一次,确认返回 200 且未产生第二张单据。 - 登记一条信函更正与一条交付凭证,事件列表可见;撤销交付凭证。
- 取消单据,查询到
Cancelada,收到cte.canceled回调。 - 故意传错(模态
Aereo、组成合计不符),确认收到 400 错误数组。
