Recipe Import & Scrapers
recipe-scrapers, schema.org Recipe, TheMealDB, Open Food Facts, Spoonacular — the engines behind every modern recipe app.
The plumbing under Self-Hosted Recipe Managers and most Hosted Recipe Apps. For the wider open food data corpus see Food Databases & Open Food Facts; for OCR of cookbook pages see Recipe Digitization & Costing and OCR & Vision; for the schema.org Recipe markup that this all depends on see SEO Metadata.
OSS scraper libraries (the actual engine)
- ★ ★ recipe-scrapers (Python) — used by Mealie, Tandoor, several hosted apps. ~400 sites with hand-tuned extractors; falls back to schema.org Recipe markup for unknown sites. MIT. The de-facto standard.
- ★ recipe-scraper / @cooklang/recipe-scraper (Node) — JS port; not as mature as the Python library but acceptable for Node-only stacks.
- schema-dts — TypeScript types for schema.org including
Recipe. Good if you're building your own minimal extractor. - OpenRecipeFormat — JSON shape that some apps standardize on for interchange; not as ubiquitous as raw schema.org.
- recipe-uri — small Node lib; URI-only; falls back to LD+JSON.
schema.org Recipe (the format almost every food blog publishes)
Every WordPress recipe plugin (WP Recipe Maker, Tasty Recipes, Create) emits <script type="application/ld+json"> with a Recipe object. This is why URL import works at all.
- ★ schema.org/Recipe — the spec.
recipeIngredient,recipeInstructions,nutrition,recipeYield,cookTime,prepTime, plus newerrecipeCategory/recipeCuisine. - JSON-LD — the encoding everyone uses; microdata / RDFa exist but recipe-scrapers normalizes all three.
- Google Rich Results Test — handy when authoring or debugging your own recipe pages; the same parser most scrapers fall back to.
When the page hides the JSON-LD (LLM fallback)
A growing share of food blogs deliberately scramble their schema.org markup or load it client-side to defeat scrapers. The 2025 fix: ask an LLM.
- ★ Mealie's OpenAI import — set
OPENAI_API_KEY; Mealie sends the page text to gpt-4o-mini, gets back structured JSON. Costs ~$0.001 per recipe. Pays for itself. - Tandoor's GPT-readable extraction — similar idea, slightly older.
- Roll-your-own: Cheerio / readability-extracted text → Claude / GPT with a JSON schema. ~50 lines.
- Trafilatura — Python content extractor that often gets enough usable text for an LLM second pass.
Recipe-data APIs (paid + free)
For "I'm building a recipe-shaped app, not collecting personal recipes."
- ★ ★ TheMealDB — free; community-curated; ~300 recipes; great for prototypes and demos. CC.
- ★ Spoonacular API — paid + free 150 req/day tier; large recipe DB with ingredient parsing, nutrition, substitutions, meal planning helpers. The closest thing to a "recipe AWS."
- Edamam — paid + small free tier; recipe + nutrition + food DB; price spikes with traffic.
- Tasty API (BuzzFeed) — limited / mostly retired; community wrappers exist.
- Yummly API — sunset alongside the app in 2024; ignore.
- Whisk / Samsung Food API — partner-only since acquisition.
Open food / nutrition data (the OSS stack)
- ★ ★ Open Food Facts — Wikipedia-shape OSS food database; ~3M products with barcodes, ingredients, allergens, Nutri-Score; CC0. The right call for any new app that needs nutrition lookup. See Food Databases & Open Food Facts.
- ★ USDA FoodData Central — gold standard for raw-ingredient nutrition; free API key; SR Legacy + Foundation + Branded datasets.
- CIQUAL (France), Phenol-Explorer, CNF (Canada) — region-specific, free, less developer-friendly.
Building your own scraper (when nothing else fits)
- Playwright for JS-rendered food blogs; Cheerio + got if the page is server-rendered. See Web Scraping.
- Readability.js / Mozilla Readability to strip chrome before LLM.
- Tika / Unstructured.io for PDF / scanned-cookbook input.
- Be polite: most food blogs have wafer-thin margins from ads. Cache, respect robots.txt, don't republish.
Format / interop notes
.cook(Cooklang) — text DSL; nice for git-tracked personal recipes.- MealMaster (.mmf) — 1990s format; old recipe archives often live here; most importers still parse it.
- Paprika
.paprikarecipes— zip of JSON; Mealie can import. - Tandoor / Mealie JSON exports — round-trip cleanly between the two as of 2025.
Watch-outs
- Aggressive ad scripts break Cheerio. Run JS unless you're sure the recipe-scrapers maintainer has a custom extractor.
recipeYieldis unreliable. "Serves 4–6" is one string; scaling math chokes on it. Tandoor handles this best.- Image rights: scraping the photo is a copyright minefield. Most apps default to "store the URL only."
- Rate limits / Cloudflare: many big food blogs are behind anti-bot now. LLM-via-text fallback is the workaround.
Pick this if…
- Self-hosting Mealie / Tandoor, you already have this — flip on the OpenAI key for stubborn pages.
- Building a new recipe app, OSS stack: recipe-scrapers + Open Food Facts + USDA FDC.
- Need a hosted "recipe AWS": Spoonacular.
- Demo / prototype data: TheMealDB.
- Personal "recipes in git" workflow: Cooklang.
- Importing from blogs that hide their JSON-LD: LLM fallback, 50 lines.