Developers / Documentos Fiscais / MDF-e
Documentos Fiscais · MDF-e

Emitir MDF-e POST

Emite um Manifesto Eletrônico de Documentos Fiscais (modelo 58) -- reúne as NF-e/CT-e de uma mesma viagem/carga num único manifesto pro transportador. Hoje só o modal rodoviário é suportado.

Quando utilizar

Sempre que um veículo sair carregado com um ou mais documentos fiscais (NF-e e/ou CT-e) e a legislação exigir MDF-e pra essa viagem -- tipicamente transporte interestadual ou intermunicipal de carga. Depois de encerrada a viagem, o manifesto precisa ser encerrado -- não é opcional.

Pré-requisitos

  • Contribuinte (transportador) já cadastrado, com certificado digital A1.
  • Pelo menos 1 documento (NF-e ou CT-e) com chave de acesso, vinculado a um município de descarregamento.
  • Condutor(es) e veículo de tração cadastrados na chamada -- não há cadastro prévio de frota nesta API.
  • Responsável técnico cadastrado na sua conta -- CNPJ, nome, e-mail e telefone, preenchidos em Área do Cliente → Responsável Técnico (sem campo equivalente no corpo desta requisição -- resolvido automaticamente pela API). Bloqueante: sem isso a emissão falha com status: "ERROR". Ver detalhes na doc de NF-e.
⚠️
ide.modal hoje não tem efeito. O motor sempre gera MDF-e rodoviário, independente do que você enviar nesse campo -- não existe erro nem aviso, o valor é silenciosamente ignorado. Só rodoviário é suportado de fato (aéreo/aquaviário/ ferroviário lançam erro no motor .NET se algum dia forem aceitos aqui, mas hoje nem chegam a ser tentados). rodoviario.veiculo_tracao.tipo_rodado e tipo_carroceria exigem o código numérico SEFAZ direto (ex.: "03" para Cavalo Mecânico), sem tradução por rótulo -- diferente de totais.unidade_carga, que aceita "KG"/"TON" por extenso.

Fluxo da operação

POST /v1/mdfe/emissoes
Motor monta, assina e transmite pra SEFAZ da UF
200 OK · resultado final (mesma chamada)
💡
Síncrono, mesmo padrão de NF-e/CT-e/NFS-e. A própria chamada POST já monta, assina e transmite -- a resposta já vem com status final (AUTHORIZED/REJECTED/ERROR/PROCESSING). GET /v1/mdfe/emissoes/{transmissao_id} continua disponível pra reconsulta, mas normalmente não é necessário logo após o POST.

Endpoint

POST https://areacliente.centralfiscal.com.br/v1/mdfe/emissoes

Headers

HeaderValor
AuthorizationBearer <sua_api_key>obrigatório
Content-Typeapplication/jsonobrigatório
Idempotency-Keystring livre, definida por vocêopcional

Body

Clique num campo com pra expandir.

emitente_documentorequired
string
CNPJ do transportador, cadastrado e com contrato ativo.
required
object
serierequired
string
numerorequired
string
data_emissaorequired
string <date-time>
modal
string
Aceito no payload, mas sem efeito hoje -- sempre sai rodoviário (ver aviso acima).
uf_carregamentorequired
string
uf_descarregamentorequired
string
tipo_emitente
string
Enum: PRESTADOR_SERVICO_TRANSPORTETRANSPORTADOR_CARGA_PROPRIACTE_GLOBALIZADO
Ou o código direto (1, 2 ou 3).
tipo_transportador
string
Enum: ETCTACCTC
Opcional -- sem valor pra "próprio" no schema real; se enviar algo fora do enum, o campo é omitido.
percurso
Array of strings
UFs de passagem entre origem e destino, se houver.
required
Array of objects
Pelo menos 1.
municipio_ibgerequired
integer
nomerequired
string
required
Array of objects
Pelo menos 1 -- cada um precisa ter ao menos 1 documento vinculado (ver documentos abaixo).
municipio_ibgerequired
integer
nomerequired
string
required
Array of objects
Lista plana (não aninhada dentro de município) -- pelo menos 1.
tiporequired
string
Enum: NFECTE
chave_acessorequired
string
44 dígitos.
municipio_descarregamento_ibge
integer
Obrigatório só se houver mais de 1 município de descarregamento -- com 1 só, todo documento vai pra ele automaticamente.
required
object
rntrc
string
RNTRC do emitente/transportador.
required
object
placarequired
string
tararequired
integer
tipo_rodadorequired
string
Enum: 010203040506
01 Truck, 02 Toco, 03 Cavalo Mecânico, 04 VAN, 05 Utilitário, 06 Outros. Código numérico direto, sem tradução por rótulo.
tipo_carroceriarequired
string
Enum: 000102030405
00 Não aplicável, 01 Aberta, 02 Fechada/Baú, 03 Granelera, 04 Porta Container, 05 Sider.
renavam
string
capacidade_kg
integer
capacidade_m3
integer
uf
string
codigo_interno
string
required
Array of objects
Pelo menos 1.
nomerequired
string
cpfrequired
string
veiculos_reboque
Array of objects
Opcional -- placa/tara/capacidade_kg/tipo_carroceria obrigatórios por item quando presente.
ciot
Array of objects
Opcional -- ciot + documento por item.
Array of objects
Opcional -- grupo <disp>.
cnpj_fornecedorrequired
string
CNPJForn -- CNPJ da empresa fornecedora do vale-pedágio.
valorrequired
number
vValePed.
documento_responsavel_pagamento
string
CNPJPg/CPFPg -- informe só quando o responsável pelo pagamento não for o emitente do MDF-e.
comprovante
string
nCompra -- identificador do vale-pedágio (IDVPO).
tipo
string
tpValePed.
contratantes
Array of objects
Opcional.
object
Opcional -- grupo <prop>, quando o veículo de tração não pertence ao emitente do MDF-e.
documentorequired
string
rntrcrequired
string
nomerequired
string
Aceita também razao_social como alias.
tipo_proprietariorequired
string
Enum: 012
tpProp: 0 TAC Agregado, 1 TAC Independente, 2 Outros.
inscricao_estadual
string
uf
string
required
object
valor_cargarequired
number
unidade_cargarequired
string
Enum: KGTON
Rótulo humano ou código SEFAZ (01/02) -- a API traduz.
quantidade_cargarequired
number
quantidade_nfe
integer
quantidade_cte
integer
object
Opcional.
responsavelrequired
string
Enum: 12
1 Emitente do MDF-e, 2 Contratante do transporte.
documento
string
CNPJ/CPF do responsável pelo seguro -- obrigatório quando responsavel = "2" (contratante). Sem ele, a SEFAZ rejeita a emissão.
seguradora
object
cnpj / nome.
apolices
Array of objects
numero + averbacoes[].
lacres
Array of objects
Opcional -- numero por item.
autorizados_xml
Array of objects
Opcional -- documento por item.

Exemplo mínimo

Apenas os campos obrigatórios -- veja o código ao lado.

Resposta de sucesso

200 OK -- já com o resultado final da SEFAZ nesta mesma resposta (status: "AUTHORIZED" em caso de sucesso). O campo detalhes traz o cstat/xmotivo reais devolvidos pela SEFAZ, além do protocolo.

Cancelamento

POST /v1/mdfe/cancelamentos -- exige chave_acesso, protocolo (da autorização original) e justificativa/ motivo com pelo menos 15 caracteres. Veja o exemplo ao lado.

Encerramento

💡
MDF-e precisa ser encerrado quando a viagem termina -- diferente de NF-e/CT-e, que só têm cancelamento. Sem encerrar, o manifesto fica "em trânsito" indefinidamente do ponto de vista da SEFAZ. Veja o exemplo ao lado.
POST https://areacliente.centralfiscal.com.br/v1/mdfe/encerramentos
chave_acessorequired
string
protocolorequired
string
Da autorização original.
data_encerramentorequired
string <date>
municipio_encerramento_ibgerequired
integer
uf_encerramentorequired
string

O que ainda não existe

Estes grupos existem no leiaute oficial (mdfeModalRodoviario_v3.00.xsd) mas o motor não os suporta hoje -- se sua operação depende de subcontratação de frete ou transporte de carga perigosa, confirme com jurídico/contábil se são obrigatórios antes de assumir que "opcional no XSD" resolve a questão:

  • infPag -- detalhamento do pagamento do frete (parcelas, dados bancários, alto desempenho). É o maior grupo do modal rodoviário, ligado à Lei do Motorista/ANTT.
  • peri[] -- produtos perigosos (classificação ONU), tema de legislação própria.
  • prodPred -- produto predominante (Resolução ANTT 5.867/2020).
  • infUnidTransp, indReentrega, SegCodBarra -- unidade de transporte/carreta-reboque, indicador de reentrega, código de barras do seguro.
  • infAdic, infSolicNFF, infPAA, infRespTec -- grupos administrativos de nicho.

Próximos passos

  • Reconsultar mais tarde, se precisar: GET /v1/mdfe/emissoes/{transmissao_id}.
  • Encerrar ao fim da viagem: POST /v1/mdfe/encerramentos (obrigatório).
  • Cancelar, se necessário, antes do encerramento: POST /v1/mdfe/cancelamentos.
  • Baixar o DAMDFE (PDF) de um MDF-e autorizado: disponível na Área do Cliente → Transmissões, mesmo padrão do DANFE (NF-e) -- não é exposto como URL na resposta desta API.