Manual da API · Entrada do TMS
Envia um manifesto novo (entrega, coleta ou transferência)
POST/integracao/v1/manifestos
Um manifesto por chamada. A idempotência usa o cabeçalho Idempotency-Key (obrigatório) mais a chave natural numeroExterno (número do manifesto no TMS):
-
mesma
Idempotency-Keye mesmo corpo = devolve a mesma resposta da primeira chamada, sem duplicar nada; -
mesma
Idempotency-Keycom corpo diferente = 409; -
numeroExternoque já existe (com outraIdempotency-Key) = 409; para alterar um manifesto já enviado use oPUT(reenvio completo).
O manifesto é gravado no ambiente da API key: chave de TESTE grava manifesto de sandbox (ambiente=TESTE), que nunca vai para o app de motoristas reais, nunca dispara webhook de produção, não faz upsert de motorista/veículo no cadastro real e é expurgado depois de ~30 dias. Idempotência, chave natural e vínculo de documentos são isolados por ambiente.
Erros de cabeçalho do manifesto (tipo ausente, CPF do motorista inválido, filial de transferência inexistente etc.) recusam a chamada inteira com 400. Erros de um documento específico (chave com dígito verificador errado, CT-e sem chave) recusam só aquele documento: o restante é gravado e a resposta traz o motivo em erros[], apontando o índice do documento no array documentos.
As paradas são montadas agrupando os documentos por destinatário (CNPJ/CPF) + endereço, na ordem em que aparecem no manifesto. Sem latitude/longitude, o endereço é geocodificado em segundo plano; a resposta não espera a geocodificação.
Para que serve: envia um manifesto novo, em uma chamada, com todos os documentos.
Quando chamar: quando o TMS fechar a viagem e o motorista estiver para sair. O Veltra monta as paradas sozinho, agrupando os documentos por destinatário (CNPJ ou CPF) mais endereço, na ordem em que aparecem em documentos.
Parâmetros
Cabeçalhos (header)
X-Veltra-Api-KeytextoobrigatórioChave de API do TMS. Emitida na tela Chaves de API do portal; o valor completo aparece uma única vez.
Idempotency-KeytextoobrigatórioChave de idempotência gerada pelo TMS (recomendado: UUID) por tentativa lógica de envio. Guardada por pelo menos 72 h, isolada por transportadora e ambiente. Repetir a mesma chave com o mesmo corpo devolve a resposta original; com corpo diferente = 409.
de 1 a 255 caracteres
Content-TypetextoobrigatórioSempre
application/json.
Corpo (body) · application/json
tipotexto (lista fixa)obrigatórioTipo do manifesto enviado pelo TMS. Use
ROTApara o caminhão que sai com entregas e coletas juntas eTRANSFERENCIApara transferência entre filiais (sempre só transferência).ENTREGAeCOLETAseguem aceitos por compatibilidade e são tratados comoROTA.Valores:
ROTA,TRANSFERENCIA,ENTREGA,COLETAnumeroExternotextoobrigatórioNúmero do manifesto/relatório no TMS. Chave natural, única por transportadora e ambiente.
de 1 a 60 caracteres
motoristaobjetoobrigatórioMotorista ou ajudante citado no manifesto.
motorista.cpftextoobrigatórioCPF com ou sem máscara (11 dígitos), validado pelos dígitos verificadores.
motorista.nometextoobrigatórioaté 200 caracteres
veiculoobjetoobrigatórioveiculo.placatextoobrigatórioPlaca de tração (padrão antigo ou Mercosul), com ou sem hífen. Chave de upsert do veículo.
ajudanteslista de objetosopcionalAté 2 ajudantes (nome + CPF). Não são usuários do app, só dados do manifesto.
até 2 itens
ajudantes[].cpftextoobrigatórioCPF com ou sem máscara (11 dígitos), validado pelos dígitos verificadores.
ajudantes[].nometextoobrigatórioaté 200 caracteres
filialOrigemSiglatextoopcionalsiglaExternada filial de origem. Obrigatória quandotipo=TRANSFERENCIA; sigla desconhecida = 400.filialDestinoSiglatextoopcionalsiglaExternada filial de destino. Obrigatória quandotipo=TRANSFERENCIA.chaveMdfetextoopcionalChave de acesso de 44 posições (NF-e, CT-e ou MDF-e). As 12 primeiras posições do CNPJ de quem emitiu o documento fiscal podem ser letras maiúsculas (CNPJ alfanumérico, em vigor desde 01/07/2026); o resto é numérico. O dígito verificador e o modelo são conferidos.
de 44 a 44 caracteres; padrão ^[0-9]{6}[0-9A-Z]{12}[0-9]{26}$
quantidadePaletesinteiroopcionalQuantidade de paletes informada no manifesto.
mínimo 0
documentoslista de objetosobrigatórioao menos 1 item(ns)
documentos[].modelotexto (lista fixa)obrigatórioModelo do documento fiscal: 55 = NF-e, 57 = CT-e, 58 = MDF-e. Nos documentos do manifesto o normal é 57 (CT-e) ou 55 (NF-e, ex.: coleta sem CT-e); a chave do MDF-e do próprio manifesto vai em
chaveMdfe.Valores:
55,57,58documentos[].chavetextoopcionalChave de acesso de 44 posições (NF-e, CT-e ou MDF-e). As 12 primeiras posições do CNPJ de quem emitiu o documento fiscal podem ser letras maiúsculas (CNPJ alfanumérico, em vigor desde 01/07/2026); o resto é numérico. O dígito verificador e o modelo são conferidos.
de 44 a 44 caracteres; padrão ^[0-9]{6}[0-9A-Z]{12}[0-9]{26}$
documentos[].numerotextoobrigatórioaté 20 caracteres
documentos[].serietextoopcionalaté 10 caracteres
documentos[].cnpjTransportadoratextoopcionalCNPJ da transportadora que emitiu o CT-e (só faz sentido em
modelo=57). Opcional: ausente, o Veltra usa o CNPJ da chave (posições 7 a 20). Se vier, é usado como enviado, sem checar contra a chave. Com ou sem máscara.documentos[].cnpjEmbarcadortextoopcionalCNPJ do embarcador, dono/emitente da NF (para
modelodiferente de 57; obrigatório nesses casos). No CT-e não é usado: a chave já identifica o documento. Com ou sem máscara.documentos[].tomadorCnpjtextoopcionalOpcional e aditivo (só
modelo=57). CNPJ de quem paga o frete (tomador do CT-e), numérico ou alfanumérico, com ou sem máscara. Ausente, nenhum terceiro recebe PDF nem canhoto.documentos[].tarefatexto (lista fixa)opcionalO que o motorista faz com o documento na parada. Coleta e entrega no mesmo cliente e no mesmo manifesto ficam na mesma parada, com as duas tarefas.
Valores:
ENTREGA,COLETAdocumentos[].embarcadorobjetoopcionalEmbarcador da mercadoria (opcional); quem embarca a mercadoria (cliente da transportadora).
documentos[].embarcador.cnpjCpftextoobrigatóriodocumentos[].embarcador.nometextoopcionaldocumentos[].destinatarioobjetoobrigatóriodocumentos[].destinatario.cnpjCpftextoobrigatórioCNPJ (numérico ou alfanumérico) ou CPF do destinatário/recebedor, com ou sem máscara. Obrigatório: agrupa as paradas e identifica o link do destinatário.
documentos[].destinatario.nometextoobrigatórioaté 200 caracteres
documentos[].destinatario.enderecoobjetoobrigatórioEndereço de entrega/coleta do destinatário. Junto com o CNPJ/CPF, define a parada.
documentos[].destinatario.endereco.logradourotextoobrigatóriodocumentos[].destinatario.endereco.numerotextoopcionaldocumentos[].destinatario.endereco.complementotextoopcionaldocumentos[].destinatario.endereco.bairrotextoopcionaldocumentos[].destinatario.endereco.municipiotextoobrigatóriodocumentos[].destinatario.endereco.uftextoobrigatóriode 2 a 2 caracteres
documentos[].destinatario.endereco.ceptextoopcionalSó dígitos ou com hífen.
documentos[].destinatario.emailtextoopcionalOpcional. E-mail do destinatário para o aviso da entrega. Dado pessoal: não registrar em log. Ausente, o destinatário acompanha pelo link copiado no portal ou pela chave da NF.
até 320 caracteres
documentos[].nfVinculadaslista de objetosopcionalNF transportadas quando o documento é um CT-e (1 ou mais). Vazio/omitido nos demais modelos.
documentos[].nfVinculadas[].chavetextoopcionalChave de acesso de 44 posições (NF-e, CT-e ou MDF-e). As 12 primeiras posições do CNPJ de quem emitiu o documento fiscal podem ser letras maiúsculas (CNPJ alfanumérico, em vigor desde 01/07/2026); o resto é numérico. O dígito verificador e o modelo são conferidos.
de 44 a 44 caracteres; padrão ^[0-9]{6}[0-9A-Z]{12}[0-9]{26}$
documentos[].nfVinculadas[].numerotextoobrigatórioaté 20 caracteres
documentos[].nfVinculadas[].serietextoopcionalaté 10 caracteres
documentos[].nfVinculadas[].cnpjEmbarcadortextoobrigatórioCNPJ do embarcador (emitente da NF), numérico ou alfanumérico, com ou sem máscara.
documentos[].nfVinculadas[].valornúmeroopcionalValor da NF em reais, para exibição na torre; não é usado em cálculo (desde a 0.4.0).
mínimo 0
documentos[].nfVinculadas[].nfeEmitidoEmtexto (data e hora ISO 8601)opcionalOpcional. Data e hora de emissão da NF-e. Sem a data base escolhida pela transportadora, o prazo conta da chegada do manifesto ao Veltra.
prazoEntregano documento continua aceito.documentos[].volumesinteiroopcionalmínimo 0
documentos[].pesonúmeroopcionalPeso em kg.
mínimo 0
documentos[].valornúmeroopcionalValor do documento em reais, para exibição na torre; não é usado em cálculo (desde a 0.4.0).
mínimo 0
documentos[].prazoEntregatexto (data AAAA-MM-DD)opcionalPrazo de entrega, quando houver. Continua aceito. Sem a data base escolhida pela transportadora (
cteEmitidoEm,nfeEmitidoEmou este campo), o prazo conta da chegada do manifesto ao Veltra.documentos[].cteEmitidoEmtexto (data e hora ISO 8601)opcionalOpcional. Data e hora de emissão do CT-e. Sem a data base escolhida pela transportadora, o prazo conta da chegada do manifesto ao Veltra.
prazoEntregacontinua aceito.documentos[].latitudenúmeroopcionalOpcional. Se vier junto com
longitude, é usada direto na parada; senão o endereço é geocodificado em segundo plano.de -90 a 90
documentos[].longitudenúmeroopcionalde -180 a 180
documentos[].protocoloAutorizacaotextoopcionalOpcional e aditivo (só
modelo=57). Protocolo de autorização do CT-e (nProt, 15 dígitos, doprotCTe). Necessário ao perfil Comprovante Digital Homologado (evento 110180). Sem ele, o evento do CT-e ficaPENDENTE_DE_DADOSno portal; a entrega continua sendo comprovada pelo comprovante interno do Veltra. Clientes que não enviam o campo seguem funcionando como antes.padrão ^[0-9]{15}$
documentos[].tipoServicotexto (lista fixa)opcionalOpcional e aditivo (só
modelo=57). Tipo de serviço do CT-e (tpServ): NORMAL (0), SUBCONTRATACAO (1), REDESPACHO (2), REDESPACHO_INTERMEDIARIO (3), SERVICO_VINCULADO_MULTIMODAL (4). O evento 110180 só lista as NF-e entregues em CT-e NORMAL.Valores:
NORMAL,SUBCONTRATACAO,REDESPACHO,REDESPACHO_INTERMEDIARIO,SERVICO_VINCULADO_MULTIMODALdocumentos[].globalizadoverdadeiro/falsoopcionalOpcional e aditivo (só
modelo=57). CT-e globalizado (a SEFAZ admite mais de um comprovante para ele). Omitido = não globalizado.padrão: false
Exemplos de corpo
{
"tipo": "ENTREGA",
"numeroExterno": "REL-2026-000123",
"motorista": {
"cpf": "529.982.247-25",
"nome": "Motorista Exemplo da Silva"
},
"veiculo": {
"placa": "ABC1D23"
},
"ajudantes": [
{
"cpf": "111.444.777-35",
"nome": "Ajudante Exemplo"
}
],
"chaveMdfe": "35260911222333000181580010000007891273645188",
"quantidadePaletes": 4,
"documentos": [
{
"modelo": 57,
"chave": "35260911222333000181570010000123451482135762",
"numero": "12345",
"serie": "1",
"cnpjTransportadora": "11222333000181",
"embarcador": {
"cnpjCpf": "12ABC34501DE35",
"nome": "Indústria Exemplo S.A."
},
"destinatario": {
"cnpjCpf": "11444777000161",
"nome": "Mercado Exemplo Ltda",
"endereco": {
"logradouro": "Rua das Flores",
"numero": "120",
"bairro": "Centro",
"municipio": "Campinas",
"uf": "SP",
"cep": "13010-000"
}
},
"nfVinculadas": [
{
"chave": "35260912ABC34501DE35550010000456781555123454",
"numero": "45678",
"serie": "1",
"cnpjEmbarcador": "12ABC34501DE35"
}
],
"volumes": 12,
"peso": 350.5,
"prazoEntrega": "2026-10-02"
},
{
"modelo": 57,
"chave": "35260911222333000181570010000123461918273641",
"numero": "12346",
"serie": "1",
"cnpjTransportadora": "11222333000181",
"destinatario": {
"cnpjCpf": "11444777000161",
"nome": "Mercado Exemplo Ltda",
"endereco": {
"logradouro": "Rua das Flores",
"numero": "120",
"bairro": "Centro",
"municipio": "Campinas",
"uf": "SP"
}
},
"nfVinculadas": [
{
"numero": "45679",
"serie": "1",
"cnpjEmbarcador": "12ABC34501DE35"
}
],
"volumes": 3,
"peso": 40
}
]
}{
"tipo": "COLETA",
"numeroExterno": "COL-2026-000045",
"motorista": {
"cpf": "52998224725",
"nome": "Motorista Exemplo da Silva"
},
"veiculo": {
"placa": "ABC1D23"
},
"documentos": [
{
"modelo": 55,
"numero": "45679",
"serie": "1",
"cnpjEmbarcador": "12ABC34501DE35",
"destinatario": {
"cnpjCpf": "12ABC34501DE35",
"nome": "Indústria Exemplo S.A.",
"endereco": {
"logradouro": "Avenida Industrial",
"numero": "1000",
"municipio": "Sumaré",
"uf": "SP"
}
},
"volumes": 20,
"peso": 800
}
]
}{
"tipo": "TRANSFERENCIA",
"numeroExterno": "TRF-2026-000007",
"motorista": {
"cpf": "52998224725",
"nome": "Motorista Exemplo da Silva"
},
"veiculo": {
"placa": "XYZ9A87"
},
"filialOrigemSigla": "CPS",
"filialDestinoSigla": "SJC",
"documentos": [
{
"modelo": 57,
"chave": "35260911222333000181570010000123451482135762",
"numero": "12345",
"serie": "1",
"cnpjTransportadora": "11222333000181",
"destinatario": {
"cnpjCpf": "11222333000181",
"nome": "Transportadora Exemplo - Filial SJC",
"endereco": {
"logradouro": "Rodovia Presidente Dutra",
"numero": "km 150",
"municipio": "São José dos Campos",
"uf": "SP"
}
},
"nfVinculadas": [
{
"numero": "45678",
"serie": "1",
"cnpjEmbarcador": "12ABC34501DE35"
}
],
"volumes": 12,
"peso": 350.5
}
]
}Respostas
200application/json
Reenvio idempotente (mesma Idempotency-Key e mesmo corpo): a mesma resposta da primeira chamada, sem gravar nada de novo.
{
"id": "0192f3a4-5b6c-7d8e-9f01-23456789abcd",
"numeroExterno": "texto",
"tipo": "ROTA",
"ambiente": "TESTE",
"versaoAtual": 1,
"quantidadeParadas": 1,
"quantidadeDocumentos": 1,
"documentos": [
{
"id": "0192f3a4-5b6c-7d8e-9f01-23456789abcd",
"modelo": 55,
"chave": "texto",
"numero": "texto",
"serie": "texto",
"status": "PENDENTE",
"nfVinculadas": [
{
"id": "0192f3a4-5b6c-7d8e-9f01-23456789abcd",
"chave": "texto",
"numero": "texto",
"serie": "texto",
"status": "PENDENTE"
}
]
}
],
"erros": [
{
"documentoIndex": 0,
"codigo": "CHAVE_INVALIDA",
"motivo": "texto",
"chave": "texto",
"numero": "texto"
}
]
}Campos da resposta (26)
Campos
idtexto (uuid)obrigatórionumeroExternotextoobrigatóriotipotexto (lista fixa)obrigatórioTipo do manifesto enviado pelo TMS. Use
ROTApara o caminhão que sai com entregas e coletas juntas eTRANSFERENCIApara transferência entre filiais (sempre só transferência).ENTREGAeCOLETAseguem aceitos por compatibilidade e são tratados comoROTA.Valores:
ROTA,TRANSFERENCIA,ENTREGA,COLETAambientetexto (lista fixa)obrigatórioAmbiente da credencial — sandbox e produção nunca se misturam
Valores:
TESTE,PRODUCAOversaoAtualinteiroobrigatórioVersão atual do manifesto (1 na criação; +1 a cada alteração).
mínimo 1
quantidadeParadasinteiroopcionalquantidadeDocumentosinteiroopcionaldocumentoslista de objetosopcionalDocumentos ativos na versão atual, com o status de cada um.
documentos[].idtexto (uuid)obrigatóriodocumentos[].modelotexto (lista fixa)obrigatórioModelo do documento fiscal: 55 = NF-e, 57 = CT-e, 58 = MDF-e. Nos documentos do manifesto o normal é 57 (CT-e) ou 55 (NF-e, ex.: coleta sem CT-e); a chave do MDF-e do próprio manifesto vai em
chaveMdfe.Valores:
55,57,58documentos[].chavetexto ou nuloopcionaldocumentos[].numerotextoobrigatóriodocumentos[].serietexto ou nuloopcionaldocumentos[].statustexto (lista fixa)obrigatórioStatus controlado por documento, não por manifesto.
Valores:
PENDENTE,EM_TRANSPORTE,ENTREGUE,ENTREGUE_PARCIAL,DEVOLVIDO,CANCELADOdocumentos[].nfVinculadaslista de objetosopcionalSituação de cada NF do CT-e (o status é por NF).
documentos[].nfVinculadas[].idtexto (uuid)obrigatóriodocumentos[].nfVinculadas[].chavetexto ou nuloopcionaldocumentos[].nfVinculadas[].numerotextoobrigatóriodocumentos[].nfVinculadas[].serietexto ou nuloopcionaldocumentos[].nfVinculadas[].statustexto (lista fixa)obrigatórioStatus controlado por documento, não por manifesto.
Valores:
PENDENTE,EM_TRANSPORTE,ENTREGUE,ENTREGUE_PARCIAL,DEVOLVIDO,CANCELADOerroslista de objetosopcionalDocumentos recusados nesta chamada. Ausente ou vazio quando tudo foi aceito.
erros[].documentoIndexinteiro ou nuloopcionalÍndice (a partir de 0) do documento no array
documentosda requisição. Nulo quando o documento recusado não está na requisição (ex.; remoção recusada de documento já baixado).mínimo 0
erros[].codigotexto (lista fixa)obrigatórioMotivo da recusa de um documento específico.
Valores:
CHAVE_INVALIDA,CHAVE_CTE_OBRIGATORIA,MODELO_INCOMPATIVEL,CNPJ_INVALIDO,DESTINATARIO_INVALIDO,DOCUMENTO_JA_BAIXADO,OUTROerros[].motivotextoobrigatórioExplicação em pt-BR.
erros[].chavetexto ou nuloopcionalChave do documento, quando houver.
erros[].numerotexto ou nuloopcionalNúmero do documento, quando houver.
201application/json
Manifesto criado (versão 1). Se algum documento foi recusado, ele aparece em erros[] e o restante foi gravado normalmente.
{
"id": "0192f3a4-5b6c-7d8e-9f01-000000000001",
"numeroExterno": "REL-2026-000123",
"tipo": "ENTREGA",
"ambiente": "PRODUCAO",
"versaoAtual": 1,
"quantidadeParadas": 1,
"quantidadeDocumentos": 2,
"erros": []
}{
"id": "0192f3a4-5b6c-7d8e-9f01-000000000001",
"numeroExterno": "REL-2026-000123",
"tipo": "ENTREGA",
"ambiente": "TESTE",
"versaoAtual": 1,
"quantidadeParadas": 1,
"quantidadeDocumentos": 1,
"erros": [
{
"documentoIndex": 1,
"codigo": "CHAVE_INVALIDA",
"motivo": "Dígito verificador da chave não confere",
"chave": "35260911222333000181570010000123461918273640",
"numero": "12346"
}
]
}Campos da resposta (26)
Campos
idtexto (uuid)obrigatórionumeroExternotextoobrigatóriotipotexto (lista fixa)obrigatórioTipo do manifesto enviado pelo TMS. Use
ROTApara o caminhão que sai com entregas e coletas juntas eTRANSFERENCIApara transferência entre filiais (sempre só transferência).ENTREGAeCOLETAseguem aceitos por compatibilidade e são tratados comoROTA.Valores:
ROTA,TRANSFERENCIA,ENTREGA,COLETAambientetexto (lista fixa)obrigatórioAmbiente da credencial — sandbox e produção nunca se misturam
Valores:
TESTE,PRODUCAOversaoAtualinteiroobrigatórioVersão atual do manifesto (1 na criação; +1 a cada alteração).
mínimo 1
quantidadeParadasinteiroopcionalquantidadeDocumentosinteiroopcionaldocumentoslista de objetosopcionalDocumentos ativos na versão atual, com o status de cada um.
documentos[].idtexto (uuid)obrigatóriodocumentos[].modelotexto (lista fixa)obrigatórioModelo do documento fiscal: 55 = NF-e, 57 = CT-e, 58 = MDF-e. Nos documentos do manifesto o normal é 57 (CT-e) ou 55 (NF-e, ex.: coleta sem CT-e); a chave do MDF-e do próprio manifesto vai em
chaveMdfe.Valores:
55,57,58documentos[].chavetexto ou nuloopcionaldocumentos[].numerotextoobrigatóriodocumentos[].serietexto ou nuloopcionaldocumentos[].statustexto (lista fixa)obrigatórioStatus controlado por documento, não por manifesto.
Valores:
PENDENTE,EM_TRANSPORTE,ENTREGUE,ENTREGUE_PARCIAL,DEVOLVIDO,CANCELADOdocumentos[].nfVinculadaslista de objetosopcionalSituação de cada NF do CT-e (o status é por NF).
documentos[].nfVinculadas[].idtexto (uuid)obrigatóriodocumentos[].nfVinculadas[].chavetexto ou nuloopcionaldocumentos[].nfVinculadas[].numerotextoobrigatóriodocumentos[].nfVinculadas[].serietexto ou nuloopcionaldocumentos[].nfVinculadas[].statustexto (lista fixa)obrigatórioStatus controlado por documento, não por manifesto.
Valores:
PENDENTE,EM_TRANSPORTE,ENTREGUE,ENTREGUE_PARCIAL,DEVOLVIDO,CANCELADOerroslista de objetosopcionalDocumentos recusados nesta chamada. Ausente ou vazio quando tudo foi aceito.
erros[].documentoIndexinteiro ou nuloopcionalÍndice (a partir de 0) do documento no array
documentosda requisição. Nulo quando o documento recusado não está na requisição (ex.; remoção recusada de documento já baixado).mínimo 0
erros[].codigotexto (lista fixa)obrigatórioMotivo da recusa de um documento específico.
Valores:
CHAVE_INVALIDA,CHAVE_CTE_OBRIGATORIA,MODELO_INCOMPATIVEL,CNPJ_INVALIDO,DESTINATARIO_INVALIDO,DOCUMENTO_JA_BAIXADO,OUTROerros[].motivotextoobrigatórioExplicação em pt-BR.
erros[].chavetexto ou nuloopcionalChave do documento, quando houver.
erros[].numerotexto ou nuloopcionalNúmero do documento, quando houver.
400application/problem+json
Manifesto recusado por inteiro (RFC 9457). Quando o problema está em documentos específicos e nenhum documento pôde ser aceito, o membro de extensão erros lista o motivo de cada um.
{
"type": "https://veltra.com.br/problemas/validacao",
"title": "Requisição inválida",
"status": 400,
"detail": "motorista.cpf inválido"
}{
"type": "https://veltra.com.br/problemas/documentos-invalidos",
"title": "Nenhum documento válido",
"status": 400,
"detail": "Todos os documentos do manifesto foram recusados.",
"erros": [
{
"documentoIndex": 0,
"codigo": "CHAVE_INVALIDA",
"motivo": "Dígito verificador da chave não confere"
}
]
}Campos da resposta (12)
Campos
typetextoobrigatóriotitletextoobrigatóriostatusinteiroobrigatóriodetailtextoopcionalinstancetextoopcionalcodigotextoopcionalCódigo estável do problema para o cliente decidir o tratamento (ex.: ASAAS_RECUSOU, FATURA_NAO_ENCONTRADA, PAGINACAO_INVALIDA). Ausente quando o erro não tem código próprio.
erroslista de objetosopcionalerros[].documentoIndexinteiro ou nuloopcionalÍndice (a partir de 0) do documento no array
documentosda requisição. Nulo quando o documento recusado não está na requisição (ex.; remoção recusada de documento já baixado).mínimo 0
erros[].codigotexto (lista fixa)obrigatórioMotivo da recusa de um documento específico.
Valores:
CHAVE_INVALIDA,CHAVE_CTE_OBRIGATORIA,MODELO_INCOMPATIVEL,CNPJ_INVALIDO,DESTINATARIO_INVALIDO,DOCUMENTO_JA_BAIXADO,OUTROerros[].motivotextoobrigatórioExplicação em pt-BR.
erros[].chavetexto ou nuloopcionalChave do documento, quando houver.
erros[].numerotexto ou nuloopcionalNúmero do documento, quando houver.
401application/problem+json
Erro no formato RFC 9457 (application/problem+json)
{
"type": "https://exemplo.com.br/webhook-veltra",
"title": "texto",
"status": 1,
"detail": "texto",
"instance": "https://exemplo.com.br/webhook-veltra",
"codigo": "ASAAS_RECUSOU"
}Campos da resposta (6)
Campos
typetextoobrigatóriotitletextoobrigatóriostatusinteiroobrigatóriodetailtextoopcionalinstancetextoopcionalcodigotextoopcionalCódigo estável do problema para o cliente decidir o tratamento (ex.: ASAAS_RECUSOU, FATURA_NAO_ENCONTRADA, PAGINACAO_INVALIDA). Ausente quando o erro não tem código próprio.
409application/problem+json
Conflito (RFC 9457): Idempotency-Key repetida com corpo diferente, numeroExterno que já existe no ambiente, ou TESTE_ENCERRADO (no campo codigo): o teste grátis da transportadora acabou e a chave de PRODUCAO não grava manifesto novo. TESTE_ENCERRADO vale só para PRODUCAO; o reenvio idempotente de um manifesto já gravado devolve o 201 gravado, sem erro. Chave de TESTE não é afetada.
{
"type": "https://exemplo.com.br/webhook-veltra",
"title": "texto",
"status": 1,
"detail": "texto",
"instance": "https://exemplo.com.br/webhook-veltra",
"codigo": "ASAAS_RECUSOU"
}Campos da resposta (6)
Campos
typetextoobrigatóriotitletextoobrigatóriostatusinteiroobrigatóriodetailtextoopcionalinstancetextoopcionalcodigotextoopcionalCódigo estável do problema para o cliente decidir o tratamento (ex.: ASAAS_RECUSOU, FATURA_NAO_ENCONTRADA, PAGINACAO_INVALIDA). Ausente quando o erro não tem código próprio.
Erroapplication/problem+json
Erro no formato RFC 9457 (application/problem+json)
{
"type": "https://exemplo.com.br/webhook-veltra",
"title": "texto",
"status": 1,
"detail": "texto",
"instance": "https://exemplo.com.br/webhook-veltra",
"codigo": "ASAAS_RECUSOU"
}Campos da resposta (6)
Campos
typetextoobrigatóriotitletextoobrigatóriostatusinteiroobrigatóriodetailtextoopcionalinstancetextoopcionalcodigotextoopcionalCódigo estável do problema para o cliente decidir o tratamento (ex.: ASAAS_RECUSOU, FATURA_NAO_ENCONTRADA, PAGINACAO_INVALIDA). Ausente quando o erro não tem código próprio.
Guia explicado
O que fazer: erros da chamada inteira
| Status | Quando | O que fazer |
|---|---|---|
400 | Falta o cabeçalho Idempotency-Key (detail: "cabeçalho Idempotency-Key é obrigatório") | Enviar o cabeçalho |
400 | Idempotency-Key com mais de 255 caracteres | Usar um UUID |
400 | JSON ilegível (detail: "Corpo da requisição ilegível.") | Validar o JSON |
400 | Erro de cabeçalho do manifesto: tipo ausente ou fora da lista; numeroExterno ausente; motorista ou veiculo ausentes; motorista.cpf inválido; veiculo.placa inválida; mais de 2 ajudantes; chaveMdfe inválida; documentos vazio ou acima de 1000 | Corrigir o campo que o detail indica |
400 | Transferência sem filialOrigemSigla ou filialDestinoSigla, ou sigla que não existe | Cadastrar a filial antes (rota de filiais) |
400 | Todos os documentos foram recusados. type termina em documentos-invalidos e erros lista o motivo de cada um. Nada foi gravado | Corrigir os documentos e reenviar |
401 | Chave inválida | Conferir a chave |
403 | Chave sem permissão para manifesto (por exemplo, chave de consulta), ou módulo de entrada suspenso (CHAVE_SUSPENSA) | Usar a chave certa |
409 | Idempotency-Key já usada com outro corpo | Gerar uma chave nova, se for outro envio |
409 | numeroExterno já existe neste ambiente (type termina em manifesto-ja-existe) | Use PUT para alterar |
409 | codigo = TESTE_ENCERRADO: o teste grátis da transportadora acabou e a chave de produção não grava manifesto novo | A transportadora contrata no portal. A chave de teste não é afetada |
409 | Conflito de gravação simultânea (type termina em conflito) | Tentar de novo com a mesma Idempotency-Key |
429 | Limite de chamadas | Esperar o Retry-After |
Observações
- Idempotência. Reenvio com a mesma
Idempotency-Keye o mesmo corpo devolve200com a resposta original e não grava nada de novo. Isso vale também depois que o teste grátis acabou: um manifesto já gravado continua devolvendo a resposta gravada. - Deduplicação por
numeroExterno. Mandar o mesmo número com outraIdempotency-Keyé409: o Veltra entende que é um manifesto repetido e não cria outro. Para mudar um manifesto existente, use oPUT. - Coleta sem CT-e. O documento é a NF (
modelo55) comnumero,serieecnpjEmbarcador. Odestinatarioé o local onde o motorista busca. Quando o CT-e for emitido depois, ele chega em outro manifesto com as mesmas NF e o Veltra vincula sozinho. - Mesma parada. Documentos para o mesmo destinatário e o mesmo endereço ficam na mesma parada, cada um com a sua tarefa.
- Teste. O manifesto de teste não chega ao app de motoristas reais nem dispara webhook de produção.
- Limites. Até 1000 documentos, até 2 ajudantes,
numeroExternocom até 60 caracteres. - Eventos. O Veltra não dispara webhook de manifesto; para acompanhar o andamento, assine os eventos de baixa, ocorrência e parada (veja os webhooks).
Texto completo, com mais exemplos, em API por rota.