---
title: "Add an ingredient the import missed"
method: POST
path: "/patients/{patient_id}/recipes/{recipe_id}/review"
tags: ["recipes"]
---

# Add an ingredient the import missed

`POST /patients/{patient_id}/recipes/{recipe_id}/review`

Recorded as an `ingredient_added` correction with actor_type patient.

## Path parameters

- `patient_id` integer, required
- `recipe_id` integer, required

## Request body

- AddRecipeReviewLineRequest — An ingredient the import missed. Supply `rxfood_id` to attach a food straight away, or `food_name` alone to record the line as unresolved for matching later.
  - `food_name` string, nullable — Required when rxfood_id is omitted.
  - `group_id` integer, nullable — Add the line into this existing ingredient group on the recipe.
  - `group_name` string, nullable — Add the line into a group with this name, creating it on the recipe if needed. Takes precedence over group_id.
  - `note` string, nullable
  - `rxfood_id` string, nullable
  - `serving_unit_label` string, nullable
  - `servings` number, nullable

## Response `200`

successful operation

- RecipeReviewLineResponse — One ingredient line awaiting or having had a decision. `resolved` is false when nothing is attached yet, which is what blocks publishing. The provenance fields are populated only for lines that came from a scan.
  - `child_recipe_id` integer, nullable
  - `description` string, nullable
  - `extracted_name` string, nullable — What the parser read the ingredient as.
  - `food_name` string, nullable
  - `group_id` integer, nullable — Ingredient group this line belongs to, or null when ungrouped.
  - `group_name` string, nullable — Display name of the line's ingredient group, for showing headings without a second lookup.
  - `ingredient_id` integer, nullable — Null for a rejected line, which no longer has an ingredient but stays visible so the curator can see what was discarded.
  - `mapping_confidence` number, nullable
  - `mapping_status` 'unmatched' | 'auto' | 'confirmed' | 'rejected', nullable — A rejected line is returned with resolved=true and no ingredient_id: it needs no further decision but is shown so the discard is visible.
  - `original_text` string, nullable — What the source said, for a scanned or imported line.
  - `resolved` boolean
  - `rxfood_id` string, nullable
  - `serving_unit_label` string, nullable
  - `servings` number, nullable
  - `sort_order` integer
  - `suggestions` object[], nullable — Catalogue candidates for an unresolved line, best first. Not exhaustive -- clients should also offer a catalogue search.
    - `confidence` number
    - `name` string
    - `name_display` string, nullable — CNF display name when populated. Null when the catalogue row has none.
    - `rxfood_id` string

## Changes

- **2026-09-24** `a61b77b30e63` — 1 info
  - added the optional property `suggestions/items/name_display` to the response with the `200` status
- **2026-09-19** `2991fb51502d` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/rxfoodapp/apis/inneranalytics-mnt-server/changes/patients/:patient_id/recipes/:recipe_id/review/post.md)

---

[API](https://skmtc.dev/rxfoodapp/apis/inneranalytics-mnt-server.md) · [All operations](https://skmtc.dev/rxfoodapp/apis/inneranalytics-mnt-server/llms.txt) · [OpenAPI document](https://skmtc.dev/rxfoodapp/apis/inneranalytics-mnt-server/revisions/a61b77b30e63?raw)
