Macros are optional; send what you have. Updates the day’s protein, calorie and fiber rollups.
Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422).
Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).
A 15-minute token bound to one patient and one enrollment, issued by POST /v1/oauth/token with the
token-exchange grant. Treat it as opaque. When it expires, exchange a fresh assertion; there is no refresh token.
A unique key per logical request, for example a UUID. Retrying with the same key and the same body
within 24 hours returns the first response (with Idempotent-Replayed: true) instead of creating a duplicate.
The same key with a different body is refused with 422 idempotency_key_reused.
How it was entered. photo_ai when the form was pre-filled by POST /v1/patient/meal-photos/{upload_id}/analysis
(send the same photo_upload_id); TeraRx then compares what was saved with the estimate.
How it was entered. photo_ai when the form was pre-filled by POST /v1/patient/meal-photos/{upload_id}/analysis
(send the same photo_upload_id); TeraRx then compares what was saved with the estimate.
Short-lived link to the photo (expires within minutes). Do not store it.
Example:
null
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TeraRx API","description":"GLP-1 coaching for telehealth brands, their patients and their prescribers.","colors":{"primary":"#465FFF","light":"#7592FF","dark":"#2A31D8"},"logo":{"light":"https://mintcdn.com/tera-health/uWz_0YeC9jmRBnOf/logo/terarx-logo-on-light.webp?fit=max\u0026auto=format\u0026n=uWz_0YeC9jmRBnOf\u0026q=85\u0026s=e1b13d13ab2a8adf4dd39a95782a1e51","dark":"https://mintcdn.com/tera-health/uWz_0YeC9jmRBnOf/logo/terarx-logo-on-dark.webp?fit=max\u0026auto=format\u0026n=uWz_0YeC9jmRBnOf\u0026q=85\u0026s=e22a4d909beab942b4f07d1241ad3f50","href":"/introduction"},"favicon":"https://mintcdn.com/tera-health/Etya93TUDmx6XFCd/logo/terarx-mark-192.png?fit=max\u0026auto=format\u0026n=Etya93TUDmx6XFCd\u0026q=85\u0026s=8affa9c088be3e81c330395cc04d8772","api":{"playground":{"display":"interactive","proxy":false},"examples":{"languages":["curl","javascript","python"],"prefill":true}},"appearance":{"default":"light"},"navbar":{"primary":{"type":"button","label":"Quickstart","href":"/quickstart"}},"footer":{"links":[{"header":"Try it","items":[{"label":"Postman collection","href":"https://sandbox.rx.tera.health/docs/postman/terarx-v1.postman_collection.json"},{"label":"Postman environment","href":"https://sandbox.rx.tera.health/docs/postman/terarx-sandbox.postman_environment.json"},{"label":"Samples","href":"/samples"}]}]},"fonts":{"family":"Outfit"},"icons":{"library":"lucide"},"banner":{"content":"This contract is a draft for partner review. Every example uses synthetic data.","dismissible":true},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tera-health","hasAudioNarration":false,"actualSubdomain":"tera-health","customDomains":["docs.tera.health"],"gitSource":{"type":"github","owner":"tera-engineering","repo":"terarx","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":"","_id":"6ae13351e0799c60782bc4ce"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af0a42e99ffa6db69675356","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"API reference","count":139},{"language":"default","tag":"Webhooks","count":22},{"language":"default","tag":"Logging","count":21},{"language":"default","tag":"Brand logs","count":13},{"language":"default","tag":"Guides","count":12},{"language":"default","tag":"AI Coach","count":9},{"language":"default","tag":"Enrollments","count":9},{"language":"default","tag":"Protocols and plans","count":8},{"language":"default","tag":"Care messaging","count":7},{"language":"default","tag":"Library","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"api-reference/logging/log-a-meal","slug":"/api-reference/logging/log-a-meal","pageMetadata":{"title":"Log a meal","description":"Macros are optional; send what you have. Updates the day's protein, calorie and fiber rollups.\nError codes: `upload_not_found` (422) for an unknown or expired `photo_upload_id`, `meal_plan_item_not_found` (422).\n\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meals","href":"/api-reference/logging/log-a-meal","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Macros are optional; send what you have. Updates the day’s protein, calorie and fiber rollups.\\nError codes: \", _jsx(_components.code, {\n children: \"upload_not_found\"\n }), \" (422) for an unknown or expired \", _jsx(_components.code, {\n children: \"photo_upload_id\"\n }), \", \", _jsx(_components.code, {\n children: \"meal_plan_item_not_found\"\n }), \" (422).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Plans:\"\n }), \" AI + health and fitness coaches (\", _jsx(_components.code, {\n children: \"ai_health_fitness\"\n }), \"), AI only (\", _jsx(_components.code, {\n children: \"ai_only\"\n }), \").\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Log a meal","description":"Macros are optional; send what you have. Updates the day's protein, calorie and fiber rollups.\nError codes: `upload_not_found` (422) for an unknown or expired `photo_upload_id`, `meal_plan_item_not_found` (422).\n\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meals","href":"/api-reference/logging/log-a-meal","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createMealLog","tags":["Logging"],"summary":"Log a meal","description":"Macros are optional; send what you have. Updates the day's protein, calorie and fiber rollups.\nError codes: `upload_not_found` (422) for an unknown or expired `photo_upload_id`, `meal_plan_item_not_found` (422).\n\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","security":["87f87c0d-0c09-4751-aaef-f5ed878a00d7"],"x-plans":["ai_health_fitness","ai_only"],"parameters":["2608f3e1-387b-4874-96fc-b67f28d7d872"],"requestBody":"7f2ef9e7-4161-45f2-b393-4d0151561559","responses":{"201":"7869f80a-b90a-48d7-8eee-cdbd856a58d1","400":"f6dc431c-8b7d-4c0b-be6a-b0c42a784c11","401":"f2fd0ef1-f687-4862-87a4-847909183c59","422":"b3b89a81-618a-400d-a3d0-22488a03e831","429":"84109f59-6265-478c-a2b3-1dc6f175d112"},"method":"post","type":"path","servers":["cbd6961c-1d43-4b1a-ace5-6c8cd05a19e6","d31af898-dd82-49ef-beb0-575942e35d63"],"path":"/v1/patient/meals","baseUrlOptions":["https://sandbox.rx.tera.health","http://localhost:4010"],"title":"Log a meal","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.eaten_at":"2026-10-26T12:30:00Z","body.meal_type":"lunch","body.description":"Greek yogurt with berries and almonds","body.photo_upload_id":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","body.entry_method":"photo","body.protein_g":24,"body.calories_kcal":310,"body.fiber_g":6}],"disableProxy":true},"dependencies":{"parameters":{"2608f3e1-387b-4874-96fc-b67f28d7d872":{"name":"Idempotency-Key","in":"header","required":true,"description":"A unique key per logical request, for example a UUID. Retrying with the same key and the same body\nwithin 24 hours returns the first response (with `Idempotent-Replayed: true`) instead of creating a duplicate.\nThe same key with a different body is refused with `422 idempotency_key_reused`.\n","schema":{"type":"string","minLength":8,"maxLength":255,"x-default":"7d0c7f4e-1a8b-4c55-9d3e-2f6a1b0c9e84","isRequired":true,"description":"A unique key per logical request, for example a UUID. Retrying with the same key and the same body\nwithin 24 hours returns the first response (with `Idempotent-Replayed: true`) instead of creating a duplicate.\nThe same key with a different body is refused with `422 idempotency_key_reused`.\n","uniqueKey":"","typeLabel":"string"},"example":"7d0c7f4e-1a8b-4c55-9d3e-2f6a1b0c9e84"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["eaten_at"],"properties":{"eaten_at":{"type":"string","format":"date-time","description":"ISO 8601 in UTC.","example":"2026-10-26T14:05:00Z","isRequired":true,"uniqueKey":"eaten_at","typeLabel":"string\u003cdate-time>"},"meal_type":{"type":"string","enum":["breakfast","lunch","dinner","snack"],"example":"lunch","uniqueKey":"meal_type","typeLabel":"enum\u003cstring>"},"meal_plan_item_id":{"type":"string","format":"uuid","example":"3c1e8f20-5b7a-4d9c-8e61-0a2b4c6d8e01","description":"Set when the patient ate a meal from their plan.","uniqueKey":"meal_plan_item_id","typeLabel":"string\u003cuuid>"},"description":{"type":"string","maxLength":1000,"example":"Greek yogurt with berries and almonds","uniqueKey":"description","typeLabel":"string"},"photo_upload_id":{"type":"string","format":"uuid","example":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","writeOnly":true,"description":"From `POST /v1/patient/meal-photos`, after the photo was uploaded. Not returned; read `photo_url` instead.","uniqueKey":"photo_upload_id","typeLabel":"string\u003cuuid>"},"entry_method":{"type":"string","enum":["manual","photo","photo_ai","text_ai","barcode","plan"],"description":"How it was entered. `photo_ai` when the form was pre-filled by `POST /v1/patient/meal-photos/{upload_id}/analysis`\n(send the same `photo_upload_id`); TeraRx then compares what was saved with the estimate.\n","example":"manual","uniqueKey":"entry_method","typeLabel":"enum\u003cstring>"},"protein_g":{"type":"number","minimum":0,"maximum":500,"example":24,"uniqueKey":"protein_g","typeLabel":"number"},"calories_kcal":{"type":"integer","minimum":0,"maximum":10000,"example":310,"uniqueKey":"calories_kcal","typeLabel":"integer"},"carbs_g":{"type":"number","minimum":0,"example":28,"uniqueKey":"carbs_g","typeLabel":"number"},"fat_g":{"type":"number","minimum":0,"example":11,"uniqueKey":"fat_g","typeLabel":"number"},"fiber_g":{"type":"number","minimum":0,"example":6,"uniqueKey":"fiber_g","typeLabel":"number"},"sugar_g":{"type":"number","minimum":0,"example":14,"uniqueKey":"sugar_g","typeLabel":"number"},"sodium_mg":{"type":"integer","minimum":0,"example":95,"uniqueKey":"sodium_mg","typeLabel":"integer"},"nutrients":{"type":"object","description":"Vitamins, minerals and anything else, keyed by nutrient code.","additionalProperties":{"type":"number","uniqueKey":"nutrients.additionalProperties","typeLabel":"number"},"example":{"calcium_mg":220},"uniqueKey":"nutrients","typeLabel":"object"},"ingredients":{"type":"array","maxItems":50,"items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":200,"example":"Greek yogurt, plain, nonfat","isRequired":true,"uniqueKey":"ingredients.items.[INDEX].name","typeLabel":"string"},"quantity":{"type":"number","example":170,"uniqueKey":"ingredients.items.[INDEX].quantity","typeLabel":"number"},"unit":{"type":"string","example":"g","uniqueKey":"ingredients.items.[INDEX].unit","typeLabel":"string"},"protein_g":{"type":"number","example":17,"uniqueKey":"ingredients.items.[INDEX].protein_g","typeLabel":"number"},"calories_kcal":{"type":"integer","example":100,"uniqueKey":"ingredients.items.[INDEX].calories_kcal","typeLabel":"integer"},"carbs_g":{"type":"number","example":6,"uniqueKey":"ingredients.items.[INDEX].carbs_g","typeLabel":"number"},"fat_g":{"type":"number","example":0.7,"uniqueKey":"ingredients.items.[INDEX].fat_g","typeLabel":"number"},"fiber_g":{"type":"number","example":0,"uniqueKey":"ingredients.items.[INDEX].fiber_g","typeLabel":"number"}},"uniqueKey":"ingredients.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ingredients","typeLabel":"object[]"},"external_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[\\x21-\\x7E]+$","description":"Your id for this log. A second log with the same id returns the first one instead of a duplicate.","example":"meal-77120","uniqueKey":"external_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"eaten_at":"2026-10-26T12:30:00Z","meal_type":"lunch","description":"Greek yogurt with berries and almonds","photo_upload_id":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","entry_method":"photo","protein_g":24,"calories_kcal":310,"fiber_g":6},"examples":{"Example":{"title":"Example","value":{"eaten_at":"2026-10-26T12:30:00Z","meal_type":"lunch","description":"Greek yogurt with berries and almonds","photo_upload_id":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","entry_method":"photo","protein_g":24,"calories_kcal":310,"fiber_g":6}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"7869f80a-b90a-48d7-8eee-cdbd856a58d1":{"description":"Logged.","content":{"application/json":{"schema":{"type":"object","required":["id","log_date","source","created_at","updated_at","eaten_at"],"properties":{"eaten_at":{"type":"string","format":"date-time","description":"ISO 8601 in UTC.","example":"2026-10-26T14:05:00Z","isRequired":true,"uniqueKey":"eaten_at","typeLabel":"string\u003cdate-time>"},"id":{"type":"string","format":"uuid","example":"0190f5c9-5d6e-7f70-8a92-1b2c3d4e5f60","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"log_date":{"type":"string","format":"date","description":"A calendar date in the patient's time zone.","example":"2026-10-26","isRequired":true,"uniqueKey":"log_date","typeLabel":"string\u003cdate>"},"source":{"type":"string","enum":["app","brand_app","brand_api","wearable","coach","ai","system"],"readOnly":true,"description":"Set by the API from the caller. `brand_api` for brand servers, `brand_app` for patient tokens issued to a brand.","example":"brand_app","isRequired":true,"uniqueKey":"source","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","description":"ISO 8601 in UTC.","example":"2026-10-26T14:05:00Z","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","description":"When the log was last corrected; the same as `created_at` until then.","example":"2026-10-26T14:05:00Z","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"meal_type":{"type":"string","enum":["breakfast","lunch","dinner","snack"],"example":"lunch","uniqueKey":"meal_type","typeLabel":"enum\u003cstring>"},"meal_plan_item_id":{"type":"string","format":"uuid","example":"3c1e8f20-5b7a-4d9c-8e61-0a2b4c6d8e01","description":"Set when the patient ate a meal from their plan.","uniqueKey":"meal_plan_item_id","typeLabel":"string\u003cuuid>"},"description":{"type":"string","maxLength":1000,"example":"Greek yogurt with berries and almonds","uniqueKey":"description","typeLabel":"string"},"entry_method":{"type":"string","enum":["manual","photo","photo_ai","text_ai","barcode","plan"],"description":"How it was entered. `photo_ai` when the form was pre-filled by `POST /v1/patient/meal-photos/{upload_id}/analysis`\n(send the same `photo_upload_id`); TeraRx then compares what was saved with the estimate.\n","example":"manual","uniqueKey":"entry_method","typeLabel":"enum\u003cstring>"},"protein_g":{"type":"number","minimum":0,"maximum":500,"example":24,"uniqueKey":"protein_g","typeLabel":"number"},"calories_kcal":{"type":"integer","minimum":0,"maximum":10000,"example":310,"uniqueKey":"calories_kcal","typeLabel":"integer"},"carbs_g":{"type":"number","minimum":0,"example":28,"uniqueKey":"carbs_g","typeLabel":"number"},"fat_g":{"type":"number","minimum":0,"example":11,"uniqueKey":"fat_g","typeLabel":"number"},"fiber_g":{"type":"number","minimum":0,"example":6,"uniqueKey":"fiber_g","typeLabel":"number"},"sugar_g":{"type":"number","minimum":0,"example":14,"uniqueKey":"sugar_g","typeLabel":"number"},"sodium_mg":{"type":"integer","minimum":0,"example":95,"uniqueKey":"sodium_mg","typeLabel":"integer"},"nutrients":{"type":"object","description":"Vitamins, minerals and anything else, keyed by nutrient code.","additionalProperties":{"type":"number","uniqueKey":"nutrients.additionalProperties","typeLabel":"number"},"example":{"calcium_mg":220},"uniqueKey":"nutrients","typeLabel":"object"},"ingredients":{"type":"array","maxItems":50,"items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":200,"example":"Greek yogurt, plain, nonfat","isRequired":true,"uniqueKey":"ingredients.items.[INDEX].name","typeLabel":"string"},"quantity":{"type":"number","example":170,"uniqueKey":"ingredients.items.[INDEX].quantity","typeLabel":"number"},"unit":{"type":"string","example":"g","uniqueKey":"ingredients.items.[INDEX].unit","typeLabel":"string"},"protein_g":{"type":"number","example":17,"uniqueKey":"ingredients.items.[INDEX].protein_g","typeLabel":"number"},"calories_kcal":{"type":"integer","example":100,"uniqueKey":"ingredients.items.[INDEX].calories_kcal","typeLabel":"integer"},"carbs_g":{"type":"number","example":6,"uniqueKey":"ingredients.items.[INDEX].carbs_g","typeLabel":"number"},"fat_g":{"type":"number","example":0.7,"uniqueKey":"ingredients.items.[INDEX].fat_g","typeLabel":"number"},"fiber_g":{"type":"number","example":0,"uniqueKey":"ingredients.items.[INDEX].fiber_g","typeLabel":"number"}},"uniqueKey":"ingredients.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ingredients","typeLabel":"object[]"},"external_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[\\x21-\\x7E]+$","description":"Your id for this log. A second log with the same id returns the first one instead of a duplicate.","example":"meal-77120","uniqueKey":"external_id","typeLabel":"string"},"photo_url":{"oneOf":[{"type":"string","format":"uri","readOnly":true,"description":"Short-lived link to the photo (expires within minutes). Do not store it.","example":null,"uniqueKey":"photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","readOnly":true,"description":"Short-lived link to the photo (expires within minutes). Do not store it.","example":null,"uniqueKey":"photo_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"photo_url","typeLabel":"string\u003curi> | null"}},"uniqueKey":"","typeLabel":"object"},"example":{"id":"0190f5c9-5d6e-7f70-8a92-1b2c3d4e5f60","eaten_at":"2026-10-26T12:30:00Z","log_date":"2026-10-26","meal_type":"lunch","description":"Greek yogurt with berries and almonds","photo_url":"https://media.example.com/meal-photos/8e2c4a60?signature=example","entry_method":"photo","protein_g":24,"calories_kcal":310,"fiber_g":6,"source":"brand_app","created_at":"2026-10-26T12:31:04Z","updated_at":"2026-10-26T12:31:04Z"},"examples":{"Example":{"title":"Example","value":{"id":"0190f5c9-5d6e-7f70-8a92-1b2c3d4e5f60","eaten_at":"2026-10-26T12:30:00Z","log_date":"2026-10-26","meal_type":"lunch","description":"Greek yogurt with berries and almonds","photo_url":"https://media.example.com/meal-photos/8e2c4a60?signature=example","entry_method":"photo","protein_g":24,"calories_kcal":310,"fiber_g":6,"source":"brand_app","created_at":"2026-10-26T12:31:04Z","updated_at":"2026-10-26T12:31:04Z"}}},"exampleType":"examples"}},"headers":{"X-Request-Id":{"description":"Unique id of this request. Echoes a valid `X-Request-Id` you sent, otherwise generated. Also in every problem body.","schema":{"type":"string"},"example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"RateLimit-Limit":{"description":"Requests allowed per minute for this client (600 by default, set per contract).","schema":{"type":"integer"},"example":600},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"},"example":587},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"},"example":42},"Idempotent-Replayed":{"description":"`true` when this response is a replay of an earlier request with the same `Idempotency-Key`.","schema":{"type":"boolean"},"example":true}},"exampleType":"examples"},"f6dc431c-8b7d-4c0b-be6a-b0c42a784c11":{"description":"The request is malformed (unparseable JSON, wrong content type, unknown query parameter).","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details, sent as `application/problem+json` with every 4xx and 5xx.\nA problem never contains patient data: no names, no values from the request, no free text the caller sent.\n","required":["type","title","status","code","request_id"],"properties":{"type":{"type":"string","format":"uri-reference","description":"`about:blank` until the docs have a public home. Branch on `code`, not on `type` or `title`.","example":"about:blank","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"title":{"type":"string","description":"The HTTP status phrase.","example":"Not Found","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","minimum":400,"maximum":599,"example":404,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"code":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Stable machine-readable code. New codes may be added; existing ones never change meaning.","example":"enrollment_not_found","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"request_id":{"type":"string","description":"Same value as the `X-Request-Id` response header. Quote it when you contact TeraRx.","example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"detail":{"type":"string","description":"What went wrong, in words safe to log.","example":"No enrollment with this id is visible to this client.","uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","format":"uri-reference","description":"The path of the request that failed.","example":"/v1/enrollments/0190f5c2-3a1b-7c4d-8e9f-a0b1c2d3e4f5","uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"errors":{"type":"array","description":"One entry per invalid field, for `validation_failed`.","items":{"type":"object","required":["pointer","code"],"properties":{"pointer":{"type":"string","description":"JSON Pointer (RFC 6901) to the field in the request body, or `path:\u003cname>`, `query:\u003cname>` or `header:\u003cname>` for a parameter.","example":"/patient/state_code","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","enum":["required","invalid_type","invalid_format","out_of_range","too_long","unknown_value","not_allowed"],"example":"invalid_format","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"What the field must look like. Never repeats the value that was sent.","example":"Must be a two-letter USPS state code.","uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"The request body is not valid JSON.","code":"malformed_request","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"The request body is not valid JSON.","code":"malformed_request","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"}}},"exampleType":"examples"}},"headers":{"X-Request-Id":{"description":"Unique id of this request. Echoes a valid `X-Request-Id` you sent, otherwise generated. Also in every problem body.","schema":{"type":"string"},"example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"RateLimit-Limit":{"description":"Requests allowed per minute for this client (600 by default, set per contract).","schema":{"type":"integer"},"example":600},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"},"example":587},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"},"example":42}},"exampleType":"examples"},"f2fd0ef1-f687-4862-87a4-847909183c59":{"description":"The access token is missing, expired or revoked.","headers":{"X-Request-Id":{"description":"Unique id of this request. Echoes a valid `X-Request-Id` you sent, otherwise generated. Also in every problem body.","schema":{"type":"string"},"example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"RateLimit-Limit":{"description":"Requests allowed per minute for this client (600 by default, set per contract).","schema":{"type":"integer"},"example":600},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"},"example":587},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"},"example":42},"WWW-Authenticate":{"description":"The scheme to authenticate with.","schema":{"type":"string"},"example":"Bearer error=\"invalid_token\""}},"content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details, sent as `application/problem+json` with every 4xx and 5xx.\nA problem never contains patient data: no names, no values from the request, no free text the caller sent.\n","required":["type","title","status","code","request_id"],"properties":{"type":{"type":"string","format":"uri-reference","description":"`about:blank` until the docs have a public home. Branch on `code`, not on `type` or `title`.","example":"about:blank","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"title":{"type":"string","description":"The HTTP status phrase.","example":"Not Found","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","minimum":400,"maximum":599,"example":404,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"code":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Stable machine-readable code. New codes may be added; existing ones never change meaning.","example":"enrollment_not_found","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"request_id":{"type":"string","description":"Same value as the `X-Request-Id` response header. Quote it when you contact TeraRx.","example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"detail":{"type":"string","description":"What went wrong, in words safe to log.","example":"No enrollment with this id is visible to this client.","uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","format":"uri-reference","description":"The path of the request that failed.","example":"/v1/enrollments/0190f5c2-3a1b-7c4d-8e9f-a0b1c2d3e4f5","uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"errors":{"type":"array","description":"One entry per invalid field, for `validation_failed`.","items":{"type":"object","required":["pointer","code"],"properties":{"pointer":{"type":"string","description":"JSON Pointer (RFC 6901) to the field in the request body, or `path:\u003cname>`, `query:\u003cname>` or `header:\u003cname>` for a parameter.","example":"/patient/state_code","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","enum":["required","invalid_type","invalid_format","out_of_range","too_long","unknown_value","not_allowed"],"example":"invalid_format","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"What the field must look like. Never repeats the value that was sent.","example":"Must be a two-letter USPS state code.","uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"The access token has expired. Request a new one.","code":"token_expired","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Unauthorized","status":401,"detail":"The access token has expired. Request a new one.","code":"token_expired","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"}}},"exampleType":"examples"}},"exampleType":"examples"},"b3b89a81-618a-400d-a3d0-22488a03e831":{"description":"A path, query or header value, or the body, fails validation (for example an id that isn't a UUID, or a\nfield out of range), or an `Idempotency-Key` was reused with a different body. `errors` lists each problem.\n","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details, sent as `application/problem+json` with every 4xx and 5xx.\nA problem never contains patient data: no names, no values from the request, no free text the caller sent.\n","required":["type","title","status","code","request_id"],"properties":{"type":{"type":"string","format":"uri-reference","description":"`about:blank` until the docs have a public home. Branch on `code`, not on `type` or `title`.","example":"about:blank","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"title":{"type":"string","description":"The HTTP status phrase.","example":"Not Found","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","minimum":400,"maximum":599,"example":404,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"code":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Stable machine-readable code. New codes may be added; existing ones never change meaning.","example":"enrollment_not_found","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"request_id":{"type":"string","description":"Same value as the `X-Request-Id` response header. Quote it when you contact TeraRx.","example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"detail":{"type":"string","description":"What went wrong, in words safe to log.","example":"No enrollment with this id is visible to this client.","uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","format":"uri-reference","description":"The path of the request that failed.","example":"/v1/enrollments/0190f5c2-3a1b-7c4d-8e9f-a0b1c2d3e4f5","uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"errors":{"type":"array","description":"One entry per invalid field, for `validation_failed`.","items":{"type":"object","required":["pointer","code"],"properties":{"pointer":{"type":"string","description":"JSON Pointer (RFC 6901) to the field in the request body, or `path:\u003cname>`, `query:\u003cname>` or `header:\u003cname>` for a parameter.","example":"/patient/state_code","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","enum":["required","invalid_type","invalid_format","out_of_range","too_long","unknown_value","not_allowed"],"example":"invalid_format","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"What the field must look like. Never repeats the value that was sent.","example":"Must be a two-letter USPS state code.","uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"validation_failed":{"title":"validation_failed","value":{"type":"about:blank","title":"Unprocessable Content","status":422,"detail":"1 field is invalid.","code":"validation_failed","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","errors":[{"pointer":"/patient/state_code","code":"invalid_format","detail":"Must be a two-letter USPS state code."}]}},"invalid_path_parameter":{"title":"invalid_path_parameter","value":{"type":"about:blank","title":"Unprocessable Content","status":422,"detail":"1 parameter is invalid.","code":"validation_failed","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","errors":[{"pointer":"path:enrollment_id","code":"invalid_format","detail":"Must be a UUID."}]}},"idempotency_key_reused":{"title":"idempotency_key_reused","value":{"type":"about:blank","title":"Unprocessable Content","status":422,"detail":"This Idempotency-Key was used with a different request body in the last 24 hours.","code":"idempotency_key_reused","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"}}},"exampleType":"examples"}},"headers":{"X-Request-Id":{"description":"Unique id of this request. Echoes a valid `X-Request-Id` you sent, otherwise generated. Also in every problem body.","schema":{"type":"string"},"example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"RateLimit-Limit":{"description":"Requests allowed per minute for this client (600 by default, set per contract).","schema":{"type":"integer"},"example":600},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"},"example":587},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"},"example":42}},"exampleType":"examples"},"84109f59-6265-478c-a2b3-1dc6f175d112":{"description":"Rate limit or daily cap reached. Wait `Retry-After` seconds.","headers":{"X-Request-Id":{"description":"Unique id of this request. Echoes a valid `X-Request-Id` you sent, otherwise generated. Also in every problem body.","schema":{"type":"string"},"example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"RateLimit-Limit":{"description":"Requests allowed per minute for this client (600 by default, set per contract).","schema":{"type":"integer"},"example":600},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"},"example":587},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"},"example":42},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"},"example":30}},"content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details, sent as `application/problem+json` with every 4xx and 5xx.\nA problem never contains patient data: no names, no values from the request, no free text the caller sent.\n","required":["type","title","status","code","request_id"],"properties":{"type":{"type":"string","format":"uri-reference","description":"`about:blank` until the docs have a public home. Branch on `code`, not on `type` or `title`.","example":"about:blank","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"title":{"type":"string","description":"The HTTP status phrase.","example":"Not Found","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","minimum":400,"maximum":599,"example":404,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"code":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Stable machine-readable code. New codes may be added; existing ones never change meaning.","example":"enrollment_not_found","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"request_id":{"type":"string","description":"Same value as the `X-Request-Id` response header. Quote it when you contact TeraRx.","example":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"detail":{"type":"string","description":"What went wrong, in words safe to log.","example":"No enrollment with this id is visible to this client.","uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","format":"uri-reference","description":"The path of the request that failed.","example":"/v1/enrollments/0190f5c2-3a1b-7c4d-8e9f-a0b1c2d3e4f5","uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"errors":{"type":"array","description":"One entry per invalid field, for `validation_failed`.","items":{"type":"object","required":["pointer","code"],"properties":{"pointer":{"type":"string","description":"JSON Pointer (RFC 6901) to the field in the request body, or `path:\u003cname>`, `query:\u003cname>` or `header:\u003cname>` for a parameter.","example":"/patient/state_code","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","enum":["required","invalid_type","invalid_format","out_of_range","too_long","unknown_value","not_allowed"],"example":"invalid_format","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"What the field must look like. Never repeats the value that was sent.","example":"Must be a two-letter USPS state code.","uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Rate limit of 600 requests per minute reached.","code":"rate_limited","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"Rate limit of 600 requests per minute reached.","code":"rate_limited","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"87f87c0d-0c09-4751-aaef-f5ed878a00d7":{"patientToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"A 15-minute token bound to one patient and one enrollment, issued by `POST /v1/oauth/token` with the\ntoken-exchange grant. Treat it as opaque. When it expires, exchange a fresh assertion; there is no refresh token.\n","x-default":"Bearer sandbox_any_token_works","scopes":[],"schemeName":"patientToken"}}},"servers":{"cbd6961c-1d43-4b1a-ace5-6c8cd05a19e6":{"url":"https://sandbox.rx.tera.health","description":"Partner sandbox, synthetic data only"},"d31af898-dd82-49ef-beb0-575942e35d63":{"url":"http://localhost:4010","description":"Local mock (Prism on the bundled spec), answers with the examples in this spec"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"A 15-minute token bound to one patient and one enrollment, issued by `POST /v1/oauth/token` with the\ntoken-exchange grant. Treat it as opaque. When it expires, exchange a fresh assertion; there is no refresh token.\n","x-default":"Bearer sandbox_any_token_works","scopes":[],"schemeName":"patientToken"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"A 15-minute token bound to one patient and one enrollment, issued by `POST /v1/oauth/token` with the\ntoken-exchange grant. Treat it as opaque. When it expires, exchange a fresh assertion; there is no refresh token.\n","format":"bearer","default":"Bearer sandbox_any_token_works","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"patientToken","name":"Authorization"}],"title":"patientToken"}]},"originalFileLocation":"openapi.json"},"subdomain":"tera-health","siteName":"TeraRx API","title":"Log a meal - TeraRx API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T16:32:55.215Z","originalFileLocation":"api-reference/logging/log-a-meal.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Macros are optional; send what you have. Updates the day\u0026#x27;s protein, calorie and fiber rollups. Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\">\u003cmeta data-mint-head name=\"application-name\" content=\"TeraRx API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Log a meal - TeraRx API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Macros are optional; send what you have. Updates the day\u0026#x27;s protein, calorie and fiber rollups. Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TeraRx API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tera.health/api-reference/logging/log-a-meal\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tera-health.mintlify.site/_mintlify/api/og/v2?division=Logging\u0026amp;title=Log+a+meal\u0026amp;description=Macros+are+optional%3B+send+what+you+have.+Updates+the+day%27s+protein%2C+calorie+and+fiber+rollups.%0AError+codes%3A+%60upload_not_found%60+%28422%29+for+an+unknown+or+expired+%60\u0026amp;theme=bbf8a14dc4b43edfc4280bbc\u0026amp;signature=40d6b78e66fd7b1bcfe59ed748589742829758bde0061bc9f936f104dde53be0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Log a meal - TeraRx API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Macros are optional; send what you have. Updates the day\u0026#x27;s protein, calorie and fiber rollups. Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tera-health.mintlify.site/_mintlify/api/og/v2?division=Logging\u0026amp;title=Log+a+meal\u0026amp;description=Macros+are+optional%3B+send+what+you+have.+Updates+the+day%27s+protein%2C+calorie+and+fiber+rollups.%0AError+codes%3A+%60upload_not_found%60+%28422%29+for+an+unknown+or+expired+%60\u0026amp;theme=bbf8a14dc4b43edfc4280bbc\u0026amp;signature=40d6b78e66fd7b1bcfe59ed748589742829758bde0061bc9f936f104dde53be0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/tera-health/arcliw8PG65YJ6Ho/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TeraRx API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#465FFF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tera.health/api-reference/logging/log-a-meal\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/logging/log-a-meal.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tera.health/#organization\",\"name\":\"TeraRx API\",\"url\":\"https://docs.tera.health\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tera-health/uWz_0YeC9jmRBnOf/logo/terarx-logo-on-light.webp?fit=max\u0026auto=format\u0026n=uWz_0YeC9jmRBnOf\u0026q=85\u0026s=e1b13d13ab2a8adf4dd39a95782a1e51\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tera.health#website\",\"name\":\"TeraRx API\",\"url\":\"https://docs.tera.health\",\"publisher\":{\"@id\":\"https://docs.tera.health/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tera.health/api-reference/logging/log-a-meal#webpage\",\"url\":\"https://docs.tera.health/api-reference/logging/log-a-meal\",\"name\":\"Log a meal\",\"description\":\"Macros are optional; send what you have. Updates the day's protein, calorie and fiber rollups. Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\",\"dateModified\":\"2026-11-08T16:32:55.215Z\",\"isPartOf\":{\"@id\":\"https://docs.tera.health#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tera.health/api-reference/logging/log-a-meal#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tera.health/api-reference/logging/log-a-meal#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Logging\",\"item\":\"https://docs.tera.health/api-reference/logging/list-my-daily-logs\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Log a meal\",\"item\":\"https://docs.tera.health/api-reference/logging/log-a-meal\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.tera.health/api-reference/logging/log-a-meal#apireference\",\"headline\":\"Log a meal\",\"name\":\"Log a meal\",\"description\":\"Macros are optional; send what you have. Updates the day's protein, calorie and fiber rollups. Error codes: upload_not_found (422) for an unknown or expired photo_upload_id, meal_plan_item_not_found (422). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\",\"url\":\"https://docs.tera.health/api-reference/logging/log-a-meal\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tera.health/api-reference/logging/log-a-meal#webpage\"},\"dateModified\":\"2026-11-08T16:32:55.215Z\",\"publisher\":{\"@id\":\"https://docs.tera.health/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tera.health#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TeraRx API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TeraRx API","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/introduction"}]},{"tab":"API reference","groups":[{"group":"Auth","pages":[{"title":"Get an access token","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/oauth/token","href":"/api-reference/auth/get-an-access-token"}]},{"group":"Tenants","pages":[{"title":"List the brands this client may act for","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tenants","href":"/api-reference/tenants/list-the-brands-this-client-may-act-for"}]},{"group":"Enrollments","pages":[{"title":"List enrollments","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/enrollments","href":"/api-reference/enrollments/list-enrollments"},{"title":"Enroll a patient","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments","href":"/api-reference/enrollments/enroll-a-patient"},{"title":"Get an enrollment","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/enrollments/{enrollment_id}","href":"/api-reference/enrollments/get-an-enrollment"},{"title":"Update the patient's details","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/patient","href":"/api-reference/enrollments/update-the-patients-details"},{"title":"Change plan","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/plan","href":"/api-reference/enrollments/change-plan"},{"title":"Pause","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/pause","href":"/api-reference/enrollments/pause"},{"title":"Resume","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/resume","href":"/api-reference/enrollments/resume"},{"title":"Cancel","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/cancel","href":"/api-reference/enrollments/cancel"},{"title":"Ask the AI Coach to reach out","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/ai-coach-outreach","href":"/api-reference/enrollments/ask-the-ai-coach-to-reach-out"}]},{"group":"Treatment","pages":[{"title":"List medications","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/medications","href":"/api-reference/treatment/list-medications"},{"title":"List treatment versions","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/enrollments/{enrollment_id}/treatments","href":"/api-reference/treatment/list-treatment-versions"},{"title":"Update the treatment mirror","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/treatments","href":"/api-reference/treatment/update-the-treatment-mirror"}]},{"group":"Consent","pages":[{"title":"List consent records","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/enrollments/{enrollment_id}/consents","href":"/api-reference/consent/list-consent-records"},{"title":"Record consent proof","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/consents","href":"/api-reference/consent/record-consent-proof"}]},{"group":"Brand logs","pages":[{"title":"Send a meal log","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/meals","href":"/api-reference/brand-logs/send-a-meal-log"},{"title":"Send a workout log","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/workouts","href":"/api-reference/brand-logs/send-a-workout-log"},{"title":"Send a symptom log","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/symptoms","href":"/api-reference/brand-logs/send-a-symptom-log"},{"title":"Send an injection log","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/enrollments/{enrollment_id}/injections","href":"/api-reference/brand-logs/send-an-injection-log"},{"title":"Delete a meal log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/enrollments/{enrollment_id}/meals/{external_id}","href":"/api-reference/brand-logs/delete-a-meal-log"},{"title":"Correct a meal log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/meals/{external_id}","href":"/api-reference/brand-logs/correct-a-meal-log"},{"title":"Delete a workout log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/enrollments/{enrollment_id}/workouts/{external_id}","href":"/api-reference/brand-logs/delete-a-workout-log"},{"title":"Correct a workout log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/workouts/{external_id}","href":"/api-reference/brand-logs/correct-a-workout-log"},{"title":"Delete a symptom log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/enrollments/{enrollment_id}/symptoms/{external_id}","href":"/api-reference/brand-logs/delete-a-symptom-log"},{"title":"Correct a symptom log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/symptoms/{external_id}","href":"/api-reference/brand-logs/correct-a-symptom-log"},{"title":"Delete an injection log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/enrollments/{enrollment_id}/injections/{external_id}","href":"/api-reference/brand-logs/delete-an-injection-log"},{"title":"Correct an injection log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/injections/{external_id}","href":"/api-reference/brand-logs/correct-an-injection-log"},{"title":"Send daily values","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/enrollments/{enrollment_id}/daily-logs/{log_date}","href":"/api-reference/brand-logs/send-daily-values"}]},{"group":"Events","pages":[{"title":"Replay events","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/events","href":"/api-reference/events/replay-events"},{"title":"Get an event","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/events/{event_id}","href":"/api-reference/events/get-an-event"}]},{"group":"Reports","pages":[{"title":"Get the brand report","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/reports/brand","href":"/api-reference/reports/get-the-brand-report"}]},{"group":"Data requests","pages":[{"title":"List data requests","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data-requests","href":"/api-reference/data-requests/list-data-requests"},{"title":"Create a data request","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/data-requests","href":"/api-reference/data-requests/create-a-data-request"},{"title":"Get a data request","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data-requests/{data_request_id}","href":"/api-reference/data-requests/get-a-data-request"},{"title":"Get a download link","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/data-requests/{data_request_id}/export-link","href":"/api-reference/data-requests/get-a-download-link"},{"title":"Decide an amendment","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/data-requests/{data_request_id}/decision","href":"/api-reference/data-requests/decide-an-amendment"}]},{"group":"Patient","pages":[{"title":"Get my profile","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient","href":"/api-reference/patient/get-my-profile"},{"title":"Update my profile","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient","href":"/api-reference/patient/update-my-profile"},{"title":"Get my treatment","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/treatment","href":"/api-reference/patient/get-my-treatment"},{"title":"Report my treatment (TeraRx Direct)","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/treatments","href":"/api-reference/patient/report-my-treatment-terarx-direct"},{"title":"List my legal documents","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/legal-documents","href":"/api-reference/patient/list-my-legal-documents"},{"title":"Accept a legal document","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/consents","href":"/api-reference/patient/accept-a-legal-document"}]},{"group":"Forms","pages":[{"title":"List my forms","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/forms","href":"/api-reference/forms/list-my-forms"},{"title":"Get a form","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/forms/{form_assignment_id}","href":"/api-reference/forms/get-a-form"},{"title":"Save a draft","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/forms/{form_assignment_id}/draft","href":"/api-reference/forms/save-a-draft"},{"title":"Submit a form","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/forms/{form_assignment_id}/submit","href":"/api-reference/forms/submit-a-form"}]},{"group":"Logging","pages":[{"title":"List my daily logs","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/daily-logs","href":"/api-reference/logging/list-my-daily-logs"},{"title":"Log daily values","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/daily-logs/{log_date}","href":"/api-reference/logging/log-daily-values"},{"title":"Start a meal photo upload","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meal-photos","href":"/api-reference/logging/start-a-meal-photo-upload"},{"title":"Analyze a meal photo","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meal-photos/{upload_id}/analysis","href":"/api-reference/logging/analyze-a-meal-photo"},{"title":"List my recent foods","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/recent-foods","href":"/api-reference/logging/list-my-recent-foods"},{"title":"List my meals","description":"Meal logs in a date range, newest first.\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/meals","href":"/api-reference/logging/list-my-meals"},{"title":"Log a meal","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meals","href":"/api-reference/logging/log-a-meal"},{"title":"Delete a meal log","description":"Deletes a meal logged by mistake. It leaves lists and the day's rollups at once; its history is kept until the\nbrand's retention period ends. Deleting it again returns `204`. Only logs made in the app can be deleted.\nError code: `log_not_owned` (403).\n\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/meals/{log_id}","href":"/api-reference/logging/delete-a-meal-log"},{"title":"Correct a meal log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/meals/{log_id}","href":"/api-reference/logging/correct-a-meal-log"},{"title":"List my workouts","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/workouts","href":"/api-reference/logging/list-my-workouts"},{"title":"Log a workout","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/workouts","href":"/api-reference/logging/log-a-workout"},{"title":"Delete a workout log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/workouts/{log_id}","href":"/api-reference/logging/delete-a-workout-log"},{"title":"Correct a workout log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/workouts/{log_id}","href":"/api-reference/logging/correct-a-workout-log"},{"title":"List my symptoms","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/symptoms","href":"/api-reference/logging/list-my-symptoms"},{"title":"Log a symptom","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/symptoms","href":"/api-reference/logging/log-a-symptom"},{"title":"Delete a symptom log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/symptoms/{log_id}","href":"/api-reference/logging/delete-a-symptom-log"},{"title":"Correct a symptom log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/symptoms/{log_id}","href":"/api-reference/logging/correct-a-symptom-log"},{"title":"List my injections","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/injections","href":"/api-reference/logging/list-my-injections"},{"title":"Log an injection","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/injections","href":"/api-reference/logging/log-an-injection"},{"title":"Delete an injection log","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/injections/{log_id}","href":"/api-reference/logging/delete-an-injection-log"},{"title":"Correct an injection log","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/injections/{log_id}","href":"/api-reference/logging/correct-an-injection-log"}]},{"group":"Progress","pages":[{"title":"Get today","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/today","href":"/api-reference/progress/get-today"},{"title":"Get targets and progress for a day","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/targets","href":"/api-reference/progress/get-targets-and-progress-for-a-day"},{"title":"Get a week's stats","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/week-stats","href":"/api-reference/progress/get-a-weeks-stats"},{"title":"List my milestones","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/milestones","href":"/api-reference/progress/list-my-milestones"},{"title":"Get a milestone","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/milestones/{milestone_id}","href":"/api-reference/progress/get-a-milestone"}]},{"group":"Protocols and plans","pages":[{"title":"List my active protocols","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/protocols","href":"/api-reference/protocols-and-plans/list-my-active-protocols"},{"title":"Get my active protocol of a type","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/protocols/{protocol_type}","href":"/api-reference/protocols-and-plans/get-my-active-protocol-of-a-type"},{"title":"List versions of a protocol","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/protocols/{protocol_type}/versions","href":"/api-reference/protocols-and-plans/list-versions-of-a-protocol"},{"title":"Get one version of a protocol","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/protocols/{protocol_type}/versions/{version}","href":"/api-reference/protocols-and-plans/get-one-version-of-a-protocol"},{"title":"Get my meal plan","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/meal-plan","href":"/api-reference/protocols-and-plans/get-my-meal-plan"},{"title":"Get my workout plan","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/workout-plan","href":"/api-reference/protocols-and-plans/get-my-workout-plan"},{"title":"Rate a meal on my plan","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/meal-plan/items/{item_id}/rating","href":"/api-reference/protocols-and-plans/rate-a-meal-on-my-plan"},{"title":"Clear a meal rating","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/meal-plan/items/{item_id}/rating","href":"/api-reference/protocols-and-plans/clear-a-meal-rating"}]},{"group":"Meal swap","pages":[{"title":"Ask the AI Coach for swap options","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meal-plan/items/{item_id}/swap-options","href":"/api-reference/meal-swap/ask-the-ai-coach-for-swap-options"},{"title":"Swap a meal","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/meal-plan/items/{item_id}/swap","href":"/api-reference/meal-swap/swap-a-meal"}]},{"group":"Library","pages":[{"title":"Browse recipes and exercises","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/library","href":"/api-reference/library/browse-recipes-and-exercises"},{"title":"Get a recipe or exercise","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/library/{library_item_id}","href":"/api-reference/library/get-a-recipe-or-exercise"},{"title":"Save a recipe or exercise","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/library/{library_item_id}/favorite","href":"/api-reference/library/save-a-recipe-or-exercise"},{"title":"Remove a favorite","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/library/{library_item_id}/favorite","href":"/api-reference/library/remove-a-favorite"},{"title":"Rate a recipe","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/library/{library_item_id}/rating","href":"/api-reference/library/rate-a-recipe"},{"title":"Clear a recipe rating","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/library/{library_item_id}/rating","href":"/api-reference/library/clear-a-recipe-rating"}]},{"group":"Care messaging","pages":[{"title":"List my care threads","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/care/conversations","href":"/api-reference/care-messaging/list-my-care-threads"},{"title":"List messages in a care thread","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/care/conversations/{conversation_id}/messages","href":"/api-reference/care-messaging/list-messages-in-a-care-thread"},{"title":"Message my coach","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/care/conversations/{conversation_id}/messages","href":"/api-reference/care-messaging/message-my-coach"},{"title":"Mark a care thread read","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/care/conversations/{conversation_id}/read","href":"/api-reference/care-messaging/mark-a-care-thread-read"},{"title":"Edit my last message","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/messages/{message_id}","href":"/api-reference/care-messaging/edit-my-last-message"},{"title":"Set my reactions on a message","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/messages/{message_id}/reactions","href":"/api-reference/care-messaging/set-my-reactions-on-a-message"},{"title":"Start a photo upload for my coach","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/message-photos","href":"/api-reference/care-messaging/start-a-photo-upload-for-my-coach"}]},{"group":"Feedback","pages":[{"title":"List open feedback popups","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/feedback-requests","href":"/api-reference/feedback/list-open-feedback-popups"},{"title":"Get a feedback popup","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/feedback-requests/{feedback_request_id}","href":"/api-reference/feedback/get-a-feedback-popup"},{"title":"Answer a feedback popup","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/feedback-requests/{feedback_request_id}/response","href":"/api-reference/feedback/answer-a-feedback-popup"},{"title":"Dismiss a feedback popup","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/feedback-requests/{feedback_request_id}/dismiss","href":"/api-reference/feedback/dismiss-a-feedback-popup"}]},{"group":"AI Coach","pages":[{"title":"List my AI Coach chats","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/ai-coach/conversations","href":"/api-reference/ai-coach/list-my-ai-coach-chats"},{"title":"Start an AI Coach chat","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/ai-coach/conversations","href":"/api-reference/ai-coach/start-an-ai-coach-chat"},{"title":"List messages in an AI Coach chat","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/ai-coach/conversations/{conversation_id}/messages","href":"/api-reference/ai-coach/list-messages-in-an-ai-coach-chat"},{"title":"Message the AI Coach","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/ai-coach/conversations/{conversation_id}/messages","href":"/api-reference/ai-coach/message-the-ai-coach"},{"title":"Get the AI Coach's reply","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/ai-coach/messages/{message_id}/reply","href":"/api-reference/ai-coach/get-the-ai-coachs-reply"},{"title":"Rate an AI Coach reply","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/patient/ai-coach/messages/{message_id}/feedback","href":"/api-reference/ai-coach/rate-an-ai-coach-reply"},{"title":"List what the AI Coach remembers","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/ai-coach/memories","href":"/api-reference/ai-coach/list-what-the-ai-coach-remembers"},{"title":"Forget a memory","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/patient/ai-coach/memories/{memory_id}","href":"/api-reference/ai-coach/forget-a-memory"},{"title":"Confirm a memory","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/ai-coach/memories/{memory_id}","href":"/api-reference/ai-coach/confirm-a-memory"}]},{"group":"Reminders","pages":[{"title":"List my reminders","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/reminders","href":"/api-reference/reminders/list-my-reminders"},{"title":"Snooze a reminder","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/patient/reminders/{reminder_id}/snooze","href":"/api-reference/reminders/snooze-a-reminder"},{"title":"Get my reminder settings","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/patient/reminder-settings","href":"/api-reference/reminders/get-my-reminder-settings"},{"title":"Change my reminder settings","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/patient/reminder-settings","href":"/api-reference/reminders/change-my-reminder-settings"}]},{"group":"Clinical flags","pages":[{"title":"List clinical flags","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/clinical-flags","href":"/api-reference/clinical-flags/list-clinical-flags"},{"title":"Get a clinical flag","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/clinical-flags/{flag_id}","href":"/api-reference/clinical-flags/get-a-clinical-flag"},{"title":"Acknowledge a flag","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/clinical-flags/{flag_id}/acknowledge","href":"/api-reference/clinical-flags/acknowledge-a-flag"},{"title":"Resolve a flag","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/clinical-flags/{flag_id}/resolve","href":"/api-reference/clinical-flags/resolve-a-flag"}]},{"group":"Webhooks","pages":[{"title":"Enrollmentcreated","version":null,"deprecated":null,"openapi":"/openapi.json webhook enrollment.created","href":"/api-reference/webhooks/enrollmentcreated"},{"title":"Enrollmentstage changed","version":null,"deprecated":null,"openapi":"/openapi.json webhook enrollment.stage_changed","href":"/api-reference/webhooks/enrollmentstage_changed"},{"title":"Enrollmentpaused","version":null,"deprecated":null,"openapi":"/openapi.json webhook enrollment.paused","href":"/api-reference/webhooks/enrollmentpaused"},{"title":"Enrollmentresumed","version":null,"deprecated":null,"openapi":"/openapi.json webhook enrollment.resumed","href":"/api-reference/webhooks/enrollmentresumed"},{"title":"Enrollmentcancelled","version":null,"deprecated":null,"openapi":"/openapi.json webhook enrollment.cancelled","href":"/api-reference/webhooks/enrollmentcancelled"},{"title":"Care teamassigned","version":null,"deprecated":null,"openapi":"/openapi.json webhook care_team.assigned","href":"/api-reference/webhooks/care_teamassigned"},{"title":"Care teamchanged","version":null,"deprecated":null,"openapi":"/openapi.json webhook care_team.changed","href":"/api-reference/webhooks/care_teamchanged"},{"title":"Care teamcapacity warning","version":null,"deprecated":null,"openapi":"/openapi.json webhook care_team.capacity_warning","href":"/api-reference/webhooks/care_teamcapacity_warning"},{"title":"Care teamfeedback due","version":null,"deprecated":null,"openapi":"/openapi.json webhook care_team.feedback_due","href":"/api-reference/webhooks/care_teamfeedback_due"},{"title":"Formrequested","version":null,"deprecated":null,"openapi":"/openapi.json webhook form.requested","href":"/api-reference/webhooks/formrequested"},{"title":"Onboardingcompleted","version":null,"deprecated":null,"openapi":"/openapi.json webhook onboarding.completed","href":"/api-reference/webhooks/onboardingcompleted"},{"title":"Protocolpublished","version":null,"deprecated":null,"openapi":"/openapi.json webhook protocol.published","href":"/api-reference/webhooks/protocolpublished"},{"title":"Protocolupdated","version":null,"deprecated":null,"openapi":"/openapi.json webhook protocol.updated","href":"/api-reference/webhooks/protocolupdated"},{"title":"Messagecreated","version":null,"deprecated":null,"openapi":"/openapi.json webhook message.created","href":"/api-reference/webhooks/messagecreated"},{"title":"Clinicalflag raised","version":null,"deprecated":null,"openapi":"/openapi.json webhook clinical.flag_raised","href":"/api-reference/webhooks/clinicalflag_raised"},{"title":"Clinicalflag redelivered","version":null,"deprecated":null,"openapi":"/openapi.json webhook clinical.flag_redelivered","href":"/api-reference/webhooks/clinicalflag_redelivered"},{"title":"Clinicalflag acknowledged","version":null,"deprecated":null,"openapi":"/openapi.json webhook clinical.flag_acknowledged","href":"/api-reference/webhooks/clinicalflag_acknowledged"},{"title":"Clinicalflag resolved","version":null,"deprecated":null,"openapi":"/openapi.json webhook clinical.flag_resolved","href":"/api-reference/webhooks/clinicalflag_resolved"},{"title":"Patientdisengaged","version":null,"deprecated":null,"openapi":"/openapi.json webhook patient.disengaged","href":"/api-reference/webhooks/patientdisengaged"},{"title":"Patientmilestone reached","version":null,"deprecated":null,"openapi":"/openapi.json webhook patient.milestone_reached","href":"/api-reference/webhooks/patientmilestone_reached"},{"title":"Reminderdue","version":null,"deprecated":null,"openapi":"/openapi.json webhook reminder.due","href":"/api-reference/webhooks/reminderdue"},{"title":"Data requestcompleted","version":null,"deprecated":null,"openapi":"/openapi.json webhook data_request.completed","href":"/api-reference/webhooks/data_requestcompleted"}]}]}]},"basePath":"","title":"Log a meal - TeraRx API","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CBsVopKK.js","utils-DZAk68jJ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D32AYZrP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D_A5_cny.js","snippetPresets-xNRfS9th.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BIB25-tq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CydJ4w4j.js","shallow-CYPBeQSG.js","getApiPlaygroundDisplay-A5xJVBOu.js","CodeSnippet-BVRTgi3m.js","CodeSnippets-DjD6BSlt.js","Page-Dr40SSJq.js","getPastedJson-D4V4JyrR.js","icon-uhcnG22T.js","MethodPill-CM-ZQdGH.js","DuplicateIcon-B_WnOiNf.js","createIcon-CJsb8utt.js","DynamicMarkdown-D-2HDKEp.js","SectionHeading-KP5xmMgQ.js","axios-vUo_bRtp.js","Markdown-D_k0dg6k.js","clsx-DK3K4Z1S.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DE3EVdvd.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fN9H9n9g.js"]}