The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the
result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and
entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis.
Counts toward the plan’s daily photo analysis limit (15 by default). Error codes: upload_not_found (404),
ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429),
ai_unavailable (503).
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.
Something the patient should check, for example a sauce the photo can't show.
Example:
"The dressing isn't visible; add it if you used one."
{"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/analyze-a-meal-photo","slug":"/api-reference/logging/analyze-a-meal-photo","pageMetadata":{"title":"Analyze a meal photo","description":"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the\nresult as an editable form, then save it with `POST /v1/patient/meals`, sending the same `photo_upload_id` and\n`entry_method: photo_ai`. Takes a few seconds. Asking again for the same upload returns the same analysis.\nCounts toward the plan's daily photo analysis limit (15 by default). Error codes: `upload_not_found` (404),\n`ai_paused` (409) when the AI Coach is paused for the plan, `daily_photo_analysis_cap_reached` (429),\n`ai_unavailable` (503).\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/meal-photos/{upload_id}/analysis","href":"/api-reference/logging/analyze-a-meal-photo","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: [\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the\\nresult as an editable form, then save it with \", _jsx(_components.code, {\n children: \"POST /v1/patient/meals\"\n }), \", sending the same \", _jsx(_components.code, {\n children: \"photo_upload_id\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"entry_method: photo_ai\"\n }), \". Takes a few seconds. Asking again for the same upload returns the same analysis.\\nCounts toward the plan’s daily photo analysis limit (15 by default). Error codes: \", _jsx(_components.code, {\n children: \"upload_not_found\"\n }), \" (404),\\n\", _jsx(_components.code, {\n children: \"ai_paused\"\n }), \" (409) when the AI Coach is paused for the plan, \", _jsx(_components.code, {\n children: \"daily_photo_analysis_cap_reached\"\n }), \" (429),\\n\", _jsx(_components.code, {\n children: \"ai_unavailable\"\n }), \" (503).\"]\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":"Analyze a meal photo","description":"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the\nresult as an editable form, then save it with `POST /v1/patient/meals`, sending the same `photo_upload_id` and\n`entry_method: photo_ai`. Takes a few seconds. Asking again for the same upload returns the same analysis.\nCounts toward the plan's daily photo analysis limit (15 by default). Error codes: `upload_not_found` (404),\n`ai_paused` (409) when the AI Coach is paused for the plan, `daily_photo_analysis_cap_reached` (429),\n`ai_unavailable` (503).\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/meal-photos/{upload_id}/analysis","href":"/api-reference/logging/analyze-a-meal-photo","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"analyzeMealPhoto","tags":["Logging"],"summary":"Analyze a meal photo","description":"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the\nresult as an editable form, then save it with `POST /v1/patient/meals`, sending the same `photo_upload_id` and\n`entry_method: photo_ai`. Takes a few seconds. Asking again for the same upload returns the same analysis.\nCounts toward the plan's daily photo analysis limit (15 by default). Error codes: `upload_not_found` (404),\n`ai_paused` (409) when the AI Coach is paused for the plan, `daily_photo_analysis_cap_reached` (429),\n`ai_unavailable` (503).\n\n\n**Plans:** AI + health and fitness coaches (`ai_health_fitness`), AI only (`ai_only`).","security":["62208535-402f-406f-bbd6-32e6be52fa1e"],"x-plans":["ai_health_fitness","ai_only"],"responses":{"200":"3ff61997-205e-4759-a9af-3f19e6fa2fdc","401":"f9ea9f22-4618-4199-9dcd-747d8619c736","404":"602be866-3b94-41c9-af97-dcde0fd1c964","409":"fd37b8ce-e8ba-48f6-b7dc-b4ca678ab833","422":"15114763-262c-4619-ab5e-00c0fbe010a5","429":"851c6f83-6f24-49bf-9b35-083abe8052dd","503":"91380620-2843-4c12-87c9-4efe34c3fe8b"},"method":"post","type":"path","servers":["cbd6961c-1d43-4b1a-ace5-6c8cd05a19e6","d31af898-dd82-49ef-beb0-575942e35d63"],"path":"/v1/patient/meal-photos/{upload_id}/analysis","baseUrlOptions":["https://sandbox.rx.tera.health","http://localhost:4010"],"title":"Analyze a meal photo","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[],"disableProxy":true},"dependencies":{"parameters":{"753da1ea-c2be-418c-8157-b163fde07895":{"name":"upload_id","in":"path","required":true,"description":"From `POST /v1/patient/meal-photos`.","schema":{"type":"string","format":"uuid","x-default":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","isRequired":true,"description":"From `POST /v1/patient/meal-photos`.","uniqueKey":"","typeLabel":"string\u003cuuid>"},"example":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e"}},"responses":{"3ff61997-205e-4759-a9af-3f19e6fa2fdc":{"description":"The estimate.","content":{"application/json":{"schema":{"type":"object","required":["upload_id","ingredients","totals","confidence"],"description":"The AI Coach's estimate from a meal photo, to pre-fill the logging form. Nothing is logged until the patient saves.","properties":{"upload_id":{"type":"string","format":"uuid","example":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","isRequired":true,"uniqueKey":"upload_id","typeLabel":"string\u003cuuid>"},"ingredients":{"type":"array","description":"Empty when no food was recognized.","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"},"isRequired":true,"uniqueKey":"ingredients","typeLabel":"object[]"},"totals":{"type":"object","properties":{"protein_g":{"type":"number","example":38,"uniqueKey":"totals.protein_g","typeLabel":"number"},"calories_kcal":{"type":"integer","example":480,"uniqueKey":"totals.calories_kcal","typeLabel":"integer"},"carbs_g":{"type":"number","example":34,"uniqueKey":"totals.carbs_g","typeLabel":"number"},"fat_g":{"type":"number","example":18,"uniqueKey":"totals.fat_g","typeLabel":"number"},"fiber_g":{"type":"number","example":6,"uniqueKey":"totals.fiber_g","typeLabel":"number"}},"isRequired":true,"uniqueKey":"totals","typeLabel":"object"},"confidence":{"type":"string","enum":["low","medium","high"],"description":"Show the estimate as a starting point when `low`.","example":"medium","isRequired":true,"uniqueKey":"confidence","typeLabel":"enum\u003cstring>"},"description":{"oneOf":[{"type":"string","example":"Grilled chicken salad with quinoa","uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","example":"Grilled chicken salad with quinoa","uniqueKey":"description.oneOf.1","typeLabel":"null"}],"uniqueKey":"description","typeLabel":"string | null"},"meal_type":{"oneOf":[{"type":"string","description":"A guess from the photo and the time; the patient can change it.","enum":["breakfast","lunch","dinner","snack"],"example":"lunch","uniqueKey":"meal_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"A guess from the photo and the time; the patient can change it.","uniqueKey":"meal_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"meal_type","typeLabel":"enum\u003cstring> | null"},"note":{"oneOf":[{"type":"string","description":"Something the patient should check, for example a sauce the photo can't show.","example":"The dressing isn't visible; add it if you used one.","uniqueKey":"note.oneOf.0","typeLabel":"string"},{"type":"null","description":"Something the patient should check, for example a sauce the photo can't show.","example":"The dressing isn't visible; add it if you used one.","uniqueKey":"note.oneOf.1","typeLabel":"null"}],"uniqueKey":"note","typeLabel":"string | null"}},"uniqueKey":"","typeLabel":"object"},"example":{"upload_id":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","description":"Grilled chicken salad with quinoa","meal_type":"lunch","ingredients":[{"name":"Grilled chicken breast","quantity":120,"unit":"g","protein_g":31,"calories_kcal":200,"carbs_g":0,"fat_g":4,"fiber_g":0},{"name":"Quinoa, cooked","quantity":90,"unit":"g","protein_g":4,"calories_kcal":110,"carbs_g":19,"fat_g":2,"fiber_g":3},{"name":"Mixed greens and tomato","quantity":80,"unit":"g","protein_g":1,"calories_kcal":20,"carbs_g":4,"fat_g":0,"fiber_g":2}],"totals":{"protein_g":36,"calories_kcal":330,"carbs_g":23,"fat_g":6,"fiber_g":5},"confidence":"medium","note":"The dressing isn't visible; add it if you used one."},"examples":{"Example":{"title":"Example","value":{"upload_id":"8e2c4a60-1f3b-4d5e-9a7c-0b2d4f6a8c1e","description":"Grilled chicken salad with quinoa","meal_type":"lunch","ingredients":[{"name":"Grilled chicken breast","quantity":120,"unit":"g","protein_g":31,"calories_kcal":200,"carbs_g":0,"fat_g":4,"fiber_g":0},{"name":"Quinoa, cooked","quantity":90,"unit":"g","protein_g":4,"calories_kcal":110,"carbs_g":19,"fat_g":2,"fiber_g":3},{"name":"Mixed greens and tomato","quantity":80,"unit":"g","protein_g":1,"calories_kcal":20,"carbs_g":4,"fat_g":0,"fiber_g":2}],"totals":{"protein_g":36,"calories_kcal":330,"carbs_g":23,"fat_g":6,"fiber_g":5},"confidence":"medium","note":"The dressing isn't visible; add it if you used one."}}},"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"},"f9ea9f22-4618-4199-9dcd-747d8619c736":{"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"},"602be866-3b94-41c9-af97-dcde0fd1c964":{"description":"No such resource, or it belongs to another tenant or patient. The API does not tell the two apart,\nso ids cannot be probed across brands.\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"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"No enrollment with this id is visible to this client.","code":"enrollment_not_found","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Not Found","status":404,"detail":"No enrollment with this id is visible to this client.","code":"enrollment_not_found","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"},"fd37b8ce-e8ba-48f6-b7dc-b4ca678ab833":{"description":"The request conflicts with the resource's current state, or a request with the same `Idempotency-Key` is still running.","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":"Conflict","status":409,"detail":"The enrollment is cancelled and cannot be paused.","code":"invalid_status_transition","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Conflict","status":409,"detail":"The enrollment is cancelled and cannot be paused.","code":"invalid_status_transition","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"},"15114763-262c-4619-ab5e-00c0fbe010a5":{"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"},"851c6f83-6f24-49bf-9b35-083abe8052dd":{"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"},"91380620-2843-4c12-87c9-4efe34c3fe8b":{"description":"A dependency (for example the AI model) is temporarily unavailable. Retry after `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":"Service Unavailable","status":503,"detail":"The AI Coach is temporarily unavailable. Try again shortly.","code":"ai_unavailable","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"},"examples":{"Example":{"title":"Example","value":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The AI Coach is temporarily unavailable. Try again shortly.","code":"ai_unavailable","request_id":"req_019a3b2c-4d5e-7f60-8a1b-2c3d4e5f6a7b"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"62208535-402f-406f-bbd6-32e6be52fa1e":{"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":"Analyze a meal photo - TeraRx API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T16:32:55.177Z","originalFileLocation":"api-reference/logging/analyze-a-meal-photo.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=\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis. Counts toward the plan\u0026#x27;s daily photo analysis limit (15 by default). Error codes: upload_not_found (404), ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429), ai_unavailable (503). 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=\"Analyze a meal photo - TeraRx API\">\u003cmeta data-mint-head property=\"og:description\" content=\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis. Counts toward the plan\u0026#x27;s daily photo analysis limit (15 by default). Error codes: upload_not_found (404), ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429), ai_unavailable (503). 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/analyze-a-meal-photo\">\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=Analyze+a+meal+photo\u0026amp;description=The+AI+Coach+estimates+the+meal+in+an+uploaded+photo%3A+what+it+is%2C+its+ingredients+and+their+macros.+Show+the%0Aresult+as+an+editable+form%2C+then+save+it+with+%60POST\u0026amp;theme=bbf8a14dc4b43edfc4280bbc\u0026amp;signature=de37b34696ee907a8919fec2c38031f7cc23070a0a93d70295427213a161e65d\">\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=\"Analyze a meal photo - TeraRx API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis. Counts toward the plan\u0026#x27;s daily photo analysis limit (15 by default). Error codes: upload_not_found (404), ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429), ai_unavailable (503). 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=Analyze+a+meal+photo\u0026amp;description=The+AI+Coach+estimates+the+meal+in+an+uploaded+photo%3A+what+it+is%2C+its+ingredients+and+their+macros.+Show+the%0Aresult+as+an+editable+form%2C+then+save+it+with+%60POST\u0026amp;theme=bbf8a14dc4b43edfc4280bbc\u0026amp;signature=de37b34696ee907a8919fec2c38031f7cc23070a0a93d70295427213a161e65d\">\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/analyze-a-meal-photo\">\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/analyze-a-meal-photo.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/analyze-a-meal-photo#webpage\",\"url\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo\",\"name\":\"Analyze a meal photo\",\"description\":\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis. Counts toward the plan's daily photo analysis limit (15 by default). Error codes: upload_not_found (404), ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429), ai_unavailable (503). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\",\"dateModified\":\"2026-11-08T16:32:55.177Z\",\"isPartOf\":{\"@id\":\"https://docs.tera.health#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo#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\":\"Analyze a meal photo\",\"item\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo#apireference\",\"headline\":\"Analyze a meal photo\",\"name\":\"Analyze a meal photo\",\"description\":\"The AI Coach estimates the meal in an uploaded photo: what it is, its ingredients and their macros. Show the result as an editable form, then save it with POST /v1/patient/meals, sending the same photo_upload_id and entry_method: photo_ai. Takes a few seconds. Asking again for the same upload returns the same analysis. Counts toward the plan's daily photo analysis limit (15 by default). Error codes: upload_not_found (404), ai_paused (409) when the AI Coach is paused for the plan, daily_photo_analysis_cap_reached (429), ai_unavailable (503). Plans: AI + health and fitness coaches (ai_health_fitness), AI only (ai_only).\",\"url\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tera.health/api-reference/logging/analyze-a-meal-photo#webpage\"},\"dateModified\":\"2026-11-08T16:32:55.177Z\",\"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","description":"Returns a pre-signed URL. Upload the photo there, then send `upload_id` as `photo_upload_id` on the meal log.\nAn upload not attached to a meal within 1 hour is deleted.\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/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","description":"Foods the patient logged before, most recently logged first, 10 at a time; follow `next_cursor` for the next 10.\nPicking one pre-fills a meal ingredient with the amount and macros from the last time. Correcting or deleting a\nmeal updates the list.\n\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/recent-foods","href":"/api-reference/logging/list-my-recent-foods"},{"title":"List my meals","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","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":"Analyze a meal photo - 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"]}