Owner's Health
loading...
公開 API
このページに出している心拍データは、認証なしの読み取り専用 API としても公開しています。 CORS を許可しているのでブラウザから直接 fetch できます。
Base URL
https://freedomflight.jp/health/v2/api/public
いま返ってくる値
読み込み中GET /latest?type=heart-rate
エンドポイント
| メソッド / パス | 内容 |
|---|---|
| GET /types | 公開中のデータ型一覧と上限値。クライアント側で決め打ちしないで済むように。 |
| GET /latest?type=heart-rate | 最新 1 点。age_seconds 付き。 |
| GET /series?type=heart-rate&minutes=60 | 時系列。既定では間引かずに記録した粒度のまま返します。 |
/series のパラメータ
| 名前 | 既定 | 内容 |
|---|---|---|
| type | heart-rate | データ型。公開対象外を指定すると 404。 |
| minutes | 60 | 終端から遡る分数。最大 1440 (24 時間)。超えると 400。 |
| end | 現在時刻 | 終端 (ISO 8601)。過去を切り出すときに使います。 |
| max_points | 50000 | 指定すると等間隔に間引きます。間引かれたかは truncated で判ります。 |
レスポンス例
$ curl -s 'https://freedomflight.jp/health/v2/api/public/latest?type=heart-rate'
{
"data_type": "heart-rate",
"label": "心拍数",
"unit": "bpm",
"value": 66.0,
"time": "2026-08-27T03:59:43Z", // UTC
"age_seconds": 465 // seconds since the sample was taken
}
$ curl -s 'https://freedomflight.jp/health/v2/api/public/series?type=heart-rate&minutes=60'
{
"data_type": "heart-rate",
"label": "心拍数",
"unit": "bpm",
"start": "2026-08-27T03:07:28Z",
"end": "2026-08-27T04:07:28Z",
"count": 1433,
"truncated": false, // true = decimated by max_points
"points": [
{ "t": "2026-08-27T03:07:30Z", "v": 61.0 },
{ "t": "2026-08-27T03:07:33Z", "v": 62.0 },
...
]
}
解像度と鮮度
Fitbit Charge 6 が記録した粒度をそのまま保存しているので、心拍は 中央値 2-3 秒間隔 (1 日あたり約 36,000 点) で取り出せます。
ただしリアルタイムではありません。 時計 → スマートフォン → Google クラウドの同期が挟まるため、最新の点でも 数分〜十数分前のものです。時計がスマートフォンと離れているとき (就寝中など) は数時間空くこともあります。この遅延はデータ提供元の都合で、 こちら側では短縮できません。
そのため minutes=5 のような短い窓を指定すると
count が 0 になることが普通にあります。
「今の値」が欲しい場合は /latest を使い、
age_seconds を見て古さを判断してください。
minutes は 30 以上を推奨します。
制限
- IP あたり 60 リクエスト / 分。超えると 429 と
Retry-Afterを返します。 - 1 回のリクエストで最大 24 時間分 / 50,000 点。
- 公開しているのは 心拍のみです (
/typesで確認できます)。 他のデータ型は 404 になります。 - 読み取り専用です。書き込み系のメソッドはありません。
使用例
// Browser (CORS enabled)
const r = await fetch(
'https://freedomflight.jp/health/v2/api/public/series?type=heart-rate&minutes=60');
const { points, unit } = await r.json();
console.log(points.length, unit); // 1433 'bpm'
# Python
import urllib.request, json
BASE = "https://freedomflight.jp/health/v2/api/public"
with urllib.request.urlopen(f"{BASE}/latest?type=heart-rate") as r:
d = json.load(r)
print(f"{d['value']:.0f} {d['unit']} ({d['age_seconds'] // 60} min ago)")
# Last 6 hours decimated to 5-minute granularity
url = f"{BASE}/series?type=heart-rate&minutes=360&max_points=72"
with urllib.request.urlopen(url) as r:
s = json.load(r)
print(s["count"], "points", "decimated" if s["truncated"] else "as recorded")
実装は GoogleHealthCollector (Google Health API v4 から 42 データ型を収集・蓄積)。このページの心拍パネルとは別系統で、 公開しているのはそのうち心拍だけです。