Merran documentation API & integrations
Follow a recipe site
const url = 'http://localhost:3000/api/sites';const options = { method: 'POST', headers: { cookie: 'merran.session_token=<merran.session_token>', 'Content-Type': 'application/json' }, body: '{"url":"https://www.loveandlemons.com/"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:3000/api/sites \ --header 'Content-Type: application/json' \ --cookie merran.session_token=<merran.session_token> \ --data '{ "url": "https://www.loveandlemons.com/" }'By any page of the site, its RSS or Atom feed, or a suggestion. Merran finds the feed and reads it straight away when no one’s read it lately, opening each new post a few seconds apart and keeping the recipes. With an API key, it needs the recipes: write permission.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Any page of the site, its feed, or a suggestion’s url.
Example
{ "url": "https://www.loveandlemons.com/"}Responses
Section titled “Responses”Following it.
object
Its newest recipes, newest first: posts Merran opened and can import.
object
The recipe’s page, to import at POST /recipes/import.
The recipe’s own short description, when the site gives one.
What its site says it is, in Merran’s words; empty when it doesn’t say.
A small copy of its photo, through Merran.
The household’s recipe from it, if it has one.
object
False when it has a food the household avoids, or is off its diets.
New posts not opened yet: Merran opens them a few seconds apart.
Not read for the first time yet.
Why its feed couldn’t be read last time.
Example
{ "id": "0199e8b0-5a10-7a01-8b00-000000000030", "name": "RecipeTin Eats", "url": "https://www.recipetineats.com/", "feedUrl": "https://www.recipetineats.com/feed/", "recipes": [ { "id": "0199e8b0-5a10-7a01-8b00-000000000031", "url": "https://www.recipetineats.com/honey-garlic-chicken/", "name": "Honey Garlic Chicken", "site": "RecipeTin Eats", "description": "Juicy chicken in a sticky honey garlic sauce, in 12 minutes.", "minutes": 12, "courses": [ "main" ], "photo": "/api/sites/recipes/0199e8b0-5a10-7a01-8b00-000000000031/photo", "publishedAt": "2026-10-01T17:30:00.000Z", "inLibrary": null, "suits": true }, { "id": "0199e8b0-5a10-7a01-8b00-000000000032", "url": "https://www.recipetineats.com/lemon-chicken/", "name": "Lemon Chicken", "site": "RecipeTin Eats", "description": null, "minutes": 35, "courses": [ "main" ], "photo": "/api/sites/recipes/0199e8b0-5a10-7a01-8b00-000000000031/photo", "publishedAt": "2026-10-01T17:30:00.000Z", "inLibrary": { "slug": "lemon-chicken", "name": "Lemon Chicken" }, "suits": true } ], "waiting": 3, "reading": false, "readAt": "2026-10-15T18:30:00.000Z", "error": null, "followedAt": "2026-10-01T17:30:00.000Z"}That isn’t a link Merran can fetch.
object
object
object
Example
{ "error": { "code": "not_found", "message": "There's nothing here.", "fields": { "name": "Give it a name." } }}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." } }}The household follows it already.
object
object
object
Example
{ "error": { "code": "not_found", "message": "There's nothing here.", "fields": { "name": "Give it a name." } }}No feed was found, or recipe sites are off.
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.