FitExerciseDB APIのレスポンス項目を解説
2026-10-02 · 6 min
FitExerciseDBの種目オブジェクトには16の項目があります。id、name、bodyPart、target、equipmentの5つは必ず含まれ、残り11項目はnullまたは欠落する可能性があるため、クライアントは任意項目として扱うべきです。一覧はdataとpaginationで種目を包み、単一種目の呼び出しでは_linksオブジェクトが加わり、langパラメータはテキスト項目だけを変え、数値は変えません。このページは、GET /v1/exercisesが返すExerciseDB形式のJSONを項目ごとに整理したリファレンスです。
In short
- 1種目16項目:id、name、bodyPart、target、equipmentは必須で、それ以外はnullになりえます。
- idは "0001" のような4桁の文字列です。先頭の0を残すため文字列のまま扱ってください。
- caloriesPerMinuteとaverageCaloriesPerMinuteは同じ保存値で、averageCaloriesPerHourはその値を60倍して丸めたものです。実際のユーザー向けには、体重を付けてカロリーのエンドポイントを呼び出します。
- 一覧は { data, pagination } を返します。ページ数はtotalとpageSizeから自分で計算してください。
- _linksを含むのは単一種目のレスポンスだけです。langパラメータはテキストを翻訳し、数値と列挙値には影響しません。
種目オブジェクトにはどんな項目がありますか?
一覧の中でも単独でも、すべての種目に同じ16項目があります。必須の5項目は、その動きが何で、どの筋肉に効くかを表します。残りはトレーニングとカロリーの詳細です。
| 項目 | 型 | 存在 | 説明 |
|---|---|---|---|
id | string | 常に存在 | "0001" のような4桁。安定した識別子です。 |
name | string | 常に存在 | 種目名。レスポンスの言語で返ります。 |
bodyPart | string | 常に存在 | 10の大まかな部位のうちの1つ。先頭大文字、例: Waist。 |
target | string | 常に存在 | 19の具体的な筋肉のうちの1つ。例: Abs。 |
equipment | string | 常に存在 | 34の固定値のうちの1つ。例: "Body Weight"。 |
category | string | nullの場合あり | strength のような自由形式のラベル。 |
difficulty | string | nullの場合あり | 例: beginner。 |
mechanic | string | nullの場合あり | 例: isolation。 |
force | string | nullの場合あり | 例: push。 |
met | number | nullの場合あり | この動きの代謝当量。例: 3.5。 |
caloriesPerMinute | number | nullの場合あり | 標準的な体重で保存された1分あたりのkcal。 |
averageCaloriesPerMinute | number | nullの場合あり | caloriesPerMinute と同じ値。 |
averageCaloriesPerHour | number | nullの場合あり | caloriesPerMinute を60倍して丸めた値。 |
secondaryMuscles | string[] | nullの場合あり | 補助的に使われる筋肉。レスポンスの言語で返ります。 |
instructions | string[] | nullの場合あり | 順序付きの手順。レスポンスの言語で返ります。 |
language | string | 任意 | このレスポンスの言語コード。 |
bodyPart、target、equipmentの正確な文字列は分類用エンドポイントから取得します。詳しくはAPIドキュメントをご覧ください。
どの項目がnullになりえて、クライアントはどう扱うべきですか?
保証されているのはid、name、bodyPart、target、equipmentだけです。残りの11項目は任意かつnull許容としてモデル化し、空の値が画面上で何を意味するかを項目ごとに決めてください。APIに合ったTypeScriptの型は次のとおりです。
type Exercise = {
id: string; // "0001", keep it a string
name: string;
bodyPart: string;
target: string;
equipment: string;
category?: string | null;
difficulty?: string | null;
mechanic?: string | null;
force?: string | null;
met?: number | null;
caloriesPerMinute?: number | null;
averageCaloriesPerMinute?: number | null;
averageCaloriesPerHour?: number | null;
secondaryMuscles?: string[] | null;
instructions?: string[] | null;
language?: "en" | "fr" | "es" | "pt" | "zh" | "ja";
};現在のデータでは、1324件すべての種目で16項目すべてに値がありますが、スキーマ上はnullが許されるため、これに頼らないでください。
2つのルールでほとんどのバグを防げます。1つ目は、instructionsがnullのときは空のリストを描画せず、手順のセクションを隠すこと。2つ目は、カロリーのエンドポイントを呼ぶ前にmetを確認することです。MET値のない種目は数値ではなく422エラーを返します。
カロリー項目とカロリーのエンドポイントはどう関係しますか?
caloriesPerMinuteは標準的な体重で保存された値で、一覧での簡易表示用です。averageCaloriesPerMinuteは分かりやすい名前で同じ値を繰り返したもので、averageCaloriesPerHourはその値を60倍して丸めたものです(1分4.3kcalは1時間258kcalになります)。どれもユーザーが誰かは考慮していません。
個人向けの推定には、体重と時間をGET /v1/exercises/{id}/calories?bodyweightKg=80&minutes=30に渡します。種目のMETに体重と時間を掛けて計算します。計算式と注意点はMETカロリーガイドにあります。MET値はCompendium of Physical Activitiesに基づくため、どの結果も推定値です。
一覧は何で包まれ、単一種目では何が加わりますか?
一覧と検索は同じ包み方です。dataに配列、paginationにpage、pageSize、totalが入ります。既定のページサイズは50、最大は100なので、1,324種目を最大サイズで取得すると14回のリクエストになります。ドキュメントの一部の例にはtotalPagesも載っていますが、どちらの場合でも動くよう自分で計算してください。
{
"data": [ { "id": "0001", "name": "3/4 Sit-up", "bodyPart": "Waist", "target": "Abs", "equipment": "Body Weight" } ],
"pagination": { "page": 1, "pageSize": 50, "total": 1324 }
}const pages = Math.ceil(total / pageSize); // 1324 / 100 = 14単一種目のGET /v1/exercises/{id}は同じ16項目に加えて、HAL形式の_linksオブジェクトを返します。caloriesのリンクはテンプレート形式なので、クライアントは2つのクエリパラメータを埋めるだけでURLを手で組み立てる必要がありません。一覧には_linksは含まれません。
"_links": {
"self": { "href": "/v1/exercises/0001" },
"related": { "href": "/v1/exercises/0001/related" },
"calories": { "href": "/v1/exercises/0001/calories{?bodyweightKg,minutes}", "templated": true },
"marketplacePreview": { "href": "/marketplace/preview/0001.gif" }
}langパラメータで何が変わりますか?
?lang=fr(またはes、pt、zh、ja)を付けると、name、bodyPart、target、equipment、secondaryMuscles、instructionsが翻訳され、languageには指定したコードが入ります。id、数値項目、そしてcategory、difficulty、mechanic、forceの4つのラベルは変わりません。そのため、数値は一度だけキャッシュし、言語ごとにテキストだけを取り直せます。
言語の決まり方と、検索語を英語のままにする理由は検索と言語のガイドで解説しています。試すにはエクササイズデータベースを見るか、ドキュメントをご覧ください。 レスポンスに画像フィールドはありません:ExerciseDB GIFの購入と埋め込みと種目APIのGIFと動画対応を参照してください。
FAQ
- 種目のidは数値ですか、文字列ですか?
- 文字列です。IDは先頭に0が付く4桁で、"0001" や "5201" のような値です(連番ではありません)。数値に変換すると先頭の0が消えて検索に失敗するため、文字列として保存・送信してください。
- bodyPartとtargetは小文字ですか?
- いいえ。Waist、Abs、Body Weightのように先頭は大文字です。フィルターはこの正確な文字列と比較するので、手入力ではなく分類用エンドポイントからコピーしてください。
- caloriesPerMinuteはユーザーの体重に依存しますか?
- いいえ。標準的な体重で保存された値です。ユーザーに合った数値が必要な場合は、bodyweightKgとminutesを付けてカロリーのエンドポイントを呼び出してください。
- レスポンスにページ数が含まれないのはなぜですか?
- paginationオブジェクトが保証するのはpage、pageSize、totalです。追加の項目に頼らず、Math.ceil(total / pageSize) でページ数を計算してください。