Skip to content
Skip to Content
Docs
Studio

Restore Custom Ingredient to Version

Roll back a custom ingredient to the content state it had at a prior version.

This is a full point-in-time restore — the entity's entire state (nutrients, serving/gram basis, name, lifecycle status, attributes) snaps back to exactly what was recorded in target_version_id. This matches the semantics of git checkout <tag>: the whole entity reverts, not just the fields that changed between the target and the current HEAD.

Lifecycle status is part of that state, so a restore re-projects the target version's status onto HEAD: restoring past an archive puts the ingredient back in active or draft, exactly as unarchiveCustomIngredient would.

It does not undo a delete. A deleted ingredient is refused with 409 custom_ingredient_not_restorable — deleteCustomIngredient is permanent (ADR 0008 D11), and this is what makes it so. restoreRecipe refuses a deleted recipe too, by a different route: a deleted recipe is hidden from all reads, so it 404s.

Creates a new commit whose content matches target_version_id; the existing history is never rewritten. The new version_id is returned in the response body — pass it as If-Match on subsequent mutations. Returns 404 if the custom ingredient or the target version does not exist; 409 on a deleted ingredient or an If-Match mismatch.

A recipe pinned to a specific custom-ingredient version_id is unaffected by this call — pins are immutable by version_id (ADR 0007 D2), so restoring the custom ingredient to a different version never changes what an already-pinned recipe reads or computes.

POST
/studio/custom-ingredients/{custom_ingredient_id}/restore

Path Parameters

custom_ingredient_id*Custom Ingredient Id

Header Parameters

If-Match*string

The custom ingredient's current version_id: the one the last change to this custom ingredient returned, or the one reading it returns (get_custom_ingredient). A stale value is refused with the current version_id; read the custom ingredient again and retry.

Request Body

application/json
  1. body

Request body for POST /custom-ingredients/{custom_ingredient_id}/restore.

A flat, single-field body — no nesting needed for a rollback operation that requires only the target version identifier. Mirrors studio.api.schemas.recipe.version.RestoreRecipeRequest.

target_version_id*Target Version Id

The version_id to restore. Full point-in-time restore — the entity's entire state (nutrients, serving/gram basis, name, lifecycle status, attributes) reverts to exactly what was recorded at this version. Earlier versions are kept; the restored state is saved as a new version.

Match^[0-9A-HJKMNP-TV-Z]{26}$

Response Body

Successful Response

application/json
  1. response

Response for the get-custom-ingredient endpoint.

Also reused verbatim by getCustomIngredientVersion (an as-of read at a historical version_id) and restoreCustomIngredient (whose version_id is the newly committed restore commit) — the wire shape is identical in every case: the full entity plus the version_id it reflects.

data*

A custom ingredient's full data: identity, lifecycle status, serving/nutrition data, and descriptive attributes.

meta*

Response metadata.

version_id?|

Version this read reflects.

Example Request
curl -X POST 'https://api.bettermenu.live/studio/custom-ingredients/string/restore' \  -H 'If-Match: string' \  -H 'Content-Type: application/json' \  -d '{  "target_version_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"}'
Example Response
{  "data": {    "id": "stringstringstringstringst",    "org_id": "stringstringstringstrings",    "status": "draft",    "name": "string",    "entry_method": "form",    "notes": "string",    "reference_amount": "string",    "reference_unit": "string",    "household_measure": "string",    "reference_quantity_g": "string",    "density_g_per_ml": "string",    "nutrients": [      {        "id": "stringstringstringstringst",        "unit": "string",        "amount": "string",        "market_nutrients": {          "property1": {            "bmid": "string",            "nutrient_id": 1          },          "property2": {            "bmid": "string",            "nutrient_id": 1          }        }      }    ],    "approved_markets": [      "US"    ],    "brand": "string",    "manufacturer": "string",    "source_url": "string",    "attributes": [      {        "key": "string",        "type": "string",        "value": null,        "searchable": false      }    ],    "artifacts": [      {        "key": "string",        "kind": "string",        "uploaded_at": "2019-08-24T14:15:22Z"      }    ],    "ingredient_statement": "string",    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  },  "meta": {    "version": "string",    "request_id": "string",    "timestamp": "string"  },  "version_id": "string"}

Recipe in, FDA-format Nutrition Facts out, with every version kept.

Start freeNo card needed.