Nutrolaの栄養データAPI: 開発者が食品データベースにアクセスする方法

Nutrolaの栄養データAPIに関する開発者ガイド。300万件以上の検証済み食品データベースへのアクセス方法、エンドポイント、認証、実際の使用例を学びましょう。

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

健康、フィットネス、または食品関連のアプリを開発していますか?最も難しい課題の一つは、栄養データの管理です。数千種類の食品に対する正確なカロリーやマクロ情報が必要であり、国際的な製品をカバーし、製造業者が製品を再構成する際にも最新の情報を維持する必要があります。

多くの開発者は、最初にUSDA FoodData Centralのようなオープンな政府データベースからデータを取得します。これにより基盤が得られますが、47カ国のブランド製品やレストランの料理、実際のユーザーが毎日食べる数千種類の地域食品をカバーすることはできません。それらのギャップを自分で埋めるには、何年ものデータキュレーション作業が必要です。

Nutrolaの栄養データAPIは、私たちのアプリを支えるのと同じ検証済み食品データベースへのアクセスを開発者に提供します。300万件以上のエントリーがあり、生の食材、ブランド製品、レストランの料理、複合レシピを網羅しています。すべてのエントリーは、200万人以上のユーザーに信頼されている多層の品質管理プロセスを通じて検証されています。

このガイドでは、APIを使用して開発を始めるために必要なすべての情報を提供します:アーキテクチャ、認証、エンドポイント、レート制限、実際のコード例など。

APIの概要

Nutrola栄養データAPIは、RESTfulなJSON APIです。HTTPリクエストを行い、JSONレスポンスを受け取ります。SDKは必要ありませんが、便利のためにPython、JavaScript、Swift用のクライアントライブラリを提供しています。

ベースURL

https://api.nutrola.com/v1

すべてのエンドポイントはHTTPS経由で提供されます。通常のHTTPリクエストは拒否されます。

主な機能

機能 説明
食品検索 3M以上の食品エントリーに対するフルテキスト検索、カテゴリ、ブランド、国でのフィルタリング
バーコード検索 UPC、EAN、その他のバーコード形式による栄養データの取得
栄養詳細 70以上の栄養素を含む任意の食品の完全な栄養プロファイル
サービングサイズ 標準および代替のサービングサイズとグラム換算
レシピ分析 材料リストを提出し、結合された栄養データを取得
食品カテゴリ 階層的な食品カテゴリのタクソノミーを閲覧
ブランドディレクトリ ブランド食品製造業者を検索および閲覧
オートコンプリート 食品検索インターフェースのための迅速なタイプアヘッド提案

レスポンス形式

すべてのレスポンスは一貫した構造に従います:

{
  "status": "success",
  "data": { },
  "meta": {
    "request_id": "req_abc123",
    "rate_limit_remaining": 245,
    "rate_limit_reset": "2026-03-10T15:00:00Z"
  }
}

エラー応答には、機械可読のエラーコードと人間が読めるメッセージが含まれます:

{
  "status": "error",
  "error": {
    "code": "FOOD_NOT_FOUND",
    "message": "提供されたIDに一致する食品エントリーがありません。",
    "request_id": "req_xyz789"
  }
}

認証

すべてのAPIリクエストには、AuthorizationヘッダーにAPIキーを渡す必要があります。

APIキーの取得

  1. developer.nutrola.comで開発者アカウントを作成します。
  2. ダッシュボードのAPIキーセクションに移動します。
  3. 新しいキーを生成し、必要なスコープを指定します。
  4. キーを安全に保管してください — 一度だけ表示されます。

APIキーの使用

リクエストヘッダーにキーを含めます:

Authorization: Bearer YOUR_API_KEY

curlの例:

curl -H "Authorization: Bearer ntr_live_abc123def456" \
  https://api.nutrola.com/v1/foods/search?q=chicken+breast

APIキーのスコープ

スコープ アクセスレベル
foods:read 食品データの検索および取得(最も一般的)
barcodes:read バーコード検索
recipes:analyze レシピ栄養分析
brands:read ブランドディレクトリアクセス
categories:read 食品カテゴリタクソノミー

キーは特定の機能にスコープを設定できます。foods:readのみのキーは、バーコード検索にアクセスできません。これは最小特権の原則に従い、アプリケーションに必要なスコープのみを要求します。

コアエンドポイント

食品検索

名前、キーワード、またはフレーズでデータベースを検索します。

GET /v1/foods/search

パラメータ:

パラメータ タイプ 必須 説明
q string はい 検索クエリ(例: "グリルチキンブレスト")
category string いいえ 食品カテゴリでフィルタリング(例: "乳製品", "野菜")
brand string いいえ ブランド名でフィルタリング
country string いいえ ISO 3166-1 alpha-2国コード(例: "US", "DE", "JP")
verified_only boolean いいえ 検証済みのソースデータを持つエントリーのみを返す(デフォルト: true)
page integer いいえ ページ番号(デフォルト: 1)
per_page integer いいえ ページあたりの結果数、最大50(デフォルト: 20)

リクエストの例:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.nutrola.com/v1/foods/search?q=greek+yogurt&country=US&per_page=5"

レスポンスの例:

{
  "status": "success",
  "data": {
    "results": [
      {
        "id": "food_8f2k9d",
        "name": "プレーン無脂肪ギリシャヨーグルト",
        "brand": null,
        "category": "乳製品",
        "country": "US",
        "verified": true,
        "source": "USDA",
        "nutrition_per_100g": {
          "calories": 59,
          "protein": 10.2,
          "carbohydrates": 3.6,
          "fat": 0.4,
          "fiber": 0,
          "sugar": 3.2,
          "sodium": 36
        },
        "default_serving": {
          "description": "1コンテナ(170g)",
          "grams": 170
        }
      }
    ],
    "total_results": 342,
    "page": 1,
    "per_page": 5
  }
}

食品詳細の取得

特定の食品の完全な栄養プロファイルを取得します。

GET /v1/foods/{food_id}

リクエストの例:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.nutrola.com/v1/foods/food_8f2k9d"

詳細レスポンスには、70以上の栄養素を含む完全な栄養分解が含まれます。すべての利用可能なサービングサイズとそのグラム換算も含まれます。

部分レスポンス(主要栄養素):

{
  "status": "success",
  "data": {
    "id": "food_8f2k9d",
    "name": "プレーン無脂肪ギリシャヨーグルト",
    "nutrition_per_100g": {
      "calories": 59,
      "protein": 10.2,
      "carbohydrates": 3.6,
      "fat": 0.4,
      "fiber": 0,
      "sugar": 3.2,
      "saturated_fat": 0.1,
      "monounsaturated_fat": 0.1,
      "polyunsaturated_fat": 0,
      "cholesterol": 5,
      "sodium": 36,
      "potassium": 141,
      "calcium": 110,
      "iron": 0.1,
      "vitamin_a": 4,
      "vitamin_c": 0,
      "vitamin_d": 0
    },
    "serving_sizes": [
      { "description": "1コンテナ(170g)", "grams": 170 },
      { "description": "1カップ(245g)", "grams": 245 },
      { "description": "1 tbsp(15g)", "grams": 15 },
      { "description": "100g", "grams": 100 }
    ],
    "allergens": ["乳"],
    "source": "USDA",
    "source_id": "170903",
    "last_verified": "2026-02-15",
    "confidence_score": 0.98
  }
}

バーコード検索

バーコードで食品製品を検索します。

GET /v1/barcodes/{barcode}

サポートされている形式: UPC-A, UPC-E, EAN-13, EAN-8

リクエストの例:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.nutrola.com/v1/barcodes/0049000006346"

レスポンスは、/foods/{food_id}エンドポイントと同じ食品詳細オブジェクトを返し、barcode_formatregional_variants(異なる国での同じ製品の食品IDの配列など)といったバーコード特有のフィールドが追加されます。

レシピ分析

材料リストを提出し、結合された栄養分解を受け取ります。

POST /v1/recipes/analyze

リクエストボディ:

{
  "name": "オーバーナイトオーツ",
  "servings": 2,
  "ingredients": [
    { "food_id": "food_3k8m2n", "grams": 160 },
    { "food_id": "food_9p4q7r", "grams": 400 },
    { "food_id": "food_1a5b8c", "grams": 60 },
    { "food_id": "food_6d2e9f", "grams": 2, "description": "ひとつまみの塩" }
  ]
}

材料をテキストとして自動解析することもできます:

{
  "name": "オーバーナイトオーツ",
  "servings": 2,
  "ingredients_text": "160gのロールドオーツ、400mlの全乳、60gのピーナッツバター、ひとつまみの塩"
}

レスポンス:

{
  "status": "success",
  "data": {
    "name": "オーバーナイトオーツ",
    "servings": 2,
    "nutrition_per_serving": {
      "calories": 425,
      "protein": 18.5,
      "carbohydrates": 42.3,
      "fat": 21.2,
      "fiber": 5.8
    },
    "nutrition_total": {
      "calories": 850,
      "protein": 37.0,
      "carbohydrates": 84.6,
      "fat": 42.4,
      "fiber": 11.6
    },
    "ingredients_matched": [
      { "input": "160gのロールドオーツ", "matched_food": "food_3k8m2n", "confidence": 0.97 },
      { "input": "400mlの全乳", "matched_food": "food_9p4q7r", "confidence": 0.99 },
      { "input": "60gのピーナッツバター", "matched_food": "food_1a5b8c", "confidence": 0.96 },
      { "input": "ひとつまみの塩", "matched_food": "food_6d2e9f", "confidence": 0.88 }
    ]
  }
}

オートコンプリート

検索インターフェースを構築するための迅速なタイプアヘッド提案。

GET /v1/foods/autocomplete?q={query}

パラメータ:

パラメータ タイプ 必須 説明
q string はい 部分検索クエリ(最小2文字)
limit integer いいえ 最大結果数、1-10(デフォルト: 5)
country string いいえ この国からの結果を優先

レスポンスタイムはインタラクティブな使用のために最適化されており、通常は50ms未満です。オートコンプリートエンドポイントは、迅速なレンダリングのために簡略化された食品オブジェクト(ID、名前、ブランド、カテゴリのみ)を返します。

レート制限と価格

無料プラン

無料プランは、開発、テスト、小規模アプリケーション向けに設計されています:

制限
1日のリクエスト数 500
1分あたりのリクエスト数 30
リクエストあたりの食品検索結果数 20
1日のレシピ分析数 10
1日のバーコード検索数 100

成長プラン

中程度のトラフィックを持つ本番アプリケーション向け:

制限
1日のリクエスト数 25,000
1分あたりのリクエスト数 300
リクエストあたりの食品検索結果数 50
1日のレシピ分析数 500
1日のバーコード検索数 5,000
価格 $49/月

エンタープライズプラン

高トラフィックアプリケーション、ホワイトラベルソリューション、カスタム要件向け:

機能 詳細
1日のリクエスト数 カスタム(通常は100K以上)
レート制限 カスタム
専用サポート 含まれています
SLA 99.9%の稼働保証
カスタムデータエクスポート 利用可能
ウェブフック通知 データ更新のために利用可能
価格 営業にお問い合わせ

レート制限情報は、すべてのAPIレスポンスにmetaオブジェクトを介して、HTTPレスポンスヘッダー(X-RateLimit-RemainingX-RateLimit-Reset)に含まれています。

実際の使用例

フィットネスおよびワークアウトアプリ

フィットネスアプリを構築しており、食品データベースをゼロから構築せずに栄養追跡を追加したい場合、NutrolaのAPIが最も迅速な方法です。食品検索とバーコードエンドポイントを使用してユーザーが食事を記録できるようにし、レシピ分析エンドポイントを使用してカスタムの食事エントリーを作成します。

食事プランニングプラットフォーム

食事プランニングアプリは、特定のマクロターゲットを達成するためのプランを生成するために正確な栄養データが必要です。APIの詳細な栄養分解(70以上の栄養素)は、カロリーやマクロだけでなく、微量栄養素、アレルゲン、食事制限の互換性を考慮した正確な食事プランの最適化を可能にします。

医療およびテレヘルス

患者の栄養を監視する医療プラットフォームは、APIと統合して既存のインターフェース内で正確な食品ログを提供できます。検証済みのデータソース(USDA、EFSA、製造業者直送)は、臨床栄養監視に必要な精度基準を満たしています。

レストランおよびフードサービス

レストランの注文プラットフォームは、APIを使用してメニュー項目の栄養情報を表示できます。レシピ分析エンドポイントは特に便利です — 料理の材料を提出し、各アイテムを手動で計算することなく完全な栄養分解を取得します。

研究および学術

栄養研究者は、APIを使用して食事研究における食品コーディングを標準化できます。一貫した検証済みデータは、参加者が報告した栄養データに依存する研究での測定エラーを減少させます。

コード例

Python: 食品を検索して栄養詳細を取得

import requests

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

headers = {
    "Authorization": f"Bearer {API_KEY}"
}

# 食品を検索
search_response = requests.get(
    f"{BASE_URL}/foods/search",
    headers=headers,
    params={"q": "グリルチキンブレスト", "per_page": 3}
)

results = search_response.json()["data"]["results"]

for food in results:
    print(f"{food['name']} - {food['nutrition_per_100g']['calories']} cal/100g")

# 最初の結果の詳細を取得
food_id = results[0]["id"]
detail_response = requests.get(
    f"{BASE_URL}/foods/{food_id}",
    headers=headers
)

food_detail = detail_response.json()["data"]
nutrition = food_detail["nutrition_per_100g"]

print(f"\n{food_detail['name']}")
print(f"カロリー: {nutrition['calories']}")
print(f"タンパク質: {nutrition['protein']}g")
print(f"炭水化物: {nutrition['carbohydrates']}g")
print(f"脂肪: {nutrition['fat']}g")
print(f"サービングサイズ: {food_detail['serving_sizes']}")

JavaScript: バーコードスキャンの統合

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

async function lookupBarcode(barcode) {
  const response = await fetch(
    `${BASE_URL}/barcodes/${barcode}`,
    {
      headers: {
        "Authorization": `Bearer ${API_KEY}`
      }
    }
  );

  if (!response.ok) {
    if (response.status === 404) {
      console.log("データベースに製品が見つかりません");
      return null;
    }
    throw new Error(`APIエラー: ${response.status}`);
  }

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

// 使用例
const product = await lookupBarcode("0049000006346");

if (product) {
  const serving = product.default_serving;
  const factor = serving.grams / 100;

  console.log(`${product.name} (${product.brand})`);
  console.log(`1サービングあたり:`);
  console.log(`  カロリー: ${Math.round(product.nutrition_per_100g.calories * factor)}`);
  console.log(`  タンパク質: ${(product.nutrition_per_100g.protein * factor).toFixed(1)}g`);
  console.log(`  炭水化物: ${(product.nutrition_per_100g.carbohydrates * factor).toFixed(1)}g`);
  console.log(`  脂肪: ${(product.nutrition_per_100g.fat * factor).toFixed(1)}g`);
}

Swift: オートコンプリート検索フィールドの構築

import Foundation

class Nutrola API {
    private let apiKey: String
    private let baseURL = "https://api.nutrola.com/v1"

    init(apiKey: String) {
        self.apiKey = apiKey
    }

    func autocomplete(query: String, limit: Int = 5) async throws -> [FoodSuggestion] {
        guard query.count >= 2 else { return [] }

        var components = URLComponents(string: "\(baseURL)/foods/autocomplete")!
        components.queryItems = [
            URLQueryItem(name: "q", value: query),
            URLQueryItem(name: "limit", value: String(limit))
        ]

        var request = URLRequest(url: components.url!)
        request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")

        let (data, _) = try await URLSession.shared.data(for: request)
        let response = try JSONDecoder().decode(AutocompleteResponse.self, from: data)
        return response.data.suggestions
    }
}

struct FoodSuggestion: Codable {
    let id: String
    let name: String
    let brand: String?
    let category: String
}

struct AutocompleteResponse: Codable {
    let status: String
    let data: AutocompleteData
}

struct AutocompleteData: Codable {
    let suggestions: [FoodSuggestion]
}

エラーハンドリングのベストプラクティス

APIは標準のHTTPステータスコードを使用します:

ステータスコード 意味 一般的な原因
200 成功 リクエストが正常に完了
400 不正なリクエスト 必須パラメータが欠けているか、無効な値
401 未認証 無効または欠落したAPIキー
403 禁止 APIキーに必要なスコープがない
404 未発見 食品IDまたはバーコードがデータベースにない
429 レート制限 リクエストが多すぎる; レート制限ヘッダーを確認
500 サーバーエラー 内部エラー; 指数バックオフで再試行

429レスポンスを受け取った場合、Retry-Afterヘッダーは再試行までの待機時間を示します。429および500レスポンスに対して指数バックオフを実装することを強く推奨します。

データの新鮮さと更新

Nutrolaのデータベースは継続的に更新されています。ブランド製品のエントリーは、製造業者が変更を報告した際に更新され、通常48時間以内に反映されます。政府データベースのエントリーは、新しいリリースが公開される際に四半期ごとに同期されます。

アプリケーションがAPIレスポンスをキャッシュする場合(パフォーマンス向上のために推奨)、食品詳細レスポンスのキャッシュTTLは24時間、検索結果のキャッシュTTLは1時間を推奨します。食品詳細レスポンスのlast_verifiedフィールドは、そのエントリーが最後に確認された日時を示します。

エンタープライズ顧客向けには、食品エントリーが更新された際にウェブフック通知を提供しており、キャッシュデータをTTLが切れるのを待たずに積極的に無効化できます。

始め方

  1. developer.nutrola.comでサインアップ — 1分もかかりません
  2. 必要なスコープでAPIキーを生成
  3. 上記のcurl例を使用して最初のリクエストを行う
  4. developer.nutrola.com/docsのインタラクティブドキュメントを探索し、ブラウザでエンドポイントを直接テスト
  5. 開発者コミュニティに参加 — Discordサーバーでサポート、機能リクエスト、他の開発者が構築しているものを確認

質問がある場合、問題が発生した場合、またはエンタープライズ統合について話し合いたい場合は、api@nutrola.comまで開発者リレーションチームにお問い合わせください。

FAQ

Nutrola APIは無料で使用できますか?

はい、1日500リクエストを含む無料プランがあります。これは開発、テスト、小規模アプリケーションに適しています。より高いトラフィックを持つ本番アプリケーションには、成長プランが月額49ドルから始まり、1日25,000リクエストを提供します。エンタープライズプランは高トラフィックの使用ケース向けにカスタム制限を提供します。

APIはどのデータフォーマットをサポートしていますか?

APIはリクエストとレスポンスの両方にJSONを専用に使用します。すべてのエンドポイントは、GETリクエスト用の標準クエリパラメータと、POSTリクエスト用のJSONリクエストボディを受け入れます。レスポンスエンコーディングはUTF-8で、すべてのサポートされている言語の食品名を適切に処理します。

APIが提供する栄養データの精度はどのくらいですか?

Nutrolaデータベースのすべてのエントリーは、政府のソース検証、製造業者データのクロスリファレンス、AIによる統計チェック、人間の専門家によるレビューを含む多層の検証プロセスを経ています。私たちの精度基準は、実験室分析に対して97.4%であり、クラウドソースデータベースの業界平均は70-85%です。各食品エントリーには、私たちの確信度を示すconfidence_scoreフィールドが含まれています。

APIを商業製品の構築に使用できますか?

はい。APIは商業利用のために設計されています。無料プランは、そのレート制限内で商業製品に使用できます。成長プランとエンタープライズプランには、アプリケーションの種類に制限なく商業利用権が含まれています。詳細については、developer.nutrola.comの利用規約を確認してください。

APIはアメリカ以外の食品をサポートしていますか?

はい。データベースは47カ国のブランド製品と120以上の料理からの一般的な食品をカバーしています。検索エンドポイントでcountryパラメータを使用して、特定の市場からの結果を優先できます。バーコード検索は、自動的に製品を正しい地域の製品に一致させます。

データベースにない食品をどのように扱いますか?

バーコード検索が404を返した場合、製品名を使用してテキスト検索にフォールバックできます。どちらのアプローチでも食品が見つからない場合は、開発者ポータルを通じて追加を提出できます。APIパートナーによって提出された食品は、検証の優先順位が高く、通常72時間以内に追加されます。エンタープライズ顧客は、大規模な製品カタログのバッチ追加をリクエストできます。

SDKやクライアントライブラリは利用可能ですか?

Python(pip経由: pip install nutrola)、JavaScript/TypeScript(npm経由: npm install @nutrola/api)、Swift(Swift Package Manager経由)用の公式クライアントライブラリを提供しています。これらのライブラリは、認証、レート制限、再試行、レスポンス解析を処理します。Go、Ruby、PHP用のコミュニティメンテナンスライブラリも利用可能です。

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

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