Integração com o Vitreum, sistema usado por clientes do PetroW: rotas em /v1/terceiro/vitreum/, próprias desse sistema. Hoje seguem as regras das rotas gerais equivalentes (indicadas em cada endpoint). Autenticação, perfis e erros seguem o manual geral das APIs de terceiro.
Autenticação em todos os exemplos: veja Autenticação. Teste no navegador pelo Swagger ou importe a coleção do Postman.
| Endpoint | Métodos | Para que serve |
|---|---|---|
vitreum/cliente |
GET, POST, PUT, DELETE | Cadastro de cliente |
vitreum/conhecimentoTransporte |
GET | Consulta resumida de um CT-e |
vitreum/fornecedor |
GET, POST, PUT, DELETE | Cadastro de fornecedor |
vitreum/importarConhecimentoTransporte |
GET, POST | Solicita a importação de CT-e pela chave |
vitreum/importarNotaFiscal |
GET, POST | Solicita a importação de NF-e pela chave |
vitreum/laudoProduto |
GET, POST, PUT, DELETE | Laudo de produto (qualidade) com checklist |
vitreum/motorista |
GET, POST, PUT, DELETE | Cadastro de motorista |
vitreum/notaFiscal |
GET | Consulta resumida de uma nota fiscal |
vitreum/operador |
GET | Consulta de operador |
vitreum/ordem |
GET | Consulta uma ordem de carregamento ou descarregamento pelo id |
vitreum/ordemAmostra |
GET, PUT | Amostras da ordem |
vitreum/ordemCarregamento |
GET, POST, PUT, DELETE | Ordem de carregamento: criar, consultar, mudar situação, vincular laudo e cancelar |
vitreum/ordemDescarregamento |
GET, POST, PUT, DELETE | Ordem de descarregamento: criar, consultar, mudar situação, vincular laudo e cancelar |
vitreum/ordemLacre |
GET, PUT | Lacres da ordem |
vitreum/produto |
GET | Consulta de produto |
vitreum/transportadora |
GET, POST, PUT, DELETE | Cadastro de transportadora |
vitreum/txEstabelecimento |
GET | Consulta de filial (estabelecimento) |
vitreum/txObservacao |
GET, POST, PUT, DELETE | Observações livres ligadas a qualquer registro |
vitreum/txPessoa |
GET | Consulta de pessoa (cadastro geral) |
vitreum/veiculo |
GET, POST, PUT, DELETE | Cadastro de veículo (com compartimentos e licenças ambientais) |
Cadastro de cliente. Mesma regra de cliente. Cadastro de cliente (dados da pessoa + cadastro de cliente). Localiza o cliente por id_cliente ou, se id_cliente não vier, por cpf_cnpj. Gravação parcial: só os campos presentes no JSON são alterados. Campos de texto precisam vir como texto JSON (entre aspas). DELETE apenas desativa (ativo = N). Acesso com perfil cliente não pode criar (403) e só consulta e altera o próprio cliente.
/v1/terceiro/vitreum/clienteConsulta um cliente
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_cliente |
integer | sim | Id do cliente (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/cliente?$AUTH&id_cliente="
Resposta:
{
"status": "ok",
"id_cliente": 123,
"codigo_erp": "C001",
"simp_instalacao": "1234567",
"simp_agente": "1234567890",
"id_tx_pessoa": 321,
"cpf_cnpj": "00000000000100",
"rg_inscricao": "ISENTO",
"nome_razao_social": "EMPRESA EXEMPLO LTDA",
"identificacao": "EXEMPLO",
"nascimento_fundacao": "2010-01-01",
"telefone": "4133334444",
"celular": "41999990000",
"email": "contato@exemplo.com.br",
"cep": "80000000",
"logradouro": "RUA EXEMPLO",
"numero": 100,
"complemento": "",
"bairro": "CENTRO",
"localidade": "CURITIBA",
"estado": "PR",
"crt": "3",
"ddi_telefone": 55,
"ddi_celular": 55,
"inscricao_municipal": "",
"pais": "BRASIL",
"suframa": "",
"tipo": "J",
"indiedest": "1",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_cliente":"Inválido"}}: sem id/documento válido.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
/v1/terceiro/vitreum/clienteCria um cliente
Sempre cria um novo cliente; não altera um existente. Se já houver uma pessoa com o cpf_cnpj, ela é reaproveitada. Se algo falhar, nada é gravado.
Perfis: App, Rede, Filial, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | sim | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
simp_instalacao |
string | não | Código SIMP/ANP da instalação (padrão '0000000' na criação). |
simp_agente |
string | não | Código SIMP/ANP do agente (padrão '0000000000' na criação). |
curl -s -X POST "$BASE/v1/terceiro/vitreum/cliente?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj": "00.000.000/0001-00", "nome_razao_social": "EMPRESA EXEMPLO LTDA", "identificacao": "EXEMPLO", "email": "contato@exemplo.com.br", "cep": "80000-000", "logradouro": "RUA EXEMPLO", "numero": 100, "bairro": "CENTRO", "localidade": "CURITIBA", "estado": "PR", "codigo_erp": "C001", "simp_instalacao": "1234567", "simp_agente": "1234567890"}'
Resposta:
{
"status": "ok",
"id_cliente": 123
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar. Se a pessoa já é cliente: "Dados já cadastrados (id)".; 403 — acesso com perfil cliente não pode criar cliente..
/v1/terceiro/vitreum/clienteAltera um cliente
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_cliente |
integer | sim | Id do cliente (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | não | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
simp_instalacao |
string | não | Código SIMP/ANP da instalação (padrão '0000000' na criação). |
simp_agente |
string | não | Código SIMP/ANP do agente (padrão '0000000000' na criação). |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/cliente?$AUTH&id_cliente=" \
-H 'Content-Type: application/json' \
-d '{"email": "novo@exemplo.com.br", "telefone": "4133335555"}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_cliente":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)").; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
/v1/terceiro/vitreum/clienteDesativa um cliente
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_cliente |
integer | sim | Id do cliente (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/cliente?$AUTH&id_cliente="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_cliente":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
Consulta resumida de um CT-e. Mesma regra de conhecimentoTransporte. Devolve a identificação e a situação de um conhecimento de transporte (CT-e) que já existe no PetroW, por id ou chave. Acesso com perfil filial ou rede só vê CT-e da filial; acesso com perfil cliente só vê CT-e em que o cliente é tomador, remetente, destinatário, expedidor ou recebedor.
/v1/terceiro/vitreum/conhecimentoTransporteConsulta CT-e por id ou chave
Na busca por chave, só o formato (44 dígitos) é verificado.
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_conhecimento_transporte |
integer | sim | Id do CT-e (Ou chave (44 dígitos).) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/conhecimentoTransporte?$AUTH&id_conhecimento_transporte="
Resposta:
{
"status": "ok",
"id_conhecimento_transporte": 501,
"chave": "41260100000000000100570010000004561000045678",
"numero": 456,
"serie": 1,
"situacao": "AUTORIZADA"
}
Erros específicos: 400 — {"errors":{"id_conhecimento_transporte":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
Cadastro de fornecedor. Mesma regra de fornecedor. Cadastro de fornecedor (dados da pessoa + cadastro de fornecedor). Localiza o fornecedor por id_fornecedor ou, se id_fornecedor não vier, por cpf_cnpj. Gravação parcial: só os campos presentes no JSON são alterados. Campos de texto precisam vir como texto JSON (entre aspas). DELETE apenas desativa (ativo = N). O endpoint não restringe pelo escopo do acesso (cliente ou filial): vale só a permissão de acesso ao endpoint.
/v1/terceiro/vitreum/fornecedorConsulta um fornecedor
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_fornecedor |
integer | sim | Id do fornecedor (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/fornecedor?$AUTH&id_fornecedor="
Resposta:
{
"status": "ok",
"id_fornecedor": 123,
"codigo_erp": "F001",
"id_tx_pessoa": 321,
"cpf_cnpj": "00000000000100",
"rg_inscricao": "ISENTO",
"nome_razao_social": "EMPRESA EXEMPLO LTDA",
"identificacao": "EXEMPLO",
"nascimento_fundacao": "2010-01-01",
"telefone": "4133334444",
"celular": "41999990000",
"email": "contato@exemplo.com.br",
"cep": "80000000",
"logradouro": "RUA EXEMPLO",
"numero": 100,
"complemento": "",
"bairro": "CENTRO",
"localidade": "CURITIBA",
"estado": "PR",
"crt": "3",
"ddi_telefone": 55,
"ddi_celular": 55,
"inscricao_municipal": "",
"pais": "BRASIL",
"suframa": "",
"tipo": "J",
"indiedest": "1",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_fornecedor":"Inválido"}}: sem id/documento válido.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/fornecedorCria um fornecedor
Sempre cria um novo fornecedor; não altera um existente. Se já houver uma pessoa com o cpf_cnpj, ela é reaproveitada. Se algo falhar, nada é gravado.
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | sim | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
curl -s -X POST "$BASE/v1/terceiro/vitreum/fornecedor?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj": "00.000.000/0001-00", "nome_razao_social": "EMPRESA EXEMPLO LTDA", "identificacao": "EXEMPLO", "email": "contato@exemplo.com.br", "cep": "80000-000", "logradouro": "RUA EXEMPLO", "numero": 100, "bairro": "CENTRO", "localidade": "CURITIBA", "estado": "PR", "codigo_erp": "C001"}'
Resposta:
{
"status": "ok",
"id_fornecedor": 123
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar. Se a pessoa já é fornecedor: "Dados já cadastrados (id)"..
/v1/terceiro/vitreum/fornecedorAltera um fornecedor
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_fornecedor |
integer | sim | Id do fornecedor (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | não | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/fornecedor?$AUTH&id_fornecedor=" \
-H 'Content-Type: application/json' \
-d '{"email": "novo@exemplo.com.br", "telefone": "4133335555"}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_fornecedor":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/fornecedorDesativa um fornecedor
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_fornecedor |
integer | sim | Id do fornecedor (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/fornecedor?$AUTH&id_fornecedor="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_fornecedor":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo..
Solicita a importação de CT-e pela chave. Mesma regra de importarConhecimentoTransporte. Coloca a chave de CT-e numa fila de importação. Não recebe o XML: o PetroW verifica periodicamente se o XML já está no repositório fiscal; quando o encontra, marca xml_ok = S e, na importação seguinte, cria o CT-e no PetroW e preenche id_conhecimento_transporte. Use o GET para acompanhar o andamento.
/v1/terceiro/vitreum/importarConhecimentoTransporteConsulta o andamento
O GET não restringe pelo escopo do acesso (cliente ou filial): consulta qualquer pedido do app.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_importar_conhecimento_transporte |
integer | sim | Id do pedido de importação (Ou chave (44 dígitos).) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/importarConhecimentoTransporte?$AUTH&id_importar_conhecimento_transporte="
Resposta:
{
"status": "ok",
"id_importar_conhecimento_transporte": 55,
"chave": "41260100000000000100550010000012341000012345",
"xml_ok": "S",
"id_conhecimento_transporte": 1001
}
Erros específicos: 400 — {"errors":{"id_conhecimento_transporte":"Inválido"}}: sem id ou chave válida (o erro usa esse nome de campo).; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/importarConhecimentoTransporteColoca a chave na fila de importação
A chave vai na query string, não no corpo. O corpo é ignorado.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
chave |
string | sim | Chave de acesso do CT-e (44 dígitos; aceita máscara). |
curl -s -X POST "$BASE/v1/terceiro/vitreum/importarConhecimentoTransporte?$AUTH&chave="
Resposta:
{
"status": "ok",
"id_importar_conhecimento_transporte": 55
}
Erros específicos: 400 — {"errors":{"chave":"Inválido"}}: chave inválida.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar. Chave já enviada antes: "Dados já cadastrados (id)"..
Solicita a importação de NF-e pela chave. Mesma regra de importarNotaFiscal. Coloca a chave de NF-e numa fila de importação. Não recebe o XML: o PetroW verifica periodicamente se o XML já está no repositório fiscal; quando o encontra, marca xml_ok = S e, na importação seguinte, cria a nota no PetroW e preenche id_nota_fiscal. A importação só é concluída se a nota pertencer a uma filial do app. Use o GET para acompanhar o andamento.
/v1/terceiro/vitreum/importarNotaFiscalConsulta o andamento
O GET não restringe pelo escopo do acesso (cliente ou filial): consulta qualquer pedido do app.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_importar_nota_fiscal |
integer | sim | Id do pedido de importação (Ou chave (44 dígitos).) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/importarNotaFiscal?$AUTH&id_importar_nota_fiscal="
Resposta:
{
"status": "ok",
"id_importar_nota_fiscal": 55,
"chave": "41260100000000000100550010000012341000012345",
"xml_ok": "S",
"id_nota_fiscal": 1001
}
Erros específicos: 400 — {"errors":{"id_importar_nota_fiscal":"Inválido"}}: sem id/chave válida.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/importarNotaFiscalColoca a chave na fila de importação
A chave vai na query string, não no corpo. O corpo é ignorado.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
chave |
string | sim | Chave de acesso da NF-e (44 dígitos; aceita máscara). |
curl -s -X POST "$BASE/v1/terceiro/vitreum/importarNotaFiscal?$AUTH&chave="
Resposta:
{
"status": "ok",
"id_importar_nota_fiscal": 55
}
Erros específicos: 400 — {"errors":{"chave":"Inválido"}}: chave inválida.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar. Chave já enviada antes: "Dados já cadastrados (id)"..
Laudo de produto (qualidade) com checklist. Mesma regra de laudoProduto. Cria, consulta, altera e desativa laudos de produto. O laudo nasce pendente (aprovado = X). Aprovar ou reprovar não é feito por esta API; depois de aprovado ou reprovado, o laudo não pode mais ser alterado. O checklist é escolhido pela configuração de checklist de laudo mais específica para filial × fornecedor × produto × grade × tipo. O GET lista todas as perguntas desse checklist (respondidas ou não); POST e PUT gravam as respostas por id_checklist_item (criam a resposta ou alteram a existente). Acesso com perfil filial ou rede só acessa laudos da filial; acesso com perfil cliente só consulta laudos ligados a ordens do cliente.
/v1/terceiro/vitreum/laudoProdutoConsulta um laudo com checklist, vínculos e PDF
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_laudo_produto |
integer | sim | Id do laudo |
curl -s -X GET "$BASE/v1/terceiro/vitreum/laudoProduto?$AUTH&id_laudo_produto="
Resposta:
{
"status": "ok",
"id_laudo_produto": 77,
"id_tx_estabelecimento": 3,
"id_fornecedor": 12,
"id_produto": 5,
"quantidade": 30000,
"unidade": "L",
"numero": "LAU-001",
"data_amostra": "2026-11-10",
"data_laudo": "2026-11-10",
"observacao": "",
"ativo": true,
"tipo": "",
"id_produto_grade": 0,
"id_tx_pessoa": 0,
"data_hora": null,
"aprovado": "X",
"origem": "",
"lacres": "123;124",
"checklist": {
"descricao": "LAUDO DE RECEBIMENTO",
"observacoes": "",
"rodape": "",
"respostas": [
{
"id_checklist_item": 48,
"pergunta": "ASPECTO",
"resposta": "LÍMPIDO",
"aprovado": true,
"observacao": ""
},
{
"id_checklist_item": 49,
"pergunta": "COR",
"resposta": "",
"aprovado": false,
"observacao": ""
}
]
},
"ordem": [
{
"tipo": "D",
"id_ordem": 9001,
"produtos": [
{
"id_produto": 5
}
]
}
],
"estoque": [
{
"id_estoque": 10,
"observacao": ""
}
],
"pedido": [
{
"id_pedido": 300,
"tipo": "V",
"observacao": "",
"ativo": true,
"itens": [
{
"descricao": "ETANOL",
"id_produto": 5,
"ativo": true
}
]
}
],
"conhecimento_transporte": [
{
"chave": "41260100000000000100570010000004561000045678",
"numero": 456,
"serie": 1
}
],
"nota_fiscal": [
{
"chave": "41260100000000000100550010000012341000012345",
"numero": 1234,
"serie": 1
}
],
"batelada": [
{
"id_batelada": 20,
"ativo": true,
"produtos": [
{
"id_produto": 5
}
]
}
],
"contrato_coleta": [
{
"id_contrato_coleta": 40
}
],
"pdf_base64": "JVBERi0xLjQK..."
}
Erros específicos: 400 — {"errors":{"id_laudo_produto":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
/v1/terceiro/vitreum/laudoProdutoCria um laudo (e respostas do checklist)
Laudo e respostas são gravados juntos: qualquer erro desfaz tudo. Sem 'checklist' no corpo, nenhuma resposta é gravada.
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_estabelecimento |
integer | não | Filial do laudo. Alternativa: cpf_cnpj_tx_estabelecimento. Sem ela, usa a filial do acesso com perfil filial (0 para os demais tipos). |
cpf_cnpj_tx_estabelecimento |
string | não | CNPJ da filial (usado se id_tx_estabelecimento não vier). |
id_fornecedor |
integer | não | Fornecedor. Alternativa: cpf_cnpj_fornecedor. |
cpf_cnpj_fornecedor |
string | não | CNPJ/CPF do fornecedor (usado se id_fornecedor não vier). |
id_produto |
integer | não | Produto (só o id). |
id_produto_grade |
integer | não | Grade do produto (padrão 0) |
quantidade |
number | não | Quantidade (padrão 0) |
unidade |
string | não | L, M3, KG, TON ou UN (padrão L) |
numero |
string | não | Número do laudo |
data_amostra |
date | não | Data da amostra, AAAA-MM-DD. Formato inválido = 400. Sem o campo: no POST, a data de hoje; no PUT, a data atual é mantida. |
data_laudo |
date | não | Data do laudo, AAAA-MM-DD. Mesmas regras de data_amostra. |
tipo |
string | não | Tipo do laudo (texto livre; também usado para escolher o checklist). |
origem |
string | não | Origem |
lacres |
string | não | Lacres |
observacao |
string | não | Observação |
checklist |
array|object | não | Respostas do checklist: lista de {id_checklist_item, resposta, observacao} ou objeto {"respostas":[…]} (o mesmo formato devolvido no GET). |
curl -s -X POST "$BASE/v1/terceiro/vitreum/laudoProduto?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj_tx_estabelecimento": "00.000.000/0001-00", "cpf_cnpj_fornecedor": "11.111.111/0001-11", "id_produto": 5, "quantidade": 30000, "unidade": "L", "numero": "LAU-001", "data_amostra": "2026-11-10", "data_laudo": "2026-11-10", "lacres": "123;124", "checklist": [{"id_checklist_item": 48, "resposta": "LÍMPIDO", "observacao": ""}, {"id_checklist_item": 49, "resposta": "INCOLOR"}]}'
Resposta:
{
"status": "ok",
"id_laudo_produto": 77
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 403 — {"errors":{"acesso":"Negado"}}: filial fora do escopo do acesso.; 400 — {"errors":{"checklist":"Nenhum checklist relacionado ao laudo (estabelecimento x fornecedor x produto x grade)"}}: o corpo traz checklist, mas não há configuração de checklist para o laudo.; 400 — {"errors":{"checklist":"id_checklist_item é obrigatório em cada resposta"}}.; 400 — {"errors":{"checklist":"id_checklist_item N não pertence ao checklist do laudo (M)"}}.; 400 — {"errors":{"exception":""}}: erro de validação do laudo, da grade ou das respostas (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/laudoProdutoAltera um laudo pendente (e respostas)
Atenção: o PUT não é parcial. Todos os campos do laudo são regravados com o valor do corpo ou com o padrão (0, '', 'L'): mande o laudo completo. data_amostra e data_laudo só mudam quando enviadas. As respostas do checklist só mudam para os itens enviados.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_laudo_produto |
integer | sim | Id do laudo |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_estabelecimento |
integer | não | Filial do laudo. Alternativa: cpf_cnpj_tx_estabelecimento. Sem ela, usa a filial do acesso com perfil filial (0 para os demais tipos). |
cpf_cnpj_tx_estabelecimento |
string | não | CNPJ da filial (usado se id_tx_estabelecimento não vier). |
id_fornecedor |
integer | não | Fornecedor. Alternativa: cpf_cnpj_fornecedor. |
cpf_cnpj_fornecedor |
string | não | CNPJ/CPF do fornecedor (usado se id_fornecedor não vier). |
id_produto |
integer | não | Produto (só o id). |
id_produto_grade |
integer | não | Grade do produto (padrão 0) |
quantidade |
number | não | Quantidade (padrão 0) |
unidade |
string | não | L, M3, KG, TON ou UN (padrão L) |
numero |
string | não | Número do laudo |
data_amostra |
date | não | Data da amostra, AAAA-MM-DD. Formato inválido = 400. Sem o campo: no POST, a data de hoje; no PUT, a data atual é mantida. |
data_laudo |
date | não | Data do laudo, AAAA-MM-DD. Mesmas regras de data_amostra. |
tipo |
string | não | Tipo do laudo (texto livre; também usado para escolher o checklist). |
origem |
string | não | Origem |
lacres |
string | não | Lacres |
observacao |
string | não | Observação |
checklist |
array|object | não | Respostas do checklist: lista de {id_checklist_item, resposta, observacao} ou objeto {"respostas":[…]} (o mesmo formato devolvido no GET). |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/laudoProduto?$AUTH&id_laudo_produto=" \
-H 'Content-Type: application/json' \
-d '{"id_tx_estabelecimento": 3, "id_fornecedor": 12, "id_produto": 5, "quantidade": 30000, "unidade": "L", "numero": "LAU-001", "data_amostra": "2026-11-10", "data_laudo": "2026-11-10", "checklist": {"respostas": [{"id_checklist_item": 49, "resposta": "INCOLOR", "observacao": "conferido"}]}}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_laudo_produto":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso.; 400 — laudo já aprovado ou reprovado não pode ser alterado (erro no campo aprovado).; 400 — os mesmos erros de checklist do POST..
/v1/terceiro/vitreum/laudoProdutoDesativa um laudo
Desativa (ativo = N); não apaga.
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_laudo_produto |
integer | sim | Id do laudo |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/laudoProduto?$AUTH&id_laudo_produto="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_laudo_produto":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso.; 400 — {"errors":{"exception":"…"}}: falha ao desativar..
Cadastro de motorista. Mesma regra de motorista. Cadastro de motoristas (dados da pessoa, CNH e validades de cursos). Localiza o motorista por id_motorista ou, se id_motorista não vier, por cpf. POST sempre cria um motorista: a pessoa com o mesmo CPF é reaproveitada; se ela já é motorista, responde 'Dados já cadastrados'. PUT é parcial. DELETE desativa (ativo = N). validade_integracao também é renovada quando um checklist do motorista é aprovado. O endpoint não restringe pelo escopo do acesso (cliente ou filial): vale só a permissão de acesso ao endpoint.
/v1/terceiro/vitreum/motoristaConsulta um motorista
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_motorista |
integer | sim | Id do motorista (Ou cpf.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/motorista?$AUTH&id_motorista="
Resposta:
{
"status": "ok",
"id_motorista": 600,
"numero_cnh": "00000000000",
"registro_cnh": "",
"estado_cnh": "PR",
"localidade_cnh": "CURITIBA",
"emissao_cnh": "2023-03-01",
"primeira_cnh": "2010-01-01",
"categoria_cnh": "E",
"validade_cnh": "2028-03-01",
"observacoes_cnh": "",
"validade_nr_35": "2027-01-01",
"validade_nr_20": "2027-01-01",
"validade_mopp": "2027-08-01",
"validade_integracao": "2027-05-10",
"validade_toxicologico": "2027-01-01",
"pais_cnh": "BRASIL",
"vistoria_carregamento": "N",
"vistoria_descarregamento": "N",
"codigo_erp": "M001",
"id_tx_pessoa": 321,
"cpf": "00000000191",
"rg": "",
"nome": "MOTORISTA EXEMPLO",
"identificacao": "",
"nascimento": "1980-01-01",
"telefone": "",
"celular": "41999990000",
"email": "",
"cep": "",
"logradouro": "",
"numero": 0,
"complemento": "",
"bairro": "",
"localidade": "",
"estado": "PR",
"ddi_telefone": 55,
"ddi_celular": 55,
"pais": "BRASIL",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_motorista":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/motoristaCria um motorista
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf |
string | sim | CPF (com ou sem máscara). No POST, a pessoa que já tem esse CPF é reaproveitada e atualizada. |
rg |
string | não | RG |
nome |
string | não | Nome |
identificacao |
string | não | Apelido |
nascimento |
date | não | AAAA-MM-DD |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF |
ddi_telefone |
integer | não | DDI |
ddi_celular |
integer | não | DDI |
pais |
string | não | País |
numero_cnh |
string | não | Número da CNH |
registro_cnh |
string | não | Registro da CNH |
estado_cnh |
string | não | UF da CNH |
localidade_cnh |
string | não | Município da CNH |
emissao_cnh |
date | não | AAAA-MM-DD |
primeira_cnh |
date | não | AAAA-MM-DD |
categoria_cnh |
string | não | Categoria (ex.: E) |
validade_cnh |
date | não | AAAA-MM-DD |
observacoes_cnh |
string | não | Observações |
validade_nr_35 |
date | não | AAAA-MM-DD |
validade_nr_20 |
date | não | AAAA-MM-DD |
validade_mopp |
date | não | AAAA-MM-DD |
validade_integracao |
date | não | AAAA-MM-DD |
validade_toxicologico |
date | não | AAAA-MM-DD |
pais_cnh |
string | não | País da CNH |
vistoria_carregamento |
string | não | S/N |
vistoria_descarregamento |
string | não | S/N |
codigo_erp |
string | não | Código no ERP |
curl -s -X POST "$BASE/v1/terceiro/vitreum/motorista?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf": "000.000.001-91", "nome": "MOTORISTA EXEMPLO", "celular": "41999990000", "numero_cnh": "00000000000", "categoria_cnh": "E", "validade_cnh": "2028-03-01", "validade_mopp": "2027-08-01"}'
Resposta:
{
"status": "ok",
"id_motorista": 600
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/motoristaAltera um motorista (parcial)
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_motorista |
integer | sim | Id do motorista (Ou cpf.) |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf |
string | não | CPF (com ou sem máscara). No POST, a pessoa que já tem esse CPF é reaproveitada e atualizada. |
rg |
string | não | RG |
nome |
string | não | Nome |
identificacao |
string | não | Apelido |
nascimento |
date | não | AAAA-MM-DD |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF |
ddi_telefone |
integer | não | DDI |
ddi_celular |
integer | não | DDI |
pais |
string | não | País |
numero_cnh |
string | não | Número da CNH |
registro_cnh |
string | não | Registro da CNH |
estado_cnh |
string | não | UF da CNH |
localidade_cnh |
string | não | Município da CNH |
emissao_cnh |
date | não | AAAA-MM-DD |
primeira_cnh |
date | não | AAAA-MM-DD |
categoria_cnh |
string | não | Categoria (ex.: E) |
validade_cnh |
date | não | AAAA-MM-DD |
observacoes_cnh |
string | não | Observações |
validade_nr_35 |
date | não | AAAA-MM-DD |
validade_nr_20 |
date | não | AAAA-MM-DD |
validade_mopp |
date | não | AAAA-MM-DD |
validade_integracao |
date | não | AAAA-MM-DD |
validade_toxicologico |
date | não | AAAA-MM-DD |
pais_cnh |
string | não | País da CNH |
vistoria_carregamento |
string | não | S/N |
vistoria_descarregamento |
string | não | S/N |
codigo_erp |
string | não | Código no ERP |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/motorista?$AUTH&id_motorista=" \
-H 'Content-Type: application/json' \
-d '{"validade_mopp": "2028-08-01"}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_motorista":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/motoristaDesativa um motorista
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_motorista |
integer | sim | Id do motorista (Ou cpf.) |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/motorista?$AUTH&id_motorista="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_motorista":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo..
Consulta resumida de uma nota fiscal. Mesma regra de notaFiscal. Devolve a identificação e a situação de uma NF-e que já existe no PetroW, localizada por id_nota_fiscal ou pela chave de 44 dígitos. Só leitura. Acesso com perfil cliente ou de filial só vê notas do próprio cliente ou filial.
/v1/terceiro/vitreum/notaFiscalConsulta nota fiscal por id ou chave
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_nota_fiscal |
integer | sim | Id da nota fiscal. (Ou chave (44 dígitos da NF-e; aceita com máscara).) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/notaFiscal?$AUTH&id_nota_fiscal="
Resposta:
{
"status": "ok",
"id_nota_fiscal": 1001,
"chave": "41260100000000000100550010000012341000012345",
"numero": 1234,
"serie": 1,
"situacao": "AUTORIZADA"
}
Erros específicos: 400 — {"errors":{"id_nota_fiscal":"Inválido"}}: sem id e sem chave válida, ou chave não encontrada.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
Consulta de operador. Mesma regra de operador. Devolve o operador (funcionário que opera o carregamento e o descarregamento) e os dados da pessoa, por id_operador ou CPF. Só leitura. Não restringe pelo escopo do acesso.
/v1/terceiro/vitreum/operadorConsulta um operador
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_operador |
integer | sim | Id do operador (Ou cpf.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/operador?$AUTH&id_operador="
Resposta:
{
"status": "ok",
"id_operador": 40,
"validade_nr_35": "2027-01-01",
"validade_nr_20": "2027-01-01",
"validade_mopp": "2027-01-01",
"validade_integracao": "2027-01-01",
"pode_completar": "N",
"limite_completar": 0,
"codigo_erp": "O040",
"id_tx_pessoa": 330,
"cpf": "00000000191",
"rg": "",
"nome": "OPERADOR EXEMPLO",
"identificacao": "",
"nascimento": "1985-01-01",
"telefone": "",
"celular": "",
"email": "",
"cep": "",
"logradouro": "",
"numero": 0,
"complemento": "",
"bairro": "",
"localidade": "",
"estado": "PR",
"ddi_telefone": 55,
"ddi_celular": 55,
"pais": "BRASIL",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_operador":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
Consulta uma ordem de carregamento ou descarregamento pelo id. Mesma regra de ordem. Verifica o tipo da ordem e devolve exatamente a mesma resposta de GET ordemCarregamento (tipo C) ou GET ordemDescarregamento (tipo D). Só aceita GET.
/v1/terceiro/vitreum/ordemOrdem pelo id
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/ordem?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"id_ordem": 123456,
"tipo": "C",
"id_cliente": 101,
"id_motorista": 2001,
"id_fornecedor": 0,
"id_veiculo1": 3001,
"id_veiculo2": 3002,
"id_veiculo3": 0,
"id_veiculo4": 0,
"id_transportadora": 401,
"id_operador": 0,
"validade_inicial": "2026-11-12 00:00:00",
"validade_final": "2026-11-13 23:59:59",
"situacao": "P",
"data_hora_pendente": "2026-11-12 08:00:00",
"data_hora_aguardando": null,
"data_hora_operacao": null,
"data_hora_finalizada": null,
"data_hora_cancelada": null,
"transferencia": "N",
"congenere": "N",
"ajuste": "N",
"vazio_balanca": 0,
"cheio_balanca": 0,
"modal": "R",
"data_hora_vistoria": null,
"vistoria": "N",
"metodo": "",
"codigo_interno": "OC-0001",
"id_nota_fiscal": 0,
"observacao": "",
"data_hora_apuracao": null,
"data_hora_conferencia": null,
"tarifar": "S",
"numero": 98765,
"ordem_item": [
{
"id_ordem_item": 1,
"id_veiculo": 3002,
"compartimento": 1,
"nivel": 0,
"sequencia": 0,
"id_operador": 0,
"amostras": 0,
"id_produto": 10,
"quantidade": 10000.0,
"temperatura": 0,
"densidade": 0,
"fator_de_correcao": 0,
"quantidade_a_20": 0,
"massa": 0,
"inpm": 0,
"gl": 0,
"densidade_a_20": 0,
"composicao": [
{
"id_produto": 10,
"percentual": 100,
"quantidade_ambiente": 10000.0,
"quantidade_a_20": 0.0,
"temperatura": 0,
"densidade": 0,
"densidade_a_20": 0,
"fator_de_correcao": 0,
"massa": 0
}
],
"apuracao": {
"quantidade_ambiente": 10000.0,
"quantidade_a_20": 0,
"massa": 0,
"temperatura": 0,
"densidade": 0,
"densidade_a_20": 0,
"fator_de_correcao": 0
}
}
],
"ordem_produto": [
{
"id_ordem_produto": 1,
"id_produto": 10,
"id_laudo_produto": 0,
"quantidade_ambiente": 10000,
"quantidade_a_20": 0,
"temperatura": 0,
"densidade": 0,
"fator_de_correcao": 0,
"massa": 0,
"densidade_a_20": 0,
"quantidade_a_20_apurado": 0,
"quantidade_encerrante": 0,
"inpm": 0,
"gl": 0
}
],
"ordem_senha": [
{
"compartimento": 1,
"sequencia": 0,
"senha": "1234"
}
],
"ordem_situacao": [
{
"id_ordem_situacao": 1,
"situacao": "P",
"data_hora": "2026-11-12 08:00:00",
"id_tx_pessoa": 0
}
],
"ordem_lacre": [
{
"tipo": "SUPERIOR",
"numero": 1001
}
],
"ordem_amostra": []
}
Erros específicos: 400 — sem detalhe, quando a ordem é de outro tipo (ex. A, abastecimento).; 403 — ordem fora do escopo do acesso.; 200 — com corpo vazio quando o id_ordem não existe.; 405 — método diferente de GET..
Amostras da ordem. Mesma regra de ordemAmostra. Consulta e mantém as amostras de uma ordem (carregamento ou descarregamento). POST, PUT e DELETE só funcionam com a ordem em P (pendente) e dentro do escopo do acesso. POST acrescenta, PUT substitui a lista inteira e DELETE remove uma amostra ou todas. O par (tipo, numero) da amostra é único em todas as ordens: o POST avisa se a amostra já está nesta ou em outra ordem.
/v1/terceiro/vitreum/ordemAmostraLista as amostras da ordem
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/ordemAmostra?$AUTH&id_ordem="
Resposta:
{
"data": [
{
"tipo": "SUPERIOR",
"numero": 1001
}
],
"status": "ok"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe.; 403 — ordem fora do escopo do acesso..
/v1/terceiro/vitreum/ordemAmostraSubstitui todas as amostras da ordem pela lista enviada
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
Corpo (JSON lista)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipo |
string | sim | Tipo da amostra (texto livre, ex. SUPERIOR). |
numero |
integer | sim | Número (inteiro maior que 0). Aceita número ou texto só com dígitos (1001 ou "1001"). |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/ordemAmostra?$AUTH&id_ordem=" \
-H 'Content-Type: application/json' \
-d '[{"tipo": "SUPERIOR", "numero": 1001}, {"tipo": "INFERIOR", "numero": 1002}]'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {body: …}: corpo vazio ou que não é uma lista JSON.; 400 — {item[i]: Inválido}, {item[i].tipo: Inválido} ou {item[i].numero: Inválido}.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe.; 403 — ordem fora do escopo do acesso.; 400 — {registro: 'Falha ao alterar: a ordem só aceita alteração enquanto estiver PENDENTE'}.; 400 — {registro: 'Falha por duplicidade: item[i]: …'}: a lista tem amostra repetido(a) ou com número já usado em outra ordem. Nada é gravado (a lista atual fica como estava)..
Ordem de carregamento: criar, consultar, mudar situação, vincular laudo e cancelar. Mesma regra de ordemCarregamento. POST cria a ordem de carregamento com os itens (compartimentos) e, se enviados, lacres, amostras e laudos, tudo de uma vez: se algo falhar, nada é gravado. PUT muda a situação (?acao=FILA|OPERACAO|FINALIZAR|CANCELAR) ou, se o corpo trouxer laudo_produto, só vincula ou remove laudos. DELETE cancela, apenas ordem em P (pendente). Acesso com perfil filial cria a ordem na própria filial; acesso com perfil cliente só cria e consulta ordens do próprio cliente.
/v1/terceiro/vitreum/ordemCarregamentoConsulta a ordem de carregamento
Datas no formato ISO 'AAAA-MM-DDTHH:MM:SS.ffffff' (segundos e frações omitidos quando zero). 1980-01-01T00:00 = sem data; 2099-12-31T23:59(:59) = sem limite.
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/ordemCarregamento?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"id_ordem": 123456,
"tipo": "C",
"id_cliente": 101,
"id_motorista": 2001,
"id_fornecedor": 0,
"id_veiculo1": 3001,
"id_veiculo2": 3002,
"id_veiculo3": 0,
"id_veiculo4": 0,
"id_transportadora": 401,
"id_operador": 0,
"validade_inicial": "2026-11-12 00:00:00",
"validade_final": "2026-11-13 23:59:59",
"situacao": "P",
"data_hora_pendente": "2026-11-12 08:00:00",
"data_hora_aguardando": null,
"data_hora_operacao": null,
"data_hora_finalizada": null,
"data_hora_cancelada": null,
"transferencia": "N",
"congenere": "N",
"ajuste": "N",
"vazio_balanca": 0,
"cheio_balanca": 0,
"modal": "R",
"data_hora_vistoria": null,
"vistoria": "N",
"metodo": "",
"codigo_interno": "OC-0001",
"id_nota_fiscal": 0,
"observacao": "",
"data_hora_apuracao": null,
"data_hora_conferencia": null,
"tarifar": "S",
"numero": 98765,
"ordem_item": [
{
"id_ordem_item": 1,
"id_veiculo": 3002,
"compartimento": 1,
"nivel": 0,
"sequencia": 0,
"id_operador": 0,
"amostras": 0,
"id_produto": 10,
"quantidade": 10000.0,
"temperatura": 0,
"densidade": 0,
"fator_de_correcao": 0,
"quantidade_a_20": 0,
"massa": 0,
"inpm": 0,
"gl": 0,
"densidade_a_20": 0,
"composicao": [
{
"id_produto": 10,
"percentual": 100,
"quantidade_ambiente": 10000.0,
"quantidade_a_20": 0.0,
"temperatura": 0,
"densidade": 0,
"densidade_a_20": 0,
"fator_de_correcao": 0,
"massa": 0
}
],
"apuracao": {
"quantidade_ambiente": 10000.0,
"quantidade_a_20": 0,
"massa": 0,
"temperatura": 0,
"densidade": 0,
"densidade_a_20": 0,
"fator_de_correcao": 0
}
}
],
"ordem_produto": [
{
"id_ordem_produto": 1,
"id_produto": 10,
"id_laudo_produto": 0,
"quantidade_ambiente": 10000,
"quantidade_a_20": 0,
"temperatura": 0,
"densidade": 0,
"fator_de_correcao": 0,
"massa": 0,
"densidade_a_20": 0,
"quantidade_a_20_apurado": 0,
"quantidade_encerrante": 0,
"inpm": 0,
"gl": 0
}
],
"ordem_senha": [
{
"compartimento": 1,
"sequencia": 0,
"senha": "1234"
}
],
"ordem_situacao": [
{
"id_ordem_situacao": 1,
"situacao": "P",
"data_hora": "2026-11-12 08:00:00",
"id_tx_pessoa": 0
}
],
"ordem_lacre": [
{
"tipo": "SUPERIOR",
"numero": 1001
}
],
"ordem_amostra": []
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe ou não é de carregamento.; 403 — ordem fora do escopo do acesso..
/v1/terceiro/vitreum/ordemCarregamentoCria ordem de carregamento
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_cliente |
integer | não | Cliente da ordem. Alternativa: cpf_cnpj_cliente. Se o terceiro é de um cliente, a ordem vai sempre para esse cliente (informar outro dá 403). |
cpf_cnpj_cliente |
string | não | CPF/CNPJ do cliente (só números ou formatado). Usado quando id_cliente vem vazio ou 0. |
id_motorista |
integer | não | Alternativa: cpf_motorista. |
cpf_motorista |
string | não | CPF do motorista. |
id_fornecedor |
integer | não | Alternativa: cpf_cnpj_fornecedor. |
cpf_cnpj_fornecedor |
string | não | |
id_veiculo1 |
integer | não | Veículo 1 (cavalo). Alternativa: placa1. |
placa1 |
string | não | Placa do veículo 1 (precisa ser uma placa válida). |
id_veiculo2 |
integer | não | Alternativa: placa2. |
placa2 |
string | não | |
id_veiculo3 |
integer | não | Alternativa: placa3. |
placa3 |
string | não | |
id_veiculo4 |
integer | não | Alternativa: placa4. |
placa4 |
string | não | |
id_transportadora |
integer | não | Alternativa: cpf_cnpj_transportadora. |
cpf_cnpj_transportadora |
string | não | |
transferencia |
boolean | não | true = transferência (grava S). Padrão: false (N). |
validade_inicial |
datetime | não | Texto 'AAAA-MM-DD HH:MM:SS' (precisa ter 14 dígitos). Formato diferente é ignorado e o campo fica vazio. |
validade_final |
datetime | não | Idem. |
codigo_interno |
string | não | Código da ordem no sistema do integrador. |
observacao |
string | não | |
nfe_origem |
string | não | |
cte_origem |
string | não | |
ordem_item |
array | sim | Obrigatório, com pelo menos 1 item. Cada item: id_veiculo (ou placa), id_produto (só o id), compartimento (inteiro, padrão 0), nivel (inteiro, padrão 0), quantidade (litros, inteiro, padrão 0) e amostras (inteiro, padrão 0). A sequencia é a posição do item na lista (0, 1, …). O servidor calcula os totais por produto (ordem_produto) a partir dos itens. |
ordem_lacre |
array | não | Opcional: [{tipo (texto), numero (inteiro maior que 0; aceita 1001 ou "1001")}]. Lacre repetido na lista é recusado (400). |
ordem_amostra |
array | não | Opcional, mesmo formato de ordem_lacre. O par (tipo, numero) da amostra não pode se repetir na lista nem em outra ordem (400). |
laudo_produto |
array | não | Opcional: [{id_produto, id_laudo_produto}]. Vincula o laudo ao produto da ordem; id_laudo_produto = 0 remove. Produto que não está na ordem dá erro. |
curl -s -X POST "$BASE/v1/terceiro/vitreum/ordemCarregamento?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj_cliente": "00.000.000/0001-00", "cpf_motorista": "000.000.000-00", "placa1": "ABC1D23", "placa2": "ABC1D24", "cpf_cnpj_transportadora": "00.000.000/0002-00", "transferencia": false, "validade_inicial": "2026-11-12 00:00:00", "validade_final": "2026-11-13 23:59:59", "codigo_interno": "OC-0001", "observacao": "", "ordem_item": [{"placa": "ABC1D24", "id_produto": 10, "compartimento": 1, "nivel": 0, "quantidade": 10000, "amostras": 0}, {"placa": "ABC1D24", "id_produto": 10, "compartimento": 2, "nivel": 0, "quantidade": 15000, "amostras": 0}], "ordem_lacre": [{"tipo": "SUPERIOR", "numero": "1001"}], "ordem_amostra": [{"tipo": "TESTEMUNHA", "numero": "5001"}], "laudo_produto": [{"id_produto": 10, "id_laudo_produto": 77}]}'
Resposta:
{
"status": "ok",
"id_ordem": 123456
}
Erros específicos: 400 — {body: 'O conteúdo não é um JSON válido'}.; 403 — cliente diferente do cliente do terceiro.; 400 — {id_ordem: 'Ordem de carregamento precisa dos itens'}: ordem_item ausente.; 400 — {id_ordem: 'Nenhum item encontrado'}: ordem_item vazio.; 400 — erros de validação da ordem ou dos itens (cliente, veículo, motorista, produto…).; 400 — {laudo_produto: mensagem}: produto não está na ordem, laudo inválido etc.; 400 — {registro: 'Falha por duplicidade: ordem_lacre[i] (ou ordem_amostra[i]): …'}: item repetido na lista ou amostra já usada em outra ordem; {ordem_lacre[i].numero: Inválido} para número vazio ou não numérico. Nada é gravado..
/v1/terceiro/vitreum/ordemCarregamentoMuda a situação (acao) ou vincula/remove laudos por produto
FILA, OPERACAO e FINALIZAR não verificam se a ordem é de carregamento (só CANCELAR verifica o tipo). FILA e OPERACAO fora da situação esperada respondem 200 com situacao='ORDEM NÃO ENCONTRADA', e não um erro.
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
FILA |
Põe a ordem na fila. Só age se a ordem estiver em P (pendente) e for do app; caso contrário, responde 200 com situacao='ORDEM NÃO ENCONTRADA'. Sucesso: situacao='ORDEM INCLUÍDA NA FILA' + id_ordem, tipo, id_cliente, cliente, id_veiculo, veiculo, id_motorista, motorista, produtos. Pendência de documento ou de agendamento: 400 com {"errors":{"exception": …}} e, quando houver, situacao='ORDEM C/ PENDÊNCIAS' + pendencias[]. |
OPERACAO |
Passa a ordem para O (operação), com data_hora_operacao = agora. Só age se a ordem estiver em A (aguardando); caso contrário, responde 200 com situacao='ORDEM NÃO ENCONTRADA'. No carregamento, preenche a temperatura e a densidade padrão do cliente para o produto (por produto ou por item, conforme o parâmetro ORDEM_PRODUTO_PREENCHER_TEMP_DENS) e recalcula os volumes. Sucesso: situacao='ORDEM INCLUÍDA NA OPERAÇÃO' + os mesmos campos da ação FILA. |
FINALIZAR |
Finaliza a ordem (ordens de equipamentos Dayler são processadas antes). Pode ser repetida: ordem já finalizada responde situacao='ORDEM FINALIZADA'. Se o app exige conferência (parâmetro OPERACAO_CARREGAMENTO_CONFERENCIA ou OPERACAO_DESCARREGAMENTO_CONFERENCIA = S) e a ordem não foi conferida: 400 'Falha ao finalizar: Conferência não realizada'. Outras falhas (ex. bloqueio de temperatura): 400 com {"errors":{"ordem": …}} e situacao='ORDEM NÃO FINALIZADA'. Esta ação não exige uma situação de origem específica. |
CANCELAR |
Igual ao DELETE: cancela apenas ordem em P (pendente) e do tipo do endpoint. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
acao |
string | não | FILA, OPERACAO, FINALIZAR ou CANCELAR. Obrigatória, exceto quando o corpo traz laudo_produto. |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
laudo_produto |
array | não | [{id_produto, id_laudo_produto}]: vincula o laudo ao produto da ordem; id_laudo_produto = 0 remove. Quando presente, o PUT faz só isso e ignora acao. |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/ordemCarregamento?$AUTH&id_ordem=" \
-H 'Content-Type: application/json' \
-d '{"laudo_produto": [{"id_produto": 10, "id_laudo_produto": 77}]}'
Resposta:
{
"status": "ok",
"situacao": "ORDEM INCLUÍDA NA FILA",
"id_ordem": 123456,
"tipo": "C",
"id_cliente": 101,
"cliente": "CLIENTE EXEMPLO",
"id_veiculo": 3001,
"veiculo": "ABC1D23",
"id_motorista": 2001,
"motorista": "MOTORISTA 01",
"produtos": "DIESEL S10"
}
Erros específicos: 400 — {acao: Inválido}: acao ausente ou diferente de FILA, OPERACAO, FINALIZAR e CANCELAR (quando o corpo não traz laudo_produto).; 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 403 — ordem fora do escopo do acesso.; 400 — erros de validação ou de situação, conforme a ação.; 200 — com laudo_produto no corpo: {status: ok}, sem outros campos. Em caso de erro, 400 {laudo_produto: mensagem}..
/v1/terceiro/vitreum/ordemCarregamentoCancela a ordem (só em P, pendente)
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/ordemCarregamento?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"id_ordem": 123456,
"situacao": "C"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 403 — ordem fora do escopo do acesso.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe ou é de outro tipo (D no endpoint de carregamento e vice-versa).; 400 — {registro: 'Falha ao cancelar: a ordem só pode ser cancelada enquanto estiver PENDENTE'}.; 400 — {registro: 'Falha ao cancelar'}..
Ordem de descarregamento: criar, consultar, mudar situação, vincular laudo e cancelar. Mesma regra de ordemDescarregamento. POST cria a ordem de descarregamento (um produto, volumes da nota de remessa e laudo opcional). Ao contrário do carregamento, não tem itens nem compartimentos: o POST ignora ordem_item, ordem_lacre, ordem_amostra e transferencia (lacres e amostras vão por ordemLacre e ordemAmostra). PUT muda a situação por ?acao= ou, com ?id_laudo_produto=, só vincula ou remove o laudo. DELETE cancela apenas ordem em P (pendente).
/v1/terceiro/vitreum/ordemDescarregamentoConsulta a ordem de descarregamento
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/ordemDescarregamento?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"id_ordem": 123457,
"tipo": "D",
"id_cliente": 101,
"id_motorista": 2001,
"id_fornecedor": 0,
"id_veiculo1": 3001,
"id_veiculo2": 0,
"id_veiculo3": 0,
"id_veiculo4": 0,
"id_transportadora": 401,
"id_operador": 0,
"validade_inicial": "2026-11-12 00:00:00",
"validade_final": "2026-11-13 23:59:59",
"situacao": "P",
"data_hora_pendente": "2026-11-12 08:00:00",
"id_produto": 10,
"volume_ambiente_remessa": 30000,
"volume_a_20_remessa": 29850,
"densidade_a_20_remessa": 0.835,
"volume_ambiente": 30000,
"volume_a_20": 0,
"codigo_interno": "OC-0002",
"nfe_origem": "",
"cte_origem": "",
"id_laudo_produto": 0,
"numero": 98766,
"ordem_senha": [],
"ordem_situacao": [
{
"id_ordem_situacao": 2,
"situacao": "P",
"data_hora": "2026-11-12 08:00:00",
"id_tx_pessoa": 0
}
],
"...": "demais campos de resposta_campos"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe ou não é de descarregamento.; 403 — ordem fora do escopo do acesso..
/v1/terceiro/vitreum/ordemDescarregamentoCria ordem de descarregamento
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_cliente |
integer | não | Alternativa: cpf_cnpj_cliente. Se o terceiro é de um cliente, a ordem vai sempre para esse cliente (informar outro dá 403). |
cpf_cnpj_cliente |
string | não | |
id_motorista |
integer | não | Alternativa: cpf_motorista. |
cpf_motorista |
string | não | |
id_fornecedor |
integer | não | Alternativa: cpf_cnpj_fornecedor. |
cpf_cnpj_fornecedor |
string | não | |
id_veiculo1 |
integer | não | Alternativa: placa1. |
placa1 |
string | não | |
id_veiculo2 |
integer | não | Alternativa: placa2. |
placa2 |
string | não | |
id_veiculo3 |
integer | não | Alternativa: placa3. |
placa3 |
string | não | |
id_veiculo4 |
integer | não | Alternativa: placa4. |
placa4 |
string | não | |
id_transportadora |
integer | não | Alternativa: cpf_cnpj_transportadora. |
cpf_cnpj_transportadora |
string | não | |
id_produto |
integer | não | Produto descarregado (só o id; não há alternativa por código). |
validade_inicial |
datetime | não | Texto 'AAAA-MM-DD HH:MM:SS'. |
validade_final |
datetime | não | Texto 'AAAA-MM-DD HH:MM:SS'. |
volume_a_20_remessa |
number | não | Volume a 20 °C da nota de remessa (L). |
volume_ambiente_remessa |
number | não | Volume ambiente da remessa (L). Também preenche volume_ambiente. |
densidade_a_20_remessa |
number | não | |
codigo_interno |
string | não | |
observacao |
string | não | |
nfe_origem |
string | não | |
cte_origem |
string | não | |
id_laudo_produto |
integer | não | Laudo a vincular à ordem (> 0). |
curl -s -X POST "$BASE/v1/terceiro/vitreum/ordemDescarregamento?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj_cliente": "00.000.000/0001-00", "cpf_motorista": "000.000.000-00", "placa1": "ABC1D23", "id_produto": 10, "volume_ambiente_remessa": 30000, "volume_a_20_remessa": 29850, "densidade_a_20_remessa": 0.835, "codigo_interno": "OC-0002", "nfe_origem": "00000000000000000000000000000000000000000000", "id_laudo_produto": 77}'
Resposta:
{
"status": "ok",
"id_ordem": 123457
}
Erros específicos: 400 — {body: 'O conteúdo não é um JSON válido'}.; 403 — cliente diferente do cliente do terceiro.; 400 — erros de validação da ordem.; 400 — {id_laudo_produto: mensagem}: laudo não encontrado ou incompatível. A ordem não é gravada.; 500 — erro inesperado..
/v1/terceiro/vitreum/ordemDescarregamentoMuda a situação (acao) ou vincula/remove o laudo
O PUT do descarregamento não lê o corpo: o laudo vai na query (no carregamento, vai no corpo). FILA, OPERACAO e FINALIZAR não verificam o tipo da ordem.
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
FILA |
Põe a ordem na fila. Só age se a ordem estiver em P (pendente) e for do app; caso contrário, responde 200 com situacao='ORDEM NÃO ENCONTRADA'. Sucesso: situacao='ORDEM INCLUÍDA NA FILA' + id_ordem, tipo, id_cliente, cliente, id_veiculo, veiculo, id_motorista, motorista, produtos. Pendência de documento ou de agendamento: 400 com {"errors":{"exception": …}} e, quando houver, situacao='ORDEM C/ PENDÊNCIAS' + pendencias[]. |
OPERACAO |
Passa a ordem para O (operação), com data_hora_operacao = agora. Só age se a ordem estiver em A (aguardando); caso contrário, responde 200 com situacao='ORDEM NÃO ENCONTRADA'. No carregamento, preenche a temperatura e a densidade padrão do cliente para o produto (por produto ou por item, conforme o parâmetro ORDEM_PRODUTO_PREENCHER_TEMP_DENS) e recalcula os volumes. Sucesso: situacao='ORDEM INCLUÍDA NA OPERAÇÃO' + os mesmos campos da ação FILA. |
FINALIZAR |
Finaliza a ordem (ordens de equipamentos Dayler são processadas antes). Pode ser repetida: ordem já finalizada responde situacao='ORDEM FINALIZADA'. Se o app exige conferência (parâmetro OPERACAO_CARREGAMENTO_CONFERENCIA ou OPERACAO_DESCARREGAMENTO_CONFERENCIA = S) e a ordem não foi conferida: 400 'Falha ao finalizar: Conferência não realizada'. Outras falhas (ex. bloqueio de temperatura): 400 com {"errors":{"ordem": …}} e situacao='ORDEM NÃO FINALIZADA'. Esta ação não exige uma situação de origem específica. |
CANCELAR |
Igual ao DELETE: cancela apenas ordem em P (pendente) e do tipo do endpoint. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
acao |
string | não | FILA, OPERACAO, FINALIZAR ou CANCELAR. Obrigatória, exceto quando se informa id_laudo_produto. |
id_laudo_produto |
integer | não | Se informado (>= 0), o PUT faz só isso e ignora acao: > 0 vincula o laudo à ordem; 0 remove o laudo. |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/ordemDescarregamento?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"situacao": "ORDEM INCLUÍDA NA OPERAÇÃO",
"id_ordem": 123457,
"tipo": "D",
"id_cliente": 101,
"cliente": "CLIENTE EXEMPLO",
"id_veiculo": 3001,
"veiculo": "ABC1D23",
"id_motorista": 2001,
"motorista": "MOTORISTA 01",
"produtos": "ETANOL"
}
Erros específicos: 400 — {acao: Inválido}: acao ausente ou diferente de FILA, OPERACAO, FINALIZAR e CANCELAR (quando não se informa id_laudo_produto).; 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 403 — ordem fora do escopo do acesso.; 400 — erros de validação ou de situação, conforme a ação.; 200 — com id_laudo_produto: {status: ok}. Em caso de erro, 400 {id_laudo_produto: mensagem}..
/v1/terceiro/vitreum/ordemDescarregamentoCancela a ordem (só em P, pendente)
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/ordemDescarregamento?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"id_ordem": 123457,
"situacao": "C"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 403 — ordem fora do escopo do acesso.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe ou é de outro tipo (D no endpoint de carregamento e vice-versa).; 400 — {registro: 'Falha ao cancelar: a ordem só pode ser cancelada enquanto estiver PENDENTE'}.; 400 — {registro: 'Falha ao cancelar'}..
Lacres da ordem. Mesma regra de ordemLacre. Consulta e mantém os lacres de uma ordem (carregamento ou descarregamento). POST, PUT e DELETE só funcionam com a ordem em P (pendente) e dentro do escopo do acesso. POST acrescenta, PUT substitui a lista inteira e DELETE remove um lacre ou todos. O mesmo lacre não pode se repetir na mesma ordem (pode existir em outras).
/v1/terceiro/vitreum/ordemLacreLista os lacres da ordem
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/ordemLacre?$AUTH&id_ordem="
Resposta:
{
"data": [
{
"tipo": "SUPERIOR",
"numero": 1001
}
],
"status": "ok"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe.; 403 — ordem fora do escopo do acesso..
/v1/terceiro/vitreum/ordemLacreSubstitui todos os lacres da ordem pela lista enviada
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_ordem |
integer | sim | Id da ordem. Não aceita o número nem o codigo_interno. |
Corpo (JSON lista)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipo |
string | sim | Tipo do lacre (texto livre, ex. SUPERIOR). |
numero |
integer | sim | Número (inteiro maior que 0). Aceita número ou texto só com dígitos (1001 ou "1001"). |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/ordemLacre?$AUTH&id_ordem=" \
-H 'Content-Type: application/json' \
-d '[{"tipo": "SUPERIOR", "numero": 1001}, {"tipo": "INFERIOR", "numero": 1002}]'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {id_ordem: Inválido}: id_ordem ausente ou inválido.; 400 — {body: …}: corpo vazio ou que não é uma lista JSON.; 400 — {item[i]: Inválido}, {item[i].tipo: Inválido} ou {item[i].numero: Inválido}.; 400 — {registro: 'Falha ao localizar'}: a ordem não existe.; 403 — ordem fora do escopo do acesso.; 400 — {registro: 'Falha ao alterar: a ordem só aceita alteração enquanto estiver PENDENTE'}.; 400 — {registro: 'Falha por duplicidade: item[i]: …'}: a lista tem lacre repetido(a). Nada é gravado (a lista atual fica como estava)..
Consulta de produto. Mesma regra de produto. Devolve o cadastro completo de um produto pelo id (não aceita código nem nome). Produto exclusivo de um cliente (id_cliente > 0) só é visto por terceiros com acesso a esse cliente.
/v1/terceiro/vitreum/produtoConsulta um produto
Atenção: alguns campos têm grafia diferente da esperada e devem ser lidos exatamente assim: 'undiade', 'id_produto_composicacaoN' e 'perc_composicacaoN'.
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_produto |
integer | sim | Id do produto |
curl -s -X GET "$BASE/v1/terceiro/vitreum/produto?$AUTH&id_produto="
Resposta:
{
"status": "ok",
"id_produto": 5,
"grupo": "ETANOL",
"nome": "ETANOL HIDRATADO",
"apelido": "EHC",
"simp": "810102001",
"densidade_a_20": 0.8093,
"densidade_a_20_min": 0.8076,
"densidade_a_20_max": 0.811,
"ordem_carregamento": "S",
"ordem_descarregamento": "S",
"inpm_min": 92.5,
"inpm_max": 95.4,
"tipo": "C",
"controla_quantidade": "S",
"controla_temp_dens": "S",
"pode_transferencia": "S",
"codigo_erp": "P005",
"gerar_simp": "S",
"aditivado": "N",
"apelido_padrao": "EHC",
"id_cliente": 0,
"pode_venda": "S",
"marcador": "N",
"cod_aditivo": "",
"perc_aditivo": 0,
"cod_marcador": "",
"perc_marcador": 0,
"classificacao": "",
"undiade": "L",
"para_litro": 1,
"para_kg": 0.8093,
"grade": "N",
"pedido": "S",
"contrato": "S",
"lastro": "N",
"extipi": "",
"cest": "",
"genero": "",
"id_produto_composicacao1": 0,
"perc_composicacao1": 0,
"id_produto_composicacao2": 0,
"perc_composicacao2": 0,
"id_produto_composicacao3": 0,
"perc_composicacao3": 0,
"id_produto_composicacao4": 0,
"perc_composicacao4": 0,
"id_produto_composicacao5": 0,
"perc_composicacao5": 0,
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_produto":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
Cadastro de transportadora. Mesma regra de transportadora. Cadastro de transportadora (dados da pessoa + cadastro de transportadora). Localiza a transportadora por id_transportadora ou, se id_transportadora não vier, por cpf_cnpj. Gravação parcial: só os campos presentes no JSON são alterados. Campos de texto precisam vir como texto JSON (entre aspas). DELETE apenas desativa (ativo = N). O endpoint não restringe pelo escopo do acesso (cliente ou filial): vale só a permissão de acesso ao endpoint.
/v1/terceiro/vitreum/transportadoraConsulta uma transportadora
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_transportadora |
integer | sim | Id da transportadora. (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/transportadora?$AUTH&id_transportadora="
Resposta:
{
"status": "ok",
"id_transportadora": 123,
"codigo_erp": "T001",
"antt": "12345678",
"id_tx_pessoa": 321,
"cpf_cnpj": "00000000000100",
"rg_inscricao": "ISENTO",
"nome_razao_social": "EMPRESA EXEMPLO LTDA",
"identificacao": "EXEMPLO",
"nascimento_fundacao": "2010-01-01",
"telefone": "4133334444",
"celular": "41999990000",
"email": "contato@exemplo.com.br",
"cep": "80000000",
"logradouro": "RUA EXEMPLO",
"numero": 100,
"complemento": "",
"bairro": "CENTRO",
"localidade": "CURITIBA",
"estado": "PR",
"crt": "3",
"ddi_telefone": 55,
"ddi_celular": 55,
"inscricao_municipal": "",
"pais": "BRASIL",
"suframa": "",
"tipo": "J",
"indiedest": "1",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_transportadora":"Inválido"}}: sem id/documento válido.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/transportadoraCria uma transportadora
Sempre cria uma nova transportadora; não altera uma existente. Se já houver uma pessoa com o cpf_cnpj, ela é reaproveitada. Se algo falhar, nada é gravado.
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | sim | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
antt |
string | não | Registro ANTT (RNTRC) |
curl -s -X POST "$BASE/v1/terceiro/vitreum/transportadora?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cpf_cnpj": "00.000.000/0001-00", "nome_razao_social": "EMPRESA EXEMPLO LTDA", "identificacao": "EXEMPLO", "email": "contato@exemplo.com.br", "cep": "80000-000", "logradouro": "RUA EXEMPLO", "numero": 100, "bairro": "CENTRO", "localidade": "CURITIBA", "estado": "PR", "codigo_erp": "C001", "antt": "12345678"}'
Resposta:
{
"status": "ok",
"id_transportadora": 123
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar. Se a pessoa já é transportadora: "Dados já cadastrados (id)"..
/v1/terceiro/vitreum/transportadoraAltera uma transportadora
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_transportadora |
integer | sim | Id da transportadora. (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpf_cnpj |
string | não | CPF ou CNPJ (com ou sem máscara). No POST, se já existir uma pessoa com esse documento no app, ela é reaproveitada e atualizada com os campos enviados. |
rg_inscricao |
string | não | RG ou inscrição estadual |
nome_razao_social |
string | não | Nome ou razão social |
identificacao |
string | não | Apelido / nome fantasia |
nascimento_fundacao |
string | não | Data de nascimento ou fundação (AAAA-MM-DD). |
telefone |
string | não | Telefone |
celular |
string | não | Celular |
email |
string | não | |
cep |
string | não | CEP |
logradouro |
string | não | Logradouro |
numero |
integer | não | Número do endereço (inteiro) |
complemento |
string | não | Complemento |
bairro |
string | não | Bairro |
localidade |
string | não | Município |
estado |
string | não | UF (2 letras) |
ddi_telefone |
integer | não | DDI do telefone |
ddi_celular |
integer | não | DDI do celular |
inscricao_municipal |
string | não | Inscrição municipal |
pais |
string | não | País |
suframa |
string | não | Inscrição SUFRAMA |
indiedest |
string | não | Indicador de IE do destinatário (NF-e: 1, 2 ou 9) |
codigo_erp |
string | não | Código no ERP |
antt |
string | não | Registro ANTT (RNTRC) |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/transportadora?$AUTH&id_transportadora=" \
-H 'Content-Type: application/json' \
-d '{"email": "novo@exemplo.com.br", "telefone": "4133335555"}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_transportadora":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/transportadoraDesativa uma transportadora
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_transportadora |
integer | sim | Id da transportadora. (Ou cpf_cnpj (CPF/CNPJ com ou sem máscara) na query.) |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/transportadora?$AUTH&id_transportadora="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_transportadora":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo..
Consulta de filial (estabelecimento). Mesma regra de txEstabelecimento. Devolve a filial e os dados cadastrais da pessoa jurídica dela, por id_tx_estabelecimento ou CNPJ. Qualquer filial do app pode ser consultada, exceto por acesso com perfil filial, que só vê a própria.
/v1/terceiro/vitreum/txEstabelecimentoConsulta uma filial
Para acesso com perfil filial, o id_tx_estabelecimento da query é substituído pelo da própria filial (só vê a própria).
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_estabelecimento |
integer | sim | Id da filial (Ou cpf_cnpj.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/txEstabelecimento?$AUTH&id_tx_estabelecimento="
Resposta:
{
"status": "ok",
"id_tx_estabelecimento": 3,
"nome": "FILIAL EXEMPLO",
"id_tx_pessoa": 321,
"cpf_cnpj": "00000000000100",
"rg_inscricao": "ISENTO",
"nome_razao_social": "EMPRESA EXEMPLO LTDA",
"identificacao": "EXEMPLO",
"nascimento_fundacao": "2010-01-01",
"telefone": "4133334444",
"celular": "41999990000",
"email": "contato@exemplo.com.br",
"cep": "80000000",
"logradouro": "RUA EXEMPLO",
"numero": 100,
"complemento": "",
"bairro": "CENTRO",
"localidade": "CURITIBA",
"estado": "PR",
"crt": "3",
"ddi_telefone": 55,
"ddi_celular": 55,
"inscricao_municipal": "",
"pais": "BRASIL",
"suframa": "",
"tipo": "J",
"indiedest": "1",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_tx_estabelecimento":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
Observações livres ligadas a qualquer registro. Mesma regra de txObservacao. Grava e consulta observações (texto) ligadas a qualquer registro do sistema, identificado por tabela + id. GET por id_tx_observacao devolve uma; por tabela + id devolve a lista. DELETE desativa (ativo = N). A API não verifica se a tabela e o id existem e não restringe pelo escopo do acesso (só pelo app).
/v1/terceiro/vitreum/txObservacaoConsulta uma observação ou as de um registro
Por id_tx_observacao a resposta é um objeto plano (sem data[]): {status, id_tx_observacao, tabela, id, observacao, data_hora, ativo}.
Perfis: App
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_observacao |
integer | não | Id da observação (tem prioridade). |
tabela |
string | não | Tabela (usar junto com id quando não houver id_tx_observacao). |
id |
integer | não | Id do registro na tabela. |
curl -s -X GET "$BASE/v1/terceiro/vitreum/txObservacao?$AUTH"
Resposta:
{
"status": "ok",
"data": [
{
"id_tx_observacao": 15,
"observacao": "Cliente pediu conferência",
"data_hora": "2026-11-10 09:30:00",
"ativo": true
}
]
}
Erros específicos: 400 — {"errors":{"params":"Você deve passar o id_tx_observacao ou o conjunto (tabela, id)"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/txObservacaoCria uma observação
Perfis: App
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tabela |
string | sim | Nome da tabela do sistema a que a observação se refere (ex.: ordem). |
id |
integer | sim | Id do registro nessa tabela. |
observacao |
string | sim | Texto |
ativo |
boolean | não | true/false |
curl -s -X POST "$BASE/v1/terceiro/vitreum/txObservacao?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"tabela": "ordem", "id": 9001, "observacao": "Cliente pediu conferência"}'
Resposta:
{
"status": "ok",
"id_tx_observacao": 15
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/txObservacaoAltera uma observação (parcial)
Perfis: App
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_observacao |
integer | sim | Id da observação |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tabela |
string | não | Nome da tabela do sistema a que a observação se refere (ex.: ordem). |
id |
integer | não | Id do registro nessa tabela. |
observacao |
string | não | Texto |
ativo |
boolean | não | true/false |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/txObservacao?$AUTH&id_tx_observacao=" \
-H 'Content-Type: application/json' \
-d '{"observacao": "Texto corrigido"}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_tx_observacao":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/txObservacaoDesativa uma observação
Perfis: App
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_observacao |
integer | sim | Id da observação |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/txObservacao?$AUTH&id_tx_observacao="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_tx_observacao":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo..
Consulta de pessoa (cadastro geral). Mesma regra de txPessoa. Devolve os dados cadastrais de uma pessoa (física ou jurídica) do app, por id_tx_pessoa ou CPF/CNPJ. Pessoa ligada a um cliente só é vista por quem tem acesso a esse cliente.
/v1/terceiro/vitreum/txPessoaConsulta uma pessoa
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_pessoa |
integer | sim | Id da pessoa (Ou cpf_cnpj.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/txPessoa?$AUTH&id_tx_pessoa="
Resposta:
{
"status": "ok",
"id_tx_pessoa": 321,
"cpf_cnpj": "00000000000100",
"rg_inscricao": "ISENTO",
"nome_razao_social": "EMPRESA EXEMPLO LTDA",
"identificacao": "EXEMPLO",
"nascimento_fundacao": "2010-01-01",
"telefone": "4133334444",
"celular": "41999990000",
"email": "contato@exemplo.com.br",
"cep": "80000000",
"logradouro": "RUA EXEMPLO",
"numero": 100,
"complemento": "",
"bairro": "CENTRO",
"localidade": "CURITIBA",
"estado": "PR",
"crt": "3",
"ddi_telefone": 55,
"ddi_celular": 55,
"inscricao_municipal": "",
"pais": "BRASIL",
"suframa": "",
"tipo": "J",
"indiedest": "1",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_tx_pessoa":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 403 — {"errors":{"acesso":"Negado"}}: fora do escopo do acesso..
Cadastro de veículo (com compartimentos e licenças ambientais). Mesma regra de veiculo. Cadastro de veículos e carretas. Localiza o veículo por id_veiculo ou, se id_veiculo não vier, por placa. POST sempre cria (placa ou RENAVAM já cadastrados dão 'Dados já cadastrados'). PUT é parcial (só os campos enviados). DELETE desativa (ativo = N). O endpoint não restringe pelo escopo do acesso (cliente ou filial): vale só a permissão de acesso ao endpoint.
/v1/terceiro/vitreum/veiculoConsulta um veículo
'compartimentos' só aparece se o veículo tiver compartimentos; cada compartimento lista só os níveis com cap_l > 0.
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_veiculo |
integer | sim | Id do veículo (Ou placa.) |
curl -s -X GET "$BASE/v1/terceiro/vitreum/veiculo?$AUTH&id_veiculo="
Resposta:
{
"status": "ok",
"id_veiculo": 800,
"tipo": "CARRETA",
"placa": "ABC1D23",
"renavam": "00000000000",
"ano_fabricacao": "2020",
"ano_modelo": "2021",
"pais": "BRASIL",
"estado": "PR",
"localidade": "CURITIBA",
"capacidade_litros": 45000,
"compartimentos": [
{
"compartimento": 1,
"lacres": 2,
"niveis": [
{
"nivel": 1,
"cap_l": 15000,
"ev_mm": 120,
"ec_mm": 300,
"et_mm": 1500
}
]
}
],
"licencas_ambientais": [
{
"estado": "PR",
"validade": "2027-06-30"
}
],
"validade_certificado": "2027-01-01",
"validade_vistoria": "2027-05-10",
"validade_civ": "2027-01-01",
"validade_cipp": "2027-01-01",
"validade_cert_ibama": "2027-01-01",
"validade_aut_ibama": "2027-01-01",
"validade_tacografo": "2027-01-01",
"cor": "BRANCA",
"vistoria_carregamento": "N",
"vistoria_descarregamento": "N",
"codigo_erp": "V001",
"ativo": true
}
Erros específicos: 400 — {"errors":{"id_veiculo":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app..
/v1/terceiro/vitreum/veiculoCria um veículo
Perfis: App, Rede, Filial, Cliente, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
placa |
string | sim | Placa (ex.: ABC1D23) |
tipo |
string | não | CAVALO, CARRETA, TRUCK, ESPECIAL ou OUTRO. |
renavam |
string | não | RENAVAM |
ano_fabricacao |
string | não | Ano de fabricação (texto). |
ano_modelo |
string | não | Ano do modelo (texto). |
pais |
string | não | País |
estado |
string | não | UF |
localidade |
string | não | Município |
capacidade_litros |
integer | não | Capacidade total em litros |
quant_compartimentos |
integer | não | Quantidade de compartimentos (recalculada a partir de 'compartimentos' quando esse campo vier). |
validade_certificado |
date | não | AAAA-MM-DD |
validade_vistoria |
date | não | AAAA-MM-DD |
validade_civ |
date | não | AAAA-MM-DD |
validade_cipp |
date | não | AAAA-MM-DD |
validade_cert_ibama |
date | não | AAAA-MM-DD |
validade_aut_ibama |
date | não | AAAA-MM-DD |
validade_tacografo |
date | não | AAAA-MM-DD |
cor |
string | não | Cor |
vistoria_carregamento |
string | não | S ou N: exige vistoria no carregamento. |
vistoria_descarregamento |
string | não | S ou N: exige vistoria no descarregamento. |
codigo_erp |
string | não | Código no ERP |
compartimentos |
array | não | [{compartimento (1–15; padrão: posição na lista + 1), lacres (inteiro), niveis:[{nivel (1–10; padrão: posição na lista + 1), cap_l, ev_mm, ec_mm, et_mm (só nível 1)}]}]. Nível 1 com cap_l = 0 apaga o compartimento e renumera os demais (capacidade e quantidade de compartimentos são recalculadas). |
licencas_ambientais |
array | não | [{estado (UF), validade (AAAA-MM-DD)}]: marca a licença ambiental como ativa na UF. Não é possível desmarcar por esta API. |
curl -s -X POST "$BASE/v1/terceiro/vitreum/veiculo?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"placa": "ABC1D23", "tipo": "CARRETA", "renavam": "00000000000", "ano_fabricacao": "2020", "ano_modelo": "2021", "estado": "PR", "localidade": "CURITIBA", "compartimentos": [{"compartimento": 1, "lacres": 2, "niveis": [{"nivel": 1, "cap_l": 15000, "ev_mm": 120, "ec_mm": 300, "et_mm": 1500}]}, {"compartimento": 2, "lacres": 2, "niveis": [{"nivel": 1, "cap_l": 30000}]}], "licencas_ambientais": [{"estado": "PR", "validade": "2027-06-30"}]}'
Resposta:
{
"status": "ok",
"id_veiculo": 800
}
Erros específicos: 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (placa ou RENAVAM já cadastrados, placa inválida…).; 500 — compartimento fora da faixa 1–15..
/v1/terceiro/vitreum/veiculoAltera um veículo (parcial)
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_veiculo |
integer | sim | Id do veículo (Ou placa.) |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
placa |
string | não | Placa (ex.: ABC1D23) |
tipo |
string | não | CAVALO, CARRETA, TRUCK, ESPECIAL ou OUTRO. |
renavam |
string | não | RENAVAM |
ano_fabricacao |
string | não | Ano de fabricação (texto). |
ano_modelo |
string | não | Ano do modelo (texto). |
pais |
string | não | País |
estado |
string | não | UF |
localidade |
string | não | Município |
capacidade_litros |
integer | não | Capacidade total em litros |
quant_compartimentos |
integer | não | Quantidade de compartimentos (recalculada a partir de 'compartimentos' quando esse campo vier). |
validade_certificado |
date | não | AAAA-MM-DD |
validade_vistoria |
date | não | AAAA-MM-DD |
validade_civ |
date | não | AAAA-MM-DD |
validade_cipp |
date | não | AAAA-MM-DD |
validade_cert_ibama |
date | não | AAAA-MM-DD |
validade_aut_ibama |
date | não | AAAA-MM-DD |
validade_tacografo |
date | não | AAAA-MM-DD |
cor |
string | não | Cor |
vistoria_carregamento |
string | não | S ou N: exige vistoria no carregamento. |
vistoria_descarregamento |
string | não | S ou N: exige vistoria no descarregamento. |
codigo_erp |
string | não | Código no ERP |
compartimentos |
array | não | [{compartimento (1–15; padrão: posição na lista + 1), lacres (inteiro), niveis:[{nivel (1–10; padrão: posição na lista + 1), cap_l, ev_mm, ec_mm, et_mm (só nível 1)}]}]. Nível 1 com cap_l = 0 apaga o compartimento e renumera os demais (capacidade e quantidade de compartimentos são recalculadas). |
licencas_ambientais |
array | não | [{estado (UF), validade (AAAA-MM-DD)}]: marca a licença ambiental como ativa na UF. Não é possível desmarcar por esta API. |
curl -s -X PUT "$BASE/v1/terceiro/vitreum/veiculo?$AUTH&id_veiculo=" \
-H 'Content-Type: application/json' \
-d '{"validade_vistoria": "2027-05-10", "compartimentos": [{"compartimento": 2, "niveis": [{"nivel": 1, "cap_l": 0}]}]}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_veiculo":"Inválido"}}.; 400 — {"errors":{"body":"O conteúdo não é um JSON válido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"exception":""}}: erro de validação ao gravar (ex.: "Dados já cadastrados (id)")..
/v1/terceiro/vitreum/veiculoDesativa um veículo
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_veiculo |
integer | sim | Id do veículo (Ou placa.) |
curl -s -X DELETE "$BASE/v1/terceiro/vitreum/veiculo?$AUTH&id_veiculo="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_veiculo":"Inválido"}}.; 400 — {"errors":{"registro":"Falha ao localizar"}}: o id não existe no app.; 400 — {"errors":{"registro":"Falha ao desativar"}}: por exemplo, registro já inativo..