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
| Paso | API | Observaciones |
|---|---|---|
| 1 Registrar empresa | Registrar empresa | Igual que la NF-e; un transportista es una empresa como cualquier otra |
| 2 Vincular certificado | Vincular certificado | Igual que la NF-e |
| 3 Registrar webhook | Registrar webhook | Igual que la NF-e; los resultados de CT-e reutilizan la misma URL de callback |
| 4 Emitir | Emitir CT-e | Aceptado de inmediato; autorizado de forma asíncrona en la SEFAZ |
| 5 Consultar | Consultar CT-e | Estado, datos del documento, enlaces de descarga de XML / DACTE, lista de eventos |
| 6 Cancelar | Cancelar CT-e | Dentro de las 168 horas posteriores a la autorización |
| 7 Eventos | vea la tabla de endpoints más abajo | Carta de corrección / comprobante de entrega / insuceso en la entrega / prestación en desacuerdo y sus cancelaciones |
| 8 Lista de eventos | Listar eventos | Todos 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). ambienteEmissaodebe 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étodo | Ruta | Endpoint | Evento |
|---|---|---|---|
| POST | `` | Emitir CT-e | Autorización asíncrona |
| GET | /{cteId} | Consultar CT-e | |
| DELETE | /{cteId} | Cancelar CT-e | 110111 |
| POST | /{cteId}/carta-correcao | Carta de corrección | 110110 |
| POST | /{cteId}/comprovante-entrega | Comprobante de entrega | 110180 |
| DELETE | /{cteId}/comprovante-entrega/{protocoloEvento} | Cancelar comprobante de entrega | 110181 |
| POST | /{cteId}/insucesso-entrega | Insuceso en la entrega | 110190 |
| DELETE | /{cteId}/insucesso-entrega/{protocoloEvento} | Cancelar insuceso en la entrega | 110191 |
| POST | /{chaveAcesso}/desacordo | Prestación en desacuerdo | 610110 |
| DELETE | /{chaveAcesso}/desacordo/{protocoloEvento} | Cancelar prestación en desacuerdo | 610111 |
| GET | /{cteId}/eventos | Listar 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 evento | Disparador | cteStatus |
|---|---|---|
cte.authorized | Autorización 100 | Autorizada |
cte.rejected | Rechazo 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.canceled | Cancelación 135 | Cancelada |
cte.event.registered | Cualquier otro evento registrado | Sobre 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:
{ "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": "..." }
| Campo | Tipo | Descripción |
|---|---|---|
tipo | string | Siempre CT-e |
empresaId | string | Identificador de la empresa |
cteId | string | El id enviado en la emisión |
cteStatus | string | Autorizada / Negada / Cancelada |
cteMotivoStatus | string | cStat - xMotivo en Negada; null en los demás |
cteLinkDacte | string | Enlace de descarga del PDF del DACTE (renderizado en la primera descarga) |
cteLinkXml | string | Enlace de descarga del XML autorizado (cteProc) |
cteNumero | string | Número del CT-e |
cteSerie | string | Serie del CT-e |
cteChaveAcesso | string | Clave de acceso de 44 dígitos |
cteDataEmissao | string | Fecha de emisión, ISO-8601 UTC |
cteDataAutorizacao | string | Fecha de autorización, ISO-8601 UTC |
cteNumeroProtocolo | string | Protocolo de autorización de la SEFAZ |
cteDigestValue | string | DigestValue 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):
{"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"}}
| Campo | Tipo | Descripción |
|---|---|---|
version | string | Versión de la carga, 1.0 |
event_id | string | Identificador del evento; idéntico en los reintentos, úselo para deduplicar |
event_type | string | cte.event.registered |
occurred_at | string | Hora del registro, ISO-8601 UTC |
data.cte_id | string | Identificador interno del documento en la plataforma |
data.chave | string | Clave de acceso de 44 dígitos |
data.external_ref | string | El id enviado en la emisión |
data.event_code | string | Código del evento en la SEFAZ (110110, 110180, 110181, 110190, 110191, 610110, 610111) |
data.n_seq | integer | Número secuencial del evento |
data.protocolo | string | Nú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).
| codigo | Escenario | Acción |
|---|---|---|
| CTe0001 | cteId no encontrado o no pertenece a la empresa | Verifique id y empresaId |
| 10003000 | empresaId no encontrado | Verifique empresaId |
| 10017004 | La empresa no puede emitir (no aprobada / certificado no listo) | Espere la aprobación / vincule el certificado |
| 10017005 / 10017006 | Solicitud duplicada concurrente / demasiadas tareas pendientes para el CNPJ | Reintente más tarde |
| 10017007 | Serie de numeración no resuelta (ninguna configurada, o varias habilitadas sin elección) | Configure una serie del modelo 57 |
| 10017010 | ambienteEmissao difiere del entorno de la empresa | Envíe para el entorno de la empresa |
| 10017011 | Código IBGE de municipio no encontrado | Verifique codigoIbge |
| 10017012 / 10017013 | Participante ausente / tomador inconsistente con el indicador de IE | Incluya el participante o cambie indicadorIeTomador |
| 10017014 | Referencias 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 |
| 10017015 | Tipo de documento inconsistente con las referencias (complementario / sustituto) | Envíe ctesComplementados / cteSubstituido según tipo |
| 10017016 | Los componentes no suman el total, o aReceber > total | Corrija los importes |
| 10017017 / 10017018 / 10017019 | RNTRC inválido / modal no soportado / enumeración o formato inválido (mensagem indica el campo) | Corrija según mensagem |
| 10017020 / 10017021 / 10017022 / 10017023 / 10017024 / 10017025 | Parámetro tributario ausente / no permitido / incompatible con el régimen / icmsUfFim obligatorio / fila de la tabla de alícuotas ausente / CST no soportado | Vea la sección de parámetros tributarios en Emitir CT-e |
| 10017030 | Mismo id con mensaje diferente | Use un nuevo id o reenvíe el mensaje original |
| 10017031 | Producción: ya existe un documento activo / autorizado para el id | Consulte el original |
| 10017040 / 10017041 / 10017042 / 10017043 / 10017044 / 10017045 | El 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 encontrado | Vea los endpoints de cancelación y de eventos |
| 10017048 / 10017049 | Cancelación bloqueada por una carta de corrección registrada / carta de corrección fuera de la ventana de 720 horas | Vea los endpoints de cancelación y de carta de corrección |
| 10001001 | Falló 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;
tipoEmissaoen 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
- En el entorno de homologación: empresa registrada, certificado vinculado, serie de numeración de CT-e configurada.
- Emita un CT-e mínimo (el ejemplo en Emitir CT-e), consúltelo como
Autorizada, descargue el XML y el DACTE. - Reenvíe el mismo
iduna vez y confirme HTTP 200 sin que se cree un segundo documento. - Registre una carta de corrección y un comprobante de entrega, véalos en la lista de eventos, luego cancele el comprobante de entrega.
- Cancele el documento, consúltelo como
Cancelada, reciba el callbackcte.canceled. - Envíe errores deliberados (modal
Aereo, suma de componentes divergente) y confirme el array de errores 400.
