TF Fiscal
Documentação

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

PassoAPIObservações
1 Registrar empresaRegistrar empresaIgual à NF-e; uma transportadora é uma empresa como qualquer outra
2 Vincular certificadoVincular certificadoIgual à NF-e
3 Registrar webhookRegistrar webhookIgual à NF-e; os resultados de CT-e reutilizam a mesma URL de callback
4 EmitirEmitir CT-eAceito imediatamente; autorizado de forma assíncrona na SEFAZ
5 ConsultarConsultar CT-eStatus, dados do documento, links de download de XML / DACTE, lista de eventos
6 CancelarCancelar CT-eDentro de 168 horas após a autorização
7 Eventosveja a tabela de endpoints abaixoCarta de correção / comprovante de entrega / insucesso na entrega / prestação em desacordo e seus cancelamentos
8 Lista de eventosListar eventosTodos 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, o que a plataforma não pode 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).
  • ambienteEmissao deve 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 sem corpo usa string vazia; POST assina o JSON bruto sem CR/LF (um POST sem corpo assina a string vazia). 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étodoCaminhoEndpointEvento
POST``Emitir CT-eAutorização assíncrona
GET/{cteId}Consultar CT-e
POST/{cteId}/cancelarCancelar CT-e110111
POST/{cteId}/carta-correcaoCarta de correção110110
POST/{cteId}/comprovante-entregaComprovante de entrega110180
POST/{cteId}/comprovante-entrega/{protocoloEvento}/cancelarCancelar comprovante de entrega110181
POST/{cteId}/insucesso-entregaInsucesso na entrega110190
POST/{cteId}/insucesso-entrega/{protocoloEvento}/cancelarCancelar insucesso na entrega110191
POST/{chaveAcesso}/desacordoPrestação em desacordo610110
POST/{chaveAcesso}/desacordo/{protocoloEvento}/cancelarCancelar prestação em desacordo610111
GET/{cteId}/eventosListar 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 eventoGatilhocteStatus
cte.authorizedAutorização 100Autorizada
cte.rejectedRejeiçã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.canceledCancelamento 135Cancelada
cte.event.registeredQualquer outro evento registradoEnvelope 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:

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": "..." }
CampoTipoDescrição
tipostringSempre CT-e, indicando que o callback fala de um documento de transporte
empresaIdstringIdentificador da empresa transportadora na plataforma
cteIdstringO identificador que o integrador enviou na emissão
cteStatusstringEm que situação o documento está: Autorizada autorizado, Negada rejeitado, Cancelada cancelado
cteMotivoStatusstringExplicação da situação; em Negada traz o cStat - xMotivo da SEFAZ, nos demais é null
cteLinkDactestringLink de download do PDF do DACTE, a versão impressa do CT-e que acompanha o veículo
cteLinkXmlstringLink de download do XML autorizado (cteProc), o original com valor legal do documento
cteNumerostringNúmero sequencial que o documento tirou da série
cteSeriestringFaixa de numeração de onde esse número saiu
cteChaveAcessostringOs 44 dígitos que identificam este documento em todo o país
cteDataEmissaostringMomento que consta no documento como o da emissão, ISO-8601 UTC
cteDataAutorizacaostringMomento em que a SEFAZ autorizou o documento, ISO-8601 UTC
cteNumeroProtocolostringRecibo com que a SEFAZ confirmou a autorização
cteDigestValuestringResumo da assinatura digital do XML, usado para conferir que o original não foi alterado

cteLinkDacte e cteLinkXml são utilizáveis assim que o callback de autorização chega; 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):

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"
}
}
CampoTipoDescrição
versionstringVersão do formato da carga, hoje 1.0
event_idstringIdentificador deste envio; idêntico nas retentativas, use-o para deduplicação
event_typestringDe que tipo de evento o callback fala, aqui sempre cte.event.registered
occurred_atstringMomento em que a SEFAZ registrou o evento, ISO-8601 UTC
data.cte_idstringIdentificador que a plataforma dá internamente a este documento
data.chavestringOs 44 dígitos que identificam o documento em todo o país
data.external_refstringO identificador que o integrador enviou na emissão
data.event_codestringNúmero que a SEFAZ usa para esse tipo de evento (110110, 110180, 110181, 110190, 110191, 610110, 610111)
data.n_seqintegerA quantas vezes esse tipo de evento já foi registrado neste documento
data.protocolostringRecibo que a SEFAZ emitiu para este registro

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).

codigoCenárioAção
CTe0001cteId não encontrado ou não pertence à empresaVerifique id e empresaId
10003000empresaId não encontradoVerifique empresaId
10017004Empresa não pode emitir (não aprovada / certificado não pronto)Aguarde a aprovação / vincule o certificado
10017005 / 10017006Requisição duplicada concorrente / tarefas pendentes em excesso para o CNPJTente novamente mais tarde
10017007Série de numeração não resolvida (nenhuma configurada, ou várias habilitadas sem escolha)Configure uma série do modelo 57
10017010ambienteEmissao difere do ambiente da empresaEnvie para o ambiente da empresa
10017011Código IBGE de município não encontradoVerifique codigoIbge
10017012 / 10017013Participante ausente / tomador inconsistente com o indicador de IEInclua o participante ou altere indicadorIeTomador
10017014Referê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
10017015Tipo de documento inconsistente com as referências (complementar / substituto)Envie ctesComplementados / cteSubstituido conforme tipo
10017016Componentes não somam o total, ou aReceber > totalCorrija os valores
10017017 / 10017018 / 10017019RNTRC inválido / modal não suportado / enumeração ou formato inválido (mensagem indica o campo)Corrija conforme mensagem
10017020 / 10017021 / 10017022 / 10017023 / 10017024 / 10017025Parâ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 suportadoVeja a seção de parâmetros tributários em Emitir CT-e
10017030Mesmo id com mensagem diferenteUse um novo id ou reenvie a mensagem original
10017031Produção: já existe um documento ativo / autorizado para o idConsulte o original
10017040 / 10017041 / 10017042 / 10017043 / 10017044 / 10017045Status 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 encontradoVeja os endpoints de cancelamento e de eventos
10017048 / 10017049Cancelamento bloqueado por carta de correção registrada / carta de correção fora da janela de 720 horasVeja os endpoints de cancelamento e de carta de correção
10001001Falha 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; tipoEmissao na 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

  1. No ambiente de homologação: empresa registrada, certificado vinculado, série de numeração de CT-e configurada.
  2. Emita um CT-e mínimo (o exemplo em Emitir CT-e), consulte-o como Autorizada, baixe o XML e o DACTE.
  3. Reenvie o mesmo id uma vez e confirme HTTP 200 sem criação de um segundo documento.
  4. Registre uma carta de correção e um comprovante de entrega, veja-os na lista de eventos, depois cancele o comprovante de entrega.
  5. Emita um segundo CT-e e cancele esse, consulte-o como Cancelada, receba o callback cte.canceled. Um documento com carta de correção registrada não pode mais ser cancelado, por isso este passo usa outro documento.
  6. Envie erros deliberados (modal Aereo, soma de componentes divergente) e confirme o array de erros 400.