Nesta página
telo · Personal API · Pro

Seus dados do Apple Health, por REST.

Leia seu próprio histórico sincronizado em painéis, scripts e agentes. Seis endpoints de leitura, incluídos na assinatura telo Pro paga e ativa.

Schemas completos de parâmetros e respostas (OpenAPI 3.1)

Faça sua primeira chamada

  1. Assine o Pro no app telo para iPhone em Account → Plan e sincronize seu histórico.
  2. Abra Conta no painel web e crie uma chave para seu projeto. Guarde-a agora: o segredo completo aparece uma única vez.
  3. Defina TELO_API_KEY no ambiente do seu servidor ou terminal local e execute a chamada abaixo.
curl --fail-with-body 'https://telo.health/api/v1/list_metrics' \
  -H "Authorization: Bearer $TELO_API_KEY"

Autenticação

Envie Authorization: Bearer <chave> em cada chamada. Cada chave lê apenas a própria conta. Guarde-a no servidor ou computador, nunca no código do navegador, num repositório público ou numa URL. Cookies e tokens do iPhone não autenticam esta API.

Crie até cinco chaves e revogue o acesso de cada projeto em Conta. A revogação continua disponível após o Pro expirar. A API exige Pro pago inclusive para contas fundadoras; reembolsos e mudanças da assinatura seguem o cache de cobrança existente, de até 15 minutos, invalidado pelo webhook.

Gerenciar chaves da API

Endpoints

URL base: https://telo.health/api/v1. Todos os endpoints usam GET e devolvem o mesmo JSON da tool de leitura do MCP, sem o envelope MCP. Datas usam YYYY-MM-DD. Listas usam vírgulas; booleanos usam true ou false. Parâmetros desconhecidos ou repetidos são recusados.

GET /data_status

Confira cobertura, progresso da importação e última sincronização antes de interpretar registros ausentes.

Obrigatórios
Nenhum
Opcionais
Nenhum
curl --fail-with-body 'https://telo.health/api/v1/data_status' \
  -H "Authorization: Bearer $TELO_API_KEY"

GET /list_metrics

Descubra nomes, unidades e intervalos das métricas disponíveis na sua conta.

Obrigatórios
Nenhum
Opcionais
Nenhum
curl --fail-with-body 'https://telo.health/api/v1/list_metrics' \
  -H "Authorization: Bearer $TELO_API_KEY"

GET /query_daily

Leia valores diários ou agregue por semana ou mês. Períodos sem dados não aparecem; não são zero.

Obrigatórios
metrics, from, to
Opcionais
granularity=day|week|month
curl --fail-with-body 'https://telo.health/api/v1/query_daily?metrics=steps&from=2026-11-01&to=2026-11-08&granularity=day' \
  -H "Authorization: Bearer $TELO_API_KEY"

GET /sessions

Liste noites de sono ou treinos. Filtros de treino e agrupamento semanal exigem kind=workout.

Obrigatórios
kind=sleep|workout, from, to
Opcionais
activity, granularity=session|week, max_hr
curl --fail-with-body 'https://telo.health/api/v1/sessions?kind=workout&from=2026-11-01&to=2026-11-08' \
  -H "Authorization: Bearer $TELO_API_KEY"

GET /workout_detail

Leia o resumo de um treino, eventos e séries disponíveis. Use um UUID devolvido por sessions.

Obrigatórios
uuid
Opcionais
metrics, offset, event_offset, limit, max_hr, wall_tolerance_s
curl --fail-with-body 'https://telo.health/api/v1/workout_detail?uuid=WORKOUT_UUID&limit=500' \
  -H "Authorization: Bearer $TELO_API_KEY"

GET /derived_metrics

Leia carga de treino por duração e médias pessoais de VFC e FC de repouso. Caminhada fica fora por padrão.

Obrigatórios
from, to
Opcionais
baseline_days=30..60 (60), include_walking=false, include_trimp=false, max_hr
curl --fail-with-body 'https://telo.health/api/v1/derived_metrics?from=2026-11-01&to=2026-11-08&include_trimp=true' \
  -H "Authorization: Bearer $TELO_API_KEY"

Exemplos de código

Os exemplos leem apenas o catálogo. A chave fica no ambiente, não no arquivo de código. Trate erros HTTP antes de usar a resposta.

Python

import json
import os
from urllib.request import Request, urlopen

request = Request(
    "https://telo.health/api/v1/list_metrics",
    headers={"Authorization": "Bearer " + os.environ["TELO_API_KEY"]},
)
# urlopen raises HTTPError for non-success responses.
with urlopen(request, timeout=30) as response:
    catalog = json.load(response)
print(catalog)

JavaScript (Node.js)

// Node.js, server-side only.
const response = await fetch("https://telo.health/api/v1/list_metrics", {
  headers: { Authorization: `Bearer ${process.env.TELO_API_KEY}` },
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`telo HTTP ${response.status}`);
const catalog = await response.json();
console.log(catalog);

Como ler a resposta

Resposta ilustrativa de query_daily, com dados fictícios:

{
  "rows": [
    {
      "period": "2026-11-01",
      "metric": "steps",
      "unit": "count",
      "value": 8200,
      "aggregation": "sum",
      "days_present": 1,
      "days_expected": 1,
      "period_start": "2026-11-01",
      "period_end": "2026-11-01",
      "daily_min": 8200,
      "daily_max": 8200
    }
  ],
  "truncated": false
}

days_present conta dias com valores guardados; days_expected descreve a cobertura de calendário pedida. Dados ausentes e null não são zero. Preserve as unidades e o offset local dos timestamps. A API lê o que o iPhone enviou; chamá-la não força sincronização. Resumos de treino são permanentes; séries brutas ficam disponíveis por 30 dias. GPS não é incluído.

Limites e paginação

  • 60 chamadas por minuto por conta, somando todas as chaves. Ao receber 429, aguarde os segundos indicados em Retry-After.
  • Até 3.660 dias por consulta de datas, ou 366 em derived_metrics. query_daily aceita até 256 nomes de métricas separados por vírgula.
  • Leituras por data devolvem até 500 linhas. Se truncated for true, descarte a resposta parcial e peça menos métricas ou intervalos menores sem sobreposição, alinhados a semanas/meses completos. Não trate uma média parcial como um período inteiro.
  • workout_detail usa next_offset e next_event_offset separados. Siga os dois independentemente até ambos serem null. Padrões: offset=0, event_offset=0, limit=360; limit vai até 500. metrics= vazio devolve metadados e eventos, sem séries.

Erros

400
Parâmetros, datas ou intervalo inválidos. Confira a referência OpenAPI.
401
Chave pessoal ausente, inválida ou revogada. Crie outra se necessário.
403
A assinatura Pro paga não está ativa. Confira Account → Plan no iPhone.
429
Limite de chamadas atingido. Aguarde os segundos de Retry-After.
500
Erro interno. Tente mais tarde; não interprete a resposta como ausência de dados de saúde.
503
Verificação da assinatura indisponível. Tente mais tarde.