成分 / Seibun

Get Started

最初の 1 リクエストまで

サインアップして API キーを発行し、八訂準拠の食品データを叩くまでを なぞるっちゃ。各ステップに cURL / JavaScript / Python のコピペ例が あるっちゃよ⚡️

例のベース URL は http://localhost:8787pnpm dev のローカル)っちゃ。本番では、デプロイした成分 API のベース URL に 置き換えてっちゃ。

サインアップ

メール+パスワードでアカウントを作るっちゃ。 メール検証は無効なので、サインアップ成功で即ログイン状態になるっちゃ(成功応答の Set-Cookie がセッション)。次の キー発行で使うので、Cookie を必ず保存しておくっちゃよ。
# -c でセッション Cookie を cookies.txt に保存(次のキー発行で使う)
curl -i -c cookies.txt -X POST http://localhost:8787/api/auth/sign-up/email \
  -H 'content-type: application/json' \
  -d '{"email":"[email protected]","password":"password1234","name":"me"}'

API キーを発行

ログイン状態(セッション Cookie)で POST /v1/keys を叩くとキーを発行できるっちゃ。 平文キー(key)は発行時の応答に 1 度だけ含まれるっちゃ。サーバは SHA-256 ハッシュしか保存しないので、 控え忘れたら失効して再発行っちゃ。
# -b で保存済み Cookie を送信。応答の "key"(平文)は**この 1 度だけ**返る。
curl -X POST http://localhost:8787/v1/keys -b cookies.txt \
  -H 'content-type: application/json' \
  -d '{"name":"my first key"}'
#  → {"id":"...","name":"my first key","keyPrefix":"fnk_xxxx","tier":"free","key":"fnk_<平文>"}

最初のリクエスト

発行したキーを X-API-Key ヘッダに付けて、データルートを叩くっちゃ。栄養値は種別(kind)を保持していて、測定値は { kind, value, unit }、微量・未測定は値を持たず{ kind, unit } で返るっちゃ。
# 発行したキーを X-API-Key ヘッダに付けてデータルートを叩く。
curl "http://localhost:8787/v1/foods/01001" \
  -H "X-API-Key: fnk_xxxxxxxxxxxxxxxx"

応答(抜粋・GET /v1/foods/01001・既定の core):

{
  "foodNumber": "01001",
  "name": "アマランサス 玄穀",
  "groupId": "01",
  "nutrients": {
    "energy_kcal":  { "kind": "measured", "value": 343, "unit": "kcal" },
    "protein":      { "kind": "measured", "value": 12.7, "unit": "g" },
    "fat":          { "kind": "measured", "value": 6, "unit": "g" },
    "dietaryFiber": { "kind": "measured", "value": 7.4, "unit": "g" },
    "carbohydrate": { "kind": "measured", "value": 64.9, "unit": "g" },
    "salt":         { "kind": "measured", "value": 0, "unit": "g" }
  },
  "portions": []
}

kind は種別を保持するっちゃ(数値に潰さない)。値を持つ 種別と持たない種別があるっちゃよ:

// 測定値(value あり)
{ "kind": "measured", "value": 7.4, "unit": "g" }
// 推定値(括弧付き)も value あり
{ "kind": "estimated", "value": 11.3, "unit": "g" }
// 微量 Tr は value を持たない
{ "kind": "trace", "unit": "mg" }
// 未測定(- または空欄)も value なし
{ "kind": "notMeasured", "unit": "µg" }

お試しトークン(認証なしで試す)

アカウントを作らずに試したいときは、お試しトークンが使えるっちゃ。POST /v1/trial-token に Turnstile の ウィジェットトークンを渡すと短命トークン(24 時間/生涯 30 リクエスト)が返るので、Authorization: Bearer で渡すっちゃ。※ Turnstile のフロント側ウィジェットはフォローアップ予定っちゃ。 今は取得済みのウィジェットトークンを差し込んで試してっちゃ。
# 1) Turnstile を 1 回解いて得たウィジェットトークンを渡し、短命トークンを得る。
curl -X POST http://localhost:8787/v1/trial-token \
  -H 'content-type: application/json' \
  -d '{"turnstileToken":"<widget token>"}'
#  → {"token":"<payload>.<sig>","expiresAt":"..."}

# 2) 得たトークンを Authorization: Bearer で渡してデータルートを叩く。
curl "http://localhost:8787/v1/foods?q=アマ&limit=5" \
  -H 'Authorization: Bearer <payload>.<sig>'

これで使えるっちゃ!

サインアップからキー発行、最初のリクエストまで一通り完了っちゃ。あとは 栄養素ティアやポーション、レート制限まわりを押さえれば本番に乗せられるっちゃよ⚡️