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; 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).
  • 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 / 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étodoCaminhoEndpointEvento
POST``Emitir CT-eAutorização assíncrona
GET/{cteId}Consultar CT-e
DELETE/{cteId}Cancelar CT-e110111
POST/{cteId}/carta-correcaoCarta de correção110110
POST/{cteId}/comprovante-entregaComprovante de entrega110180
DELETE/{cteId}/comprovante-entrega/{protocoloEvento}Cancelar comprovante de entrega110181
POST/{cteId}/insucesso-entregaInsucesso na entrega110190
DELETE/{cteId}/insucesso-entrega/{protocoloEvento}Cancelar insucesso na entrega110191
POST/{chaveAcesso}/desacordoPrestação em desacordo610110
DELETE/{chaveAcesso}/desacordo/{protocoloEvento}Cancelar 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
empresaIdstringIdentificador da empresa
cteIdstringO id enviado na emissão
cteStatusstringAutorizada / Negada / Cancelada
cteMotivoStatusstringcStat - xMotivo em Negada; null nos demais
cteLinkDactestringLink de download do PDF do DACTE (renderizado no primeiro download)
cteLinkXmlstringLink de download do XML autorizado (cteProc)
cteNumerostringNúmero do CT-e
cteSeriestringSérie do CT-e
cteChaveAcessostringChave de acesso de 44 dígitos
cteDataEmissaostringData de emissão, ISO-8601 UTC
cteDataAutorizacaostringData de autorização, ISO-8601 UTC
cteNumeroProtocolostringProtocolo de autorização da SEFAZ
cteDigestValuestringDigestValue 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):

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"
}
}
CampoTipoDescrição
versionstringVersão da carga, 1.0
event_idstringIdentificador do evento; idêntico nas retentativas, use-o para deduplicação
event_typestringcte.event.registered
occurred_atstringHora do registro, ISO-8601 UTC
data.cte_idstringIdentificador interno do documento na plataforma
data.chavestringChave de acesso de 44 dígitos
data.external_refstringO id enviado na emissão
data.event_codestringCódigo do evento na SEFAZ (110110, 110180, 110181, 110190, 110191, 610110, 610111)
data.n_seqintegerNúmero sequencial do evento
data.protocolostringNú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).

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. Cancele o documento, consulte-o como Cancelada, receba o callback cte.canceled.
  6. Envie erros deliberados (modal Aereo, soma de componentes divergente) e confirme o array de erros 400.