Merran documentation API & integrations
The Review queue
const url = 'http://localhost:3000/api/proposals?limit=50&offset=0';const options = { method: 'GET', headers: {cookie: 'merran.session_token=<merran.session_token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'http://localhost:3000/api/proposals?limit=50&offset=0' \ --cookie merran.session_token=<merran.session_token>What AI suggests, waiting to be applied or dismissed, newest first, a page at a time. With an API key, it needs the recipes: read permission.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Only this recipe’s, by its id or address.
Only this recipe’s, by its id or address.
Responses
Section titled “Responses”What’s waiting.
object
object
object
What it changes, in a sentence.
The sections it changes, each applied or skipped on its own.
The cooking note it came from, for one made from a note.
What an assistant’s suggestion adds, by kind: recipe (a recipe, as the editor writes one), meals (meals for the plan), items (lines for the list), tastes to remember (avoid, diets, weeknightMinutes), a recipe page to import (url, name, site, photo, minutes, why), or a stand-in for an ingredient (ingredientId, insteadOf, lines, note, steps), which applying saves to the recipe. Null for changes to a recipe’s sections.
The assistant’s chat it came from, for one from the assistant.
A recipe’s sections, only the ones a suggestion changes. Ingredients and steps are editor lines.
object
object
object
object
The food Merran knows that the line is, as a food key; null when no one has said.
A recipe’s sections, only the ones a suggestion changes. Ingredients and steps are editor lines.
object
object
object
object
The food Merran knows that the line is, as a food key; null when no one has said.
How many are waiting in all.
Example
{ "proposals": [ { "id": "0199e8b0-5a10-7a01-8b00-000000000029", "kind": "tidy", "status": "pending", "resolvedAt": null, "recipe": { "id": "0199e8b0-5a10-7a01-8b00-000000000006", "slug": "lemon-chicken", "name": "Lemon Chicken" }, "summary": "Split a long step and marked the chicken as needed.", "sections": [ "steps", "marks" ], "note": null, "payload": null, "chat": null, "before": { "steps": [ "Rub the chicken with lemon and garlic, then roast it at 200°C for 40 minutes until golden. Enjoy!" ], "marks": [ { "line": "2 lb chicken thighs", "mark": null }, { "line": "2 lemons, juiced", "mark": null } ] }, "after": { "steps": [ "Rub the chicken with lemon and garlic.", "Roast at 200°C for 40 minutes, until golden." ], "marks": [ { "line": "2 lb chicken thighs", "mark": "needed" }, { "line": "2 lemons, juiced", "mark": "needed" } ] }, "createdAt": "2026-10-01T17:30:00.000Z" } ], "total": 1}Not signed in.
object
object
object
Example
{ "error": { "code": "not_found", "message": "There's nothing here.", "fields": { "name": "Give it a name." } }}Not allowed.
object
object
object
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.