Tooling

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 newer recipeCategory / 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.
  • recipeYield is 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.