TF Fiscal
Documentación

CT-e

Emisión de CT-e en nombre de transportistas (modelo 57, modal por carretera): flujo de integración, endpoints, cargas de webhook, modelo de errores, alcance y lista de verificación de integración.

Visión general

La API de CT-e emite documentos electrónicos de transporte (CT-e, modelo 57, modal por carretera) en nombre de transportistas, consulta su estado, los cancela y registra eventos posteriores a la autorización (carta de corrección, comprobante de entrega, insuceso en la entrega, prestación en desacuerdo). El registro de la empresa, la vinculación del certificado y el registro del webhook se comparten con la NF-e y aquí solo se referencian.

Convención de ruta: el segmento de recurso es la categoría del documento cte; toda operación a nivel de documento vive bajo /openapi/v2/empresas/{empresaId}/cte/{cteId}, donde cteId es el id enviado en la emisión.

Flujo de integración

PasoAPIObservaciones
1 Registrar empresaRegistrar empresaIgual que la NF-e; un transportista es una empresa como cualquier otra
2 Vincular certificadoVincular certificadoIgual que la NF-e
3 Registrar webhookRegistrar webhookIgual que la NF-e; los resultados de CT-e reutilizan la misma URL de callback
4 EmitirEmitir CT-eAceptado de inmediato; autorizado de forma asíncrona en la SEFAZ
5 ConsultarConsultar CT-eEstado, datos del documento, enlaces de descarga de XML / DACTE, lista de eventos
6 CancelarCancelar CT-eDentro de las 168 horas posteriores a la autorización
7 Eventosvea la tabla de endpoints más abajoCarta de corrección / comprobante de entrega / insuceso en la entrega / prestación en desacuerdo y sus cancelaciones
8 Lista de eventosListar eventosTodos los eventos registrados

Requisitos previos

  • La empresa debe estar aprobada con un certificado utilizable, y su CNPJ debe estar habilitado para CT-e en la autoridad tributaria estatal (IE registrada como prestadora de servicios de transporte y acreditación de CT-e completada). Sin ello la SEFAZ devuelve 230 - IE do emitente não cadastrada, lo que la plataforma no puede resolver.
  • La empresa debe tener una serie de numeración de CT-e (modelo 57). Si no hay ninguna configurada, o hay varias habilitadas y la solicitud no elige una, la API devuelve 10017007.
  • La fase uno admite solo el modal por carretera (Rodoviario); otros modales se rechazan en la aceptación (10017018).
  • ambienteEmissao debe coincidir con el entorno actual de la empresa (10017010), vea Entornos.

Autenticación

Idéntica a la NF-e: cabeceras token / timestamp / sign, con sign = MD5(token + path + body + timestamp) en hexadecimal minúsculo; path incluye el prefijo /openapi y las variables de ruta y excluye la cadena de consulta; GET sin cuerpo usa la cadena vacía; POST firma el JSON bruto sin CR/LF (un POST sin cuerpo firma la cadena vacía). Los detalles del algoritmo, las implementaciones de referencia y la solución de problemas están en Autenticación.

Endpoints

Todas las rutas son relativas a /openapi/v2/empresas/{empresaId}/cte.

MétodoRutaEndpointEvento
POST``Emitir CT-eAutorización asíncrona
GET/{cteId}Consultar CT-e
POST/{cteId}/cancelarCancelar CT-e110111
POST/{cteId}/carta-correcaoCarta de corrección110110
POST/{cteId}/comprovante-entregaComprobante de entrega110180
POST/{cteId}/comprovante-entrega/{protocoloEvento}/cancelarCancelar comprobante de entrega110181
POST/{cteId}/insucesso-entregaInsuceso en la entrega110190
POST/{cteId}/insucesso-entrega/{protocoloEvento}/cancelarCancelar insuceso en la entrega110191
POST/{chaveAcesso}/desacordoPrestación en desacuerdo610110
POST/{chaveAcesso}/desacordo/{protocoloEvento}/cancelarCancelar prestación en desacuerdo610111
GET/{cteId}/eventosListar eventos

Todo evento se envía de forma síncrona y, en caso de éxito, devuelve el objeto del evento (chaveAcesso, tipo, codigo, sequencia, status, motivo, protocolo, data, linkXml). Los campos de texto se sanitizan (acentos eliminados, espacios en blanco consolidados) antes de la validación de longitud; las coordenadas se registran con seis decimales.

Aviso: los endpoints de prestación en desacuerdo son los únicos direccionados por la clave de acceso de un CT-e emitido por otra empresa: esta empresa actúa como receptora / tomadora de ese documento, y el evento se encamina al estado de ese documento.

Carga del webhook

El registro del webhook y las cabeceras de firma se comparten con la NF-e, vea Webhooks. Se emiten cuatro códigos de evento para CT-e:

Código del eventoDisparadorcteStatus
cte.authorizedAutorización 100Autorizada
cte.rejectedRechazo de la SEFAZ (cStat distinto de 100)Negada (cteMotivoStatus es cStat - motivo); un fallo terminal de la tarea (Falha) no envía callback, use la API de consulta
cte.canceledCancelación 135Cancelada
cte.event.registeredCualquier otro evento registradoSobre de la plataforma; data lleva event_code / n_seq / protocolo

cte.authorized, cte.rejected, cte.canceled

Los tres eventos de resultado del documento usan la carga de compatibilidad (tipo="CT-e", orden fijo de campos), paralela a los campos nfe* de la NF-e:

json
{ "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": "..." }
CampoTipoDescripción
tipostringSiempre CT-e, lo que indica que el callback habla de un documento de transporte
empresaIdstringIdentificador de la empresa transportista en la plataforma
cteIdstringEl identificador que el integrador envió en la emisión
cteStatusstringEn qué situación está el documento: Autorizada autorizado, Negada rechazado, Cancelada cancelado
cteMotivoStatusstringExplicación de esa situación; en Negada trae el cStat - xMotivo de la SEFAZ, en los demás es null
cteLinkDactestringEnlace de descarga del PDF del DACTE, la versión impresa del CT-e que acompaña al vehículo
cteLinkXmlstringEnlace de descarga del XML autorizado (cteProc), el original con valor legal del documento
cteNumerostringNúmero secuencial que el documento tomó de la serie
cteSeriestringRango de numeración del que salió ese número
cteChaveAcessostringLos 44 dígitos que identifican este documento en todo el país
cteDataEmissaostringMomento que consta en el documento como el de emisión, ISO-8601 UTC
cteDataAutorizacaostringMomento en que la SEFAZ autorizó el documento, ISO-8601 UTC
cteNumeroProtocolostringRecibo con el que la SEFAZ confirmó la autorización
cteDigestValuestringResumen de la firma digital del XML, usado para comprobar que el original no fue alterado

cteLinkDacte y cteLinkXml son utilizables en cuanto llega el callback de autorización; los enlaces no necesitan cabeceras de firma, redirigen con 302, y su validez y códigos de error se describen en Descarga de archivos.

cte.event.registered

Se emite cuando se registra cualquier evento posterior a la autorización distinto de la cancelación (carta de corrección, comprobante de entrega, insuceso en la entrega, prestación en desacuerdo y sus cancelaciones). Usa el sobre de la plataforma (version / event_id / event_type / occurred_at / data):

json
{
"version": "1.0",
"event_id": "7312345678901234567",
"event_type": "cte.event.registered",
"occurred_at": "2026-09-06T13:00:00Z",
"data": {
"cte_id": "1001",
"chave": "35260940673061000134570010000000011000000016",
"external_ref": "CTE-ORD-1",
"event_code": "110110",
"n_seq": 1,
"protocolo": "135260000000099"
}
}
CampoTipoDescripción
versionstringVersión del formato de la carga, hoy 1.0
event_idstringIdentificador de este envío; idéntico en los reintentos, úselo para deduplicar
event_typestringDe qué tipo de evento habla el callback, aquí siempre cte.event.registered
occurred_atstringMomento en que la SEFAZ registró el evento, ISO-8601 UTC
data.cte_idstringIdentificador que la plataforma da internamente a este documento
data.chavestringLos 44 dígitos que identifican el documento en todo el país
data.external_refstringEl identificador que el integrador envió en la emisión
data.event_codestringNúmero que la SEFAZ usa para ese tipo de evento (110110, 110180, 110181, 110190, 110191, 610110, 610111)
data.n_seqintegerCuántas veces se registró ese tipo de evento en este documento
data.protocolostringRecibo que la SEFAZ emitió para este registro

Modelo de errores

Mismas formas que la NF-e: los errores de negocio son [{ "codigo", "mensagem" }] (HTTP 400; un documento / tarea inexistente es HTTP 404 con codigo CTe0001); los errores de la capa de autenticación usan el sobre de la plataforma (401 / 403 / 429, vea Autenticación).

codigoEscenarioAcción
CTe0001cteId no encontrado o no pertenece a la empresaVerifique id y empresaId
10003000empresaId no encontradoVerifique empresaId
10017004La empresa no puede emitir (no aprobada / certificado no listo)Espere la aprobación / vincule el certificado
10017005 / 10017006Solicitud duplicada concurrente / demasiadas tareas pendientes para el CNPJReintente más tarde
10017007Serie de numeración no resuelta (ninguna configurada, o varias habilitadas sin elección)Configure una serie del modelo 57
10017010ambienteEmissao difiere del entorno de la empresaEnvíe para el entorno de la empresa
10017011Código IBGE de municipio no encontradoVerifique codigoIbge
10017012 / 10017013Participante ausente / tomador inconsistente con el indicador de IEIncluya el participante o cambie indicadorIeTomador
10017014Referencias de documentos inválidas (ausentes, dígito verificador incorrecto, grupos mezclados, documentos anteriores inconsistentes con el tipo de servicio)Ajuste según la tabla de campos de la emisión
10017015Tipo de documento inconsistente con las referencias (complementario / sustituto)Envíe ctesComplementados / cteSubstituido según tipo
10017016Los componentes no suman el total, o aReceber > totalCorrija los importes
10017017 / 10017018 / 10017019RNTRC inválido / modal no soportado / enumeración o formato inválido (mensagem indica el campo)Corrija según mensagem
10017020 / 10017021 / 10017022 / 10017023 / 10017024 / 10017025Parámetro tributario ausente / no permitido / incompatible con el régimen / icmsUfFim obligatorio / fila de la tabla de alícuotas ausente / CST no soportadoVea la sección de parámetros tributarios en Emitir CT-e
10017030Mismo id con mensaje diferenteUse un nuevo id o reenvíe el mensaje original
10017031Producción: ya existe un documento activo / autorizado para el idConsulte el original
10017040 / 10017041 / 10017042 / 10017043 / 10017044 / 10017045El estado no permite el evento / ventana de cancelación excedida / texto del evento inválido / la SEFAZ rechazó el evento / límite de secuencia de la corrección / evento referenciado no encontradoVea los endpoints de cancelación y de eventos
10017048 / 10017049Cancelación bloqueada por una carta de corrección registrada / carta de corrección fuera de la ventana de 720 horasVea los endpoints de cancelación y de carta de corrección
10001001Falló la validación de campos (una entrada por campo)Corrija según mensagem

Los rechazos de la SEFAZ durante la emisión no son errores HTTP: aparecen como estado Negada en la consulta y como el webhook cte.rejected.

Alcance y limitaciones

  • CT-e modelo 57 versión 4.00, modal por carretera; documentos normales / complementarios / sustitutos; los cinco tipos de servicio.
  • Grupos tributarios ICMS 00 / 20 / 40 / 41 / 51 / 60 / 90 / OutraUF / SN + ICMSUFFim + vTotTrib; IBS/CBS en la fase dos.
  • Contingencia: SVC (SVC-RS / SVC-SP) y EPEC los activa la plataforma por estado, de forma transparente para los integradores; tipoEmissao en la consulta lo muestra. Los eventos de documentos autorizados en contingencia se siguen enviando al autorizador regular del estado.
  • No soportado: otros modales, multimodal, GTV, CT-e OS (modelo 67), distribución de documentos recibidos (DistDFe).

Lista de verificación de integración

  1. En el entorno de homologación: empresa registrada, certificado vinculado, serie de numeración de CT-e configurada.
  2. Emita un CT-e mínimo (el ejemplo en Emitir CT-e), consúltelo como Autorizada, descargue el XML y el DACTE.
  3. Reenvíe el mismo id una vez y confirme HTTP 200 sin que se cree un segundo documento.
  4. Registre una carta de corrección y un comprobante de entrega, véalos en la lista de eventos, luego cancele el comprobante de entrega.
  5. Emita un segundo CT-e y cancele ese, consúltelo como Cancelada, reciba el callback cte.canceled. Un documento con carta de corrección registrada ya no puede cancelarse, por eso este paso usa otro documento.
  6. Envíe errores deliberados (modal Aereo, suma de componentes divergente) y confirme el array de errores 400.