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; es una cuestión de registro fiscal del lado de la empresa 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 / DELETE sin cuerpo usan la cadena vacía; un DELETE con cuerpo (cancelación) firma el JSON bruto sin CR/LF. 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
DELETE/{cteId}Cancelar CT-e110111
POST/{cteId}/carta-correcaoCarta de corrección110110
POST/{cteId}/comprovante-entregaComprobante de entrega110180
DELETE/{cteId}/comprovante-entrega/{protocoloEvento}Cancelar comprobante de entrega110181
POST/{cteId}/insucesso-entregaInsuceso en la entrega110190
DELETE/{cteId}/insucesso-entrega/{protocoloEvento}Cancelar insuceso en la entrega110191
POST/{chaveAcesso}/desacordoPrestación en desacuerdo610110
DELETE/{chaveAcesso}/desacordo/{protocoloEvento}Cancelar 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
empresaIdstringIdentificador de la empresa
cteIdstringEl id enviado en la emisión
cteStatusstringAutorizada / Negada / Cancelada
cteMotivoStatusstringcStat - xMotivo en Negada; null en los demás
cteLinkDactestringEnlace de descarga del PDF del DACTE (renderizado en la primera descarga)
cteLinkXmlstringEnlace de descarga del XML autorizado (cteProc)
cteNumerostringNúmero del CT-e
cteSeriestringSerie del CT-e
cteChaveAcessostringClave de acceso de 44 dígitos
cteDataEmissaostringFecha de emisión, ISO-8601 UTC
cteDataAutorizacaostringFecha de autorización, ISO-8601 UTC
cteNumeroProtocolostringProtocolo de autorización de la SEFAZ
cteDigestValuestringDigestValue de la firma del XML

cteLinkDacte y cteLinkXml son utilizables en cuanto llega el callback de autorización (el DACTE se renderiza en la primera descarga); 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": "35260940673061000134570010000000011000000010",
"external_ref": "CTE-ORD-1",
"event_code": "110110",
"n_seq": 1,
"protocolo": "135260000000099"
}
}
CampoTipoDescripción
versionstringVersión de la carga, 1.0
event_idstringIdentificador del evento; idéntico en los reintentos, úselo para deduplicar
event_typestringcte.event.registered
occurred_atstringHora del registro, ISO-8601 UTC
data.cte_idstringIdentificador interno del documento en la plataforma
data.chavestringClave de acceso de 44 dígitos
data.external_refstringEl id enviado en la emisión
data.event_codestringCódigo del evento en la SEFAZ (110110, 110180, 110181, 110190, 110191, 610110, 610111)
data.n_seqintegerNúmero secuencial del evento
data.protocolostringNúmero de protocolo del evento

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. Cancele el documento, consúltelo como Cancelada, reciba el callback cte.canceled.
  6. Envíe errores deliberados (modal Aereo, suma de componentes divergente) y confirme el array de errores 400.