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.
custom_ingredient_id*Custom Ingredient IdIf-Match*stringThe 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.
application/json- 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 IdThe 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.
^[0-9A-HJKMNP-TV-Z]{26}$Successful Response
application/json- 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.
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"}'{ "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"}