POST/api/v1/households/{householdId}/plans/generate
Put the week in the planning queue and answer with the run
Adults only; a Junior member gets 403. Answers 202 with the run's id (ADR-289): the week is built by a background job, GET plans/runs/{jobId} says where the run stands, and the phone is told by push when the week lands (#200). Costs credits unless the cookbook or the starter library answers every day — GET cost-estimate says the price first. A second press while the run is going joins it and gets the same run id back; 409 with code week_planning_in_progress only for two presses in the very same instant (ADR-073). What the run itself can end in — rules that cannot all be met, a provider that never answered — is on the run's status, not here.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/generate" \
-H "Content-Type: application/json" \
-d '{"weekStart":"2026-09-07"}'
Eksempel på svar
202application/json
{
"jobId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStart": "2026-09-07"
}
GET/api/v1/households/{householdId}/plans/runs/{jobId}
Say where a planning run stands, and why it ended if it ended badly
Any member — the week is the household's and so is the wait. status is queued, running, done or failed; queuePosition counts from one while the run waits, and counts the runs already in the model, because they are what it is waiting for. planId is the week the run settled, once it is done. failure carries the problem the run would have answered with while a request was still open — planning_conflict with its errors, for one (ADR-289).
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/runs/3fa85f64-5717-4562-b3fc-2c963f66afa6"
Eksempel på svar
200application/json
{
"jobId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStart": "2026-09-07",
"status": "Queued",
"queuePosition": 0,
"planId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startedAt": "2026-09-07T16:30:00Z"
}
GET/api/v1/households/{householdId}/plans/cost-estimate
Estimate what planning the week would cost, with a day-by-day preflight
Reads only — nothing is generated or charged (#340). Answers the credits, what is left of the quota, whether the run would be admitted, and a preflight of what each day becomes if the run is pressed as it stands (#694, ADR-066). scope defaults to WholeWeek; allowGeneration overrides the household's cap on new dishes for this estimate only. lockedDates and excludedTitles are the sheet's «Låst» and «Ikke denne» (ADR-356 (#3244)), read exactly as the run's policy reads them; lockedDates absent means the plan's own locks. heldDishes («yyyy-MM-dd:Title») are the cookbook dishes the sheet already showed on days nobody touched, held there so re-pricing does not move them (ADR-366 (#3288)).
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/cost-estimate?weekStart=2026-09-07"
Eksempel på svar
200application/json
{
"credits": 0,
"remaining": 0,
"affordable": false,
"daysToGenerate": 0,
"usesStarterLibrary": false,
"resetsAt": "2026-09-07T16:30:00Z",
"suggestMoreCredits": 0,
"affordableNewDishes": 0,
"shortfall": 0
}
GET/api/v1/households/{householdId}/plans/overview
List which days carry a dinner, week by week, for a window of at most 92 days
Month-map data: each week's status, each day's entry type and dish name, and whether the week has a shopping list and when the trip was finished. from and to are both required and from must not be after to (#445), and the window may cover at most 92 days — a calendar read, not a page (#2977, ADR-292). The widest any client asks for is a month grid's six weeks.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/overview?from=2026-09-07&to=2026-09-07"
Eksempel på svar
200application/json
{
"weeks": [
{
"weekStart": "2026-09-07",
"status": {},
"days": [
{}
],
"hasShoppingList": false,
"changedSinceShopped": 0
}
]
}
PATCH/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}
Replace one day's dinner with another candidate, or make it a leftovers day
Adults only; a Junior member gets 403. Send exactly one of mealCandidateId (a candidate generated for the same date) or entryType "Leftovers" (#1691, ADR-136). Regenerates the week's shopping list if one exists. A superseded plan answers 400 — refresh to the current week.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X PATCH \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Content-Type: application/json" \
-d '{}'
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
POST/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/feedback
Say what was wrong with a planned dinner and let Bryti act on it
Adults only; a Junior member gets 403. «Si fra om denne retten» (#740, ADR-075): depending on the reason Bryti swaps the day, replans the open days, offers a variant, excludes the dish, or only notes it when the day has passed or its outcome is recorded. Two of the reasons can end in a generation, so the call may cost credits and runs under the planner's time budget (502/504 as for planning the week). The answer carries the week and a typed result the client uses for «Angre».
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/feedback" \
-H "Content-Type: application/json" \
-d '{"reason":"RuleBroken"}'
Eksempel på svar
200application/json
{
"plan": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": {},
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
},
"result": {
"reason": {},
"action": {}
}
}
POST/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/move
Move a dinner to another day in the same week, trading places if that day has one
Adults only; a Junior member gets 403. toDate must be a day of the same plan, and the day being moved must have a dinner (#111). Regenerates the week's shopping list if one exists.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/move" \
-H "Content-Type: application/json" \
-d '{"toDate":"2026-09-07"}'
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
DELETE/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/dinner
Take the dinner off a day and leave the day open
Adults only; a Junior member gets 403. Not eating out and not a swap — the day simply has nothing planned (#111). Regenerates the week's shopping list if one exists.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X DELETE \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/dinner"
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
POST/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/lock
Lock a day's dinner so a replan leaves it alone
Adults only; a Junior member gets 403.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/lock"
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
POST/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/unlock
Unlock a day's dinner so a replan may change it again
Adults only; a Junior member gets 403.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/unlock"
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
POST/api/v1/households/{householdId}/plans/{planId}/entries/{entryId}/freezer
Say how many baby portions tonight's cooking put in the freezer
Any member, Juniors included — it says what happened in the kitchen (#3092). Portions is the total for this dinner, not an increment: tapping again sends two and «Angre» sends zero, so the call is idempotent. 400 when the dinner is not showing the freezer advice, or when portions is outside 0..20. Writes one pantry row on the food key baby-portion-frozen, in the freezer.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/entries/3fa85f64-5717-4562-b3fc-2c963f66afa6/freezer" \
-H "Content-Type: application/json" \
-d '{"portions":0}'
Eksempel på svar
200application/json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"householdId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStartDate": "2026-09-07",
"status": "Draft",
"plannerVersion": "string",
"scoreBreakdown": {
"key": 0
},
"entries": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"date": "2026-09-07",
"entryType": {},
"isLocked": false,
"portions": 0,
"candidate": {}
}
],
"createdAt": "2026-09-07T16:30:00Z",
"activatedAt": "2026-09-07T16:30:00Z",
"fromStarterLibrary": false,
"shoppingListStale": false
}
POST/api/v1/households/{householdId}/plans/{planId}/replan
Put the week back in the planning queue and answer with the run
Adults only; a Junior member gets 403. Answers 202 with the run's id (ADR-289): the week is planned again by a background job, and GET plans/runs/{jobId} says where it stands. scope defaults to OpenDays, which fills only the days with nothing on them and changes nothing already decided; WholeWeek re-solves everything that is not locked, answered for or in the past (#340). The optional body is the preflight's answer (#694, ADR-066).May cost credits — GET plans/cost-estimate says the price first. The shopping list follows the week to the new plan, and «Angre» is POST plans/{planId}/restore. A press while a run is going joins that run; 409 (week_planning_in_progress) means the same as for planning the week.
Svar
- 401No session, or the session is no longer valid.
application/problem+jsonProblemDetails- 426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails- 429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails- Hoder
Retry-After- — Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.
Eksempel
curl -b "bryti_session=…" \
-X POST \
"https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/plans/3fa85f64-5717-4562-b3fc-2c963f66afa6/replan" \
-H "Content-Type: application/json" \
-d '{"allowNearMisses":false}'
Eksempel på svar
202application/json
{
"jobId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"weekStart": "2026-09-07"
}