Revolus API Reference

Documentação completa das APIs REST da plataforma Revolus OEE — sistema de monitoramento industrial em tempo real multi-tenant.

🔐 Auth API ⚙️ MES API 📊 Analytics API

Formato

JSON · REST

Autenticação

Bearer JWT

Multi-tenant

companyId no JWT

🔑

A plataforma utiliza JWT Bearer Token. Após o login, inclua o token no header Authorization de todas as requisições protegidas. Tokens expiram e devem ser renovados via POST /refresh.


Authorization: Bearer <seu-jwt-token>

O payload do JWT contém: sub (userId), companyId, companyTag, equipmentIds e scope. Todos os dados são automaticamente escopados pela empresa do usuário autenticado.

🔐
Base URL https://api.revolus.dev.br/auth
Sessão
POST /signin Autenticar usuário 🌐 Público
Autentica o usuário com login e senha. Retorna um JWT de acesso e um refresh token. O campo companyId é opcional — quando omitido, o sistema seleciona a empresa padrão do usuário.
Body · application/json
CampoTipoStatusDescrição
username string obrigatório Login do usuário
password string obrigatório Senha do usuário (mínimo 6 caracteres)
companyId string (UUID) opcional ID da empresa para login direto em multi-tenant
Requisição
Resposta 200
{
  "username": "operador01",
  "password": "senha123",
  "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b"
}
Resposta 200
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenExpires": 1750000000,
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
  "refreshExpires": 1752592000
}
POST /refresh Renovar token JWT 🌐 Público
Emite um novo JWT usando o refresh token sem exigir credenciais novamente.
Body · application/json
CampoTipoStatusDescrição
refreshToken string obrigatório Refresh token obtido no login
Resposta 200
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenExpires": 1750003600,
  "refreshToken": "dGhpcyBpcyBhIG5ldyByZWZyZXNoIHRva2Vu...",
  "refreshExpires": 1752595600
}
POST /company Trocar empresa ativa 🔒 JWT
Alterna o contexto de empresa do usuário autenticado e regera tokens com o novo companyId e companyTag.
Body · application/json
CampoTipoStatusDescrição
companyId string (UUID) obrigatório ID da empresa destino
Resposta 200
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenExpires": 1750000000,
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
  "refreshExpires": 1752592000
}
Usuários
GET /users Listar usuários 🔒 JWT
Retorna lista paginada de usuários da empresa ativa. Suporta filtro por nome e status.
Query Parameters
ParâmetroTipoStatusDescrição
pageintegeropcionalNúmero da página (min: 1, padrão: 1)
pageRowsintegeropcionalRegistros por página (1–100, padrão: 10)
orderBystringopcionalCampo para ordenação
orderASC | DESCopcionalDireção da ordenação
namestringopcionalFiltro por nome (busca parcial)
activebooleanopcionalFiltrar por status ativo/inativo
Resposta 200
{
  "count": 42,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "name": "Kleber Marçal",
      "login": "kleber",
      "email": "kleber@empresa.com",
      "active": true,
      "createdAt": "2025-01-15T10:00:00.000Z"
    }
  ]
}
GET /users/me Perfil do usuário autenticado 🔒 JWT
Retorna os dados do usuário atualmente autenticado, incluindo a empresa ativa selecionada.
Resposta 200
{
  "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
  "name": "Kleber Marçal",
  "login": "kleber",
  "email": "kleber@empresa.com",
  "active": true,
  "selectedCompany": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b"
}
GET /users/:id Buscar usuário por ID 🔒 JWT
Retorna os dados de um usuário específico dentro da empresa autenticada, incluindo os vínculos com empresas.
Path Parameters
ParâmetroTipoStatusDescrição
idstring (UUID)obrigatórioID do usuário
Resposta 200
{
  "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
  "login": "operador01",
  "name": "João Operador",
  "email": "joao@empresa.com",
  "userCompanies": [
    {
      "userId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "systems": ["MES"],
      "active": true,
      "company": { "id": "01932e4a-…", "name": "Brasfit", "tag": "BRFIT" }
    }
  ]
}
POST /users Criar usuário 🔒 JWT
Cria um novo usuário na empresa ativa do usuário autenticado. Resposta 200: o objeto do usuário criado — mesma estrutura de GET /users/:id.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome completo do usuário
loginstringobrigatórioLogin único do usuário
passwordstringobrigatórioSenha (mínimo 6 caracteres)
emailstring (email)opcionalEndereço de e-mail
PATCH /users/:id Atualizar usuário 🔒 JWT
Atualiza dados de um usuário. Todos os campos são opcionais. Resposta 200: o objeto do usuário atualizado — mesma estrutura de GET /users/:id.
Body · application/json (todos opcionais)
CampoTipoStatusDescrição
namestringopcionalNome completo
loginstringopcionalLogin
passwordstringopcionalNova senha (mín. 6 caracteres)
emailstring (email)opcionalE-mail
PATCH /users/restore/:id Restaurar usuário excluído 🔒 JWT
Restaura um usuário previamente excluído (soft-delete) na empresa ativa. Resposta 200: o objeto do usuário com active: true.
Path Parameters
ParâmetroTipoStatusDescrição
idstring (UUID)obrigatórioID do usuário
DELETE /users/:id Excluir usuário 🔒 JWT
Exclusão lógica (soft-delete) do usuário. O registro permanece no banco mas é marcado como inativo. Resposta 200: o objeto do usuário com active: false.
Path Parameters
ParâmetroTipoStatusDescrição
idstring (UUID)obrigatórioID do usuário
Empresas
GET /companies Listar empresas 🔒 JWT
Lista as empresas acessíveis ao usuário autenticado (multi-tenant). Nota: a implementação atual retorna lista vazia — as empresas do usuário são obtidas via GET /users/:id (campo userCompanies).
Resposta 200
[]
⚙️
Base URL https://api.revolus.dev.br/mes

Todas as rotas exigem JWT Bearer e são escopadas pela empresa do token. Listagens paginadas aceitam pagination[page] (padrão 1), pagination[pageRows] (1–10000, padrão 10) e order[campo]=asc|desc, e respondem no formato { count, rows }. Usuários com restrição de equipamentos no JWT só enxergam os equipamentos permitidos.

Equipamentos
GET /equipments Listar equipamentos 🔒 JWT
Lista paginada dos equipamentos da empresa ativa. Filtros são passados aninhados em filter[...].
Query Parameters
ParâmetroTipoStatusDescrição
filter[name]stringopcionalFiltro por nome (busca parcial)
filter[description]stringopcionalFiltro por descrição
filter[collectorMac]stringopcionalMAC do coletor vinculado
filter[groupId]string (UUID)opcionalGrupo de equipamentos
filter[productId]string (UUID)opcionalSomente equipamentos vinculados ao produto
filter[equipmentIds][]string[] (UUID)opcionalLista de ids específicos
filter[active]booleanopcionalStatus ativo/inativo
pagination[page]integeropcionalPágina (padrão 1)
pagination[pageRows]integeropcionalRegistros por página (1–10000, padrão 10)
order[campo]asc | descopcionalOrdenação, ex. order[name]=asc
Resposta 200
{
  "count": 8,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "erpId": null,
      "name": "Impressora Flexo 01",
      "description": "Linha 1 — galpão A",
      "collectorMac": "A0:B1:C2:D3:E4:F5",
      "groupId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a99",
      "color": "#3B82F6",
      "band": 1,
      "active": true,
      "hourmeter": 152340,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": "2025-03-02T08:12:00.000Z",
      "updatedBy": null
    }
  ]
}
GET /equipments/rssi Sinal RSSI dos coletores 🔒 JWT
Retorna a intensidade de sinal Wi-Fi (RSSI) reportada pelos coletores de hardware — útil para diagnóstico de conectividade no chão de fábrica. rssi vem null quando o coletor nunca reportou.
Query Parameters
ParâmetroTipoStatusDescrição
macsstring (CSV)obrigatórioMACs separados por vírgula, ex. A0:B1:C2:D3:E4:F5,B0:C1:D2:E3:F4:A5
Resposta 200
[
  { "mac": "A0:B1:C2:D3:E4:F5", "rssi": -58 },
  { "mac": "B0:C1:D2:E3:F4:A5", "rssi": null }
]
GET /equipments/:id Buscar equipamento por ID 🔒 JWT
Retorna um equipamento da empresa ativa. Responde 404 se não encontrado. Resposta 200: objeto Equipamento — mesma estrutura dos itens de GET /equipments.
POST /equipments Criar equipamento 🔒 JWT
Cadastra um novo equipamento na empresa ativa. Resposta 200: o Equipamento criado — mesma estrutura dos itens de GET /equipments.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do equipamento
colorstring (hexa)obrigatórioCor de exibição, ex. #3B82F6
descriptionstringopcionalDescrição livre
bandnumberopcionalBanda/faixa do coletor
activebooleanopcionalStatus inicial
PATCH /equipments/:id Atualizar equipamento 🔒 JWT
Atualização parcial — todos os campos são opcionais: name, description, groupId, color, active. Resposta 200: o Equipamento atualizado.
DELETE /equipments/:id Excluir equipamento 🔒 JWT
Exclusão lógica (soft-delete) — o equipamento é marcado como inativo e some das listagens padrão. Resposta 200: o Equipamento com active: false.
PATCH /equipments/restore/:id Restaurar equipamento 🔒 JWT
Reativa um equipamento previamente excluído (soft-delete). Resposta 200: o Equipamento com active: true.
Grupos de Equipamento
GET /equipment-groups Listar grupos 🔒 JWT
Retorna todos os grupos de equipamento da empresa ativa (sem paginação), como array direto.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a99",
    "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
    "name": "Linha 1",
    "color": "22C55E",
    "active": true,
    "createdAt": "2025-01-15T10:00:00.000Z",
    "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
    "updatedAt": null,
    "updatedBy": null
  }
]
GET /equipment-group/:id Buscar grupo por ID 🔒 JWT
Retorna um grupo de equipamentos. Responde 404 se não encontrado. Resposta 200: objeto Grupo — mesma estrutura dos itens de GET /equipment-groups.
POST /equipment-group Criar grupo 🔒 JWT
Cria um grupo para organizar equipamentos por linha, célula ou setor. Resposta 200: o Grupo criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do grupo
colorstring (hexa 6)obrigatórioCor em hexa de 6 dígitos, ex. 22C55E
activebooleanobrigatórioStatus do grupo
PATCH /equipment-group/:id Atualizar grupo 🔒 JWT
Atualização parcial — name, color e active opcionais. Resposta 200: o Grupo atualizado.
Produtos
GET /products Listar produtos 🔒 JWT
Lista paginada dos produtos da empresa ativa, no formato { count, rows }.
Resposta 200
{
  "count": 120,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "erpId": null,
      "name": "Rótulo Refrigerante 2L",
      "code": "ROT-2L-001",
      "metricId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c40",
      "dealMetricId": null,
      "type": "FINISHED_PRODUCT",
      "unitPrice": 0.12,
      "labelsPerRoll": 5000,
      "rows": 4,
      "active": true,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null
    }
  ]
}
Query Parameters
ParâmetroTipoStatusDescrição
filter[nameOrCode]stringopcionalBusca por nome ou código
filter[name]stringopcionalFiltro por nome
filter[code]stringopcionalFiltro por código
filter[metricId]string (UUID)opcionalUnidade de medida
filter[equipmentId]string (UUID)opcionalSomente produtos vinculados ao equipamento
filter[type]enumopcionalRAW_MATERIAL · UNFINISHED_PRODUCT · FINISHED_PRODUCT
filter[active]booleanopcionalStatus ativo/inativo
pagination / orderopcionalPaginação e ordenação padrão MES
GET /products/:id Buscar produto por ID 🔒 JWT
Retorna um produto da empresa ativa. Resposta 200: objeto Produto — mesma estrutura dos itens de GET /products.
POST /products Criar produto 🔒 JWT
Cadastra um produto. Dimensões (largura/altura e gaps) são usadas em produtos impressos, como rótulos e etiquetas. Resposta 200: o Produto criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do produto
codestringobrigatórioCódigo interno do produto
metricIdstring (UUID)obrigatórioUnidade de medida
typeenumobrigatórioRAW_MATERIAL · UNFINISHED_PRODUCT · FINISHED_PRODUCT
width / gapWidthnumber (mm)opcionalLargura e gap de largura
height / gapHeightnumber (mm)opcionalAltura e gap de altura
unitPricenumberopcionalPreço unitário
labelsPerRollnumberopcionalEtiquetas por bobina
rowsnumberopcionalNúmero de carreiras
activebooleanopcionalStatus inicial
PATCH /products/:id Atualizar produto 🔒 JWT
Atualização parcial com os mesmos campos do POST, todos opcionais. Dimensões devem ser ≥ 1 mm. Resposta 200: o Produto atualizado.
DELETE /products/:id Excluir produto 🔒 JWT
Exclusão lógica (soft-delete) do produto. Resposta 200: o Produto com active: false.
PATCH /products/restore/:id Restaurar produto 🔒 JWT
Reativa um produto previamente excluído. Resposta 200: o Produto com active: true.
Equipamento × Produto
GET /equipment-products Listar vínculos 🔒 JWT
Lista as relações equipamento × produto no formato { count, rows } — cada vínculo define a capacidade nominal e os fatores de conversão daquele produto naquele equipamento. Cada item vem com os objetos equipment e product completos embutidos.
Query Parameters
ParâmetroTipoStatusDescrição
equipmentIdstring (UUID)opcionalFiltrar por equipamento
equipmentNamestringopcionalNome do equipamento
productIdstring (UUID)opcionalFiltrar por produto
productCodestringopcionalCódigo do produto
productNamestringopcionalNome do produto
activebooleanopcionalStatus do vínculo
Resposta 200
{
  "count": 35,
  "rows": [
    {
      "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30",
      "nominalCapacity": 1200,
      "multiplierFactor": 4,
      "divideFactor": 1,
      "microStopInit": 10,
      "microStopEnd": 120,
      "visualAlert": true,
      "soundAlert": false,
      "firstAlert": 30,
      "secondAlert": 90,
      "perBar": null,
      "active": true,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null,
      "equipment": { "…objeto Equipamento completo…" },
      "product": { "…objeto Produto completo…" }
    }
  ]
}
GET /equipment-product/:equipmentId/:productId Buscar vínculo 🔒 JWT
Retorna a relação de um produto com um equipamento pela chave composta. Resposta 200: objeto do vínculo — mesma estrutura dos itens de GET /equipment-products.
POST /equipment-product Vincular produto a equipamento 🔒 JWT
Cria o vínculo. Responde 400 se o produto já estiver cadastrado no equipamento. Resposta 200: o vínculo criado.
Body · application/json
CampoTipoStatusDescrição
equipmentIdstring (UUID)obrigatórioEquipamento
productIdstring (UUID)obrigatórioProduto
nominalCapacitynumberobrigatórioPeças produzidas em 1h de execução (base da Performance do OEE)
multiplierFactornumberobrigatórioQuantidade produzida por ciclo de máquina
divideFactornumberobrigatórioFator divisor por ciclo (padrão 1)
PATCH /equipment-product/:equipmentId/:productId Atualizar vínculo 🔒 JWT
Atualiza parâmetros de produção e do ANDON para o par equipamento/produto. Resposta 200: o vínculo atualizado.
Body · application/json (todos opcionais)
CampoTipoDescrição
nominalCapacitynumberPeças por hora
multiplierFactor / divideFactornumberFatores de conversão por ciclo
microStopInit / microStopEndinteger (s)Janela de microparada em segundos
visualAlert / soundAlertbooleanSinais visual e sonoro do ANDON
firstAlert / secondAlertinteger (s)Tempos do 1º e 2º alertas
perBarintegerPeças por barra
activebooleanStatus do vínculo
DELETE /equipment-product/:equipmentId/:productId Excluir vínculo 🔒 JWT
Exclusão lógica do vínculo equipamento × produto. Resposta 200: o vínculo com active: false.
PATCH /equipment-product/restore/:equipmentId/:productId Restaurar vínculo 🔒 JWT
Reativa um vínculo previamente excluído. Resposta 200: o vínculo com active: true.
Métricas (Unidades de Medida)
GET /metrics Listar unidades de medida 🔒 JWT
Retorna as unidades de medida da empresa ativa (ex. PÇ, KG, M, BOB), como array direto.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c40",
    "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
    "name": "Peças",
    "code": "PÇ",
    "active": true,
    "createdAt": "2025-01-15T10:00:00.000Z",
    "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
    "updatedAt": null,
    "updatedBy": null
  }
]
GET /metrics/:id Buscar unidade por ID 🔒 JWT
Retorna uma unidade de medida. Resposta 200: objeto Métrica — mesma estrutura dos itens de GET /metrics.
POST /metrics Criar unidade de medida 🔒 JWT
Cadastra uma unidade de medida. Resposta 200: a Métrica criada.
Body · application/json
CampoTipoStatusDescrição
codestring (máx 4)obrigatórioCódigo curto, ex.
namestringobrigatórioNome da unidade, ex. Peças
activebooleanopcionalStatus inicial
PATCH /metrics/:id Atualizar unidade 🔒 JWT
Atualização parcial — code, name e active opcionais. Resposta 200: a Métrica atualizada.
Produções (Ordens de Produção)
GET /productions Listar produções 🔒 JWT
Lista paginada das ordens de produção. Ciclo de vida: PLANNED → RUNNING ⇄ PAUSED → REVIEW → FINISHED (ou CANCELED).
Query Parameters
ParâmetroTipoStatusDescrição
filter[name]stringopcionalNome da produção
filter[equipmentIds][]string[] (UUID)opcionalEquipamentos
filter[productId]string (UUID)opcionalProduto
filter[status][]enum[]opcionalPLANNED · RUNNING · PAUSED · REVIEW · FINISHED · CANCELED
filter[groupId]string (UUID)opcionalGrupo de equipamentos
filter[collectorMac]stringopcionalMAC do coletor
filter[plannedStartInterval]DateIntervalopcionalIntervalo do início planejado
pagination / orderopcionalPaginação e ordenação padrão MES
Resposta 200
{
  "count": 17,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30",
      "erpId": null,
      "name": "OP-2025-0612",
      "multiplierFactor": 4,
      "divideFactor": 1,
      "nominalCapacity": 1200,
      "status": "RUNNING",
      "plannedStart": "2025-06-12T06:00:00.000Z",
      "plannedEnd": "2025-06-12T22:00:00.000Z",
      "plannedQuantity": 10000,
      "plannedQuality": 98,
      "plannedAvailability": 90,
      "plannedPerformance": 85,
      "cycleTime": 3.0,
      "startTime": "2025-06-12T06:04:12.000Z",
      "lastPlay": "2025-06-12T13:10:00.000Z",
      "pastExecutionTime": 18450,
      "expectedEnd": "2025-06-12T21:40:00.000Z",
      "endTime": null,
      "active": true,
      "observation": "Prioridade alta",
      "client": "Cliente XYZ",
      "value": 12500.00,
      "createdAt": "2025-06-11T18:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null,
      "equipment": { "…objeto Equipamento completo…" },
      "product": { "…objeto Produto completo…" },
      "counter": 5230,
      "setupCounter": 48,
      "cycleAverage": 2.94
    }
  ]
}

Os campos counter, setupCounter e cycleAverage (contadores ao vivo, lidos do Redis) só aparecem em produções com status RUNNING.

GET /productions/:id Buscar produção por ID 🔒 JWT
Retorna uma ordem de produção. O id deve ser um UUIDv7 válido. Resposta 200: objeto Produção — mesma estrutura dos itens de GET /productions.
POST /productions Criar produção 🔒 JWT
Cria uma ordem de produção planejada. As metas planejadas (disponibilidade, performance e qualidade) definem o OEE alvo da ordem. Resposta 200: a Produção criada com status: "PLANNED".
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioIdentificação da ordem
productIdstring (UUID)obrigatórioProduto a produzir
equipmentIdstring (UUID)obrigatórioEquipamento designado
nominalCapacitynumberobrigatórioCapacidade nominal (peças/h) desta ordem
plannedQuantityintegerobrigatórioQuantidade planejada (≥ 1)
plannedStartstring (ISO date)obrigatórioInício planejado
plannedEndstring (ISO date)obrigatórioFim planejado
plannedAvailabilityinteger (1–100)obrigatórioMeta de disponibilidade %
plannedPerformanceinteger (1–100)obrigatórioMeta de performance %
plannedQualityinteger (1–100)obrigatórioMeta de qualidade %
observationstringobrigatórioObservações da ordem
clientstringopcionalCliente da ordem
valuenumber (2 casas)opcionalValor da produção
rowsnumberopcionalCarreiras (produtos impressos)
activebooleanopcionalStatus inicial
PATCH /productions/:id Atualizar produção 🔒 JWT
Atualização parcial com os mesmos campos do POST, todos opcionais. Resposta 200: a Produção atualizada.
PATCH /productions/start/:id Iniciar / retomar produção 🔒 JWT
Coloca a ordem em RUNNING. O equipamento passa a contabilizar contagens desta ordem e o evento {equipmentId}/UPDATE_EQUIPMENT_PRODUCT é emitido via WebSocket para os dashboards. Resposta 200: a Produção com status: "RUNNING".
PATCH /productions/pause/:id Pausar produção 🔒 JWT
Coloca a ordem em PAUSED, preservando o tempo de execução acumulado. Resposta 200: a Produção com status: "PAUSED".
PATCH /productions/finalize/:id Finalizar produção 🔒 JWT
Encerra a ordem de produção e consolida os totais produzidos. Resposta 200: a Produção com status: "FINISHED" e endTime preenchido.
DELETE /productions/:id Excluir produção 🔒 JWT
Exclusão lógica da ordem de produção. Resposta 200: a Produção com active: false.
Paradas
GET /stops Listar paradas 🔒 JWT
Lista paginada das paradas registradas. Paradas são criadas automaticamente pelo pipeline MQTT quando o equipamento para de produzir.
Query Parameters
ParâmetroTipoStatusDescrição
filter[equipmentIds][]string[] (UUID)opcionalEquipamentos
filter[productionIds][]string[] (UUID)opcionalProduções
filter[shiftIds][]string[] (UUID)opcionalTurnos
filter[motiveIds][]string[] (UUID)opcionalMotivos de parada
filter[stopMotiveGroupIds][]string[] (UUID)opcionalGrupos de motivo
filter[productIds][]string[] (UUID)opcionalProdutos
filter[productionStatus][]enum[]opcionalStatus da produção associada
filter[start] / filter[end]string (ISO date)opcionalPeríodo de início das paradas
pagination / orderopcionalPaginação e ordenação padrão MES
Resposta 200
{
  "count": 42,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1e01",
      "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
      "startTime": "2025-06-10T14:22:31.000Z",
      "endTime": "2025-06-10T14:41:05.000Z",
      "duration": 1114,
      "motiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07",
      "motiveType": "UNPLANNED",
      "stopMotive": {
        "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07",
        "name": "Quebra mecânica",
        "color": "#EF4444",
        "type": "UNPLANNED",
        "isSetup": false,
        "isMaintenance": true
      },
      "production": {
        "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
        "name": "OP-2025-0612",
        "product": { "name": "Rótulo Refrigerante 2L" },
        "equipment": { "name": "Impressora Flexo 01" }
      }
    }
  ]
}

duration em segundos, recortada ao período filtrado. motiveId/stopMotive vêm null em paradas ainda não classificadas.

PATCH /stops/break/:equipmentId Encerrar parada aberta 🔒 JWT
Encerra manualmente a parada em aberto do equipamento. Emite {equipmentId}/STOP_FINALIZE via WebSocket. Resposta 200: a parada encerrada, com endTime preenchido.
Body · application/json
CampoTipoStatusDescrição
finalizeSetupbooleanopcionalIndica que o setup foi concluído junto com a quebra da parada
PATCH /stops/classify/:equipmentId/:stopId Classificar parada 🔒 JWT
Atribui um motivo a uma parada. Emite {equipmentId}/STOP_CLASSIFY via WebSocket para atualizar os dashboards. Resposta 200: a parada com motiveId e motiveType atualizados.
Body · application/json
CampoTipoStatusDescrição
motiveIdstring (UUID)obrigatórioMotivo de parada atribuído
observationstringopcionalObservação do classificador
Motivos de Parada
GET /stop-motives Listar motivos de parada 🔒 JWT
Lista os motivos de parada da empresa, no formato { count, rows }.
Resposta 200
{
  "count": 12,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "stopMotiveGroupId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c90",
      "name": "Quebra mecânica",
      "type": "UNPLANNED",
      "isSetup": false,
      "isMaintenance": true,
      "color": "#EF4444",
      "active": true,
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "createdAt": "2025-01-15T10:00:00.000Z",
      "updatedBy": null,
      "updatedAt": null
    }
  ]
}
Query Parameters
ParâmetroTipoStatusDescrição
namestringopcionalFiltro por nome
typeenumopcionalPLANNED · UNPLANNED · MICROSTOP
isSetupbooleanopcionalSomente motivos de setup
isMaintenancebooleanopcionalSomente motivos de manutenção
stopMotiveGroupIdstring (UUID)opcionalGrupo de motivos
activebooleanopcionalStatus ativo/inativo
GET /stop-motives/:id Buscar motivo por ID 🔒 JWT
Retorna um motivo de parada. Resposta 200: objeto Motivo — mesma estrutura dos itens de GET /stop-motives.
POST /stop-motives Criar motivo de parada 🔒 JWT
Cadastra um motivo. O tipo define como a parada impacta o OEE: PLANNED não penaliza disponibilidade; UNPLANNED penaliza; MICROSTOP impacta performance. Resposta 200: o Motivo criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do motivo
typeenumobrigatórioPLANNED · UNPLANNED · MICROSTOP
isSetupbooleanobrigatórioMotivo de setup/troca
isMaintenancebooleanobrigatórioMotivo de manutenção (alimenta MTTR/MTBF)
colorstring (hexa)obrigatórioCor de exibição
stopMotiveGroupIdstring (UUID)opcionalGrupo do motivo
activebooleanopcionalStatus inicial
PATCH /stop-motives/:id Atualizar motivo 🔒 JWT
Atualização parcial com os mesmos campos do POST, todos opcionais. Resposta 200: o Motivo atualizado.
Grupos de Motivo de Parada
GET /stop-motive-groups Listar grupos de motivo 🔒 JWT
Retorna os grupos de motivo de parada da empresa ativa, no formato { count, rows }.
Resposta 200
{
  "count": 4,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c90",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "name": "Mecânica",
      "color": "#F59E0B",
      "active": true,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null
    }
  ]
}
GET /stop-motive-group/:id Buscar grupo por ID 🔒 JWT
Retorna um grupo de motivos de parada. Resposta 200: objeto Grupo — mesma estrutura dos itens de GET /stop-motive-groups.
POST /stop-motive-group Criar grupo de motivo 🔒 JWT
Cria um grupo para agregar motivos nos relatórios (ex. Mecânica, Elétrica, Processo). Resposta 200: o Grupo criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do grupo
colorstring (hexa)obrigatórioCor de exibição
activebooleanobrigatórioStatus do grupo
PATCH /stop-motive-group/:id Atualizar grupo de motivo 🔒 JWT
Atualização parcial — name, color e active opcionais. Resposta 200: o Grupo atualizado.
Equipamento × Motivo de Parada
GET /equipment-stop-motives Listar vínculos 🔒 JWT
Lista quais motivos de parada estão habilitados em cada equipamento — controla o que o operador vê na hora de classificar.
Query Parameters
ParâmetroTipoStatusDescrição
equipmentIdstring (UUID)opcionalFiltrar por equipamento
stopMotiveIdstring (UUID)opcionalFiltrar por motivo
stopMotiveNamestringopcionalNome do motivo
typeenumopcionalTipo do motivo
isQuickbooleanopcionalSomente classificação rápida
Resposta 200
{
  "count": 28,
  "rows": [
    {
      "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "stopMotiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07",
      "isQuick": true,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null,
      "equipment": { "…objeto Equipamento completo…" },
      "stopMotive": { "…objeto Motivo de Parada completo…" }
    }
  ]
}
GET /equipment-stop-motives/:equipmentId/:stopMotiveId Buscar vínculo 🔒 JWT
Retorna a relação equipamento × motivo pela chave composta. Resposta 200: objeto do vínculo — mesma estrutura dos itens de GET /equipment-stop-motives.
POST /equipment-stop-motives Vincular motivo a equipamento 🔒 JWT
Habilita um motivo de parada em um equipamento. Resposta 200: o vínculo criado.
Body · application/json
CampoTipoStatusDescrição
equipmentIdstring (UUID)obrigatórioEquipamento
stopMotiveIdstring (UUID)obrigatórioMotivo de parada
isQuickbooleanopcionalExibe como botão de classificação rápida (padrão false)
PATCH /equipment-stop-motives/:equipmentId/:stopMotiveId Atualizar vínculo 🔒 JWT
Atualiza a flag isQuick do vínculo. Resposta 200: o vínculo atualizado.
DELETE /equipment-stop-motives/:equipmentId/:stopMotiveId Remover vínculo 🔒 JWT
Desabilita o motivo de parada no equipamento. Resposta 200: o vínculo removido.
Descartes
GET /discards/:productionId Descartes de uma produção 🔒 JWT
Lista os descartes (refugos) registrados em uma ordem de produção, como array direto. Descartes reduzem a Qualidade no cálculo do OEE.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f01",
    "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
    "shiftId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10",
    "discardMotiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f90",
    "multiplier": 1,
    "total": 35,
    "discardMetricId": null,
    "observation": "Falha de impressão",
    "createdAt": "2025-06-12T09:31:00.000Z",
    "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
    "updatedAt": null,
    "updatedBy": null
  }
]
POST /discards Registrar descarte 🔒 JWT
Registra um descarte em uma produção. Emite {equipmentId}/DISCARD_UPDATE via WebSocket. Resposta 200: o Descarte criado — mesma estrutura dos itens de GET /discards/:productionId.
Body · application/json
CampoTipoStatusDescrição
productionIdstring (UUID)obrigatórioProdução onde ocorreu o descarte
totalinteger (≥ 1)obrigatórioQuantidade descartada
discardMotiveIdstring (UUID)obrigatórioMotivo do descarte
equipmentIdstring (UUID)opcionalEquipamento de origem
metricIdstring (UUID)opcionalUnidade de medida do descarte
multipliernumberopcionalMultiplicador de conversão
observationstringopcionalObservação
Motivos de Descarte
GET /discard-motives Listar motivos de descarte 🔒 JWT
Lista os motivos de descarte no formato { count, rows }. Aceita name como filtro, além de pagination/order.
Resposta 200
{
  "count": 6,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f90",
      "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
      "name": "Falha de impressão",
      "active": true,
      "createdAt": "2025-01-15T10:00:00.000Z",
      "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
      "updatedAt": null,
      "updatedBy": null
    }
  ]
}
GET /discard-motives/:id Buscar motivo por ID 🔒 JWT
Retorna um motivo de descarte. Responde 404 se não encontrado. Resposta 200: objeto Motivo — mesma estrutura dos itens de GET /discard-motives.
POST /discard-motives Criar motivo de descarte 🔒 JWT
Cadastra um motivo de descarte. Resposta 200: o Motivo criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do motivo
activebooleanopcionalStatus inicial
PATCH /discard-motives/:id Atualizar motivo 🔒 JWT
Atualização parcial — name e active opcionais. Resposta 200: o Motivo atualizado.
Turnos
GET /shifts Listar turnos 🔒 JWT
Retorna os turnos da empresa ativa, como array direto. tzOffset é o offset de fuso em minutos (padrão −180 = UTC−3).
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10",
    "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
    "name": "Turno A",
    "startTime": 360,
    "duration": 480,
    "tzOffset": -180,
    "firstShift": true,
    "active": true,
    "createdAt": "2025-01-15T10:00:00.000Z",
    "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
    "updatedAt": null,
    "updatedBy": null
  }
]
GET /shifts/:id Buscar turno por ID 🔒 JWT
Retorna um turno. Resposta 200: objeto Turno — mesma estrutura dos itens de GET /shifts.
POST /shifts Criar turno 🔒 JWT
Cadastra um turno. Horários são expressos em minutos do dia (0–1439). Resposta 200: o Turno criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do turno, ex. Turno A
startTimeinteger (0–1439)obrigatórioInício em minutos — 360 = 06:00
durationinteger (≥ 1)obrigatórioDuração em minutos — 480 = 8h
firstShiftbooleanopcionalMarca o turno que abre o dia produtivo
Requisição
{
  "name": "Turno A",
  "startTime": 360,
  "duration": 480,
  "firstShift": true
}
PATCH /shifts/:id Atualizar turno 🔒 JWT
Atualização parcial com os mesmos campos do POST, todos opcionais. Resposta 200: o Turno atualizado.
Planejamento Operacional
GET /plannings/operational Listar planos operacionais 🔒 JWT
Retorna os planos operacionais da empresa — a grade semanal de turnos e paradas planejadas aplicada aos equipamentos pelo scheduler. A resposta é um array de Equipamentos ativos, cada um com suas grades embutidas.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
    "name": "Impressora Flexo 01",
    "…demais campos do Equipamento…": "…",
    "equipmentShiftPlan": [
      {
        "id": "01932e4a-…",
        "equipmentId": "01932e4a-…",
        "shiftId": "01932e4a-…",
        "dayOfWeek": 1,
        "active": true,
        "shift": { "…objeto Turno completo…" }
      }
    ],
    "equipmentStopPlan": [
      {
        "id": "01932e4a-…",
        "equipmentId": "01932e4a-…",
        "stopMotiveId": "01932e4a-…",
        "dayOfWeek": 1,
        "startTime": 720,
        "duration": 60,
        "tzOffset": -180,
        "active": true,
        "stopMotive": { "…objeto Motivo de Parada completo…" }
      }
    ]
  }
]
GET /plannings/operational/:id Buscar plano por ID 🔒 JWT
Retorna um plano operacional com sua grade de turnos e paradas planejadas. Resposta 200: mesma estrutura dos itens de GET /plannings/operational.
POST /plannings/operational Criar plano operacional 🔒 JWT
Define a grade semanal de um conjunto de equipamentos. dayOfWeek vai de 0 (domingo) a 6 (sábado); horários em minutos do dia. Resposta 200: o plano criado com as grades persistidas.
Body · application/json
CampoTipoStatusDescrição
equipmentIdsstring[] (UUID)obrigatórioEquipamentos cobertos pelo plano
shiftPlanobject[]obrigatórioItens { dayOfWeek, shiftId }
stopPlanobject[]obrigatórioItens { dayOfWeek, startTime, duration, motiveId }
Requisição
{
  "equipmentIds": ["01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b"],
  "shiftPlan": [
    { "dayOfWeek": 1, "shiftId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10" }
  ],
  "stopPlan": [
    { "dayOfWeek": 1, "startTime": 720, "duration": 60, "motiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c20" }
  ]
}
Perfis de Acesso
GET /profiles Listar perfis 🔒 JWT
Lista os perfis de acesso da empresa, como array direto. Filtros: id, name, active.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10",
    "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
    "name": "Supervisor",
    "createdAt": "2025-01-15T10:00:00.000Z",
    "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
    "updatedAt": null,
    "updatedBy": null
  }
]
GET /profiles/permissions Listar permissões disponíveis 🔒 JWT
Retorna as permissões do perfil do usuário autenticado, como array de strings — usado pelo frontend para montar o menu conforme o acesso.
Resposta 200
[
  "EQUIPMENT_READ",
  "PRODUCTION_WRITE",
  "STOP_CLASSIFY",
  "…"
]
GET /profiles/:id Buscar perfil por ID 🔒 JWT
Retorna um perfil com sua lista de permissões achatada em array de strings.
Resposta 200
{
  "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10",
  "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00",
  "name": "Supervisor",
  "createdAt": "2025-01-15T10:00:00.000Z",
  "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55",
  "updatedAt": null,
  "updatedBy": null,
  "permissions": ["EQUIPMENT_READ", "PRODUCTION_WRITE", "…"]
}
POST /profiles Criar perfil 🔒 JWT
Cria um perfil de acesso. Resposta 200: o Perfil criado.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome do perfil
permissionsenum[]opcionalPermissões do catálogo /profiles/permissions
PATCH /profiles/:id Atualizar perfil 🔒 JWT
Atualiza nome e permissões do perfil. Resposta 200: o Perfil atualizado.
Usuários MES
GET /users Listar usuários MES 🔒 JWT
Lista os usuários da empresa com seus perfis MES. Internamente combina dados do serviço Auth com os perfis locais. Filtros: name, active.
Resposta 200
{
  "count": 12,
  "rows": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "name": "João Operador",
      "login": "operador01",
      "email": "joao@empresa.com",
      "active": true,
      "userProfile": {
        "userId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
        "profileId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10",
        "profile": { "id": "01932e4a-…", "name": "Operador", "…": "…" }
      }
    }
  ]
}
GET /users/:id Buscar usuário MES por ID 🔒 JWT
Retorna um usuário com perfil e restrições de equipamento. Resposta 200: mesma estrutura dos itens de GET /users.
POST /users Criar usuário MES 🔒 JWT
Cria o usuário no Auth e vincula o perfil MES em uma única chamada. Resposta 200: o usuário criado com o vínculo de perfil.
Body · application/json
CampoTipoStatusDescrição
namestringobrigatórioNome completo
loginstringobrigatórioLogin único
passwordstring (mín 6)obrigatórioSenha inicial
userProfileIdstring (UUID)obrigatórioPerfil de acesso MES
emailstring (email)opcionalE-mail
PATCH /users/:id Atualizar usuário MES 🔒 JWT
Atualização parcial: name, login, password, email, userProfileId e equipmentIds[] (restrição de equipamentos visíveis ao usuário). Resposta 200: o usuário atualizado.
PATCH /users/restore/:id Restaurar usuário MES 🔒 JWT
Reativa um usuário previamente excluído. Resposta 200: o usuário com active: true.
DELETE /users/:id Excluir usuário MES 🔒 JWT
Exclusão lógica do usuário na empresa ativa. Resposta 200: o usuário com active: false.
Dashboards & Configurações
GET /dashboards/op/:id Dashboard operacional 🔒 JWT
Snapshot completo do dashboard do operador para um equipamento: produção corrente, contadores, parada aberta e estado do coletor. Após a carga inicial, as atualizações chegam via WebSocket (COUNT_UPDATE, STOP_CREATE, etc.).
Path Parameters
ParâmetroTipoStatusDescrição
idstring (UUID)obrigatórioID do equipamento
Resposta 200
{
  "serverTime": "2025-06-12T13:12:00.000Z",
  "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
  "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
  "name": "OP-2025-0612",
  "startTime": "2025-06-12T06:04:12.000Z",
  "lastPlay": "2025-06-12T13:10:00.000Z",
  "pastExecutionTime": 18450,
  "nominalCapacity": 1200,
  "plannedQuantity": 10000,
  "plannedStart": "2025-06-12T06:00:00.000Z",
  "plannedEnd": "2025-06-12T22:00:00.000Z",
  "cycleTime": 3.0,
  "product": {
    "id": "01932e4a-…",
    "code": "ROT-2L-001",
    "name": "Rótulo Refrigerante 2L",
    "metric": { "code": "PÇ", "name": "Peças" }
  },
  "equipment": { "collectorMac": "A0:B1:C2:D3:E4:F5", "hourmeter": 152340 },
  "equipmentProduct": {
    "multiplierFactor": 4,
    "divideFactor": 1,
    "microStopInit": 10,
    "microStopEnd": 120,
    "visualAlert": true,
    "soundAlert": false,
    "firstAlert": 30,
    "secondAlert": 90,
    "perBar": null
  },
  "counters": [ { "hour": "2025-06-12T13:00:00.000Z", "count": 1180 } ],
  "slices":   [ "…fatias de produção do turno…" ],
  "stops":    [ "…paradas da produção corrente…" ],
  "discards": [ "…descartes da produção corrente…" ]
}

Retorna null quando o equipamento não tem produção corrente.

GET /dashboards/manager Dashboard gerencial 🔒 JWT
Visão consolidada de múltiplos equipamentos (status, produção corrente, OEE do turno). Aceita ids[] na query para restringir os equipamentos; também disponível como POST /dashboards/manager com ids no body para listas grandes. A restrição de equipamentos do JWT é aplicada automaticamente.
Resposta 200
[
  {
    "serverTime": "2025-06-12T13:12:00.000Z",
    "…produção corrente do equipamento (mesmos campos do dashboard operacional)…": "…",
    "stops": [
      {
        "id": "01932e4a-…",
        "startTime": "2025-06-12T10:00:00.000Z",
        "endTime": "2025-06-12T10:18:00.000Z",
        "motiveId": "01932e4a-…",
        "stopMotive": { "id": "01932e4a-…", "name": "Troca de bobina", "color": "#F59E0B", "type": "PLANNED", "isSetup": true, "isMaintenance": false }
      }
    ],
    "discards": [ "…descartes da produção corrente…" ]
  }
]
GET /configs Configurações da empresa 🔒 JWT
Retorna as configurações MES da empresa ativa como array de pares chave/valor. Chaves possíveis: FORCE_CLASSIFY, PLAN_END_SETUP, PROD_START_IN_SETUP, ENABLE_ANDONS, SPEED_UNIT, OPERATIONAL_DASH, entre outras.
Resposta 200
[
  { "companyId": "01932e4a-…", "key": "FORCE_CLASSIFY", "value": "true" },
  { "companyId": "01932e4a-…", "key": "SPEED_UNIT", "value": "pçs/h" }
]
📊
Base URL https://api.revolus.dev.br/analytics

Todas as rotas são GET, exigem JWT e compartilham o mesmo conjunto de filtros de período. start e end são obrigatórios (ISO 8601); shiftIds[], equipmentIds[], productIds[] e productionIds[] são opcionais. Respostas são cacheadas em Redis com TTL por rota.

Métricas OEE
GET /oee Componentes do OEE do período 🔒 JWT
Retorna os componentes agregados para o cálculo do OEE no período filtrado — tempo de execução, capacidade nominal, quantidades produzida e descartada, e tempos de parada separados por classificação. Disponibilidade, Performance e Qualidade são derivadas destes valores.
Query Parameters
ParâmetroTipoStatusDescrição
startstring (ISO date)obrigatórioInício do período
endstring (ISO date)obrigatórioFim do período
shiftIds[]string[] (UUID)opcionalTurnos
equipmentIds[]string[] (UUID)opcionalEquipamentos
productIds[]string[] (UUID)opcionalProdutos
productionIds[]string[] (UUID)opcionalProduções
Resposta 200
{
  "executionTime": 25340,
  "nominalCapacity": 1200,
  "doneQuantity": 7850,
  "discardedQuantity": 112,
  "unclassifiedStopTime": 420,
  "plannedStopTime": 3600,
  "unplannedStopTime": 1140
}
GET /hourly Produção e paradas por hora 🔒 JWT
Retorna três séries agrupadas por hora para o período filtrado: counters (contagens de produção), slices (fatias de tempo em produção) e stops (paradas). Base dos gráficos de linha do dia produtivo. Usa os mesmos filtros de /oee.
Resposta 200
{
  "counters": [
    { "total": 1180, "hour": 6 },
    { "total": 1240, "hour": 7 }
  ],
  "slices": [
    { "hour": 0, "duration": 0, "nominalCapacity": 0 },
    { "hour": 6, "duration": 3355, "nominalCapacity": 1118 }
  ],
  "stops": [
    { "hour": 0, "planned": 0, "unplanned": 0, "unclassified": 0 },
    { "hour": 10, "planned": 1080, "unplanned": 420, "unclassified": 0 }
  ]
}

counters traz apenas as horas com produção; slices e stops sempre retornam as 24 horas (índice hour 0–23), com durações em segundos.

GET /stops Histórico de paradas 🔒 JWT
Paradas do período agregadas por motivo — duração total em segundos por motivo, pronto para análises de Pareto. Usa os mesmos filtros de /oee.
Resposta 200
[
  {
    "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07",
    "name": "Quebra mecânica",
    "type": "UNPLANNED",
    "duration": 4230
  },
  {
    "id": null,
    "name": null,
    "type": "UNCLASSIFIED",
    "duration": 860
  }
]

Paradas sem classificação aparecem com id/name nulos e type: "UNCLASSIFIED".

GET /tabulate Dados tabulados de produção 🔒 JWT
Dados de produção tabulados do período — uma linha por produção, combinando PostgreSQL (cadastro) e QuestDB (contadores e paradas). Base das tabelas analíticas e exportações. Usa os mesmos filtros de /oee.
Resposta 200
[
  {
    "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
    "equipment": "Impressora Flexo 01",
    "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01",
    "production": "OP-2025-0612",
    "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30",
    "product": "Rótulo Refrigerante 2L",
    "planned": 10000,
    "value": 12500.00,
    "observation": "Prioridade alta",
    "doneQuantity": 7850,
    "discardedQuantity": 112,
    "executionTime": 25340,
    "nominalCapacity": 1200,
    "unclassifiedStopTime": 420,
    "plannedStopTime": 3600,
    "unplannedStopTime": 1140
  }
]

Tempos em segundos. Produções com status PLANNED ou CANCELED não entram no resultado.

GET /maintenance Indicadores de manutenção (MTTF/MTTR/MTBF) 🔒 JWT
Calcula indicadores de manutenção sobre as paradas classificadas com motivos de manutenção (isMaintenance): MTTF, MTTR e MTBF em horas, consolidados, por equipamento e por falha individual. Usa os mesmos filtros de /oee.
Resposta 200
{
  "summary": {
    "mttf": 46.5,
    "mttr": 1.2,
    "mtbf": 47.7,
    "totalFailures": 14
  },
  "byEquipment": [
    { "name": "Impressora Flexo 01", "mttf": 52.1, "mttr": 0.9, "mtbf": 53.0 }
  ],
  "failures": [
    {
      "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b",
      "equipment": "Impressora Flexo 01",
      "failedAt": "2025-06-10T14:22:31.000Z",
      "repairedAt": "2025-06-10T15:10:05.000Z",
      "mttf": 38.4,
      "mttr": 0.79,
      "cause": "Quebra mecânica"
    }
  ]
}