CT-e
Emissão de CT-e em nome de transportadoras (modelo 57, modal rodoviário): fluxo de integração, endpoints, cargas de webhook, modelo de erros, escopo e checklist de integração.
Visão geral
A API de CT-e emite documentos eletrônicos de transporte (CT-e, modelo 57, modal rodoviário) em nome de transportadoras, consulta o status, cancela e registra eventos pós-autorização (carta de correção, comprovante de entrega, insucesso na entrega, prestação em desacordo). Registro da empresa, vínculo do certificado e registro do webhook são compartilhados com a NF-e e apenas referenciados aqui.
Convenção de caminho: o segmento de recurso é a categoria do documento cte; toda operação no nível do documento fica sob /openapi/v2/empresas/{empresaId}/cte/{cteId}, onde cteId é o id enviado na emissão.
Fluxo de integração
| Passo | API | Observações |
|---|---|---|
| 1 Registrar empresa | Registrar empresa | Igual à NF-e; uma transportadora é uma empresa como qualquer outra |
| 2 Vincular certificado | Vincular certificado | Igual à NF-e |
| 3 Registrar webhook | Registrar webhook | Igual à NF-e; os resultados de CT-e reutilizam a mesma URL de callback |
| 4 Emitir | Emitir CT-e | Aceito imediatamente; autorizado de forma assíncrona na SEFAZ |
| 5 Consultar | Consultar CT-e | Status, dados do documento, links de download de XML / DACTE, lista de eventos |
| 6 Cancelar | Cancelar CT-e | Dentro de 168 horas após a autorização |
| 7 Eventos | veja a tabela de endpoints abaixo | Carta de correção / comprovante de entrega / insucesso na entrega / prestação em desacordo e seus cancelamentos |
| 8 Lista de eventos | Listar eventos | Todos os eventos registrados |
Pré-requisitos
- A empresa precisa estar aprovada com certificado utilizável, e seu CNPJ precisa estar habilitado para CT-e na Secretaria da Fazenda estadual (IE cadastrada como prestadora de serviço de transporte e credenciamento de CT-e concluído). Sem isso a SEFAZ retorna
230 - IE do emitente não cadastrada; trata-se de uma questão de cadastro fiscal do lado da empresa que a plataforma não consegue resolver. - A empresa precisa ter uma série de numeração de CT-e (modelo 57). Se nenhuma estiver configurada, ou várias estiverem habilitadas e a requisição não escolher uma, a API retorna
10017007. - A fase um suporta apenas o modal rodoviário (Rodoviario); outros modais são rejeitados na aceitação (
10017018). ambienteEmissaodeve coincidir com o ambiente atual da empresa (10017010), veja Ambientes.
Autenticação
Idêntica à NF-e: cabeçalhos token / timestamp / sign, com sign = MD5(token + path + body + timestamp) em hexadecimal minúsculo; path inclui o prefixo /openapi e as variáveis de caminho e exclui a query string; GET / DELETE sem corpo usam string vazia; um DELETE com corpo (cancelamento) assina o JSON bruto sem CR/LF. Detalhes do algoritmo, implementações de referência e solução de problemas estão em Autenticação.
Endpoints
Todos os caminhos são relativos a /openapi/v2/empresas/{empresaId}/cte.
| Método | Caminho | Endpoint | Evento |
|---|---|---|---|
| POST | `` | Emitir CT-e | Autorização assíncrona |
| GET | /{cteId} | Consultar CT-e | |
| DELETE | /{cteId} | Cancelar CT-e | 110111 |
| POST | /{cteId}/carta-correcao | Carta de correção | 110110 |
| POST | /{cteId}/comprovante-entrega | Comprovante de entrega | 110180 |
| DELETE | /{cteId}/comprovante-entrega/{protocoloEvento} | Cancelar comprovante de entrega | 110181 |
| POST | /{cteId}/insucesso-entrega | Insucesso na entrega | 110190 |
| DELETE | /{cteId}/insucesso-entrega/{protocoloEvento} | Cancelar insucesso na entrega | 110191 |
| POST | /{chaveAcesso}/desacordo | Prestação em desacordo | 610110 |
| DELETE | /{chaveAcesso}/desacordo/{protocoloEvento} | Cancelar prestação em desacordo | 610111 |
| GET | /{cteId}/eventos | Listar eventos |
Todo evento é enviado de forma síncrona e, em caso de sucesso, devolve o objeto do evento (chaveAcesso, tipo, codigo, sequencia, status, motivo, protocolo, data, linkXml). Os campos de texto são sanitizados (acentos removidos, espaços em branco consolidados) antes da validação de comprimento; as coordenadas são registradas com seis casas decimais.
Nota: os endpoints de prestação em desacordo são os únicos endereçados pela chave de acesso de um CT-e emitido por outra empresa: esta empresa age como recebedora / tomadora daquele documento, e o evento é encaminhado ao estado daquele documento.
Carga do webhook
O registro do webhook e os cabeçalhos de assinatura são compartilhados com a NF-e, veja Webhooks. Quatro códigos de evento são emitidos para CT-e:
| Código do evento | Gatilho | cteStatus |
|---|---|---|
cte.authorized | Autorização 100 | Autorizada |
cte.rejected | Rejeição da SEFAZ (cStat diferente de 100) | Negada (cteMotivoStatus é cStat - motivo); uma falha terminal da tarefa (Falha) não envia callback, use a API de consulta |
cte.canceled | Cancelamento 135 | Cancelada |
cte.event.registered | Qualquer outro evento registrado | Envelope da plataforma; data traz event_code / n_seq / protocolo |
cte.authorized, cte.rejected, cte.canceled
Os três eventos de resultado do documento usam a carga de compatibilidade (tipo="CT-e", ordem fixa de campos), paralela aos campos nfe* da 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 | Descrição |
|---|---|---|
tipo | string | Sempre CT-e |
empresaId | string | Identificador da empresa |
cteId | string | O id enviado na emissão |
cteStatus | string | Autorizada / Negada / Cancelada |
cteMotivoStatus | string | cStat - xMotivo em Negada; null nos demais |
cteLinkDacte | string | Link de download do PDF do DACTE (renderizado no primeiro download) |
cteLinkXml | string | Link de download do XML autorizado (cteProc) |
cteNumero | string | Número do CT-e |
cteSerie | string | Série do CT-e |
cteChaveAcesso | string | Chave de acesso de 44 dígitos |
cteDataEmissao | string | Data de emissão, ISO-8601 UTC |
cteDataAutorizacao | string | Data de autorização, ISO-8601 UTC |
cteNumeroProtocolo | string | Protocolo de autorização da SEFAZ |
cteDigestValue | string | DigestValue da assinatura do XML |
cteLinkDacte e cteLinkXml são utilizáveis assim que o callback de autorização chega (o DACTE é renderizado no primeiro download); os links não precisam de cabeçalhos de assinatura, redirecionam com 302, e sua validade e códigos de erro estão descritos em Download de arquivos.
cte.event.registered
Emitido quando qualquer evento pós-autorização que não seja cancelamento é registrado (carta de correção, comprovante de entrega, insucesso na entrega, prestação em desacordo e seus cancelamentos). Usa o envelope da 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 | Descrição |
|---|---|---|
version | string | Versão da carga, 1.0 |
event_id | string | Identificador do evento; idêntico nas retentativas, use-o para deduplicação |
event_type | string | cte.event.registered |
occurred_at | string | Hora do registro, ISO-8601 UTC |
data.cte_id | string | Identificador interno do documento na plataforma |
data.chave | string | Chave de acesso de 44 dígitos |
data.external_ref | string | O id enviado na emissão |
data.event_code | string | Código do evento na SEFAZ (110110, 110180, 110181, 110190, 110191, 610110, 610111) |
data.n_seq | integer | Número sequencial do evento |
data.protocolo | string | Número de protocolo do evento |
Modelo de erros
Mesmas formas da NF-e: erros de negócio são [{ "codigo", "mensagem" }] (HTTP 400; documento / tarefa inexistente é HTTP 404 com codigo CTe0001); erros da camada de autenticação usam o envelope da plataforma (401 / 403 / 429, veja Autenticação).
| codigo | Cenário | Ação |
|---|---|---|
| CTe0001 | cteId não encontrado ou não pertence à empresa | Verifique id e empresaId |
| 10003000 | empresaId não encontrado | Verifique empresaId |
| 10017004 | Empresa não pode emitir (não aprovada / certificado não pronto) | Aguarde a aprovação / vincule o certificado |
| 10017005 / 10017006 | Requisição duplicada concorrente / tarefas pendentes em excesso para o CNPJ | Tente novamente mais tarde |
| 10017007 | Série de numeração não resolvida (nenhuma configurada, ou várias habilitadas sem escolha) | Configure uma série do modelo 57 |
| 10017010 | ambienteEmissao difere do ambiente da empresa | Envie para o ambiente da empresa |
| 10017011 | Código IBGE de município não encontrado | Verifique codigoIbge |
| 10017012 / 10017013 | Participante ausente / tomador inconsistente com o indicador de IE | Inclua o participante ou altere indicadorIeTomador |
| 10017014 | Referências de documentos inválidas (ausentes, dígito verificador incorreto, grupos misturados, documentos anteriores inconsistentes com o tipo de serviço) | Ajuste conforme a tabela de campos da emissão |
| 10017015 | Tipo de documento inconsistente com as referências (complementar / substituto) | Envie ctesComplementados / cteSubstituido conforme tipo |
| 10017016 | Componentes não somam o total, ou aReceber > total | Corrija os valores |
| 10017017 / 10017018 / 10017019 | RNTRC inválido / modal não suportado / enumeração ou formato inválido (mensagem indica o campo) | Corrija conforme mensagem |
| 10017020 / 10017021 / 10017022 / 10017023 / 10017024 / 10017025 | Parâmetro tributário ausente / não permitido / incompatível com o regime / icmsUfFim obrigatório / linha da tabela de alíquotas ausente / CST não suportado | Veja a seção de parâmetros tributários em Emitir CT-e |
| 10017030 | Mesmo id com mensagem diferente | Use um novo id ou reenvie a mensagem original |
| 10017031 | Produção: já existe um documento ativo / autorizado para o id | Consulte o original |
| 10017040 / 10017041 / 10017042 / 10017043 / 10017044 / 10017045 | Status não permite o evento / janela de cancelamento excedida / texto do evento inválido / SEFAZ rejeitou o evento / limite de sequência da correção / evento referenciado não encontrado | Veja os endpoints de cancelamento e de eventos |
| 10017048 / 10017049 | Cancelamento bloqueado por carta de correção registrada / carta de correção fora da janela de 720 horas | Veja os endpoints de cancelamento e de carta de correção |
| 10001001 | Falha de validação de campos (uma entrada por campo) | Corrija conforme mensagem |
Rejeições da SEFAZ durante a emissão não são erros HTTP: aparecem como status Negada na consulta e como o webhook cte.rejected.
Escopo e limitações
- CT-e modelo 57 versão 4.00, modal rodoviário; documentos normais / complementares / substitutos; todos os cinco tipos de serviço.
- Grupos tributários ICMS 00 / 20 / 40 / 41 / 51 / 60 / 90 / OutraUF / SN + ICMSUFFim + vTotTrib; IBS/CBS na fase dois.
- Contingência: SVC (SVC-RS / SVC-SP) e EPEC são acionados pela plataforma por estado, de forma transparente para os integradores;
tipoEmissaona consulta mostra isso. Eventos de documentos autorizados em contingência continuam sendo enviados ao autorizador regular do estado. - Não suportado: outros modais, multimodal, GTV, CT-e OS (modelo 67), distribuição de documentos recebidos (DistDFe).
Checklist de integração
- No ambiente de homologação: empresa registrada, certificado vinculado, série de numeração de CT-e configurada.
- Emita um CT-e mínimo (o exemplo em Emitir CT-e), consulte-o como
Autorizada, baixe o XML e o DACTE. - Reenvie o mesmo
iduma vez e confirme HTTP 200 sem criação de um segundo documento. - Registre uma carta de correção e um comprovante de entrega, veja-os na lista de eventos, depois cancele o comprovante de entrega.
- Cancele o documento, consulte-o como
Cancelada, receba o callbackcte.canceled. - Envie erros deliberados (modal
Aereo, soma de componentes divergente) e confirme o array de erros 400.
