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
/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.
/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.
/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.
/api/v1/auth/logout Termine a sessão atual. Limpa o cookie de sessão e elimina a linha da sessão.
/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.
/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).
/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.
/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).
/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": [...]}} /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.
/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.
/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
/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}
]} /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).
/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} /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).
/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.
/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.
/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.
/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.
/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 IPPOST /api/v1/auth/login— 10 pedidos por 15 minutos por IPPOST /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 grande429— 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.