Weesy Docs

Cancelamento e carta de correção do CT-e

Cancelar CT-e

POST https://apifiscal.weesy.com.br/v1/cte/{id}/cancelamento

Abrir na referência interativa

Pede à SEFAZ o cancelamento de um CT-e autorizado, por exemplo quando o frete não aconteceu. Regras da SEFAZ:

A resposta confirma que recebemos o pedido. Em geral a SEFAZ responde na hora e o CT-e já volta cancelado (ou cancelamento_rejeitado); se a SEFAZ demorar, ele volta cancelamento_solicitado e o resultado chega pelo webhook ou consultando o CT-e.

Parâmetros

NomeOndeTipoDescrição
id
obrigatório
caminhostring

Id do CT-e, devolvido no campo id quando você emitiu.

Exemplo de chamada

cURL

curl --request POST \
  --url "https://apifiscal.weesy.com.br/v1/cte/6ade6278e8340a492a46b564/cancelamento" \
  --header "Authorization: Bearer $WEESY_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
  "justificativa": "Frete não realizado, carga devolvida ao remetente."
}'

Node.js

const resposta = await fetch("https://apifiscal.weesy.com.br/v1/cte/6ade6278e8340a492a46b564/cancelamento", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WEESY_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "justificativa": "Frete não realizado, carga devolvida ao remetente."
  }),
});
console.log(resposta.status, await resposta.text());

Python

import os

import requests

resposta = requests.post(
    "https://apifiscal.weesy.com.br/v1/cte/6ade6278e8340a492a46b564/cancelamento",
    headers={"Authorization": f"Bearer {os.environ['WEESY_TOKEN']}"},
    json={
        "justificativa": "Frete não realizado, carga devolvida ao remetente.",
    },
    timeout=30,
)
print(resposta.status_code, resposta.text)

PHP

<?php

$corpo = <<<'JSON'
{
  "justificativa": "Frete não realizado, carga devolvida ao remetente."
}
JSON;

$contexto = stream_context_create(["http" => [
    "method" => "POST",
    "header" => implode("\r\n", ["Authorization: Bearer " . getenv("WEESY_TOKEN"), "Content-Type: application/json"]),
    "content" => $corpo,
    "ignore_errors" => true, // lê o corpo também nas respostas de erro
]]);
$resposta = file_get_contents("https://apifiscal.weesy.com.br/v1/cte/6ade6278e8340a492a46b564/cancelamento", false, $contexto);
echo $http_response_header[0], PHP_EOL, $resposta, PHP_EOL;

C#

using System.Net.Http.Headers;
using System.Text;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("WEESY_TOKEN"));

var corpo = """
    {
      "justificativa": "Frete não realizado, carga devolvida ao remetente."
    }
    """;

using var resposta = await http.PostAsync(
    "https://apifiscal.weesy.com.br/v1/cte/6ade6278e8340a492a46b564/cancelamento",
    new StringContent(corpo, Encoding.UTF8, "application/json"));
Console.WriteLine($"{(int)resposta.StatusCode} {await resposta.Content.ReadAsStringAsync()}");

Corpo da requisição

CampoTipoDescrição
justificativa
obrigatório
string

Por que o CT-e está sendo cancelado, em texto livre (vai para a SEFAZ).

Exemplo

JSON
{
  "justificativa": "Frete não realizado, carga devolvida ao remetente."
}

Respostas

Campos da resposta 202

CampoTipoDescrição
id
obrigatório
string

O id que a Weesy dá ao documento. Guarde como texto e não tente interpretar.

idIntegracao
obrigatório
string

O código seu que veio na emissão.

status
obrigatório
string

Situação do CT-e. A lista pode crescer: trate valor desconhecido sem quebrar.

ValorSignificado
recebidoRecebemos o CT-e; ele ainda vai para a SEFAZ
em_processamentoEnviado à SEFAZ; aguardando a resposta
autorizadoA SEFAZ autorizou — o CT-e vale e já tem chave de acesso e protocolo
rejeitadoA SEFAZ recusou por algum dado — veja sefaz.mensagem, corrija e mande de novo com o mesmo idIntegracao
erroFalha técnica (SEFAZ fora do ar, tempo esgotado) — reenvie em POST /cte/{id}/reprocessamento
cancelamento_solicitadoPedido de cancelamento enviado; aguardando a SEFAZ
canceladoA SEFAZ confirmou o cancelamento
cancelamento_rejeitadoA SEFAZ recusou o cancelamento — o CT-e continua autorizado

A carta de correção não muda o status: ela aparece em eventos[].

ambiente
obrigatório
string

Onde o documento é emitido.

ValorSignificado
producaoDocumento de verdade, com valor fiscal
homologacaoTeste na SEFAZ, sem valor fiscal. Exige certificado; os nomes das partes saem como "CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"

O ambiente simulacao (sem certificado, sem sair da Weesy), que a NFS-e tem, ainda não existe para CT-e e MDF-e.

empresa
obrigatório
object
empresa.cnpj
obrigatório
string

CNPJ sem pontos, barra ou traço (14 posições). Já aceita o CNPJ com letras, que começa a valer em 2026.

empresa.razaoSocial
obrigatório
string
empresa.ufstring

Sigla do estado, em maiúsculas.

Valores: AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG, PA, PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO.

serie
obrigatório
string
numerostring ou null

Número do CT-e. Vazio até a Weesy montar o XML.

chaveAcessostring ou null
protocolostring ou null

Protocolo de autorização da SEFAZ.

autorizadoEmstring (date-time) ou null
cfopstring
tomadorobject
tomador.papelinteger

Quem paga o frete (o "tomador do serviço") — código oficial toma do CT-e.

CódigoQuem paga
0O remetente
1O expedidor
2O recebedor
3O destinatário
4Outra pessoa — informe os dados dela no próprio tomador
ValorSignificado
0Remetente
1Expedidor
2Recebedor
3Destinatário
4Outra pessoa (dados no próprio tomador)
tomador.cpfCnpjstring

CPF (11 números) ou CNPJ (14 posições), sem pontuação.

tomador.nomestring
remetenteobject
remetente.cpfCnpj
obrigatório
string

CPF (11 números) ou CNPJ (14 posições), sem pontuação.

remetente.nome
obrigatório
string
destinatarioobject
destinatario.cpfCnpj
obrigatório
string

CPF (11 números) ou CNPJ (14 posições), sem pontuação.

destinatario.nome
obrigatório
string
expedidorobject ou null
expedidor.cpfCnpjstring

CPF (11 números) ou CNPJ (14 posições), sem pontuação.

expedidor.nomestring
recebedorobject ou null
recebedor.cpfCnpjstring

CPF (11 números) ou CNPJ (14 posições), sem pontuação.

recebedor.nomestring
origemobject

Identificação do município por código IBGE, nome e UF.

origem.codigoIbge
obrigatório
string

Código IBGE do município.

origem.nomestring

Nome do município.

origem.ufstring

Sigla da unidade federativa.

destinoobject

Identificação do município por código IBGE, nome e UF.

destino.codigoIbge
obrigatório
string

Código IBGE do município.

destino.nomestring

Nome do município.

destino.ufstring

Sigla da unidade federativa.

documentosTransportadosarray de object
documentosTransportados[].chaveNfe
obrigatório
string

Chave de acesso de 44 dígitos — o "RG" do documento fiscal na SEFAZ.

valoresobject
valores.valorTotalServico
obrigatório
number

Valor total do frete.

valores.valorReceber
obrigatório
number

Quanto a transportadora vai receber de fato (normalmente igual ao total).

valores.componentesarray de object

Como o total se divide. Opcional.

valores.componentes[].nome
obrigatório
string

Nome curto do componente.

valores.componentes[].valor
obrigatório
number

Valor em reais, como número com 2 casas decimais (ex. 100.00). Não mande como texto.

cargaobject
carga.valornumber

Valor em reais, como número com 2 casas decimais (ex. 100.00). Não mande como texto.

carga.produtoPredominantestring
sefazobject

Última resposta da SEFAZ, como ela mandou. Útil para entender uma rejeição.

sefaz.cStatinteger ou null

Código de resposta da SEFAZ (ex. 100 = autorizado; 2xx/5xx/6xx = rejeição).

sefaz.mensagemstring ou null

Texto da SEFAZ que explica o código.

sefaz.protocolostring ou null

Número do protocolo da SEFAZ, quando houver.

eventosarray de object

Cancelamentos e cartas de correção, do mais antigo para o mais novo.

eventos[].tipo
obrigatório
string
ValorSignificado
cancelamentoPedido de cancelamento
carta_correcaoCarta de correção
eventos[].sequencia
obrigatório
integer

Número do evento desse tipo no CT-e (a 1ª carta de correção é 1, a 2ª é 2...).

eventos[].situacao
obrigatório
string
ValorSignificado
processandoEnviado à SEFAZ; aguardando a resposta
registradoA SEFAZ aceitou o evento
rejeitadoA SEFAZ recusou — veja sefaz.mensagem
eventos[].justificativastring ou null

Só no cancelamento.

eventos[].correcoesarray de object

Só na carta de correção.

eventos[].correcoes[].grupoAlterado
obrigatório
string

Grupo do XML onde está o campo (ex. compl, ide, rem).

eventos[].correcoes[].campoAlterado
obrigatório
string

Nome da tag a corrigir dentro do grupo (ex. xObs).

eventos[].correcoes[].valorAlterado
obrigatório
string

O valor correto.

eventos[].correcoes[].numeroItemAlteradostring

Só quando o grupo se repete no XML — qual ocorrência corrigir (começa em 1).

eventos[].protocolostring ou null

Protocolo do evento na SEFAZ, quando registrado.

eventos[].sefazobject

Última resposta da SEFAZ, como ela mandou. Útil para entender uma rejeição.

eventos[].sefaz.cStatinteger ou null

Código de resposta da SEFAZ (ex. 100 = autorizado; 2xx/5xx/6xx = rejeição).

eventos[].sefaz.mensagemstring ou null

Texto da SEFAZ que explica o código.

eventos[].sefaz.protocolostring ou null

Número do protocolo da SEFAZ, quando houver.

eventos[].solicitadoEm
obrigatório
string (date-time)

Data e hora no horário de Brasília (ex. 2026-10-26T09:27:34-03:00).

eventos[].registradoEmstring (date-time) ou null
historicoarray de object

Por onde o CT-e passou, em ordem.

historico[].status
obrigatório
string

Situação do CT-e. A lista pode crescer: trate valor desconhecido sem quebrar.

ValorSignificado
recebidoRecebemos o CT-e; ele ainda vai para a SEFAZ
em_processamentoEnviado à SEFAZ; aguardando a resposta
autorizadoA SEFAZ autorizou — o CT-e vale e já tem chave de acesso e protocolo
rejeitadoA SEFAZ recusou por algum dado — veja sefaz.mensagem, corrija e mande de novo com o mesmo idIntegracao
erroFalha técnica (SEFAZ fora do ar, tempo esgotado) — reenvie em POST /cte/{id}/reprocessamento
cancelamento_solicitadoPedido de cancelamento enviado; aguardando a SEFAZ
canceladoA SEFAZ confirmou o cancelamento
cancelamento_rejeitadoA SEFAZ recusou o cancelamento — o CT-e continua autorizado

A carta de correção não muda o status: ela aparece em eventos[].

historico[].em
obrigatório
string (date-time)

Data e hora em UTC, terminada em Z (ex. 2026-10-26T12:27:34Z).

historico[].mensagemstring ou null
links
obrigatório
object
links.self
obrigatório
string
links.xmlstring ou null

Vazio até autorizar.

links.dactestring ou null

Vazio até autorizar.

criadoEm
obrigatório
string (date-time)

Data e hora em UTC, terminada em Z (ex. 2026-10-26T12:27:34Z).

atualizadoEm
obrigatório
string (date-time)

Data e hora em UTC, terminada em Z (ex. 2026-10-26T12:27:34Z).

← Voltar ao início