Referência

Convenções e erros

As regras que se aplicam a todos os endpoints, para só ter de as aprender uma vez.

Paginação

Os endpoints de listagem recebem page (a começar em 1) e pageSize (1–100, por omissão 30) como parâmetros de query e envolvem os resultados num envelope:

{
  "items": [ … ],
  "pageNumber": 2,
  "totalPages": 9,
  "totalCount": 174,
  "hasPreviousPage": true,
  "hasNextPage": true
}

Os enums são strings em camelCase

Os valores enum são sempre strings em camelCase, nunca inteiros: "pounds", "kilometers", "oneRepMax", "chest", "normal". Trate valores enum desconhecidos como compatíveis com versões futuras: podem surgir novos sem mudança de versão.

Unidades

MedidaUnidade
Peso (séries, recordes)Libras
DistânciaMetros
Duração de série / recordeSegundos
Duração do treinoMinutos (durationMinutes)
Medições corporaisO sistema de unidades indicado pelo weightUnit do registo (polegadas com libras, centímetros com quilogramas)

As unidades de apresentação preferidas do utilizador estão em /api/v1/user. Converta na fronteira da sua app, não no armazenamento.

Identificadores

  • Dados de utilizador (treinos, templates, splits, medições): GUIDs estáveis
  • Dados de catálogo (exercícios, equipamento): ids inteiros estáveis partilhados com a app Gravl
  • O utilizador: um id string opaco, estável em todos os endpoints e tokens

Datas

Todos os timestamps são UTC, ISO 8601 (2026-07-12T17:03:00Z). Os filtros de intervalo de datas (startDate, endDate) são inclusivos.

Limites de pedidos

SuperfícieLimiteChave
/api/v1/*100 pedidos / 15 minapp + utilizador
/oauth/*10 pedidos / minendereço IP

Exceder um limite devolve 429 com um cabeçalho Retry-After quando disponível. Recue exponencialmente e evite polling: a maioria dos dados pessoais muda a ritmo humano.

Erros

EstadoQuandoCorpo
401Token em falta, malformado, expirado ou revogado; app suspensaVazio (challenge WWW-Authenticate)
403Token válido, scope em faltaProblem details com o scope em falta identificado
404O recurso não existe ou pertence a outro utilizadorProblem details
429Limite de pedidos excedidoVazio; cabeçalho Retry-After
400Falha de validação (pageSize inválido, parâmetros malformados)Problem details com erros por campo
Problem details (RFC 7807)
{
  "status": 403,
  "title": "Missing scope",
  "detail": "This authorization is missing the 'measurements:read' scope."
}

Note a regra do 404 para dados alheios: pedir o treino de outro utilizador por id devolve 404, não 403. A API nunca confirma a existência de dados que não pode ver.