FFS Discord に参加しませんか? — サーバー起動・音声・イベントの連絡はこちらで 参加する →

DCS World Dedicated Server Community

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 のパラメータ

名前既定内容
typeheart-rate データ型。公開対象外を指定すると 404。
minutes60 終端から遡る分数。最大 1440 (24 時間)。超えると 400。
end現在時刻 終端 (ISO 8601)。過去を切り出すときに使います。
max_points50000 指定すると等間隔に間引きます。間引かれたかは 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 以上を推奨します。

制限

使用例

// 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 データ型を収集・蓄積)。このページの心拍パネルとは別系統で、 公開しているのはそのうち心拍だけです。