開発者向け無料栄養API:Nutrolaの食品データでアプリを構築する方法

Nutrolaの無料栄養APIを使用して栄養に配慮したアプリケーションを構築するための開発者ガイド。エンドポイント、認証、Python、JavaScript、cURLのコード例、レート制限、Nutritionix、Edamam、USDA APIとの比較を含みます。

Medically reviewed by Dr. Emily Torres, Registered Dietitian Nutritionist (RDN)

栄養に配慮したアプリケーションを構築するには、従来は独自に食品データベースを作成したり、高価なデータセットをライセンスしたり、不確かな情報源からデータをスクレイピングしたりする必要がありました。しかし、現在では栄養APIを利用することで、マクロ栄養素、ミクロ栄養素、サービングサイズのデータを整然としたJSON形式で提供する包括的な食品データベースにプログラム的にアクセスできるようになりました。このガイドでは、栄養APIの全体像を解説し、Nutrolaの無料プランの始め方や他の選択肢との比較に焦点を当てています。

食事プランニングアプリ、フィットネストラッカー、研究ツール、レシピ分析ツール、栄養に関する質問に答えるAIアシスタントを構築する場合でも、このガイドはAPIを選択し、数分でリクエストを開始するための技術的な詳細を提供します。

栄養APIの全体像

実装に入る前に、2026年に開発者向けに利用可能な主要な栄養APIの比較を示します。

API 無料プラン レート制限(無料) データベース内の食品数 バーコードスキャン 食品認識(AI) 有料プランの価格
Nutrola API あり 500リクエスト/日 900,000+ あり あり(オプション) 月額29ドルから
USDA FoodData Central あり(完全無料) 1,000/時間/キー 370,000+ なし なし 無料
Nutritionix API あり(制限あり) 50リクエスト/日 1,000,000+ あり なし 月額299ドルから
Edamam API あり 100リクエスト/日 900,000+ なし なし 月額19ドルから
FatSecret Platform API あり 5,000リクエスト/日 500,000+ あり なし 無料(クレジット表記必要)
Open Food Facts API あり(完全無料) 適度な使用 3,000,000+ あり なし 無料
Spoonacular あり 150リクエスト/日 500,000+ なし なし 月額29ドルから

Nutrola APIの始め方

ステップ1:開発者アカウントの作成

Nutrola Developer Portal(developers.nutrola.com)にアクセスして、無料アカウントを作成します。メール確認後、ダッシュボードにAPIキーが表示されます。無料プランでは、1日500リクエスト、完全な食品データベースへのアクセス、テキストベースの食品検索が含まれます。AI食品認識エンドポイントは有料プランで利用可能です。

ステップ2:認証

すべてのAPIリクエストには、リクエストヘッダーにAPIキーが必要です。キーはX-Api-Keyヘッダーを介して渡されます。

X-Api-Key: your_api_key_here

APIはHTTPSのみを使用します。HTTPエンドポイントへのすべてのリクエストは、HTTPSへの301リダイレクトを受け取ります。APIキーをクライアント側のコードに埋め込まないでください。常にバックエンドサーバーを介してリクエストをプロキシしてください。

ステップ3:ベースURL

すべてのエンドポイントは以下から提供されます。

https://api.nutrola.com/v1/

レスポンスはJSON形式でUTF-8エンコーディングです。APIはRESTfulの規約に従い、標準のHTTPステータスコードを使用します。

コアエンドポイント

食品検索

テキストクエリで食品データベースを検索します。栄養データを含む一致する食品を返します。

エンドポイント: GET /v1/foods/search

パラメータ:

パラメータ 必須 説明
query string はい 検索語(例:"グリルチキンブレスト")
limit integer いいえ ページあたりの結果数(デフォルト:10、最大:50)
offset integer いいえ ページネーションオフセット(デフォルト:0)
type string いいえ タイプでフィルタリング:"common"、"branded"、"restaurant"
language string いいえ 言語コード(デフォルト:"en")。サポートされる言語:en、es、de、fr、pt、ja、ko、zh

リクエスト例(cURL):

curl -X GET "https://api.nutrola.com/v1/foods/search?query=grilled+chicken+breast&limit=5" \
  -H "X-Api-Key: your_api_key_here"

リクエスト例(Python):

import requests

API_KEY = "your_api_key_here"
BASE_URL = "https://api.nutrola.com/v1"

response = requests.get(
    f"{BASE_URL}/foods/search",
    headers={"X-Api-Key": API_KEY},
    params={
        "query": "grilled chicken breast",
        "limit": 5
    }
)

data = response.json()
for food in data["foods"]:
    print(f"{food['name']}: {food['calories']} kcal per {food['serving_size']}{food['serving_unit']}")

リクエスト例(JavaScript / Node.js):

const API_KEY = "your_api_key_here";
const BASE_URL = "https://api.nutrola.com/v1";

async function searchFoods(query) {
  const url = new URL(`${BASE_URL}/foods/search`);
  url.searchParams.append("query", query);
  url.searchParams.append("limit", "5");

  const response = await fetch(url, {
    headers: { "X-Api-Key": API_KEY }
  });

  const data = await response.json();
  return data.foods;
}

searchFoods("grilled chicken breast").then(foods => {
  foods.forEach(food => {
    console.log(`${food.name}: ${food.calories} kcal per ${food.serving_size}${food.serving_unit}`);
  });
});

レスポンス例:

{
  "foods": [
    {
      "id": "nf_001234",
      "name": "Chicken Breast, Grilled, Skinless",
      "type": "common",
      "calories": 165,
      "protein_g": 31.0,
      "carbohydrates_g": 0.0,
      "fat_g": 3.6,
      "fiber_g": 0.0,
      "sugar_g": 0.0,
      "sodium_mg": 74,
      "serving_size": 100,
      "serving_unit": "g",
      "serving_description": "100 grams",
      "alt_servings": [
        {
          "description": "1 medium breast (196g)",
          "multiplier": 1.96
        },
        {
          "description": "1 oz (28g)",
          "multiplier": 0.28
        }
      ],
      "source": "USDA SR Legacy",
      "updated": "2026-01-15"
    }
  ],
  "total_results": 47,
  "offset": 0,
  "limit": 5
}

食品IDによる取得

特定の食品アイテムの詳細な栄養データをNutrola IDを使用して取得します。

エンドポイント: GET /v1/foods/{food_id}

例(cURL):

curl -X GET "https://api.nutrola.com/v1/foods/nf_001234" \
  -H "X-Api-Key: your_api_key_here"

レスポンスには フルマクロおよびミクロン栄養素プロファイル(30以上の栄養素)、すべての利用可能なサービングサイズ、成分リスト(ブランド品およびレストランアイテム用)、アレルゲンフラグ、食事タグ(ビーガン、グルテンフリー、ハラール、コーシャ)、およびソースの帰属が含まれます。

バーコードによる食品取得

UPCまたはEANバーコードを使用してパッケージ食品を検索します。

エンドポイント: GET /v1/foods/barcode/{code}

パラメータ:

パラメータ 必須 説明
code string はい UPC(12桁)またはEAN(13桁)バーコード

例(Python):

response = requests.get(
    f"{BASE_URL}/foods/barcode/041331092609",
    headers={"X-Api-Key": API_KEY}
)

food = response.json()
print(f"{food['name']}: {food['calories']} kcal per {food['serving_description']}")

自然言語入力の分析

自然言語の食品説明を解析し、構造化された栄養データを返します。このエンドポイントは、数量、単位、調理方法、および複数のアイテムを単一の文字列で処理します。

エンドポイント: POST /v1/foods/analyze

リクエストボディ:

{
  "query": "2 scrambled eggs with a slice of whole wheat toast and half an avocado",
  "language": "en"
}

例(Python):

response = requests.post(
    f"{BASE_URL}/foods/analyze",
    headers={
        "X-Api-Key": API_KEY,
        "Content-Type": "application/json"
    },
    json={
        "query": "2 scrambled eggs with a slice of whole wheat toast and half an avocado"
    }
)

result = response.json()
for item in result["items"]:
    print(f"{item['quantity']} {item['unit']} {item['name']}: {item['calories']} kcal")
print(f"Total: {result['total']['calories']} kcal")

レスポンス例:

{
  "items": [
    {
      "name": "Scrambled Eggs",
      "quantity": 2,
      "unit": "large",
      "calories": 182,
      "protein_g": 12.2,
      "carbohydrates_g": 2.4,
      "fat_g": 13.6,
      "food_id": "nf_002891"
    },
    {
      "name": "Whole Wheat Toast",
      "quantity": 1,
      "unit": "slice",
      "calories": 81,
      "protein_g": 3.9,
      "carbohydrates_g": 13.8,
      "fat_g": 1.1,
      "food_id": "nf_003401"
    },
    {
      "name": "Avocado",
      "quantity": 0.5,
      "unit": "medium",
      "calories": 120,
      "protein_g": 1.5,
      "carbohydrates_g": 6.4,
      "fat_g": 11.0,
      "food_id": "nf_000892"
    }
  ],
  "total": {
    "calories": 383,
    "protein_g": 17.6,
    "carbohydrates_g": 22.6,
    "fat_g": 25.7
  }
}

AI食品認識(有料プラン)

食品の写真を提出し、AIによる認識と栄養分析を行います。

エンドポイント: POST /v1/foods/recognize

リクエスト: 画像ファイルを含むマルチパートフォームデータ、またはbase64エンコードされた画像を含むJSONボディ。

例(Python):

with open("meal_photo.jpg", "rb") as f:
    response = requests.post(
        f"{BASE_URL}/foods/recognize",
        headers={"X-Api-Key": API_KEY},
        files={"image": ("meal.jpg", f, "image/jpeg")}
    )

result = response.json()
for item in result["detected_items"]:
    print(f"{item['name']} ({item['confidence']:.1%}): {item['calories']} kcal")

レスポンスには 検出された食品アイテムと信頼度スコア、バウンディングボックスの座標、推定ポーションサイズ、各アイテムの栄養内訳、総食事の栄養概要が含まれます。

レート制限とエラー処理

プラン別レート制限

プラン 日次リクエスト数 リクエスト/秒 AI認識 価格
無料 500 5 含まれない $0
スターター 5,000 10 100/日 $29/月
プロ 50,000 25 1,000/日 $99/月
エンタープライズ カスタム カスタム カスタム 営業にお問い合わせ

レート制限ヘッダー

すべてのレスポンスにはレート制限ヘッダーが含まれます:

X-RateLimit-Limit: 500
X-RateLimit-Remaining: 487
X-RateLimit-Reset: 1710374400

エラーレスポンス

APIは標準のHTTPステータスコードを使用し、説明的なエラーボディを返します。

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "1日のリクエスト制限500を超えました。UTCの00:00にリセットされます。",
    "status": 429
  }
}
ステータスコード 意味
200 成功
400 不正なリクエスト(無効なパラメータ)
401 認証失敗(無効または欠落したAPIキー)
404 食品が見つかりません
429 レート制限を超えました
500 サーバー内部エラー

429および500のレスポンスには指数バックオフを実装してください。単純な戦略としては、最初の失敗後に1秒待ち、2回目の後に2秒、3回目の後に4秒待ち、最大60秒まで待つことです。

使用例と実装パターン

食事プランニングアプリ

目標マクロを達成するために食品を検索し、栄養合計を計算し、ユーザーの目標に合った食事プランを作成するアプリを構築します。

def find_foods_for_target(target_protein, target_calories):
    """カロリー予算内でタンパク質が豊富な食品を見つける。"""
    response = requests.get(
        f"{BASE_URL}/foods/search",
        headers={"X-Api-Key": API_KEY},
        params={
            "query": "high protein",
            "limit": 20,
            "type": "common"
        }
    )

    foods = response.json()["foods"]
    # タンパク質とカロリーの比率でフィルタリング
    efficient_foods = [
        f for f in foods
        if f["protein_g"] / max(f["calories"], 1) > 0.15
    ]
    return sorted(efficient_foods, key=lambda f: f["protein_g"], reverse=True)

フィットネスアプリ統合

活動データと組み合わせて、ユーザーのカロリーバランスを表示します。自然言語エンドポイントを使用して迅速に記録します。

async function logMealFromText(description) {
  const response = await fetch(`${BASE_URL}/foods/analyze`, {
    method: "POST",
    headers: {
      "X-Api-Key": API_KEY,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ query: description })
  });

  const data = await response.json();

  // データベースに保存
  await db.meals.insert({
    user_id: currentUser.id,
    items: data.items,
    total_calories: data.total.calories,
    total_protein: data.total.protein_g,
    timestamp: new Date()
  });

  return data;
}

レシピ栄養計算機

各材料を調べてレシピの栄養成分を計算します。

def analyze_recipe(ingredients):
    """
    ingredients: ["200g chicken breast", "1 cup brown rice", "2 tbsp olive oil"]のような文字列のリスト
    """
    recipe_nutrition = {"calories": 0, "protein_g": 0, "carbohydrates_g": 0, "fat_g": 0}

    for ingredient in ingredients:
        response = requests.post(
            f"{BASE_URL}/foods/analyze",
            headers={
                "X-Api-Key": API_KEY,
                "Content-Type": "application/json"
            },
            json={"query": ingredient}
        )
        data = response.json()
        for item in data["items"]:
            recipe_nutrition["calories"] += item["calories"]
            recipe_nutrition["protein_g"] += item["protein_g"]
            recipe_nutrition["carbohydrates_g"] += item["carbohydrates_g"]
            recipe_nutrition["fat_g"] += item["fat_g"]

    return recipe_nutrition

# 使用例
recipe = analyze_recipe([
    "200g chicken breast",
    "1 cup brown rice cooked",
    "2 tablespoons olive oil",
    "1 cup steamed broccoli"
])
print(f"レシピ合計:{recipe['calories']} kcal, {recipe['protein_g']}g タンパク質")

研究とデータ分析

学術研究のために、APIを使用して研究対象の栄養プロファイルを構築したり、食事評価ツールを検証したりします。

import pandas as pd

def build_nutrition_profile(food_log_df):
    """
    food_log_df: ['food_description', 'date']の列を持つDataFrame
    各エントリーの完全な栄養内訳を持つDataFrameを返します。
    """
    results = []

    for _, row in food_log_df.iterrows():
        response = requests.post(
            f"{BASE_URL}/foods/analyze",
            headers={
                "X-Api-Key": API_KEY,
                "Content-Type": "application/json"
            },
            json={"query": row["food_description"]}
        )
        data = response.json()
        results.append({
            "date": row["date"],
            "description": row["food_description"],
            "calories": data["total"]["calories"],
            "protein_g": data["total"]["protein_g"],
            "carbs_g": data["total"]["carbohydrates_g"],
            "fat_g": data["total"]["fat_g"]
        })

    return pd.DataFrame(results)

代替APIとの比較

USDA FoodData Central API

USDA APIは完全に無料で、無制限のプランがないため、学術研究や政府プロジェクトのデフォルトの選択肢となります。約370,000の食品をカバーし、Foundation、SR Legacy、Survey(FNDDS)、およびBrandedデータベースを含みます。強みは、米国の食品成分データのゴールドスタンダードであり、他のデータベースが参照する権威であることです。制限としては、自然言語解析がなく(食品名を特定のデータベースキーに一致させる必要があります)、バーコード検索がなく、AI認識がなく、ブランド食品データはメーカーの提出に依存するため、一貫性がない場合があります。APIドキュメントは機能的ですが、現代の基準では開発者に優しくありません。

最適な用途: 学術研究、政府プロジェクト、権威ある参照データが必要なアプリケーションで、マッチングの複雑さを処理できる開発リソースがある場合。

Nutritionix API

Nutritionixは、レストランやブランド食品の強力なカバレッジを持つ最大の食品データベースの1つです。その自然言語エンドポイントは成熟しており、複雑なクエリをうまく処理します。しかし、無料プランは1日50リクエストと非常に制限されており、有料プランは月額299ドルから始まるため、多くの独立した開発者や小規模なスタートアップにとっては手が届きません。APIはよく文書化されており、テキストとバーコードの両方の検索をサポートしています。

最適な用途: 大規模なレストランデータが必要で、価格を負担できる資金力のあるアプリケーション。

Edamam API

Edamamは、栄養分析、レシピ分析、食品データベースAPIを提供しています。無料プランでは1日100リクエストが可能で、プロトタイピングに適しています。Edamamの強みは、フルレシピの材料リストを解析し、1食あたりの栄養データを返す能力です。データベースは約900,000の食品をカバーしています。制限としては、サービングサイズデータに時折不一致があり、最新のAPIに比べて開発者体験が直感的でないことがあります。

最適な用途: レシピに焦点を当てたアプリケーション、レシピレベルの分析が必要な食事プランニングツール。

FatSecret Platform API

FatSecretは、1日5,000リクエストの寛大な無料プランを提供しており、資金が限られたプロジェクトにとって魅力的です。ただし、アプリケーション内でFatSecretのブランドとクレジットを表示する必要があります。データベースは約500,000の食品をカバーし、国際的なカバレッジも良好です。APIはOAuth 1.0認証をサポートしており、これはAPIキーやOAuth 2.0アプローチよりも古く、実装が複雑です。

最適な用途: クレジット表記の要件を満たすことができ、予算が限られたプロジェクト。

Open Food Facts API

Open Food Factsは、3百万以上の製品を持つコミュニティ主導のオープンソース食品データベースで、主にバーコードデータを含むパッケージ食品をカバーしています。完全に無料でオープン(オープンデータベースライセンス)です。APIはバーコード検索には簡単ですが、栄養検索クエリにはあまり構造化されていません。データの質は、寄付によって変動しますが、コミュニティのレビュー過程で多くのエラーが修正されます。

最適な用途: パッケージ食品のバーコードスキャン、オープンソースの原則に沿ったプロジェクト、国際的なパッケージ食品のカバレッジ。

API比較サマリー

機能 Nutrola USDA Nutritionix Edamam FatSecret Open Food Facts
無料プランの1日制限 500 1,000/時 50 100 5,000 無制限
自然言語解析 あり なし あり あり なし なし
AI食品認識 あり(有料) なし なし なし なし なし
バーコード検索 あり なし あり なし あり あり
多言語サポート 8言語 英語 英語 英語 16言語 40以上の言語
レシピ分析 NLP経由 なし あり あり なし なし
ミクロン栄養素の深さ 30以上の栄養素 60以上の栄養素 20以上の栄養素 25以上の栄養素 15以上の栄養素 変動
認証 APIキー APIキー APIキー アプリID + キー OAuth 1.0 なし(オプション)

栄養アプリ構築のベストプラクティス

積極的にキャッシュする

一般的な食品の栄養データは頻繁に変更されません。食品検索結果や栄養ルックアップをバックエンドで24〜72時間キャッシュして、APIコールを減らし、応答時間を改善します。

欠落データを優雅に処理する

すべての食品エントリーが完全なミクロン栄養素データを持っているわけではありません。データが利用できない場合は、ユーザーが誤解しないようにゼロを表示するのではなく、データが利用できないことを示すUIを設計してください。

APIコールの前にユーザー入力を検証する

APIに送信する前に、空白をトリムし、単位を正規化し、食品名をスペルチェックします。正しく形成されたクエリは、タイプミスが多いものよりもはるかに良い結果をもたらします。

可能な限り自然言語エンドポイントを使用する

独自の食品名パーサーを構築する代わりに、/foods/analyzeエンドポイントを使用してください。これは、数量("2 cups")、調理方法("grilled")、複合的な説明("whole wheat toast with butter")を、ほとんどのカスタム実装よりも優れた方法で処理します。

レート制限を尊重する

適切なバックオフロジックを実装してください。可能な場合はバッチ処理を行い、高ボリュームの操作には同期APIコールではなく、Webhookやキューを使用してください。

データソースを帰属させる

良いプラクティス(およびAPIによっては法的要件)として、データソースを帰属させることが重要です。アプリケーション内に「Nutrola提供の栄養データ」と表示するか、使用するAPIに応じた同等の表記を行ってください。

よくある質問

Nutrola APIは本当に無料ですか?

はい。無料プランでは、1日500リクエストを無償で提供し、クレジットカードは不要です。これは、プロトタイピング、小規模アプリケーション、個人プロジェクトに十分です。無料プランには、テキスト検索、IDによる食品ルックアップ、バーコードスキャン、自然言語分析が含まれます。画像からのAI食品認識は、月額29ドルからの有料プランで利用可能です。

APIはどのようなデータ形式で返されますか?

すべてのレスポンスはJSON形式でUTF-8エンコーディングです。栄養値は標準単位を使用します:エネルギーにはキロカロリー、マクロ栄養素と食物繊維にはグラム、ナトリウムやほとんどのミネラルにはミリグラム、ビタミンには適用される場合にマイクログラムを使用します。

Nutrola APIを商業アプリケーションで使用できますか?

はい。無料プランと有料プランの両方が商業利用を許可しています。無料プランでは、アプリケーション内でNutrolaの帰属が必要です。有料プランには、帰属が不要なホワイトラベルオプションが含まれています。

食品データベースはどのくらいの頻度で更新されますか?

Nutrolaの食品データベースは、ブランド食品やレストラン食品について継続的に更新され、USDAの参照データはUSDAのリリースから30日以内に同期されます。主要なデータベースのリフレッシュは毎月行われ、個々の食品エントリーは、メーカーの変更、ユーザーからの報告された修正、新製品の発売に基づいて、日々更新されることがあります。

APIは国際食品をサポートしていますか?

はい。データベースは50か国以上の食品をカバーしており、8言語(英語、スペイン語、ドイツ語、フランス語、ポルトガル語、日本語、韓国語、中国語)で検索が可能です。国際的な食品カバレッジはNutrolaの重要な優先事項であり、地域の料理、地元のブランド製品、米国中心のデータベースにはしばしば欠けている料理特有の調理法が含まれています。

モバイルアプリでAPIを使用できますか?

はい。ただし、APIキーをモバイルクライアントコードに直接埋め込まないでください。アプリのバイナリから抽出される可能性があります。代わりに、Nutrola APIへのリクエストをプロキシし、認証を処理する軽量のバックエンドサーバーを設定してください。これにより、キャッシュやリクエスト管理のためのレイヤーも提供されます。

Webhookやストリーミングオプションはありますか?

現在、APIはリクエスト-レスポンスモデルで動作しています。非同期の食品認識結果(大規模なバッチ処理用)のWebhookサポートは2026年のロードマップにあります。今日のバッチ処理には、1回のリクエストで最大20アイテムを受け入れる/v1/foods/analyze/batchエンドポイントを使用してください。

結論

栄養APIは、開発者が独自の食品データベースを維持するための膨大なコストをかけずに、食品に配慮したアプリケーションを構築することを実現可能にしました。NutrolaのAPIは、寛大な無料プラン、国際的な料理にわたる包括的な食品カバレッジ、自然言語理解、オプションのAI食品認識を提供しており、週末のプロトタイプから本番アプリケーションまで幅広いプロジェクトに適した選択肢となっています。

プロジェクトに最適なAPIは、特定のニーズによります:権威ある参照データが必要な場合はUSDA、深いレストランカバレッジが必要な場合はNutritionix、オープンソースのバーコードデータが必要な場合はOpen Food Facts、または機能、精度、開発者体験のバランスが必要な場合はNutrolaです。多くの場合、複数のAPIを組み合わせることで最良のカバレッジが得られます。無料プランから始めて、使用ケースに対して検証し、そこからスケールアップしてください。

栄養追跡を革新する準備はできていますか?

Nutrolaで健康の旅を変えた数千人に参加しましょう!