Referência da API

URL base

https://api.vbatpower.com

Todos os endpoints têm o prefixo /api/v1. A autenticação é feita por cookies de sessão (para clientes de navegador) ou por chaves de API (para clientes MCU/servidor). A API é gratuita e sem limites de utilização para além dos limites de taxa de proteção contra abuso descritos abaixo.

Autenticação

POST /api/v1/auth/register

Crie uma nova conta com email e palavra-passe (mínimo 8 caracteres, máximo 72).

{"email": "user@example.com", "password": "securePassword123"}

Devolve 201 com o objeto de utilizador e define o cookie de sessão. Devolve 409 se o email já existir. Limitado a 5 pedidos / 15 min por IP em produção.

POST /api/v1/auth/login

Inicie sessão com email e palavra-passe.

{"email": "user@example.com", "password": "securePassword123"}

Devolve 200 com o objeto de utilizador e define o cookie de sessão. Devolve 401 com credenciais incorretas. Limitado a 10 pedidos / 15 min por IP em produção.

GET /api/v1/auth/me

Obtenha o utilizador atualmente autenticado. Requer cookie de sessão.

Devolve 200 com o objeto de utilizador contendo os campos id, email, name, role, ou 401 se não autenticado.

POST /api/v1/auth/logout

Termine a sessão atual. Limpa o cookie de sessão e elimina a linha da sessão.

POST /api/v1/auth/logout-all

Revogue todas as sessões do utilizador atual (terminar sessão em todos os dispositivos). Requer cookie de sessão. Devolve 200 com {"status": "ok"}, ou 401 se não autenticado.

GET /api/v1/auth/providers

Liste os fornecedores OAuth atualmente ativados no servidor. Público — não requer autenticação. Devolve {"providers": ["google", "github"]} (o array contém apenas os fornecedores configurados no momento da implementação).

GET /api/v1/auth/oauth/:provider

Redireciona para o início de sessão do fornecedor OAuth. Fornecedores suportados: google, microsoft, github. Após o consentimento, o fornecedor regressa a /api/v1/auth/oauth/:provider/callback, que define o cookie de sessão e redireciona de volta para a aplicação.

Projetos

Todos os endpoints de projetos requerem autenticação (cookie de sessão). Os corpos de projeto podem ter até 2 MB.

GET /api/v1/projects

Liste todos os projetos do utilizador autenticado, ordenados pela última atualização. Devolve id, name, description, tags e marcas temporais (não o blob data completo).

POST /api/v1/projects

Crie um novo projeto. name é obrigatório (máx. 255 caracteres); description (máx. 4096 caracteres), tags (array de até 50 cadeias, cada uma até 64 caracteres) e data são opcionais. Devolve 201.

{"name": "Sensor Node", "data": {"batteries": [...]}}
GET /api/v1/projects/:id

Obtenha um projeto por ID (devolve os dados completos, incluindo baterias). Devolve 404 se não for encontrado ou não pertencer ao utilizador.

PUT /api/v1/projects/:id

Atualize um projeto. Apenas os campos fornecidos são atualizados (semântica PATCH — os campos omitidos mantêm o seu valor atual). Devolve 404 se o projeto não pertencer ao utilizador.

DELETE /api/v1/projects/:id

Elimine um projeto e todos os dados associados. Devolve 204 em caso de sucesso.

Esquema data do projeto

O campo data contém o modelo do projeto: um objeto com um array batteries. Cada bateria tem um id numérico (o seu índice hierárquico de profundidade 1) e um array components; cada componente tem um id e um array states; cada estado tem um id mais os seus campos de modo de funcionamento. Os valores de id mapeiam diretamente para os IDs de telemetria em notação por pontos (bateria 0 → componente 0.0 → estado 0.0.0).

{
  "name": "Sensor Node",
  "description": "ESP32 + INA219",
  "tags": ["esp32", "lipo"],
  "data": {
    "batteries": [
      {
        "id": 0,
        "name": "18650 cell",
        "voltageMin": 3.0,
        "voltageMax": 4.2,
        "current": 2.5,
        "currentUnit": "Ah",
        "components": [
          {
            "id": 0,
            "name": "ESP32",
            "states": [
              {"id": 0, "name": "Deep Sleep", "alwaysOn": true, "current": 10, "currentUnit": "u"},
              {"id": 1, "name": "Active", "current": 80, "currentUnit": "m", "interval": 60, "intervalUnit": "s", "execTime": 5, "execTimeUnit": "s"}
            ]
          }
        ]
      }
    ]
  }
}

Campos de estado comuns: name, alwaysOn (booleano), current + currentUnit, interval + intervalUnit, execTime + execTimeUnit, e runOnce (booleano). O objeto data é armazenado tal como está, pelo que quaisquer campos produzidos pela aplicação são preservados na ida e volta.

Telemetria

POST /api/v1/telemetry

Carregue registos de telemetria. Requer a chave de API como cabeçalho Authorization: Bearer <key>. Até 10.000 registos por pedido; a chave determina o projeto de destino. Limitado a 60 pedidos / minuto por projeto (devolve 429 quando excedido). Devolve 201 com {"status": "ok", "inserted": N}.

{"records": [
  {"id": "0", "type": "v", "value": 3.28, "unit": "V", "nonce": 1, "runid": 1},
  {"id": "0.0.0", "type": "t", "value": 1523, "unit": "ms", "nonce": 1, "runid": 1},
  {"id": "0.0.0", "type": "v", "value": 12.5, "unit": "mA", "nonce": 1, "runid": 1}
]}
GET /api/v1/telemetry/:projectId

Obtenha registos de telemetria de um projeto. Requer a chave de API como Authorization: Bearer <key>; a chave tem de estar restrita ao projeto solicitado (caso contrário 403).

Os resultados são paginados por cursor id. Parâmetros de consulta: limit (1–1000, predefinição 1000) e cursor (devolver as linhas com id superior a este valor, predefinição 0). A resposta inclui next_cursor — devolva-o como cursor para obter a página seguinte; é null quando não foram devolvidas linhas.

{
  "project_id": 1,
  "records": [
    {"id": 42, "record_id": "0", "record_type": "v", "value": 3.28, "unit": "V", "nonce": 1, "runid": 1, "received_at": "2026-01-01T12:00:00.000Z"}
  ],
  "next_cursor": 42
}

Histórico de Fórmulas

Todos os endpoints de histórico de fórmulas requerem autenticação (cookie de sessão).

POST /api/v1/formulas/history

Guarde um cálculo de fórmula no histórico. formula_id e solve_for são obrigatórios. Devolve 201.

{"formula_id": "ohms-law", "solve_for": "V", "inputs": {"I": 0.5, "R": 100}, "result": 50}
GET /api/v1/formulas/history?limit=50

Obtenha os cálculos de fórmulas recentes, do mais recente primeiro. limit é limitado a 1–500 (predefinição 50).

DELETE /api/v1/formulas/history/:id

Elimine uma única entrada do histórico por ID. Devolve 200 com {"status": "ok"}, ou 404 se a entrada não for encontrada ou não pertencer ao utilizador.

DELETE /api/v1/formulas/history

Limpe todo o histórico de fórmulas do utilizador atual. Devolve 200 com {"status": "ok"}.

Chaves de API

Todos os endpoints de gestão de chaves de API requerem autenticação (cookie de sessão). As chaves são usadas por MCUs e scripts para carregar telemetria sem uma sessão de navegador.

POST /api/v1/keys

Crie uma chave de API restrita a um projeto. project_id é obrigatório; name é opcional (máx. 128 caracteres). Até 50 chaves ativas por utilizador.

{"project_id": 1, "name": "ESP32 Sensor"}

Devolve 201 com a cadeia da chave (com o prefixo vbat_). Guarde-a em segurança — não pode ser recuperada novamente.

GET /api/v1/keys

Liste as chaves de API do utilizador, da mais recente primeiro. Devolve id, project_id, prefixo da chave, name, marca temporal de criação e flag de revogação — nunca a chave completa.

DELETE /api/v1/keys/:id

Revogue uma chave de API por ID. A chave deixa de funcionar imediatamente. Devolve 200 com {"status": "ok"}, ou 404 se a chave não for encontrada ou já tiver sido revogada.

Limites de Taxa

O VBatPower é gratuito e sem quotas de utilização. Os únicos limites são os limites de taxa de proteção contra abuso, aplicados por IP (autenticação) ou por projeto (telemetria) em produção:

  • POST /api/v1/auth/register — 5 pedidos por 15 minutos por IP
  • POST /api/v1/auth/login — 10 pedidos por 15 minutos por IP
  • POST /api/v1/telemetry — 60 pedidos por minuto por projeto

Exceder um limite devolve 429 com o corpo {"error": "Too many requests"}. Os corpos dos pedidos também têm limite: 64 KB para as rotas de autenticação, chaves e histórico de fórmulas; 2 MB para projetos e telemetria. Corpos demasiado grandes devolvem 413 com {"error": "Payload too large"}.

Respostas de Erro

Todos os erros devolvem JSON com um campo error a descrever o problema:

{"error": "Not authenticated"}

Códigos de estado HTTP usados pela API:

  • 400 — pedido inválido (JSON inválido, campo em falta ou malformado)
  • 401 — não autenticado (sessão em falta/expirada ou chave de API inválida)
  • 403 — proibido (chave de API não restrita ao projeto solicitado)
  • 404 — não encontrado (ou não pertencente ao utilizador autenticado)
  • 409 — conflito (email já registado)
  • 413 — payload demasiado grande
  • 429 — demasiados pedidos (limite de taxa excedido)
  • 500 — erro interno

Tutorial de MCU Ponta a Ponta

Isto liga os endpoints para o fluxo típico de hardware: gerar uma chave, criar um projeto, enviar telemetria e lê-la de volta. Todos os pedidos usam o URL base https://api.vbatpower.com.

1. Criar um projeto (sessão de navegador)

Inicie sessão na aplicação, ou chame a API com o seu cookie de sessão:

curl -X POST https://api.vbatpower.com/api/v1/projects \
  -H "Content-Type: application/json" \
  --cookie "session=YOUR_SESSION" \
  -d '{"name":"Sensor Node","data":{"batteries":[{"id":0,"components":[{"id":0,"states":[{"id":0}]}]}]}}'
# -> 201 {"project": {"id": 1, ...}}

2. Gerar uma chave de API para esse projeto

curl -X POST https://api.vbatpower.com/api/v1/keys \
  -H "Content-Type: application/json" \
  --cookie "session=YOUR_SESSION" \
  -d '{"project_id":1,"name":"ESP32 Sensor"}'
# -> 201 {"key": "vbat_xxxxxxxx...", "project_id": 1}
# Copy the key now — it is shown only once.

3. Enviar telemetria do dispositivo via POST (chave Bearer)

Não é necessária sessão nem cookie — a chave autentica o dispositivo e seleciona o projeto. Consulte Integração de MCU para código de Arduino/ESP32/STM32 que produz este pedido.

curl -X POST https://api.vbatpower.com/api/v1/telemetry \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer vbat_xxxxxxxx..." \
  -d '{"records":[
    {"id":"0","type":"v","value":3.28,"unit":"V","nonce":1,"runid":1},
    {"id":"0.0.0","type":"t","value":1523,"unit":"ms","nonce":1,"runid":1},
    {"id":"0.0.0","type":"v","value":12.5,"unit":"mA","nonce":1,"runid":1},
    {"id":"0.0.0","type":"n","value":0,"unit":"ms","nonce":1,"runid":1}
  ]}'
# -> 201 {"status": "ok", "inserted": 4}

4. Verificar se os dados chegaram

Leia-os de volta com a mesma chave, ou abra a página de Gráficos do projeto na aplicação:

curl https://api.vbatpower.com/api/v1/telemetry/1?limit=1000 \
  -H "Authorization: Bearer vbat_xxxxxxxx..."
# -> 200 {"project_id": 1, "records": [...], "next_cursor": 42}
# Page through more rows by passing ?cursor=42 on the next call.