Usadas pelo programa Supervisório e pelos equipamentos da base: ordens do dia, senhas, eventos, tanques, peso de balança, cancela, câmera, totem, Dayler, Danload e impressão.
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 |
|---|---|---|
supervisorio |
GET, POST | Integração do Supervisório (automação de plataformas de carregamento e descarga, tanques e balanças) |
danload6000 |
GET, PUT | Integração antiga com o controlador de carregamento Danload 6000 (obsoleta) |
zlx9000 |
GET | Configuração dos controladores Zylix ZLX9000 |
dayler |
GET, PUT | Integração com o sistema de automação Dayler (troca de ordens e tickets de carregamento) |
totem |
GET, POST | Totem de autoatendimento do motorista: confere CPF/ordem e coloca a ordem na fila |
balanca |
PUT | Balança rodoviária: validação de ordem de descarga |
cancela |
PUT | Cancela de entrada/saída: leitura do QR Code da ordem decide se abre |
camera |
POST | Câmera de leitura de placas (LPR): registra cada leitura com foto |
impressoraJob |
GET, PUT | Fila de impressão das impressoras locais (tickets de ordem etc.) |
status |
GET | Teste de conexão e credencial do terceiro |
Integração do Supervisório (automação de plataformas de carregamento e descarga, tanques e balanças). Endpoint principal do programa Supervisório instalado no terminal. GET baixa a configuração dos equipamentos e a lista de ordens a operar; POST envia o que aconteceu no pátio (resultado das ordens, senhas, eventos, medições de tanque, pesagens). ORDEM, SENHA e TANQUE são guardados e processados depois pelo PetroW (encerrantes, temperatura e densidade, senhas dos compartimentos, medições de tanque): o efeito não é imediato. EVENTO e PESO são gravados na hora. Tipos de terceiro aceitos: rede, estabelecimento e pessoa (cliente não).
/v1/terceiro/supervisorioConfiguração dos equipamentos (padrão) ou ordens a operar (acao=ORDEM)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
ORDEM |
Ordens dos clientes do app (respeitando o escopo do acesso): tipo C ou D em P (pendente), A (aguardando), O (operação) ou V (vistoria), ou que passaram para F (finalizada) ou C (cancelada) nas últimas 24 h; pendentes há pelo menos 1 minuto e criadas nos últimos 7 dias. Inclui também as ordens de ajuste com automação = S em A, O, P ou V. Uma linha por item (compartimento/sequência) da ordem; ordem sem item vem numa linha só. Devolve também 'cancela_ordens_outros_sistemas' (parâmetro do app SUPERVISORIO_CANCELA_ORDENS_INICIADAS_OUTROS_SISTEMAS = S) e 'situacao' com a contagem de ordens do dia (pendente, aguardando, operacao, finalizada e cancelada hoje). |
CONFIG (padrão) |
Configuração para o Supervisório: 'operador' (lista de operadores ativos) e 'equipamento', com uma lista por tipo: danload6000, zlx9000, zlxsgt, metroval, multiload, dayler, tanque, veeder_root, motherwell_concentrador, motherwell_radar, joyo_concentrador, joyo_radar, balanca, automacao, impressora, cancela, camera, letreiro. Cada lista traz os equipamentos ativos do app (filtráveis por grupo). Não restringe pelo escopo do acesso (traz o app inteiro). Inclui as credenciais dos equipamentos configurados. Com acesso de perfil filial (ou rede), cada lista de equipamentos traz só os da filial (ou da rede) do acesso; os operadores são do app e vêm todos. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | ORDEM = lista de ordens; qualquer outro valor ou ausente = configuração (CONFIG). Não diferencia maiúsculas. |
tipo |
string | não | Só acao=ORDEM: C (carregamento), D (descarregamento) ou * (ambos, padrão). |
filtro_senha |
string | não | Só acao=ORDEM: S = só itens SEM senha gerada, C = só COM senha, * = todos (padrão). |
grupo |
string | não | Grupo de automação do equipamento. Omitido ou '*' = todos os ativos do app. Vazio não equivale a todos: filtra os equipamentos sem grupo. |
id_operador |
integer | não | Só na configuração: filtra um operador. Ausente = todos os operadores ativos com alguma senha de equipamento. |
curl -s -X GET "$BASE/v1/terceiro/supervisorio?$AUTH"
Resposta:
{
"status": "ok",
"data": [
{
"id_ordem": 123456,
"tipo": "C",
"modal": "R",
"id_ordem_item": 987654,
"compartimento": 1,
"sequencia": 1,
"nivel": 1,
"id_cliente": 100,
"cliente": "DISTRIBUIDORA A - CIDADE/UF",
"id_veiculo": 200,
"veiculo": "ABC1D23 (TANQUE)",
"placa_veiculo": "ABC1D23",
"id_motorista": 300,
"motorista": "MOTORISTA 01 CIDADE/UF 000.***.***-00 00000000000",
"motorista_nome": "MOTORISTA 01",
"motorista_cpf_cnpj": "00000000000",
"motorista_registro_cnh": "00000000000",
"motorista_categoria_cnh": "E",
"motorista_validade_cnh": "2027-12-31",
"transportadora_nome": "TRANSPORTADORA EXEMPLO",
"transportadora_cpf_cnpj": "00000000000100",
"id_produto": 5,
"produto": "S10A",
"senha": "1234",
"quantidade": 5000,
"situacao": "A",
"medidor_tabela": "metroval",
"medidor_id": 3
}
],
"cancela_ordens_outros_sistemas": false,
"situacao": {
"pendente": 4,
"aguardando": 2,
"operacao": 1,
"finalizada": 10,
"cancelada": 0
}
}
Erros específicos: 401 — falha de autenticação.; 403 — tipo de terceiro não permitido (cliente) ou fora do escopo.; 500 — erro interno ao consultar os dados.; 200 — campos sem valor (nulos) não aparecem no objeto; lista vazia = chave 'data' ausente..
/v1/terceiro/supervisorioEnvio de resultados do pátio por ?acao= (ORDEM padrão, SENHA, EVENTO, TANQUE, PESO)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
ORDEM (padrão) |
Guarda o corpo para processamento posterior (um registro por id_ordem; só regrava se o conteúdo mudou). O processamento gera os encerrantes, o histórico de bateladas, o operador e o preset nos itens e atualiza volume, temperatura e densidade da ordem. Erro id_ordem 'Inválido' se ≤ 0 ou fora do escopo. |
SENHA |
Guarda o corpo para processamento posterior; o processamento (só de envios das últimas 6 h) grava as senhas dos compartimentos. |
EVENTO |
Grava na hora cada item de 'eventos' como evento do app. Corpo inválido dá erro 500. |
TANQUE |
Guarda o corpo para processamento posterior; o processamento (só de envios das últimas 6 h) gera as medições de tanque. |
PESO |
Pesagem de balança: descarta (tipo X) as pesagens anteriores da placa com o mesmo tipo, grava a nova e procura a ordem da placa. Se a ordem está em A (aguardando), a pesagem é do tipo I e a balança tem 'entrar em operação' = S, a ordem passa para O (operação). Se está em O (operação) ou V (vistoria), a pesagem é do tipo F e a balança tem 'finalizar ordem' = S, a ordem é finalizada. Bloqueio por temperatura não desfaz a pesagem: devolve situacao 'ORDEM NÃO FINALIZADA' + {"errors":{"ordem": …}} com o motivo (e registra um evento). |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | ORDEM (padrão), SENHA, EVENTO, TANQUE ou PESO. Outro valor dá erro acao 'Inválida'. |
id_ordem |
integer | não | acao=ORDEM: obrigatório (> 0 e dentro do escopo do acesso). |
id_balanca |
integer | não | acao=PESO: obrigatório (> 0). |
peso |
number | não | acao=PESO: obrigatório (> 0), em kg. |
placa |
string | não | acao=PESO: obrigatório. Placa válida (pontuação e espaços são retirados; letras convertidas para maiúsculas). |
tipo |
string | não | acao=PESO: obrigatório. I = pesagem inicial, F = final, A = balança única de entrada e saída (o PetroW decide: se a última pesagem válida da placa foi I, esta é F; senão, I). |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
(ORDEM) id_ordem |
integer | sim | Precisa ser igual ao id_ordem da query; se for diferente, o envio é ignorado no processamento. |
(ORDEM) id_cliente / id_veiculo / id_motorista |
integer | não | Gravados como encerrantes da ordem. |
(ORDEM) data_hora_inicio / data_hora_fim |
datetime | sim | Início e fim do preset da ordem, 'AAAA-MM-DD HH:MM:SS'. |
(ORDEM) compartimentos[] |
array | sim | Um objeto por compartimento: id_ordem_item, id_operador, identificador, compartimento, sequencia, quantidade_programada, quantidade_carregada, quantidade_pendente, data_hora_inicio, data_hora_parada, identificador_integracao (ex.: METROVAL) e identificador_id (id do medidor), e por produto (b100, s500a, s10a, eh, ea, gasa): _contador_inicial, _contador_final, _temperatura, _densidade (kg/m³ ou g/cm³; > 2 é dividido por 1000). Opcional bateladas[]: batelada (nº), id_operador, data_hora_inicio, data_hora_parada, quantidade_programada/carregada/pendente e por produto _temperatura, _densidade, _vazao, _contador_inicial, _contador_final. |
(SENHA) data[] |
array | sim | Objetos {id_ordem, compartimento, sequencia, senha}: grava a senha do compartimento e marca a ordem com automacao = S (ordem de ajuste pendente passa para operação). |
(EVENTO) eventos[] |
array | sim | Objetos {tabela, id, tipo, evento, data_hora 'AAAA-MM-DD HH:MM:SS'} gravados como eventos do app (todos ou nenhum). |
(TANQUE) data[] |
array | sim | Objetos {id_tanque, ultima_medicao 'AAAA-MM-DD HH:MM:SS', nivel_mm, volume_ambiente, volume_a20, temperatura, densidade}: viram medições do tanque (altura = nivel_mm/10 se o tanque usa arqueação; temperatura e densidade vêm da automação ou da tabela do produto, conforme o cadastro do tanque). |
(PESO) |
- | não | Sem corpo: tudo vai na query. |
curl -s -X POST "$BASE/v1/terceiro/supervisorio?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"id_ordem": 123456, "id_cliente": 100, "id_veiculo": 200, "id_motorista": 300, "data_hora_inicio": "2026-11-12 08:00:00", "data_hora_fim": "2026-11-12 08:25:00", "compartimentos": [{"id_ordem_item": 987654, "id_operador": 10, "identificador": "BRACO 1", "compartimento": 1, "sequencia": 1, "quantidade_programada": 5000, "quantidade_carregada": 5000, "quantidade_pendente": 0, "data_hora_inicio": "2026-11-12 08:02:00", "data_hora_parada": "2026-11-12 08:20:00", "identificador_integracao": "METROVAL", "identificador_id": 3, "s10a_contador_inicial": 1000000, "s10a_contador_final": 1005000, "s10a_temperatura": 24.5, "s10a_densidade": 0.835}]}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_ordem":"Inválido"}}: acao=ORDEM com id_ordem ausente, ≤ 0 ou fora do escopo.; 400 — {"errors":{"acao":"Inválida"}}.; 400 — acao=PESO: id_balanca, peso, placa ou tipo 'Inválido'.; 400 — acao=PESO: {"errors":{"ordem": …}} traz o motivo do bloqueio de temperatura.; 500 — acao=EVENTO com corpo que não é JSON.; 401 — falha de autenticação.; 403 — tipo de terceiro não permitido ou fora do escopo..
Integração antiga com o controlador de carregamento Danload 6000 (obsoleta). Obsoleto: mantido para equipamentos antigos; use supervisorio. Versão anterior ao Supervisório, para plataformas com Danload 6000. GET traz a configuração dos Danload ou as ordens de carregamento; PUT envia o resultado das ordens, que o PetroW processa depois (convertendo os volumes para 20 °C). O PUT não verifica o escopo do acesso nas ordens do corpo. Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/danload6000Configuração (padrão), ordens (acao=ORDEM) ou portas seriais (acao=SERIAL)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
(padrão) |
data[] com os Danload 6000 ativos do app que têm porta serial ativa: id_danload6000, identificador, slave_id, date_rate, port_serial_name, data_byte, stop_byte, parity, _medidor/_receita/_id, quantidade_minima, calibracao, num_comps, ativo. |
ORDEM |
Mesma lista de supervisorio?acao=ORDEM, só com carregamento (tipo C), todas as senhas (filtro *) e o escopo do acesso. Sem 'situacao' e sem 'cancela_ordens_outros_sistemas'. |
SERIAL |
Portas seriais ativas, cada uma com os Danload 6000 ligados a ela (danloads[]). Sem porta_serial, lista todas; com perfil filial (ou rede), só as da filial (ou da rede). |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | ORDEM, SERIAL ou ausente (configuração). |
grupo |
string | não | Grupo de automação do equipamento. Omitido ou '*' = todos os ativos do app. Vazio não equivale a todos: filtra os equipamentos sem grupo. |
porta_serial |
string | não | acao=SERIAL: filtra a porta serial (port_serial_name). |
curl -s -X GET "$BASE/v1/terceiro/danload6000?$AUTH"
Resposta:
{
"status": "ok",
"data": [
{
"id_danload6000": 1,
"identificador": "DANLOAD 1",
"slave_id": 1,
"date_rate": 9600,
"port_serial_name": "COM1",
"data_byte": 8,
"stop_byte": 1,
"parity": 0,
"s10a_medidor": 1,
"s10a_receita": 2,
"s10a_id": 5,
"quantidade_minima": 500,
"calibracao": 1.0,
"num_comps": 6,
"ativo": "S"
}
]
}
Erros específicos: 401 — falha de autenticação.; 403 — acesso negado..
/v1/terceiro/danload6000Resultado das ordens carregadas (acao=ORDEM)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
ORDEM |
Guarda cada ordem para processamento posterior (substitui o envio anterior da mesma ordem). Falha numa ordem vira {"errors":{"registro": …}}. |
LOG |
Não implementada: devolve {"errors":{"registro": "Falha Função log: Não implementada"}}. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | sim | ORDEM ou LOG, exatamente assim, em maiúsculas (não há valor padrão). LOG não está implementado. |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
<id_ordem> |
object | sim | Chave = id da ordem; valor = objeto com compartimentos[]: id_danload6000, produto_1, temperatura_1 (inteiro × 10: 150 = 15,0 °C), densidade_1, volume_1 e, para o segundo produto, produto_2, temperatura_2, densidade_2 e volume_2. |
curl -s -X PUT "$BASE/v1/terceiro/danload6000?$AUTH&acao=" \
-H 'Content-Type: application/json' \
-d '{"123456": {"compartimentos": [{"id_danload6000": 1, "produto_1": 2, "temperatura_1": 245, "densidade_1": 0.835, "volume_1": 5000, "produto_2": 0}]}}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"acao":"Inválida"}}.; 400 — {"errors":{"registro": "Falha O JSON não possui ordens"}}: corpo {}.; 400 — {"errors":{"registro": "Falha Ordem N não pode ser salva."}}; 500 — corpo que não é JSON.; 400 — {Ordem …: ' não encontrada.'}: a ordem não é do app ou está fora do escopo do acesso (as demais ordens do corpo são gravadas)..
Configuração dos controladores Zylix ZLX9000. Devolve os ZLX9000 ativos do app (não usa acao). É a mesma lista zlx9000 de equipamento na configuração do supervisorio. Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/zlx9000Lista dos ZLX9000 ativos
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
grupo |
string | não | Grupo de automação do equipamento. Omitido ou '*' = todos os ativos do app. Vazio não equivale a todos: filtra os equipamentos sem grupo. |
curl -s -X GET "$BASE/v1/terceiro/zlx9000?$AUTH"
Resposta:
{
"status": "ok",
"data": [
{
"id_zlx9000": 1,
"id_tx_app": 1,
"id_tx_estabelecimento": 10,
"ip": "192.168.0.10",
"porta": 502,
"estacao": 1,
"identificador": "ZLX 1",
"s10a_medidor": 1,
"s10a_receita": 2,
"s10a_id": 5,
"quantidade_minima": 500,
"calibracao": 1.0,
"finaliza_ordem": "S",
"ativo": "S"
}
]
}
Erros específicos: 401 — falha de autenticação.; 403 — acesso negado..
Integração com o sistema de automação Dayler (troca de ordens e tickets de carregamento). Usado pelo integrador da automação Dayler, só para ordens de carregamento dos clientes do app (respeitando o escopo do acesso). Fluxo: GET GRAVAR lista as ordens ainda não enviadas à automação → PUT GRAVAR envia os tickets (viram as senhas dos compartimentos e a ordem fica com automacao = S) → GET LER lista as ordens em operação já na automação → PUT LER envia o resultado (processado depois pelo PetroW) → GET e PUT CANCELAR tratam as canceladas. Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/daylerListas por ?acao= (GRAVAR padrão, LER, CANCELAR, SENHA)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
GRAVAR |
Ordens C (carregamento) com automacao = N em P (pendente), A (aguardando) ou O (operação), pendentes há pelo menos 1 minuto. Resposta 'gravar': objeto com chave = id_ordem e valor = lista de itens {cliente, veiculo (placa), motorista (primeiro nome), produto (código de automação), quantidade, lacre ('')}. |
LER |
data[] {id_ordem} das ordens C em O (operação), com automacao = S, que entraram na fila (aguardando) nos últimos 3 dias. |
CANCELAR |
data[] {id_ordem} das ordens C canceladas nas últimas 4 horas. |
SENHA |
Ordens C em P, A ou O com senha no compartimento 1, nível 1. Resposta 'senha': chave = id_ordem, valor = lista {cliente, veiculo, motorista, compartimento ('CN<nível>'), produto, quantidade, senha}. Atenção: a consulta marca essas ordens com senha = 'N'; consultar de novo não as traz mais. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | GRAVAR (padrão), LER, CANCELAR ou SENHA. Não diferencia maiúsculas. |
curl -s -X GET "$BASE/v1/terceiro/dayler?$AUTH"
Resposta:
{
"status": "ok",
"gravar": {
"123456": [
{
"cliente": "DISTRIBUIDORA A - CIDADE/UF",
"veiculo": "ABC1D23",
"motorista": "MOTORISTA",
"produto": "S10A",
"quantidade": 5000,
"lacre": ""
}
]
}
}
Erros específicos: 400 — {"errors":{"acao":"Inválida"}}.; 401 — falha de autenticação.; 403 — acesso negado..
/v1/terceiro/daylerRetorno da automação por ?acao= (GRAVAR padrão, LER, CANCELAR)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
GRAVAR |
Grava a senha de cada compartimento (um ticket por item) e marca a ordem com automacao = S. Mais itens do que tickets dá erro 500; senha já gravada também dá erro 500. |
LER |
Guarda o JSON para processamento posterior pelo PetroW, quando o conteúdo mudou. |
CANCELAR |
Volta a ordem para automacao = N. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | GRAVAR (padrão), LER ou CANCELAR. |
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
(GRAVAR) ordens[0].ordem |
integer | sim | Id da ordem (só o primeiro elemento de 'ordens' é lido). |
(GRAVAR) ordens[0].tickets[] |
array | sim | Tickets, na ordem dos compartimentos (sequência, compartimento) dos itens com nível, quantidade e produto. Cada ticket vira a senha de um compartimento. Descarregamento: só o primeiro ticket. |
(LER) data |
object | sim | JSON do Dayler da ordem: ordem (id), veiculo, cliente, motorista, status, data_hora_entrada, produtos[] (composto_a/composto_b com ticket, quantidade_solicitada, quantidade_carregada, temperatura, densidade, inpm, medidor, lacre, status…). Guardado inteiro, se mudou desde o último envio. |
(CANCELAR) ordens[0] |
integer | sim | Id da ordem que volta para automacao = N. |
curl -s -X PUT "$BASE/v1/terceiro/dayler?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"ordens": [{"ordem": 123456, "tickets": [1001, 1002, 1003]}]}'
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"acao":"Inválida"}}.; 500 — corpo que não é JSON ou sem os campos esperados.; 200 — ordem fora do escopo, id ≤ 0 ou tickets vazios são ignorados sem aviso (responde ok)..
Totem de autoatendimento do motorista: confere CPF/ordem e coloca a ordem na fila. O motorista digita o CPF (GET acao=motorista), depois o número da ordem (GET acao=ordem) e confirma (POST). A confirmação coloca a ordem na fila de agendamento e, se o app tem o parâmetro TOTEM_IMPRESSORA > 0, cria junto o trabalho de impressão do ticket (com os materiais da ordem quando TOTEM_IMPRIMIR_MATERIAIS = S). Só ordens em P (pendente) de carregamento ou descarregamento do motorista do CPF; acesso com perfil filial só vê as ordens da filial. Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/totemEtapas de conferência por ?acao= (motorista, ordem), em minúsculas
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
motorista |
Só valida: CPF válido e com pelo menos uma ordem pendente de carregamento ou descarregamento no app e no escopo do acesso. Resposta sem dados (só status). |
ordem |
Devolve a ordem pendente do CPF: data[] (id_ordem, tipo, situacao, id_transportadora, data_hora_pendente, validade_inicial, validade_final, cliente, motorista, transportadora, placa), produtos_detalhe[] {produto, quantidade}, estabelecimento [nome, logradouro, 'cidade - UF'] do app e, com TOTEM_IMPRIMIR_MATERIAIS = S, materiais[] {tipo (FRASCO, ADITIVO, MARCADOR ou LACRE), descricao, quantidade, unidade}. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | sim | motorista ou ordem, exatamente em minúsculas. Outro valor dá erro acao 'Ação inválida'. |
cpf |
string | sim | CPF do motorista, só números (comparado com o cadastro). |
id_ordem |
integer | não | acao=ordem: obrigatório. |
curl -s -X GET "$BASE/v1/terceiro/totem?$AUTH&acao=&cpf="
Resposta:
{
"status": "ok",
"data": [
{
"id_ordem": 123456,
"tipo": "C",
"situacao": "P",
"id_transportadora": 50,
"data_hora_pendente": "2026-11-12 07:30:00",
"validade_inicial": "2026-11-12 00:00:00",
"validade_final": "2026-11-12 23:59:59",
"cliente": "DISTRIBUIDORA A LTDA",
"motorista": "MOTORISTA 01",
"transportadora": "TRANSPORTADORA EXEMPLO",
"placa": "ABC1D23"
}
],
"produtos_detalhe": [
{
"produto": "OLEO DIESEL S10",
"quantidade": 5000
}
],
"estabelecimento": [
"TERMINAL EXEMPLO",
"RUA EXEMPLO, 100",
"CIDADE - UF"
]
}
Erros específicos: 400 — cpf: 'Informe o CPF', 'CPF inválido' ou 'CPF não possui ordens pendentes'.; 400 — id_ordem: 'Informe a ordem' ou 'Ordem não encontrada'.; 400 — acao: 'Ação inválida'.; 401 — falha de autenticação.; 403 — acesso negado..
/v1/terceiro/totemColoca a ordem na fila (e imprime o ticket)
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
origem |
string | sim | ordem. Os valores pedido e contrato_coleta são aceitos, mas não fazem nada; outro valor dá erro. |
id |
integer | sim | Id da ordem. |
cpf_motorista |
string | não | CPF do motorista. Se informado, a ordem precisa ser dele. |
curl -s -X POST "$BASE/v1/terceiro/totem?$AUTH&origem=&id="
Resposta:
{
"status": "ok"
}
Erros específicos: 403 — {"errors":{"acesso":"Negado"}}: ordem fora do escopo do acesso.; 400 — {"errors":{"exception": …}} com a mensagem: 'Origem não informada', 'Id não informado', 'Ordem não encontrada', 'Ordem não está pendente', 'Ordem não pertence ao CPF informado', 'Já existe uma fila ativa para este veículo/motorista com ordens de tipo diferente', 'Origem inválida'…; 400 — {"errors":{"id_ordem": "Fora do horário aceito para o agendamento"}}. O agendamento é marcado como ausente.; 200 — se a ordem já está na fila, responde ok sem fazer nada..
Balança rodoviária: validação de ordem de descarga. PUT verifica se a ordem pode passar na balança. GET não faz nada (devolve só status ok): a configuração das balanças vem na configuração do supervisorio e a pesagem é enviada por supervisorio?acao=PESO. Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/balancaValida ordem (acao=VALIDAR_ORDEM, padrão)
Perfis: App, Rede, Filial, Pessoa
Ações (parâmetro acao):
| Ação | O que faz |
|---|---|
VALIDAR_ORDEM |
'ORDEM VÁLIDA' se a ordem é de descarregamento, está em O (operação), entrou em operação há no máximo OPERACAO_DESCARREGAMENTO_CARENCIA minutos (parâmetro do app), está dentro da validade e no escopo do acesso. Caso contrário, 'ORDEM NÃO ENCONTRADA'. |
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
acao |
string | não | VALIDAR_ORDEM (padrão). Qualquer outra ação responde ok, sem dados. |
id_ordem |
integer | sim | Ordem a validar. |
curl -s -X PUT "$BASE/v1/terceiro/balanca?$AUTH&id_ordem="
Resposta:
{
"status": "ok",
"situacao": "ORDEM VÁLIDA"
}
Erros específicos: 401 — falha de autenticação.; 403 — acesso negado..
Cancela de entrada/saída: leitura do QR Code da ordem decide se abre. O leitor da cancela envia o número da ordem lido no QR Code. Na ENTRADA, abre se a ordem já está em O (operação) dentro da carência; senão, se ela está em A (aguardando), já foi chamada na fila e a cancela tem 'entrar em operação' = S, coloca em operação todas as ordens abertas do mesmo veículo e motorista. Na SAÍDA, abre se a ordem foi finalizada dentro da carência; senão, se a cancela tem 'finalizar ordem' = S, finaliza as ordens em O (operação) ou V (vistoria) do mesmo veículo e motorista. Cada leitura com id_cancela fica registrada (liberada ou negada, com o motivo). Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/cancelaPedido de abertura da cancela
Perfis: App, Rede, Filial, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
qrcode |
integer | sim | Id da ordem lido no QR Code. |
cancela |
string | sim | ENTRADA ou SAÍDA (aceita SAIDA; não diferencia maiúsculas e minúsculas). |
id_cancela |
integer | não | Cancela física (cadastro). Define se a leitura coloca a ordem em operação ou a finaliza, e é necessária para registrar a leitura. |
curl -s -X PUT "$BASE/v1/terceiro/cancela?$AUTH&qrcode=&cancela="
Resposta:
{
"status": "ok",
"abrir": "SIM",
"mensagem": ""
}
Erros específicos: 400 — {"abrir":"NÃO","mensagem":"QR Code inválido","errors":{"qrcode":"Inválido"},"status":"error"}.; 400 — qrcode Inválido + 'A ordem N não pertence ao cliente desta integração': ordem fora do escopo do acesso.; 400 — {"errors":{"entrada": "NÃO AUTORIZADA"}} ou {"errors":{"saída": "NÃO AUTORIZADA"}}, com mensagem.; 400 — {"errors":{"cancela": "Inválido"}}: cancela diferente de ENTRADA e SAÍDA.; 401 — falha de autenticação.; 403 — acesso negado..
Câmera de leitura de placas (LPR): registra cada leitura com foto. POST recebe o evento da câmera (repassado pelo Supervisório), grava a leitura e guarda a foto nos documentos do PetroW. A câmera é localizada pelo device_id ou pelo identificador do cadastro (câmera ativa); sem cadastro, a leitura é gravada com id_camera 0. GET não implementado (501). Tipos de terceiro: rede, estabelecimento e pessoa.
/v1/terceiro/cameraLeitura de placa
Perfis: App, Rede, Filial, Pessoa
Corpo (JSON objeto)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cameraId |
string | não | device_id (ou identificador) da câmera cadastrada. |
dataHoraEvento |
datetime | não | 'AAAA-MM-DDTHH:MM:SS' ou com espaço no lugar do T. Valor inválido fica vazio. |
placa |
string | não | Placa lida |
placaDetectada |
boolean | não | true = S. |
cor |
string | não | |
tipoVeiculo |
string | não | |
velocidade |
integer | não | |
direcao |
string | não | |
fotoBase64 |
string | não | JPEG em base64. |
curl -s -X POST "$BASE/v1/terceiro/camera?$AUTH" \
-H 'Content-Type: application/json' \
-d '{"cameraId": "CAM-ENTRADA-01", "dataHoraEvento": "2026-11-12T08:01:15", "placa": "ABC1D23", "placaDetectada": true, "cor": "BRANCO", "tipoVeiculo": "CAMINHAO", "velocidade": 5, "direcao": "ENTRADA", "fotoBase64": "/9j/4AAQ..."}'
Resposta:
{
"status": "ok",
"id_camera_leitura": 5001,
"id_camera": 3
}
Erros específicos: 500 — corpo que não é JSON ou base64 inválido.; 401 — falha de autenticação.; 403 — acesso negado..
Fila de impressão das impressoras locais (tickets de ordem etc.). Usado pelo Supervisório (impressora cadastrada no PetroW): GET busca os trabalhos pendentes de uma impressora e PUT marca a situação depois de imprimir. Os trabalhos são criados pelo próprio PetroW (ex.: ticket do totem). POST e DELETE existem, mas não fazem nada. Vale para todos os tipos de terceiro (rede, estabelecimento, cliente e pessoa).
/v1/terceiro/impressoraJobTrabalhos pendentes da impressora
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_impressora |
integer | sim | Impressora (sem ela, não retorna nada). |
curl -s -X GET "$BASE/v1/terceiro/impressoraJob?$AUTH&id_tx_impressora="
Resposta:
{
"status": "ok",
"data": [
{
"id_tx_impressora_job": 900,
"id_tx_impressora": 2,
"documento": "<conteúdo a imprimir>",
"id_tx_pessoa": 0,
"data_hora": "2026-11-12 08:00:00",
"data_hora_situacao": "2026-11-12 08:00:00",
"situacao": "P"
}
]
}
Erros específicos: 401 — falha de autenticação.; 403 — acesso negado..
/v1/terceiro/impressoraJobAtualiza a situação do trabalho
Perfis: App, Rede, Filial, Cliente, Pessoa
Parâmetros (query)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id_tx_impressora_job |
integer | sim | Trabalho. |
situacao |
string | sim | Nova situação: P (pendente), E (enviado), F (finalizado) ou C (cancelado). O valor não é validado: o que chega é gravado. O Supervisório usa F. |
curl -s -X PUT "$BASE/v1/terceiro/impressoraJob?$AUTH&id_tx_impressora_job=&situacao="
Resposta:
{
"status": "ok"
}
Erros específicos: 400 — {"errors":{"id_tx_impressora_job":"Valor inválido"}}.; 500 — trabalho de outro app ou valor recusado na gravação..
Teste de conexão e credencial do terceiro. Não consulta nada: só confirma que a autenticação (APP/REDE/CNPJ/CPF + SENHA + A) e a permissão do terceiro estão corretas. Útil para testar a conexão da integração. Vale para todos os tipos de terceiro.
/v1/terceiro/statusResponde ok se a credencial é válida
Perfis: App, Rede, Filial, Cliente, Pessoa
curl -s -X GET "$BASE/v1/terceiro/status?$AUTH"
Resposta:
{
"status": "ok"
}
Erros específicos: 401 — credencial inválida.; 403 — sem permissão..