Manual da API · Entrada do TMS
Altera um manifesto reenviando-o inteiro (nova versão)
PUT/integracao/v1/manifestos/{numeroExterno}
Alterar = reenviar o manifesto completo. O Veltra calcula o que entrou, saiu ou mudou, grava uma nova versão (versaoAtual + 1) e guarda o histórico. Trocar motorista, veículo ou ajudantes no meio da rota é permitido; o que já foi feito continua em nome de quem fez.
-
numeroExternodo corpo diferente do caminho = 400; mudar otipodo manifesto = 400. -
Um documento que sumiu da versão nova mas já tem baixa ou ocorrência NÃO é removido: o restante da alteração é aplicado e a resposta traz o motivo em
erros[]. Um comprovante nunca some. -
O manifesto é localizado no ambiente da API key e a alteração nunca muda o ambiente dele. Inexistente = 404.
-
Idempotência igual à do
POST: mesmaIdempotency-Keye mesmo corpo = mesma resposta; mesma chave com corpo diferente = 409. -
Reenviar exatamente o conteúdo da versão atual (com outra
Idempotency-Key) não cria versão nova.
Para que serve: altera um manifesto já enviado. Alterar é reenviar o manifesto inteiro: o Veltra compara com a versão atual, calcula o que entrou, saiu ou mudou e grava uma nova versão (versaoAtual + 1), guardando o histórico.
Quando chamar: para trocar motorista, veículo ou ajudantes no meio da rota, adicionar ou tirar documentos, ou corrigir um documento que foi recusado no envio. O que já foi feito continua registrado em nome de quem fez.
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.
Caminho (path)
numeroExternotextoobrigatórioNúmero do manifesto no TMS (chave natural, única por transportadora e ambiente).
de 1 a 60 caracteres
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
}
]
}Respostas
200application/json
Manifesto alterado (ou reenvio idempotente)
{
"id": "0192f3a4-5b6c-7d8e-9f01-000000000001",
"numeroExterno": "REL-2026-000123",
"tipo": "ENTREGA",
"ambiente": "PRODUCAO",
"versaoAtual": 2,
"quantidadeParadas": 1,
"quantidadeDocumentos": 2,
"erros": [
{
"codigo": "DOCUMENTO_JA_BAIXADO",
"motivo": "O documento já tem baixa e não pode ser removido do manifesto",
"chave": "35260911222333000181570010000123461918273641",
"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.
404application/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, ou POST de um numeroExterno que já existe no ambiente.
{
"type": "https://veltra.com.br/problemas/idempotencia",
"title": "Idempotency-Key já usada com outro corpo",
"status": 409,
"detail": "A Idempotency-Key informada já foi usada numa requisição com conteúdo diferente."
}{
"type": "https://veltra.com.br/problemas/manifesto-ja-existe",
"title": "Manifesto já existe",
"status": 409,
"detail": "O manifesto REL-2026-000123 já foi enviado; use PUT /integracao/v1/manifestos/REL-2026-000123 para alterar."
}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
| Status | Quando | O que fazer |
|---|---|---|
400 | numeroExterno do corpo diferente do caminho (detail: "numeroExterno do corpo difere do informado no caminho") | Igualar os dois |
400 | Tentou mudar o tipo (detail: "o tipo do manifesto não pode mudar (atual: ...)") | Manter o tipo; para outro tipo, cancele e crie outro manifesto |
400 | Qualquer erro de cabeçalho do manifesto ou de Idempotency-Key (as mesmas regras do POST) | Corrigir |
400 | Todos os documentos recusados | Corrigir os documentos |
401 | Chave inválida | Conferir a chave |
403 | Chave sem permissão | Usar a chave de TMS |
404 | O manifesto não existe neste ambiente | Conferir o numeroExterno e o ambiente da chave |
409 | Idempotency-Key já usada com outro corpo | Gerar uma chave nova |
Observações
- Documento que sumiu mas já tem baixa ou ocorrência não é removido. O restante da alteração é aplicado e a resposta traz
DOCUMENTO_JA_BAIXADOemerros. Um comprovante nunca some. - Reenviar exatamente o conteúdo atual (mesmo com outra
Idempotency-Key) não cria versão nova: a resposta traz a mesmaversaoAtual. - Idempotência igual à do
POST: mesma chave e mesmo corpo devolve a mesma resposta. - Ambiente. O manifesto é localizado pelo ambiente da chave e a alteração nunca muda o ambiente dele.
- Um documento cancelado ou devolvido que volta no manifesto é tratado como nova tentativa e volta a
PENDENTE. Entregue continua entregue. - Uma alteração não gera webhook; a nova versão fica na linha do tempo do manifesto.
Texto completo, com mais exemplos, em API por rota.