GET /v1/recipes/meta — canonical filter options for the SPA library page. Auth-gated + tenant-scoped even though the option set is global today (D-18 forward compat)
GET /v1/recipes/meta — canonical filter options for the SPA library page. Auth-gated + tenant-scoped even though the option set is global today (D-18 forward compat) › Responses
DELETE /v1/recipes/{recipe} — soft-delete on a household-owned recipe
Soft-delete via Eloquent SoftDeletes — deleted_at is set, the row
persists. Dependent FKs (recipe_ingredients, recipe_cooks,
recipe_ingredient_checks, recipe_notes, recipe_reports) all use
cascadeOnDelete which only triggers on FORCE delete; soft-delete
leaves them intact, preserving history + supporting future restore.
Returns 204 No Content on success. Cross-tenant private 404; system recipe + non-owner-on-community 403.
path Parameters
recipeDELETE /v1/recipes/{recipe} — soft-delete on a household-owned recipe › Responses
No Content
PATCH /v1/recipes/{recipe} — partial update on a household-owned recipe
System recipes are immutable for every caller; community + private recipes are mutable only by the owning household. Cross-tenant 404 (recipe-existence guard, not 403). (split-pass-1).
path Parameters
recipePATCH /v1/recipes/{recipe} — partial update on a household-owned recipe › Request Body
yields_portionsprep_minutescook_minutesfridge_daysfreezer_daysfreezes_wellstatustitledescriptionPATCH /v1/recipes/{recipe} — partial update on a household-owned recipe › Responses
PATCH /v1/recipes/{recipe}/slug — owner-gated slug rename. Slug uniqueness enforced by the handler (DB unique index `recipes_slug_unique`)
path Parameters
recipePATCH /v1/recipes/{recipe}/slug — owner-gated slug rename. Slug uniqueness enforced by the handler (DB unique index `recipes_slug_unique`) › Request Body
slug^[a-z0-9]+(?:-[a-z0-… · requiredPATCH /v1/recipes/{recipe}/slug — owner-gated slug rename. Slug uniqueness enforced by the handler (DB unique index `recipes_slug_unique`) › Responses
PUT /v1/recipes/{recipe}/ingredients — full-replace ingredient list. (D-17 / D-18 / T-16-03-T4 transactional)
path Parameters
recipePUT /v1/recipes/{recipe}/ingredients — full-replace ingredient list. (D-17 / D-18 / T-16-03-T4 transactional) › Request Body
PUT /v1/recipes/{recipe}/ingredients — full-replace ingredient list. (D-17 / D-18 / T-16-03-T4 transactional) › Responses
Eager-load ingredients.ingredient so the response-DTO build path
(RecipeData::fromRecipe → IngredientData::fromRecipeIngredient) does
not trigger Eloquent strict-mode LazyLoadingViolationException on
each $row->ingredient access. Mirrors the D-27 idiom already shipping
in ShowRecipeQueryHandler.
PUT /v1/recipes/{recipe}/steps — full-replace ordered step list. Steps are translatable jsonb; the request body carries `{nl: [...], en: [...]}`
path Parameters
recipe