Weesy Docs

Emitir e consultar MDF-e

Emitir MDF-e

POST https://apifiscal.weesy.com.br/v1/mdfe

Abrir na referência interativa

Envia um MDF-e para autorização na SEFAZ com os dados da viagem: de onde sai, para onde vai, o veículo, os motoristas e os CT-e da carga. A resposta só confirma que recebemos; o resultado (autorizado ou rejeitado) chega depois pelo webhook ou consultando o MDF-e.

Não duplica: mandou de novo o mesmo idIntegracao com o mesmo corpo? Devolvemos o MDF-e que já existe (200). Se o anterior foi rejeitado, o mesmo idIntegracao com o corpo corrigido reenvia com os dados novos (200, mesmo id). Em qualquer outra situação, corpo diferente com o mesmo idIntegracao responde 409.

Antes de emitir, confira se o veículo não tem MDF-e aberto (GET /mdfe/nao-encerrados).

Exemplo de chamada

cURL

curl --request POST \
  --url "https://apifiscal.weesy.com.br/v1/mdfe" \
  --header "Authorization: Bearer $WEESY_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
  "idIntegracao": "viagem-2087",
  "cnpjEmitente": "21664333000195",
  "ambiente": "homologacao",
  "serie": "1",
  "ufInicio": "SP",
  "ufFim": "PR",
  "percurso": [],
  "carregamento": [
    {
      "codigoIbge": "3550308"
    }
  ],
  "descarregamento": [
    {
      "codigoIbge": "4106902",
      "chavesCte": [
        "35261021664333000195570010000012341000012345"
      ]
    }
  ],
  "rodoviario": {
    "rntrc": "12345678",
    "veiculo": {
      "placa": "ABC1D23",
      "uf": "SP",
      "tipoRodado": "01",
      "tipoCarroceria": "02",
      "tara": 8500,
      "capacidadeKg": 23000
    },
    "condutores": [
      {
        "nome": "MOTORISTA EXEMPLO",
        "cpf": "12345678909"
      }
    ],
    "ciot": {
      "numero": "123456789012",
      "cpfCnpj": "21664333000195"
    }
  },
  "carga": {
    "valor": 15800,
    "unidade": "01",
    "quantidade": 1250.5
  }
}'

Node.js

const resposta = await fetch("https://apifiscal.weesy.com.br/v1/mdfe", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WEESY_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "idIntegracao": "viagem-2087",
    "cnpjEmitente": "21664333000195",
    "ambiente": "homologacao",
    "serie": "1",
    "ufInicio": "SP",
    "ufFim": "PR",
    "percurso": [],
    "carregamento": [
      {
        "codigoIbge": "3550308"
      }
    ],
    "descarregamento": [
      {
        "codigoIbge": "4106902",
        "chavesCte": [
          "35261021664333000195570010000012341000012345"
        ]
      }
    ],
    "rodoviario": {
      "rntrc": "12345678",
      "veiculo": {
        "placa": "ABC1D23",
        "uf": "SP",
        "tipoRodado": "01",
        "tipoCarroceria": "02",
        "tara": 8500,
        "capacidadeKg": 23000
      },
      "condutores": [
        {
          "nome": "MOTORISTA EXEMPLO",
          "cpf": "12345678909"
        }
      ],
      "ciot": {
        "numero": "123456789012",
        "cpfCnpj": "21664333000195"
      }
    },
    "carga": {
      "valor": 15800,
      "unidade": "01",
      "quantidade": 1250.5
    }
  }),
});
console.log(resposta.status, await resposta.text());

Python

import os

import requests

resposta = requests.post(
    "https://apifiscal.weesy.com.br/v1/mdfe",
    headers={"Authorization": f"Bearer {os.environ['WEESY_TOKEN']}"},
    json={
        "idIntegracao": "viagem-2087",
        "cnpjEmitente": "21664333000195",
        "ambiente": "homologacao",
        "serie": "1",
        "ufInicio": "SP",
        "ufFim": "PR",
        "percurso": [],
        "carregamento": [
            {
                "codigoIbge": "3550308",
            },
        ],
        "descarregamento": [
            {
                "codigoIbge": "4106902",
                "chavesCte": [
                    "35261021664333000195570010000012341000012345",
                ],
            },
        ],
        "rodoviario": {
            "rntrc": "12345678",
            "veiculo": {
                "placa": "ABC1D23",
                "uf": "SP",
                "tipoRodado": "01",
                "tipoCarroceria": "02",
                "tara": 8500,
                "capacidadeKg": 23000,
            },
            "condutores": [
                {
                    "nome": "MOTORISTA EXEMPLO",
                    "cpf": "12345678909",
                },
            ],
            "ciot": {
                "numero": "123456789012",
                "cpfCnpj": "21664333000195",
            },
        },
        "carga": {
            "valor": 15800,
            "unidade": "01",
            "quantidade": 1250.5,
        },
    },
    timeout=30,
)
print(resposta.status_code, resposta.text)

PHP

<?php

$corpo = <<<'JSON'
{
  "idIntegracao": "viagem-2087",
  "cnpjEmitente": "21664333000195",
  "ambiente": "homologacao",
  "serie": "1",
  "ufInicio": "SP",
  "ufFim": "PR",
  "percurso": [],
  "carregamento": [
    {
      "codigoIbge": "3550308"
    }
  ],
  "descarregamento": [
    {
      "codigoIbge": "4106902",
      "chavesCte": [
        "35261021664333000195570010000012341000012345"
      ]
    }
  ],
  "rodoviario": {
    "rntrc": "12345678",
    "veiculo": {
      "placa": "ABC1D23",
      "uf": "SP",
      "tipoRodado": "01",
      "tipoCarroceria": "02",
      "tara": 8500,
      "capacidadeKg": 23000
    },
    "condutores": [
      {
        "nome": "MOTORISTA EXEMPLO",
        "cpf": "12345678909"
      }
    ],
    "ciot": {
      "numero": "123456789012",
      "cpfCnpj": "21664333000195"
    }
  },
  "carga": {
    "valor": 15800,
    "unidade": "01",
    "quantidade": 1250.5
  }
}
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/mdfe", 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 = """
    {
      "idIntegracao": "viagem-2087",
      "cnpjEmitente": "21664333000195",
      "ambiente": "homologacao",
      "serie": "1",
      "ufInicio": "SP",
      "ufFim": "PR",
      "percurso": [],
      "carregamento": [
        {
          "codigoIbge": "3550308"
        }
      ],
      "descarregamento": [
        {
          "codigoIbge": "4106902",
          "chavesCte": [
            "35261021664333000195570010000012341000012345"
          ]
        }
      ],
      "rodoviario": {
        "rntrc": "12345678",
        "veiculo": {
          "placa": "ABC1D23",
          "uf": "SP",
          "tipoRodado": "01",
          "tipoCarroceria": "02",
          "tara": 8500,
          "capacidadeKg": 23000
        },
        "condutores": [
          {
            "nome": "MOTORISTA EXEMPLO",
            "cpf": "12345678909"
          }
        ],
        "ciot": {
          "numero": "123456789012",
          "cpfCnpj": "21664333000195"
        }
      },
      "carga": {
        "valor": 15800,
        "unidade": "01",
        "quantidade": 1250.5
      }
    }
    """;

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

Corpo da requisição

CampoTipoDescrição
idIntegracao
obrigatório
string

Um código seu para este MDF-e (o número da viagem, por exemplo). Precisa ser único por empresa: é ele que impede emitir o mesmo MDF-e duas vezes.

cnpjEmitente
obrigatório
string

CNPJ da transportadora que emite o MDF-e, só dígitos.

ambiente
obrigatório
string

Onde o documento é emitido.

ValorSignificado
producaoDocumento de verdade, com valor fiscal
homologacaoTeste na SEFAZ, sem valor fiscal. Exige certificado

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

serie
obrigatório
string

Série do MDF-e (de 0 a 999). O número é a Weesy que dá, em sequência.

ufInicio
obrigatório
string

Estado onde a viagem começa (onde a carga é carregada).

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.

ufFim
obrigatório
string

Estado onde a viagem termina (onde a carga é entregue).

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.

percursoarray de string

Estados por onde o caminhão passa entre o início e o fim, na ordem. Não repita ufInicio nem ufFim.

carregamento
obrigatório
array de object

Cidades onde a carga é colocada no caminhão.

carregamento[].codigoIbge
obrigatório
string

Código IBGE da cidade onde a carga foi colocada no caminhão (7 dígitos).

descarregamento
obrigatório
array de object

Cidades onde a carga é entregue, cada uma com os CT-e entregues lá.

descarregamento[].codigoIbge
obrigatório
string

Código IBGE da cidade onde a carga será entregue (7 dígitos).

descarregamento[].chavesCte
obrigatório
array de string

Chaves de acesso dos CT-e cuja carga é entregue nesta cidade.

rodoviario
obrigatório
object
rodoviario.rntrc
obrigatório
string

Número do RNTRC da transportadora na ANTT (8 dígitos).

rodoviario.veiculo
obrigatório
object

O caminhão (ou cavalo mecânico) que puxa a carga.

rodoviario.veiculo.placa
obrigatório
string

Placa do veículo, sem traço, em maiúsculas (formato antigo ou Mercosul).

rodoviario.veiculo.uf
obrigatório
string

Estado onde o veículo está licenciado (está no CRLV).

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.

rodoviario.veiculo.renavamstring

RENAVAM do veículo (está no CRLV).

rodoviario.veiculo.tara
obrigatório
integer

Peso do veículo vazio, em kg (está no CRLV).

rodoviario.veiculo.capacidadeKginteger

Capacidade de carga em kg.

rodoviario.veiculo.capacidadeM3integer

Capacidade de carga em m³, quando fizer sentido.

rodoviario.veiculo.proprietarioobject

Dono do veículo, quando não é a própria empresa (veículo de terceiro ou agregado).

rodoviario.veiculo.proprietario.cpfCnpj
obrigatório
string

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

rodoviario.veiculo.proprietario.rntrc
obrigatório
string

RNTRC do proprietário na ANTT (8 dígitos).

rodoviario.veiculo.proprietario.nome
obrigatório
string
rodoviario.veiculo.proprietario.inscricaoEstadualstring

Inscrição estadual, só dígitos, ou ISENTO. Com ela, informe também a uf.

rodoviario.veiculo.proprietario.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.

rodoviario.veiculo.proprietario.tipo
obrigatório
integer
CódigoTipo
0TAC agregado
1TAC independente
2Outros

Valores: 0, 1, 2.

rodoviario.veiculo.tipoRodado
obrigatório
string

Tipo de rodado — código oficial tpRod.

CódigoTipo
01Truck
02Toco
03Cavalo mecânico
04Van
05Utilitário
06Outros
ValorSignificado
01Truck
02Toco
03Cavalo mecânico
04Van
05Utilitário
06Outros
rodoviario.veiculo.tipoCarroceria
obrigatório
string

Tipo de carroceria — código oficial tpCar.

CódigoTipo
00Não se aplica (cavalo mecânico sem carroceria)
01Aberta
02Fechada ou baú
03Graneleira
04Porta-contêiner
05Sider
ValorSignificado
00Não se aplica
01Aberta
02Fechada ou baú
03Graneleira
04Porta-contêiner
05Sider
rodoviario.reboquesarray de object
rodoviario.reboques[].placa
obrigatório
string

Placa do veículo, sem traço, em maiúsculas (formato antigo ou Mercosul).

rodoviario.reboques[].uf
obrigatório
string

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.

rodoviario.reboques[].tipoCarroceria
obrigatório
string

Tipo de carroceria — código oficial tpCar.

CódigoTipo
00Não se aplica (cavalo mecânico sem carroceria)
01Aberta
02Fechada ou baú
03Graneleira
04Porta-contêiner
05Sider
ValorSignificado
00Não se aplica
01Aberta
02Fechada ou baú
03Graneleira
04Porta-contêiner
05Sider
rodoviario.reboques[].renavamstring

RENAVAM do veículo (está no CRLV).

rodoviario.reboques[].tara
obrigatório
integer

Peso do veículo vazio, em kg (está no CRLV).

rodoviario.reboques[].capacidadeKg
obrigatório
integer

Capacidade de carga do reboque, em kg.

rodoviario.reboques[].capacidadeM3integer

Capacidade de carga em m³, quando fizer sentido.

rodoviario.reboques[].proprietarioobject

Dono do veículo, quando não é a própria empresa (veículo de terceiro ou agregado).

rodoviario.reboques[].proprietario.cpfCnpj
obrigatório
string

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

rodoviario.reboques[].proprietario.rntrc
obrigatório
string

RNTRC do proprietário na ANTT (8 dígitos).

rodoviario.reboques[].proprietario.nome
obrigatório
string
rodoviario.reboques[].proprietario.inscricaoEstadualstring

Inscrição estadual, só dígitos, ou ISENTO. Com ela, informe também a uf.

rodoviario.reboques[].proprietario.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.

rodoviario.reboques[].proprietario.tipo
obrigatório
integer
CódigoTipo
0TAC agregado
1TAC independente
2Outros

Valores: 0, 1, 2.

rodoviario.condutores
obrigatório
array de object
rodoviario.condutores[].nome
obrigatório
string

Nome completo do motorista.

rodoviario.condutores[].cpf
obrigatório
string

CPF do motorista, só dígitos.

rodoviario.ciot
obrigatório
object

CIOT (Código Identificador da Operação de Transporte), gerado na ANTT ou num SEFAZ de pagamento de frete. A SEFAZ passa a conferir o CIOT no MDF-e em produção a partir de 23/11/2026 (rejeição 684).

rodoviario.ciot.numero
obrigatório
string

Número do CIOT (12 dígitos).

rodoviario.ciot.cpfCnpj
obrigatório
string

CPF ou CNPJ de quem gerou o CIOT (o contratado do frete).

carga
obrigatório
object

Totais da carga que vai no caminhão.

carga.valor
obrigatório
number

Valor total da mercadoria transportada (soma das cargas dos CT-e).

carga.unidade
obrigatório
string

Unidade do peso — código oficial cUnid.

CódigoUnidade
01Quilo (KG)
02Tonelada (TON)
ValorSignificado
01Quilo
02Tonelada
carga.quantidade
obrigatório
number

Peso bruto total da carga, até 4 casas decimais.

Viagem de São Paulo para Curitiba com um CT-e

JSON
{
  "idIntegracao": "viagem-2087",
  "cnpjEmitente": "21664333000195",
  "ambiente": "homologacao",
  "serie": "1",
  "ufInicio": "SP",
  "ufFim": "PR",
  "percurso": [],
  "carregamento": [
    {
      "codigoIbge": "3550308"
    }
  ],
  "descarregamento": [
    {
      "codigoIbge": "4106902",
      "chavesCte": [
        "35261021664333000195570010000012341000012345"
      ]
    }
  ],
  "rodoviario": {
    "rntrc": "12345678",
    "veiculo": {
      "placa": "ABC1D23",
      "uf": "SP",
      "tipoRodado": "01",
      "tipoCarroceria": "02",
      "tara": 8500,
      "capacidadeKg": 23000
    },
    "condutores": [
      {
        "nome": "MOTORISTA EXEMPLO",
        "cpf": "12345678909"
      }
    ],
    "ciot": {
      "numero": "123456789012",
      "cpfCnpj": "21664333000195"
    }
  },
  "carga": {
    "valor": 15800,
    "unidade": "01",
    "quantidade": 1250.5
  }
}

Respostas

Campos da resposta 200

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 MDF-e. A lista pode crescer: trate valor desconhecido sem quebrar.

ValorSignificado
recebidoRecebemos o MDF-e; ele ainda vai para a SEFAZ
em_processamentoEnviado à SEFAZ; aguardando a resposta
autorizadoA SEFAZ autorizou — a viagem pode começar. Lembre de encerrar no fim
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 /mdfe/{id}/reprocessamento
canceladoA SEFAZ confirmou o cancelamento
encerradoA viagem terminou e a SEFAZ registrou o encerramento
ambiente
obrigatório
string

Onde o documento é emitido.

ValorSignificado
producaoDocumento de verdade, com valor fiscal
homologacaoTeste na SEFAZ, sem valor fiscal. Exige certificado

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 MDF-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
ufIniciostring

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.

ufFimstring

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.

percursoarray de string
carregamentoarray de object
carregamento[].codigoIbge
obrigatório
string

Código IBGE do município.

carregamento[].nomestring

Nome do município.

carregamento[].ufstring

Sigla da unidade federativa.

descarregamentoarray de object
descarregamento[].codigoIbge
obrigatório
string

Código IBGE do município.

descarregamento[].nomestring

Nome do município.

descarregamento[].ufstring

Sigla da unidade federativa.

descarregamento[].chavesCtearray de string
veiculoobject
veiculo.placastring

Placa do veículo, sem traço, em maiúsculas (formato antigo ou Mercosul).

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

cargaobject
carga.valornumber

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

carga.quantidadeCteinteger

Quantos CT-e o MDF-e leva (contado das chaves em descarregamento).

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; 135 = evento registrado).

sefaz.mensagemstring ou null

Texto da SEFAZ que explica o código.

sefaz.protocolostring ou null

Número do protocolo da SEFAZ, quando houver.

encerramentonull ou object

Preenchido quando o MDF-e é encerrado.

encerramento.municipioobject

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

encerramento.municipio.codigoIbge
obrigatório
string

Código IBGE do município.

encerramento.municipio.nomestring

Nome do município.

encerramento.municipio.ufstring

Sigla da unidade federativa.

encerramento.encerradoEmstring (date-time)

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

encerramento.protocolostring ou null
cancelamentonull ou object

Preenchido quando o MDF-e é cancelado.

cancelamento.justificativastring
cancelamento.canceladoEmstring (date-time)

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

cancelamento.protocolostring ou null
historicoarray de object

Por onde o MDF-e passou, em ordem.

historico[].status
obrigatório
string

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

ValorSignificado
recebidoRecebemos o MDF-e; ele ainda vai para a SEFAZ
em_processamentoEnviado à SEFAZ; aguardando a resposta
autorizadoA SEFAZ autorizou — a viagem pode começar. Lembre de encerrar no fim
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 /mdfe/{id}/reprocessamento
canceladoA SEFAZ confirmou o cancelamento
encerradoA viagem terminou e a SEFAZ registrou o encerramento
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.damdfestring 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