{"openapi":"3.1.0","info":{"title":"Hackathon BEM — API Sandbox","description":"API intermediária que dá acesso controlado aos dados de sensores no InfluxDB, sem expor o token do sistema. Autentique com o header `X-API-Key`. Comece por `GET /api/v1/sensors`. Documentação amigável na raiz `/`.","version":"1.0.0"},"paths":{"/api/v1/groups":{"get":{"tags":["sensors"],"summary":"Listar grupos com seus sensores","description":"Lista os grupos e, dentro de cada um, os sensores que pertencem a ele.","operationId":"list_groups_api_v1_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupsResponse"}}}}}}},"/api/v1/sensors":{"get":{"tags":["sensors"],"summary":"Listar grupos e sensores","description":"Lista os grupos e sensores. Use `type` e/ou `group` para filtrar.","operationId":"list_sensors_api_v1_sensors_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtra por tipo: energia, temperatura, porta.","title":"Type"},"description":"Filtra por tipo: energia, temperatura, porta."},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtra por grupo: ex. extrusao, camara_congelados.","title":"Group"},"description":"Filtra por grupo: ex. extrusao, camara_congelados."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/data":{"get":{"tags":["data"],"summary":"Consultar leituras do sensor","operationId":"get_data_api_v1_data_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"sensor","in":"query","required":true,"schema":{"type":"string","description":"ID do sensor (ver GET /sensors).","title":"Sensor"},"description":"ID do sensor (ver GET /sensors)."},{"name":"start","in":"query","required":false,"schema":{"type":"string","description":"Início: 'now', relativo ('-1h','-7d') ou RFC3339.","default":"-1h","title":"Start"},"description":"Início: 'now', relativo ('-1h','-7d') ou RFC3339."},{"name":"stop","in":"query","required":false,"schema":{"type":"string","description":"Fim: 'now', relativo ou RFC3339.","default":"now","title":"Stop"},"description":"Fim: 'now', relativo ou RFC3339."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Máximo de leituras retornadas.","default":1000,"title":"Limit"},"description":"Máximo de leituras retornadas."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Verificação de saúde","description":"Retorna o status do serviço e se está operando em modo demo.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"DataResponse":{"properties":{"sensor":{"type":"string","title":"Sensor"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"type":{"type":"string","title":"Type"},"label":{"type":"string","title":"Label"},"demo_mode":{"type":"boolean","title":"Demo Mode"},"fields":{"items":{"type":"string"},"type":"array","title":"Fields"},"count":{"type":"integer","title":"Count"},"points":{"items":{"type":"object"},"type":"array","title":"Points"}},"type":"object","required":["sensor","group","type","label","demo_mode","fields","count","points"],"title":"DataResponse"},"GroupDetailOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"sensors":{"items":{"$ref":"#/components/schemas/SensorOut"},"type":"array","title":"Sensors"}},"type":"object","required":["id","label","description","sensors"],"title":"GroupDetailOut"},"GroupOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"sensors":{"items":{"type":"string"},"type":"array","title":"Sensors"}},"type":"object","required":["id","label","description","sensors"],"title":"GroupOut"},"GroupsResponse":{"properties":{"count":{"type":"integer","title":"Count"},"demo_mode":{"type":"boolean","title":"Demo Mode"},"groups":{"items":{"$ref":"#/components/schemas/GroupDetailOut"},"type":"array","title":"Groups"}},"type":"object","required":["count","demo_mode","groups"],"title":"GroupsResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SensorOut":{"properties":{"id":{"type":"string","title":"Id"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"type":{"type":"string","title":"Type"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status"},"note":{"type":"string","title":"Note"},"fields":{"items":{"type":"string"},"type":"array","title":"Fields"}},"type":"object","required":["id","group","type","label","status","note","fields"],"title":"SensorOut"},"SensorTypeOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","label","description"],"title":"SensorTypeOut"},"SensorsResponse":{"properties":{"count":{"type":"integer","title":"Count"},"demo_mode":{"type":"boolean","title":"Demo Mode"},"types":{"items":{"$ref":"#/components/schemas/SensorTypeOut"},"type":"array","title":"Types"},"groups":{"items":{"$ref":"#/components/schemas/GroupOut"},"type":"array","title":"Groups"},"sensors":{"items":{"$ref":"#/components/schemas/SensorOut"},"type":"array","title":"Sensors"}},"type":"object","required":["count","demo_mode","types","groups","sensors"],"title":"SensorsResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"tags":[{"name":"meta","description":"Página inicial e verificação de saúde."},{"name":"sensors","description":"Catálogo de tópicos/sensores (público)."},{"name":"data","description":"Consulta de séries temporais (requer X-API-Key)."}]}