Happklaar API
string · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredboolean · requiredstring · date-time · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredinteger · requiredstring[] · requiredstring[] · requiredboolean · requiredstring · requiredinteger · requiredboolean · requiredstring | null · date-timeinteger | nullinteger | nullinteger | nullinteger | nullstring | nullarray | nullstring | null · date-timeinteger | nullinteger | nullstring · requiredstring · requiredstring | nullstring[] · requiredstring[] · requiredstring[] · requiredstring[] · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredstring · requiredinteger · requiredstring · requiredinteger · requiredboolean · requiredstring · requiredstring | null · date-timeinteger | nullinteger | nullstring | null · date-timestring · requiredinteger · requiredinteger · requiredstring[] · requiredstring | null integer · min: 1 · max: 50integer | null · min: 0 · max: 1440integer | null · min: 0 · max: 1440integer | null · min: 0 · max: 365integer | null · min: 0 · max: 365booleanstring · enumstring[] · minItems: 1string[]
Shared.AllergenData
slugicon_slugicon_variantchip_color_tokenShared.DietTagData
slugicon_slugicon_variantchip_color_tokenRecipe.IngredientCheckData
recipe_ingredient_idcheckedchecked_atRecipe.RecipeData
idslugtitledescriptionsourcevisibilitystatusyields_portionsShared.DietTagData[] · required
Shared.AllergenData[] · required
ingredientsstepsfreezes_wellselfcook_countis_bookmarkedpublished_atprep_minutescook_minutesfridge_daysfreezer_dayssource_urlprovenancelast_cooked_atauthor_user_idtotal_minutesRecipe.RecipeFilterChipData
sluglabel_keyquery_paramRecipe.RecipeFilterOptionsData
dietary_tagsallergensingredient_categoriescook_time_bucketsRecipe.RecipeListItemData
idslugtitlesourceseed_sourcevisibilitystatusyields_portionsShared.DietTagData[] · required
selfcook_countis_bookmarkedsectionpublished_atprep_minutescook_minuteslast_cooked_atRecipe.ScaledPortionsData
recipe_idbase_portionstarget_portionsitemsselfRecipe.UpdateIngredientChecksRequestData
PUT /v1/recipes/{recipe}/ingredient-checks
request body.
The wire shape is `{ "checks": [{ "recipe_ingredient_id": "...",
"checked": true }, ...] }`. Batched for two reasons:
1. The SPA debounces user taps at 400ms (UI-SPEC §13) and coalesces
pending checks into a single PUT to keep request rate well under
the api throttle (T-11-S11).
2. Atomic per-batch — handler validates EVERY recipe_ingredient_id
belongs to the addressed recipe before any upsert.
`user_id` is NOT in the body — it always comes from auth context
(T-11-S10 mitigation).
object[] · minItems: 1 · maxItems: 100 · required
Recipe.UpdateRecipeRequestData
(split-pass-1) — PATCH /v1/recipes/{recipe} request body.
Partial-update wire shape — every field is `Optional` so omitting it
means "leave unchanged". Sending an explicit `null` on a nullable field
means "clear it" (only the columns that are nullable in the schema can
be cleared this way: prep_minutes, cook_minutes, fridge_days,
freezer_days). Required fields (title, description, yields_portions,
freezes_well, status) reject `null` via validation.
The handler maps `Optional` ↔ "not touched" and "explicit null" ↔
"clear". The controller flattens the DTO into the command's
`$touched` whitelist before dispatch.
yields_portionsprep_minutescook_minutesfridge_daysfreezer_daysfreezes_wellstatusEnum values:
draft
published
archived
titledescription