{"openapi":"3.1.0","info":{"title":"Amy API","version":"1.0.0","description":"Amy nutrition, journal, profile, and weight data API for user-authorized clients and MCP tools.","contact":{"name":"Amy","url":"https://connect.amyfoodjournal.com/docs"}},"servers":[{"url":"https://connect.amyfoodjournal.com/api/v1","description":"Amy public API"}],"tags":[{"name":"Profile","description":"Profile, settings, goals, and health profile data."},{"name":"Nutrition","description":"Daily nutrition summaries and food journal entries."},{"name":"Weight","description":"Recent weight history."}],"components":{"securitySchemes":{"amyApiKey":{"type":"http","scheme":"bearer","bearerFormat":"Amy API key","description":"Send `Authorization: Bearer amy_live_...` with every request."},"amyOAuth":{"type":"oauth2","description":"OAuth 2.1 bearer tokens issued by Amy/Supabase Auth for ChatGPT, Claude, and other hosted connectors.","flows":{"authorizationCode":{"authorizationUrl":"https://jabgxipuolfxmkwtgrii.supabase.co/auth/v1/oauth/authorize","tokenUrl":"https://jabgxipuolfxmkwtgrii.supabase.co/auth/v1/oauth/token","scopes":{"openid":"Supabase openid scope","email":"Supabase email scope","profile":"Supabase profile scope"}}}}},"schemas":{"ErrorResponse":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","examples":["invalid_api_key"]},"message":{"type":"string","examples":["Invalid Amy API key"]}}},"ProfileResponse":{"type":"object","properties":{"profile":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"email":{"type":["string","null"],"format":"email"},"avatar_url":{"type":["string","null"]},"has_premium":{"type":["boolean","null"]},"is_beta_tester":{"type":["boolean","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"settings":{"type":["object","null"],"properties":{"nutrition_goals":{"$ref":"#/components/schemas/NutritionGoals"},"water":{"type":"object","properties":{"enabled":{"type":"boolean"},"unit":{"type":"string","examples":["ml"]},"daily_goal_ml":{"type":["number","null"]}}},"timezone":{"type":"string","examples":["America/Chicago"]},"health_profile":{"type":"object"},"calorie_estimation_bias":{"type":["string","null"]},"updated_at":{"type":["string","null"],"format":"date-time"}}}}},"NutritionSummaryResponse":{"type":"object","required":["date","timezone","totals","goals","entries"],"properties":{"date":{"type":"string","format":"date","examples":["2026-06-14"]},"timezone":{"type":"string","examples":["America/Chicago"]},"totals":{"$ref":"#/components/schemas/NutritionTotals"},"goals":{"anyOf":[{"$ref":"#/components/schemas/NutritionGoals"},{"type":"null"}]},"entries":{"type":"array","items":{"$ref":"#/components/schemas/FoodEntry"}}}},"FoodEntriesResponse":{"type":"object","required":["entries","limit"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/FoodEntry"}},"limit":{"type":"integer","examples":[14]}}},"FoodEntry":{"type":"object","required":["id","date","totals","items"],"properties":{"id":{"type":"string","format":"uuid"},"date":{"type":"string","format":"date"},"food_text":{"type":["string","null"]},"timezone":{"type":["string","null"]},"totals":{"$ref":"#/components/schemas/NutritionTotals"},"items":{"type":"array","items":{"$ref":"#/components/schemas/FoodItem"}},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"FoodItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"detailed_description":{"type":["string","null"],"description":"Optional longer context used for nutrition analysis while keeping the visible journal line concise."},"calories":{"type":"number"},"protein":{"type":["number","null"]},"carbs":{"type":["number","null"]},"fat":{"type":["number","null"]},"sugar":{"type":["number","null"]},"fiber":{"type":["number","null"]},"sodium":{"type":["number","null"],"description":"Milligrams."},"is_water_entry":{"type":"boolean"},"water_milliliters":{"type":"number"},"line_index":{"type":["integer","null"]},"ai_comment":{"type":["string","null"]},"confidence_score":{"type":["number","null"]},"updated_at":{"type":["string","null"],"format":"date-time"}}},"NutritionTotals":{"type":"object","properties":{"calories":{"type":"number"},"protein":{"type":"number","description":"Grams."},"carbs":{"type":"number","description":"Grams."},"fat":{"type":"number","description":"Grams."},"sugar":{"type":"number","description":"Grams."},"fiber":{"type":"number","description":"Grams."},"sodium":{"type":"number","description":"Milligrams."},"water_milliliters":{"type":"number"}}},"NutritionGoals":{"type":"object","properties":{"daily_calorie_goal":{"type":["number","null"],"description":"Used in `/me` profile settings."},"calories":{"type":["number","null"]},"protein":{"type":["number","null"]},"carbs":{"type":["number","null"]},"fat":{"type":["number","null"]},"sugar":{"type":["number","null"]},"fiber":{"type":["number","null"]},"sodium":{"type":["number","null"]},"water_milliliters":{"type":["number","null"]}}},"WeightHistoryResponse":{"type":"object","required":["entries","limit"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/WeightEntry"}},"limit":{"type":"integer","examples":[30]}}},"WeightEntry":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"weight_kg":{"type":"number"},"recorded_at":{"type":["string","null"],"format":"date-time"},"recorded_date":{"type":["string","null"],"format":"date"},"source":{"type":["string","null"],"examples":["manual"]},"notes":{"type":["string","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}}}},"security":[{"amyApiKey":[]},{"amyOAuth":["openid","email","profile"]}],"paths":{"/me":{"get":{"tags":["Profile"],"operationId":"getProfile","summary":"Get Amy profile and settings","description":"Returns the authenticated user profile, nutrition goals, water settings, timezone, and health profile.","responses":{"200":{"description":"Profile and settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/nutrition/summary":{"get":{"tags":["Nutrition"],"operationId":"getNutritionSummary","summary":"Get nutrition summary for a day","description":"Returns daily totals, goals, water, and the entries that contributed to the totals.","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":"Date formatted as YYYY-MM-DD. Defaults to today in the user timezone.","example":"2026-06-14"}],"responses":{"200":{"description":"Daily nutrition summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NutritionSummaryResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/food-entries":{"get":{"tags":["Nutrition"],"operationId":"listFoodEntries","summary":"List food journal entries","description":"Returns recent food journal entries with item-level nutrition. Date filters are inclusive.","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"example":"2026-06-01"},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"example":"2026-06-14"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":14}}],"responses":{"200":{"description":"Food journal entries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FoodEntriesResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/weight-history":{"get":{"tags":["Weight"],"operationId":"listWeightHistory","summary":"List weight history","description":"Returns the most recent weight entries for the authenticated user.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"Weight entries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeightHistoryResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}