Merran documentation API & integrations
Find new recipes online
const url = 'http://localhost:3000/api/discover';const options = { method: 'POST', headers: { cookie: 'merran.session_token=<merran.session_token>', 'Content-Type': 'application/json' }, body: '{"theme":"cozy fall soups"}'};
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/discover \ --header 'Content-Type: application/json' \ --cookie merran.session_token=<merran.session_token> \ --data '{ "theme": "cozy fall soups" }'Searches the web for recipes that fit a theme (“cozy fall soups”) and suit the household, in the background, with the household’s model for finding recipes, which must be able to search the web. Merran opens each page and keeps those it can import. Follow it at GET /discover/{discoveryId}; one at a time for a household. With an API key, it needs the recipes: write permission.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Example
{ "theme": "cozy fall soups"}Responses
Section titled “Responses”Searching.
object
The starter collection it found more for (POST /collections/{collection}/find), or null.
Still searching, done, or failed (error says why).
Up to eight, each a page Merran opened and can import, no more than two from a site unless there aren’t others.
object
The recipe’s page, to import at POST /recipes/import.
Why it’s a good pick.
Example
{ "id": "0199e8b0-5a10-7a01-8b00-00000000002d", "theme": "cozy fall soups", "collection": null, "status": "done", "error": null, "recipes": [ { "url": "https://cooking.example/butternut-squash-soup", "name": "Roasted Butternut Squash Soup", "site": "cooking.example", "minutes": 60, "photo": "https://cooking.example/images/squash-soup.jpg", "why": "Vegetarian and freezes well, with the squash roasted for depth." } ], "createdAt": "2026-10-01T17:30:00.000Z", "updatedAt": "2026-10-01T17:30:00.000Z"}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." } }}A search is going already.
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.