{"openapi":"3.1.0","info":{"title":"Calorie API","description":"Food calorie API for developers: REST search, barcode lookup, macros per 100g, and autocomplete across our food database API. Free tier for nutrition apps.","version":"2.0.0","contact":{"name":"Calorie API","url":"https://calorieapi.com","email":"busybody.office@gmail.com"},"termsOfService":"https://calorieapi.com/terms","license":{"name":"Commercial","url":"https://calorieapi.com/commercial-license"}},"servers":[{"url":"https://calorieapiadmin.com","description":"Production"}],"externalDocs":{"description":"Calorie API documentation","url":"https://calorieapi.com/docs"},"paths":{"/api/v1/auth/register":{"post":{"tags":["authentication"],"summary":"Register User","description":"Register a new user.","operationId":"register_user_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegister"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["authentication"],"summary":"Login User","description":"Login user and return JWT tokens for frontend access.","operationId":"login_user_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["authentication"],"summary":"Refresh Access Token","description":"Refresh JWT access token using refresh token.","operationId":"refresh_access_token_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_refresh_access_token_api_v1_auth_refresh_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/api-keys":{"post":{"tags":["authentication"],"summary":"Create Api Key Endpoint","description":"Create a new API key for the authenticated user (requires JWT token).","operationId":"create_api_key_endpoint_api_v1_auth_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["authentication"],"summary":"List Api Keys","description":"List all API keys for the authenticated user (requires JWT token).","operationId":"list_api_keys_api_v1_auth_api_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyResponse"},"title":"Response List Api Keys Api V1 Auth Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/api-keys/{key_id}":{"delete":{"tags":["authentication"],"summary":"Revoke Api Key Endpoint","description":"Revoke an API key (requires JWT token).","operationId":"revoke_api_key_endpoint_api_v1_auth_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email":{"post":{"tags":["authentication"],"summary":"Verify Email Endpoint","description":"Verify user email with verification token.","operationId":"verify_email_endpoint_api_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_email_endpoint_api_v1_auth_verify_email_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email-code":{"post":{"tags":["authentication"],"summary":"Verify Email Code Endpoint","description":"Verify a user's email with the 6-digit code sent on registration.","operationId":"verify_email_code_endpoint_api_v1_auth_verify_email_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/resend-verification-code":{"post":{"tags":["authentication"],"summary":"Resend Verification Code Endpoint","description":"Resend a fresh 6-digit verification code. Always generic (no leak).","operationId":"resend_verification_code_endpoint_api_v1_auth_resend_verification_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["authentication"],"summary":"Forgot Password","operationId":"forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["authentication"],"summary":"Reset Password Endpoint","operationId":"reset_password_endpoint_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["authentication"],"summary":"Get Current User Info","description":"Get current user information (requires JWT token).","operationId":"get_current_user_info_api_v1_auth_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/foods/":{"get":{"tags":["foods"],"summary":"List Foods","description":"List foods with optional filtering and search (metadata only, no nutrients).","operationId":"list_foods_api_v1_foods__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Filter by brand name","title":"Brand"},"description":"Filter by brand name"},{"name":"brand_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Brand Id"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Filter by category name","title":"Category"},"description":"Filter by category name"},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"}},{"name":"nutrient_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nutrient Id"}},{"name":"min_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Amount"}},{"name":"max_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Amount"}},{"name":"min_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Calories"}},{"name":"max_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Calories"}},{"name":"min_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Protein"}},{"name":"max_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Protein"}},{"name":"min_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Carbs"}},{"name":"max_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Carbs"}},{"name":"min_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Fat"}},{"name":"max_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Fat"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Query"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/foods/brands/":{"get":{"tags":["foods"],"summary":"List Brands","description":"List brands with optional search.","operationId":"list_brands_api_v1_foods_brands__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/foods/categories/":{"get":{"tags":["foods"],"summary":"List Categories","description":"List categories with optional search.","operationId":"list_categories_api_v1_foods_categories__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/foods/nutrients/":{"get":{"tags":["foods"],"summary":"List Nutrients","description":"List nutrients with optional search.","operationId":"list_nutrients_api_v1_foods_nutrients__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/foods/{food_id}":{"get":{"tags":["foods"],"summary":"Get Food","description":"Get detailed food information including nutrients and verified portions.","operationId":"get_food_api_v1_foods__food_id__get","parameters":[{"name":"food_id","in":"path","required":true,"schema":{"type":"integer","title":"Food Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/foods":{"get":{"tags":["catalog"],"summary":"List Catalog Foods","description":"List food metadata only (no nutrients). Higher limit than /foods/.","operationId":"list_catalog_foods_api_v1_catalog_foods_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Search name/description","title":"Q"},"description":"Search name/description"},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Alias for q","title":"Query"},"description":"Alias for q"},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Brand"}},{"name":"brand_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Brand Id"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Category"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"}},{"name":"nutrient_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nutrient Id"}},{"name":"min_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Amount"}},{"name":"max_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Amount"}},{"name":"min_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Calories"}},{"name":"max_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Calories"}},{"name":"min_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Protein"}},{"name":"max_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Protein"}},{"name":"min_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Carbs"}},{"name":"max_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Carbs"}},{"name":"min_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Fat"}},{"name":"max_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Fat"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalogFood_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/foods/{food_id}":{"get":{"tags":["catalog"],"summary":"Get Catalog Food","description":"Get a single food's metadata (no nutrients or barcodes).","operationId":"get_catalog_food_api_v1_catalog_foods__food_id__get","parameters":[{"name":"food_id","in":"path","required":true,"schema":{"type":"integer","title":"Food Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogFood"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/brands":{"get":{"tags":["catalog"],"summary":"List Catalog Brands","operationId":"list_catalog_brands_api_v1_catalog_brands_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Q"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalogBrand_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/categories":{"get":{"tags":["catalog"],"summary":"List Catalog Categories","operationId":"list_catalog_categories_api_v1_catalog_categories_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Q"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalogCategory_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/nutrients":{"get":{"tags":["catalog"],"summary":"List Catalog Nutrients","operationId":"list_catalog_nutrients_api_v1_catalog_nutrients_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Q"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Search"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalogNutrient_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/foods":{"get":{"tags":["search"],"summary":"Search Foods","description":"Search foods with advanced multi-word matching and ranking.\n\nFeatures:\n- Multi-word query support with word-order independence\n- Intelligent ranking: exact phrase > all words > most words > any word\n- Returns complete nutrition data (nutrients array, per-100g values, meal object)\n- Brand, category, and nutrient/macro filters\n- Empty query returns common/popular foods\n\nResults are intelligently ranked:\n1. Exact phrase at start (e.g., \"chicken breast\" matches \"Chicken breast, raw\")\n2. Exact phrase anywhere (e.g., \"... chicken breast ...\")\n3. All words present (any order) OR most words (N-1 for N-word query)\n4. First word OR any word present","operationId":"search_foods_api_v1_search_foods_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":0,"description":"Search query (empty for common foods)","default":"","title":"Q"},"description":"Search query (empty for common foods)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"k","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Alias for limit","title":"K"},"description":"Alias for limit"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by brand name","title":"Brand"},"description":"Filter by brand name"},{"name":"brand_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by brand ID","title":"Brand Id"},"description":"Filter by brand ID"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category name","title":"Category"},"description":"Filter by category name"},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by category ID","title":"Category Id"},"description":"Filter by category ID"},{"name":"nutrient_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Require this nutrient","title":"Nutrient Id"},"description":"Require this nutrient"},{"name":"min_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Min amount for nutrient_id","title":"Min Amount"},"description":"Min amount for nutrient_id"},{"name":"max_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Max amount for nutrient_id","title":"Max Amount"},"description":"Max amount for nutrient_id"},{"name":"min_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Calories"}},{"name":"max_calories","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Calories"}},{"name":"min_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Protein"}},{"name":"max_protein","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Protein"}},{"name":"min_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Carbs"}},{"name":"max_carbs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Carbs"}},{"name":"min_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Fat"}},{"name":"max_fat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Fat"}},{"name":"match_mode","in":"query","required":false,"schema":{"type":"string","description":"any or all word matching","default":"any","title":"Match Mode"},"description":"any or all word matching"},{"name":"verified_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only verified foods","default":false,"title":"Verified Only"},"description":"Only verified foods"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FoodSearchResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/suggest":{"get":{"tags":["search"],"summary":"Suggest Foods","description":"Autocomplete food names (id, name, brand_name).","operationId":"suggest_foods_api_v1_search_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":15,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FoodSuggestItem"},"title":"Response Suggest Foods Api V1 Search Suggest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/barcode/{upc}":{"get":{"tags":["search"],"summary":"Search By Barcode","description":"Lookup food by barcode (UPC/EAN). Uses local database first, then Open Food Facts.","operationId":"search_by_barcode_api_v1_search_barcode__upc__get","parameters":[{"name":"upc","in":"path","required":true,"schema":{"type":"string","title":"Upc"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BarcodeLookupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/brands":{"get":{"tags":["search"],"summary":"Search Brands","description":"Search brands by name - SIMPLIFIED.","operationId":"search_brands_api_v1_search_brands_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/categories":{"get":{"tags":["search"],"summary":"Search Categories","description":"Search categories by name - SIMPLIFIED.","operationId":"search_categories_api_v1_search_categories_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/nutrients":{"get":{"tags":["search"],"summary":"Search Nutrients","description":"Search nutrients by name - SIMPLIFIED.","operationId":"search_nutrients_api_v1_search_nutrients_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/advanced":{"get":{"tags":["search"],"summary":"Advanced Search","description":"Advanced search with multiple filters - SIMPLIFIED.","operationId":"advanced_search_api_v1_search_advanced_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"brand_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by brand ID","title":"Brand Id"},"description":"Filter by brand ID"},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by category ID","title":"Category Id"},"description":"Filter by category ID"},{"name":"min_nutrients","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Minimum number of nutrients","title":"Min Nutrients"},"description":"Minimum number of nutrients"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/calc/macros":{"get":{"tags":["calc"],"summary":"Calc Macros","description":"Calculate BMR, TDEE, and daily macro targets using the Mifflin-St Jeor formula.","operationId":"calc_macros_api_v1_calc_macros_get","parameters":[{"name":"age","in":"query","required":true,"schema":{"type":"integer","maximum":120,"minimum":1,"description":"Age in years","title":"Age"},"description":"Age in years"},{"name":"gender","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Gender","description":"male or female"},"description":"male or female"},{"name":"weight_kg","in":"query","required":true,"schema":{"type":"number","maximum":500,"exclusiveMinimum":0,"description":"Body weight in kilograms","title":"Weight Kg"},"description":"Body weight in kilograms"},{"name":"height_cm","in":"query","required":true,"schema":{"type":"number","maximum":300,"exclusiveMinimum":0,"description":"Height in centimetres","title":"Height Cm"},"description":"Height in centimetres"},{"name":"activity","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ActivityLevel","description":"sedentary | lightly_active | moderately_active | very_active | extra_active"},"description":"sedentary | lightly_active | moderately_active | very_active | extra_active"},{"name":"goal","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Goal","description":"lose | maintain | gain"},"description":"lose | maintain | gain"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MacroCalcResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/calc/portion":{"get":{"tags":["calc"],"summary":"Calc Portion","description":"Scale a food's nutrition to an arbitrary gram amount.","operationId":"calc_portion_api_v1_calc_portion_get","parameters":[{"name":"food_id","in":"query","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"description":"Food ID from /search/foods","title":"Food Id"},"description":"Food ID from /search/foods"},{"name":"grams","in":"query","required":true,"schema":{"type":"number","maximum":5000,"exclusiveMinimum":0,"description":"Serving size in grams","title":"Grams"},"description":"Serving size in grams"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortionCalcResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/calc/recipe":{"post":{"tags":["calc"],"summary":"Calc Recipe","description":"Aggregate total and per-serving nutrition for a list of ingredients.","operationId":"calc_recipe_api_v1_calc_recipe_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeCalcRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeCalcResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ActivityLevel":{"type":"string","enum":["sedentary","lightly_active","moderately_active","very_active","extra_active"],"title":"ActivityLevel"},"ApiKeyCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreate","description":"Schema for creating API key."},"ApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"usage_count":{"type":"integer","title":"Usage Count","default":0}},"type":"object","required":["id","name","is_active"],"title":"ApiKeyResponse","description":"Schema for API key response."},"BarcodeLookupResponse":{"properties":{"barcode":{"type":"string","title":"Barcode"},"product":{"$ref":"#/components/schemas/BarcodeProductDetails"},"serving":{"$ref":"#/components/schemas/BarcodeServing"},"nutrition_per_100g":{"$ref":"#/components/schemas/BarcodeMacros"},"nutrition_per_serving":{"anyOf":[{"$ref":"#/components/schemas/BarcodeMacros"},{"type":"null"}]},"micronutrients_per_100g":{"items":{"$ref":"#/components/schemas/BarcodeMicronutrient"},"type":"array","title":"Micronutrients Per 100G"}},"type":"object","required":["barcode","product","serving","nutrition_per_100g"],"title":"BarcodeLookupResponse"},"BarcodeMacros":{"properties":{"energy_kcal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Energy Kcal","description":"Energy in kcal"},"protein_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Protein G"},"carbohydrates_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Carbohydrates G"},"fat_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fat G"},"fiber_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fiber G"},"sugars_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sugars G"},"saturated_fat_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Saturated Fat G"},"salt_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Salt G"},"sodium_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sodium G"},"added_sugars_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Added Sugars G"}},"type":"object","title":"BarcodeMacros"},"BarcodeMicronutrient":{"properties":{"name":{"type":"string","title":"Name"},"amount":{"type":"number","title":"Amount"},"unit":{"type":"string","title":"Unit"}},"type":"object","required":["name","amount","unit"],"title":"BarcodeMicronutrient"},"BarcodeProductDetails":{"properties":{"name":{"type":"string","title":"Name"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"generic_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generic Name"},"quantity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quantity","description":"Package size, e.g. '400 g'"},"ingredients":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingredients"},"allergens":{"items":{"type":"string"},"type":"array","title":"Allergens"}},"type":"object","required":["name"],"title":"BarcodeProductDetails"},"BarcodeServing":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable serving, e.g. '1 tsp (4 g)'"},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quantity","description":"Numeric serving amount when available"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Serving unit, e.g. g or ml"}},"type":"object","title":"BarcodeServing"},"Body_refresh_access_token_api_v1_auth_refresh_post":{"properties":{"refresh_token_value":{"type":"string","title":"Refresh Token Value"}},"type":"object","required":["refresh_token_value"],"title":"Body_refresh_access_token_api_v1_auth_refresh_post"},"Body_verify_email_endpoint_api_v1_auth_verify_email_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_verify_email_endpoint_api_v1_auth_verify_email_post"},"CatalogBrand":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"CatalogBrand"},"CatalogCategory":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"CatalogCategory"},"CatalogFood":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"brand_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Brand Id"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"serving_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Serving Size"},"serving_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serving Unit"},"serving":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serving"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"default_portion":{"anyOf":[{"$ref":"#/components/schemas/PortionInfo"},{"type":"null"}]},"portions_count":{"type":"integer","title":"Portions Count","default":0},"verified_portions":{"anyOf":[{"items":{"$ref":"#/components/schemas/PortionInfo"},"type":"array"},{"type":"null"}],"title":"Verified Portions"},"suggested_serving":{"anyOf":[{"$ref":"#/components/schemas/PortionInfo"},{"type":"null"}]}},"type":"object","required":["id","name"],"title":"CatalogFood"},"CatalogNutrient":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}},"type":"object","required":["id","name"],"title":"CatalogNutrient"},"FoodSearchResult":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"match_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Type","default":"text"},"search_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Search Score"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"serving_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Serving Size"},"serving_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serving Unit"},"serving":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serving"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"nutrients":{"items":{"$ref":"#/components/schemas/NutrientItem"},"type":"array","title":"Nutrients"},"portion_nutrients":{"anyOf":[{"items":{"$ref":"#/components/schemas/NutrientItem"},"type":"array"},{"type":"null"}],"title":"Portion Nutrients"},"default_portion":{"anyOf":[{"$ref":"#/components/schemas/PortionInfo"},{"type":"null"}]},"portions_count":{"type":"integer","title":"Portions Count","default":0},"upc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upc"},"calories_100g":{"type":"number","title":"Calories 100G"},"protein_100g":{"type":"number","title":"Protein 100G"},"carbs_100g":{"type":"number","title":"Carbs 100G"},"fat_100g":{"type":"number","title":"Fat 100G"},"fiber_100g":{"type":"number","title":"Fiber 100G"},"sugar_100g":{"type":"number","title":"Sugar 100G"},"match_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Match Rank"},"meal":{"$ref":"#/components/schemas/MealObject"}},"type":"object","required":["id","name","nutrients","calories_100g","protein_100g","carbs_100g","fat_100g","fiber_100g","sugar_100g","meal"],"title":"FoodSearchResult","description":"Schema for individual food search result with complete nutrition data"},"FoodSuggestItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"}},"type":"object","required":["id","name"],"title":"FoodSuggestItem","description":"Lightweight autocomplete item."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"Gender":{"type":"string","enum":["male","female"],"title":"Gender"},"Goal":{"type":"string","enum":["lose","maintain","gain"],"title":"Goal"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MacroCalcResponse":{"properties":{"bmr":{"type":"integer","title":"Bmr","description":"Basal Metabolic Rate (Mifflin-St Jeor)"},"tdee":{"type":"integer","title":"Tdee","description":"Total Daily Energy Expenditure"},"activity_multiplier":{"type":"number","title":"Activity Multiplier"},"daily_targets":{"$ref":"#/components/schemas/MacroTargets"},"formula":{"type":"string","title":"Formula","default":"Mifflin-St Jeor"}},"type":"object","required":["bmr","tdee","activity_multiplier","daily_targets"],"title":"MacroCalcResponse"},"MacroNutrients":{"properties":{"protein":{"type":"number","title":"Protein"},"carbs":{"type":"number","title":"Carbs"},"fat":{"type":"number","title":"Fat"},"fiber":{"type":"number","title":"Fiber"},"sugar":{"type":"number","title":"Sugar"}},"type":"object","required":["protein","carbs","fat","fiber","sugar"],"title":"MacroNutrients","description":"Macro nutrients in meal object"},"MacroTargets":{"properties":{"calories":{"type":"integer","title":"Calories"},"protein_g":{"type":"number","title":"Protein G"},"carbohydrates_g":{"type":"number","title":"Carbohydrates G"},"fat_g":{"type":"number","title":"Fat G"}},"type":"object","required":["calories","protein_g","carbohydrates_g","fat_g"],"title":"MacroTargets"},"MealObject":{"properties":{"name":{"type":"string","title":"Name"},"calories":{"type":"number","title":"Calories"},"servings":{"type":"integer","title":"Servings"},"macros":{"$ref":"#/components/schemas/MacroNutrients"}},"type":"object","required":["name","calories","servings","macros"],"title":"MealObject","description":"Meal object with calculated values"},"NutrientItem":{"properties":{"nutrient_id":{"type":"integer","title":"Nutrient Id"},"nutrient_name":{"type":"string","title":"Nutrient Name"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["nutrient_id","nutrient_name","amount"],"title":"NutrientItem","description":"Nutrient item in search results"},"PaginatedResponse":{"properties":{"data":{"items":{},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse","description":"Generic paginated response model"},"PaginatedResponse_CatalogBrand_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CatalogBrand"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse[CatalogBrand]"},"PaginatedResponse_CatalogCategory_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CatalogCategory"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse[CatalogCategory]"},"PaginatedResponse_CatalogFood_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CatalogFood"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse[CatalogFood]"},"PaginatedResponse_CatalogNutrient_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CatalogNutrient"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse[CatalogNutrient]"},"PaginatedResponse_FoodSearchResult_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FoodSearchResult"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"PaginatedResponse[FoodSearchResult]"},"PortionCalcResponse":{"properties":{"food_id":{"type":"integer","title":"Food Id"},"food_name":{"type":"string","title":"Food Name"},"requested_grams":{"type":"number","title":"Requested Grams"},"nutrition":{"$ref":"#/components/schemas/PortionNutrition"}},"type":"object","required":["food_id","food_name","requested_grams","nutrition"],"title":"PortionCalcResponse"},"PortionInfo":{"properties":{"grams":{"type":"number","title":"Grams"},"label":{"type":"string","title":"Label"}},"type":"object","required":["grams","label"],"title":"PortionInfo","description":"A serving portion with gram weight and display label."},"PortionNutrition":{"properties":{"calories":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calories"},"protein_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Protein G"},"carbohydrates_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Carbohydrates G"},"fat_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fat G"},"fiber_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fiber G"},"sugars_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sugars G"},"saturated_fat_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Saturated Fat G"},"sodium_g":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sodium G"}},"type":"object","title":"PortionNutrition"},"RecipeCalcRequest":{"properties":{"servings":{"type":"integer","maximum":100,"minimum":1,"title":"Servings","default":1},"ingredients":{"items":{"$ref":"#/components/schemas/RecipeIngredient"},"type":"array","maxItems":50,"minItems":1,"title":"Ingredients"}},"type":"object","required":["ingredients"],"title":"RecipeCalcRequest"},"RecipeCalcResponse":{"properties":{"servings":{"type":"integer","title":"Servings"},"total":{"$ref":"#/components/schemas/RecipeTotals"},"per_serving":{"$ref":"#/components/schemas/RecipeTotals"},"ingredients_resolved":{"type":"integer","title":"Ingredients Resolved","description":"Ingredients successfully found in the database"}},"type":"object","required":["servings","total","per_serving","ingredients_resolved"],"title":"RecipeCalcResponse"},"RecipeIngredient":{"properties":{"food_id":{"type":"integer","exclusiveMinimum":0,"title":"Food Id"},"grams":{"type":"number","exclusiveMinimum":0,"title":"Grams","description":"Amount in grams"}},"type":"object","required":["food_id","grams"],"title":"RecipeIngredient"},"RecipeTotals":{"properties":{"calories":{"type":"number","title":"Calories"},"protein_g":{"type":"number","title":"Protein G"},"carbohydrates_g":{"type":"number","title":"Carbohydrates G"},"fat_g":{"type":"number","title":"Fat G"},"fiber_g":{"type":"number","title":"Fiber G"},"sugars_g":{"type":"number","title":"Sugars G"}},"type":"object","required":["calories","protein_g","carbohydrates_g","fat_g","fiber_g","sugars_g"],"title":"RecipeTotals"},"ResendCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendCodeRequest","description":"Schema for requesting a new email OTP code."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"anyOf":[{"$ref":"#/components/schemas/UserResponse"},{"type":"null"}]}},"type":"object","required":["access_token","expires_in"],"title":"TokenResponse","description":"Schema for JWT token response."},"UserLogin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"UserLogin","description":"Schema for user login."},"UserRegister":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"plan_id":{"type":"integer","title":"Plan Id","default":1}},"type":"object","required":["email","password"],"title":"UserRegister","description":"Schema for user registration."},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"plan_id":{"type":"integer","title":"Plan Id","default":1},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","first_name","last_name","company_name","created_at"],"title":"UserResponse","description":"Schema for user response."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyCodeRequest","description":"Schema for verifying an email OTP code."}}}}