Skip to content
merran
GitHubInstall

Merran documentation API & integrations

Change several meals at once

POST
/api/plan/entries/bulk
curl --request POST \
--url http://localhost:3000/api/plan/entries/bulk \
--header 'Content-Type: application/json' \
--cookie merran.session_token=<merran.session_token> \
--data '{ "ids": [ "0199e8b0-5a10-7a01-8b00-00000000001b" ], "action": "status", "status": "cooked" }'

Take them off, move them (to another day or meal, or the week’s pool), or mark them planned, cooked or skipped: all or none. The answer says what they were before, for Undo with /plan/restore. Ids not on the plan are passed over. With an API key, it needs the plan: write permission.

Media typeapplication/json
object
ids
required
Array<string>
>= 1 items <= 200 items
action
required
string
Allowed values: remove move status
date

Where to move them.

string
/^\d{4}-\d{2}-\d{2}$/

Example

2026-10-15
meal
string
Allowed values: breakfast lunch dinner snack
anyDay

Into the pool of the week date is in.

boolean
status
string
Allowed values: planned cooked skipped

Example

{
"ids": [
"0199e8b0-5a10-7a01-8b00-00000000001b"
],
"action": "status",
"status": "cooked"
}

Done.

Media typeapplication/json
object
entries
required

The meals as they are now; none when they were taken off.

Array<object>
object
id
required
string
date
required

Its day, or for the week’s pool, the week’s first day.

string
/^\d{4}-\d{2}-\d{2}$/
anyDay
required

In the week’s pool: for any day of the week.

boolean
meal
required
string
Allowed values: breakfast lunch dinner snack
position
required

Its place among the meal’s dishes.

integer
status
required
string
Allowed values: planned cooked skipped
recipe
required

Null for a note.

object
id
required
string
slug
required
string
name
required
string
photo
required
string | null
servings
required
number | null
totalMinutes
required
integer | null
calories
required

In a serving, when its nutrition is known.

number | null
withRecipe
required

What it’s made with: “with peanut sauce”.

object
id
required
string
slug
required
string
name
required
string
calories
required
number | null
note
required

A meal that isn’t a recipe: “leftovers”.

string | null
servings
required

Null for the recipe’s own servings.

number | null
why
required

Why it was picked, when Fill the week picked it: none otherwise.

Array
<= 5 items
One of:
object
kind
required
string
Allowed values: theme
label
required
string
<= 60 characters
createdAt
required
string format: date-time
before
required

The meals as they were, for Undo.

Array<object>

A meal as it was, to put back with /plan/restore: what taking it off or changing it answers with.

object
id
required
string format: uuid
date
required
string
/^\d{4}-\d{2}-\d{2}$/
anyDay
required
boolean
meal
required
string
Allowed values: breakfast lunch dinner snack
position
required
integer
status
required
string
Allowed values: planned cooked skipped
recipe
required
string | null
withRecipe
required
string | null
note
required
string | null
<= 200 characters
servings
required
number | null
> 0 <= 1000
listedAt
required
string | null format: date-time
why
Array | null
<= 5 items
One of:
object
kind
required
string
Allowed values: theme
label
required
string
<= 60 characters
cookedAt

When it was marked cooked: put back cooked, its recipe and side were made then.

string | null format: date-time

Example

{
"entries": [
{
"id": "0199e8b0-5a10-7a01-8b00-00000000001b",
"date": "2026-10-15",
"anyDay": false,
"meal": "dinner",
"position": 0,
"status": "cooked",
"recipe": {
"id": "0199e8b0-5a10-7a01-8b00-000000000006",
"slug": "lemon-chicken",
"name": "Lemon Chicken",
"photo": null,
"servings": 4,
"totalMinutes": 50,
"calories": 412
},
"withRecipe": {
"id": "0199e8b0-5a10-7a01-8b00-000000000007",
"slug": "garlic-rice",
"name": "Garlic Rice",
"calories": 210
},
"note": null,
"servings": null,
"why": [
{
"kind": "theme",
"label": "Taco night"
}
],
"createdAt": "2026-10-15T18:30:00.000Z"
}
],
"before": [
{
"id": "0199e8b0-5a10-7a01-8b00-00000000001b",
"date": "2026-10-15",
"anyDay": false,
"meal": "dinner",
"position": 0,
"status": "planned",
"recipe": "0199e8b0-5a10-7a01-8b00-000000000006",
"withRecipe": "0199e8b0-5a10-7a01-8b00-000000000007",
"note": null,
"servings": null,
"listedAt": null,
"why": null,
"cookedAt": null
}
]
}

Not signed in.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
fields
object
key
additional properties
string

Example

{
"error": {
"code": "not_found",
"message": "There's nothing here.",
"fields": {
"name": "Give it a name."
}
}
}

Not allowed.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
fields
object
key
additional properties
string

Example

{
"error": {
"code": "not_found",
"message": "There's nothing here.",
"fields": {
"name": "Give it a name."
}
}
}

© 2026 Kyle Johnson. Documentation: CC BY 4.0. Merran: AGPL-3.0-or-later.