{
  "data": {
    "id": "EVA9PME5KWbFjUYD4",
    "actId": "ph3cwfPJgeysFit9N",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-12T22:32:53.110Z",
    "finishedAt": "2026-11-12T22:33:07.327Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 14074,
      "runTimeSecs": 14.074,
      "computeUnits": 0.015637777777777778,
      "imageSizeBytes": 373570560
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "6GwdnIcc2aWR7LzCS",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Recipe Scraper Input\",\n  \"description\": \"Scrape recipes from major recipe sites and food blogs. Search by keyword across supported sites, paste direct recipe URLs, point at category/search/tag pages, or walk a sitemap. The actor reads schema.org/Recipe JSON-LD first, with fallbacks for WP Recipe Maker, Tasty Recipes, Jetpack, and microdata. AllRecipes and a few other hard-blocked sites are not supported.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"How to find recipes. Search by keyword is the simplest; URL and sitemap modes are best when you already know the pages.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byUrls\",\n        \"byListing\",\n        \"byTag\",\n        \"bySitemap\"\n      ],\n      \"enumTitles\": [\n        \"Search by keyword — find recipes across supported sites\",\n        \"By URLs — scrape a list of direct recipe URLs\",\n        \"By listing pages — scrape category, tag, or search-result pages\",\n        \"By tag pages (legacy alias for byListing)\",\n        \"By sitemap — extract recipe URLs from sitemap.xml files\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"byUrls\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"What to search for, e.g. `banana bread`, `vegan dinner`, or `chicken curry`.\",\n      \"editor\": \"textfield\",\n      \"default\": \"banana bread\",\n      \"prefill\": \"banana bread\"\n    },\n    \"site\": {\n      \"title\": \"Site to search (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Pick one site, or `all` to search every supported site. Search coverage varies by site; unsupported sites still work in byUrls/bySitemap modes.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"bbcgoodfood\",\n        \"epicurious\",\n        \"tasty\",\n        \"foodnetwork\",\n        \"nytcooking\",\n        \"bonappetit\",\n        \"delish\",\n        \"budgetbytes\",\n        \"pinchofyum\",\n        \"minimalistbaker\",\n        \"smittenkitchen\",\n        \"loveandlemons\",\n        \"skinnytaste\"\n      ],\n      \"enumTitles\": [\n        \"All supported sites\",\n        \"BBC Good Food\",\n        \"Epicurious\",\n        \"Tasty\",\n        \"Food Network\",\n        \"NYT Cooking\",\n        \"Bon Appétit\",\n        \"Delish\",\n        \"Budget Bytes\",\n        \"Pinch of Yum\",\n        \"Minimalist Baker\",\n        \"Smitten Kitchen\",\n        \"Love and Lemons\",\n        \"Skinnytaste\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"epicurious\"\n    },\n    \"recipeUrls\": {\n      \"title\": \"Recipe URLs (mode=byUrls)\",\n      \"type\": \"array\",\n      \"description\": \"Direct recipe-page URLs from any supported site or food blog. AllRecipes URLs are rejected as unsupported.\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"https://www.epicurious.com/recipes/food/views/banana-bread\"\n      ],\n      \"prefill\": [\n        \"https://www.epicurious.com/recipes/food/views/banana-bread\"\n      ]\n    },\n    \"listingUrls\": {\n      \"title\": \"Listing page URLs (mode=byListing)\",\n      \"type\": \"array\",\n      \"description\": \"Category, tag, or search-result pages. The actor extracts recipe links and follows page 2, 3, … where the site exposes a page parameter.\",\n      \"editor\": \"stringList\",\n      \"default\": []\n    },\n    \"sitemapUrls\": {\n      \"title\": \"Sitemap URLs (mode=bySitemap)\",\n      \"type\": \"array\",\n      \"description\": \"Sitemap.xml URLs. The actor walks sitemap indexes and keeps recipe-looking URLs.\",\n      \"editor\": \"stringList\",\n      \"default\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Max recipes\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on emitted recipe records.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 50,\n      \"prefill\": 1\n    },\n    \"maxPages\": {\n      \"title\": \"Max pages per site/listing\",\n      \"type\": \"integer\",\n      \"description\": \"For search and listing modes, how many result pages to read per site or listing URL.\",\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"default\": 2,\n      \"prefill\": 1\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating (optional)\",\n      \"type\": \"integer\",\n      \"description\": \"Drop recipes with a rating below this value on a 0–500 scale (400 = 4.0/5).\",\n      \"minimum\": 0,\n      \"maximum\": 500\n    },\n    \"minRatingCount\": {\n      \"title\": \"Minimum rating count (optional)\",\n      \"type\": \"integer\",\n      \"description\": \"Drop recipes with fewer ratings than this.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"maxTotalTimeMinutes\": {\n      \"title\": \"Maximum total time in minutes (optional)\",\n      \"type\": \"integer\",\n      \"description\": \"Drop recipes whose prep + cook time exceeds this many minutes.\",\n      \"minimum\": 1,\n      \"maximum\": 100000\n    },\n    \"keywordIncludes\": {\n      \"title\": \"Must contain keyword (optional)\",\n      \"type\": \"string\",\n      \"description\": \"Drop recipes whose name and description do not contain this keyword.\",\n      \"editor\": \"textfield\"\n    },\n    \"proxy\": {\n      \"title\": \"Apify Proxy (optional)\",\n      \"type\": \"object\",\n      \"description\": \"No proxy is needed for the supported sites. Enable Apify Proxy only if you want to route requests through your own Apify proxy groups.\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": false\n      }\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Multi-Site Recipe & Nutrition Data Extractor\n\nRecipe sites and food blogs publish a machine-readable `schema.org/Recipe` record on every recipe page — the same record search engines use for star ratings and cooking times. This actor reads that record (and the common WordPress recipe formats when a site has no JSON-LD), so one input works across major recipe sites and thousands of food blogs.\n\n## What it does\n\n- **Search by keyword** across BBC Good Food, Epicurious, Tasty, Food Network, NYT Cooking, Bon Appétit, Delish, Budget Bytes, Pinch of Yum, Minimalist Baker, Smitten Kitchen, Love and Lemons, and Skinnytaste.\n- **Scrape direct recipe URLs** from any supported site or food blog.\n- **Crawl category, tag, or search-result pages** and follow their pagination.\n- **Walk sitemaps**, including one level of nested sitemap indexes.\n- **Parse ingredients, instructions, and nutrition** from JSON-LD, WP Recipe Maker, Tasty Recipes, Jetpack Recipe, or schema.org microdata.\n- **Filter** by rating, rating count, total time, and a required keyword.\n\n## Output per recipe (`recordType: \"recipe\"`)\n\n- `url`, `id` — canonical recipe URL (`id` mirrors `url`)\n- `platform` — site slug, e.g. `epicurious`, `tasty`, `bbcgoodfood`, `smittenkitchen`\n- `name`, `description` — title and short blurb, HTML stripped\n- `image` — hero image URL\n- `author` — `{name, url}`\n- `ratingValue`, `ratingCount`, `reviewCount` — average rating (0–5), number of ratings, number of written reviews\n- `prepTimeMinutes`, `cookTimeMinutes`, `totalTimeMinutes` — ISO-8601 durations and human durations such as `1 hr 15 min` are both supported; `totalTimeMinutes` falls back to prep + cook\n- `recipeYield` — servings or pieces, e.g. `\"8 slices\"`\n- `recipeCategory`, `recipeCuisine` — arrays\n- `keywords` — keyword tags\n- `recipeIngredient` — ingredient lines\n- `recipeInstructions` — step strings, HTML stripped, including `HowToSection` groups\n- `nutrition` — calories, protein, carbs, fat, saturated fat, cholesterol, sodium, fiber, sugar, serving size when published\n- `video` — `{url, name, thumbnailUrl}` when the recipe has one\n- `datePublished`, `dateModified` — dates as published by the site\n- `scrapedAt` — ISO 8601 UTC timestamp\n\nEmpty fields are omitted at every depth — never `null`, `\"\"`, `[]`, or `{}`.\n\n## Output per failed direct URL (`recordType: \"url_failed\"`)\n\nDirect URLs that cannot be read produce a typed row instead of disappearing:\n\n- `reason` — `unsupported_site` (AllRecipes or another explicitly blocked host), `not_found`, `anti_bot_block`, `no_recipe_jsonld`, `filtered_out`, or `fetch_error`\n- `url`, `platform`, `scrapedAt`\n\nIf every direct URL fails, or a search/listing yields candidates but none are recipes, the dataset also gets one `recordType: \"scrape_summary\"` row with the dominant reason and a plain-language message. A search that finds no candidate URLs at all reports it in the run status message.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search`, `byUrls`, `byListing`, `byTag` (legacy alias for `byListing`), or `bySitemap` |\n| `searchQuery` | string | `banana bread` | Keyword for `mode=search` |\n| `site` | select | `all` | One supported site, or `all` |\n| `recipeUrls` | array | `[\"https://www.epicurious.com/recipes/food/views/banana-bread\"]` | Direct recipe URLs for `mode=byUrls` |\n| `listingUrls` | array | – | Category/tag/search pages for `mode=byListing` |\n| `sitemapUrls` | array | – | Sitemap URLs for `mode=bySitemap` |\n| `maxItems` | integer | `50` | Hard cap on recipe records (1–1000) |\n| `maxPages` | integer | `2` | Pages per site or listing URL (1–10) |\n| `minRating` | integer | – | Minimum rating on a 0–500 scale (400 = 4.0/5) |\n| `minRatingCount` | integer | – | Minimum number of ratings |\n| `maxTotalTimeMinutes` | integer | – | Maximum prep + cook time |\n| `keywordIncludes` | string | – | Required keyword in name or description |\n| `proxy` | object | `{\"useApifyProxy\": false}` | Optional Apify Proxy configuration |\n\n### Examples\n\nSearch Epicurious for banana bread:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"banana bread\",\n  \"site\": \"epicurious\",\n  \"maxItems\": 20\n}\n```\n\nSearch every supported site:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"vegan dinner\",\n  \"site\": \"all\",\n  \"maxItems\": 50,\n  \"maxPages\": 2\n}\n```\n\nScrape direct URLs:\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"recipeUrls\": [\n    \"https://www.epicurious.com/recipes/food/views/banana-bread\",\n    \"https://tasty.co/recipe/banana-bread\",\n    \"https://www.bbcgoodfood.com/recipes/vegan-banana-bread\"\n  ]\n}\n```\n\nCrawl a category page and its next pages:\n\n```json\n{\n  \"mode\": \"byListing\",\n  \"listingUrls\": [\"https://www.epicurious.com/recipes/category/dessert\"],\n  \"maxPages\": 3,\n  \"maxItems\": 40\n}\n```\n\nWalk a sitemap:\n\n```json\n{\n  \"mode\": \"bySitemap\",\n  \"sitemapUrls\": [\"https://www.bbcgoodfood.com/sitemap.xml\"],\n  \"maxItems\": 100\n}\n```\n\n## Supported search sites\n\nBBC Good Food, Epicurious, Tasty, Food Network, NYT Cooking, Bon Appétit, Delish, Budget Bytes, Pinch of Yum, Minimalist Baker, Smitten Kitchen, Love and Lemons, and Skinnytaste. Direct URL and sitemap modes work on any site that publishes recipe JSON-LD or one of the supported WordPress recipe formats.\n\n## Compatibility with older inputs\n\nOld saved tasks keep working because legacy keys are mapped in code:\n\n- `mode=byTag` and `tagUrls` → `byListing` and `listingUrls`\n- `query`, `searchTerm`, `keyword`, `q` → `searchQuery`\n- `urls`, `recipeUrl`, `url` → `recipeUrls`\n- `sitemapUrl`, `sitemaps` → `sitemapUrls`\n- `maxResults` → `maxItems`\n- `maxPagesPerSite`, `pages` → `maxPages`\n- `siteScope`, `searchSites`, `sites` → `site`\n- `minRatingScore` (0–5) → `minRating` (0–500)\n- `mustContain`, `keywordFilter` → `keywordIncludes`\n\nOnly fields the actor actually reads are visible in the input schema. Unknown legacy keys are accepted by Apify and mapped inside the actor.\n\n## Limitations\n\n- **AllRecipes** is protected by Akamai Bot Manager and is rejected as `unsupported_site`.\n- **Serious Eats, Simply Recipes, Food & Wine, EatingWell, and Martha Stewart** currently return HTTP 403 to cookieless datacenter requests. They work in `byUrls` only if your proxy configuration can reach them; otherwise they appear as `anti_bot_block`.\n- Search pagination depends on the site. Tasty, NYT Cooking and Delish expose the first page only; BBC Good Food, Epicurious, Food Network, Bon Appétit and the WordPress sites support deeper pagination.\n- Search results are returned in the site's own relevance order. A result can occasionally be a round-up or article that has no recipe record; those candidates are skipped.\n- **Budget Bytes and Smitten Kitchen** return HTTP 403 from Apify cloud IPs for both search and direct recipe pages; both work from a local/residential connection. On cloud they surface as `anti_bot_block`; the other WordPress sites in the search list are unaffected.\n- Recipe data is only as complete as the source page. Missing fields are omitted instead of guessed.\n\n## Notes\n\nNo cookies, logins, or API keys are required. The actor fetches pages with a Chrome TLS fingerprint. Enable the optional `proxy` field only if you want to supply Apify Proxy groups; no proxy is needed for the supported sites' default paths.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "multi-site-recipe-and-nutrition-data-extractor",
      "title": "Multi-Site Recipe & Nutrition Data Extractor",
      "description": "Search recipes across major recipe sites and food blogs, or scrape direct URLs, listing pages, and sitemaps. Returns ingredients, instructions, nutrition, ratings, times, yield, author, and images.",
      "version": "2.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Multi-Site Recipe & Nutrition Data Extractor\n\nRecipe sites and food blogs publish a machine-readable `schema.org/Recipe` record on every recipe page — the same record search engines use for star ratings and cooking times. This actor reads that record (and the common WordPress recipe formats when a site has no JSON-LD), so one input works across major recipe sites and thousands of food blogs.\n\n## What it does\n\n- **Search by keyword** across BBC Good Food, Epicurious, Tasty, Food Network, NYT Cooking, Bon Appétit, Delish, Budget Bytes, Pinch of Yum, Minimalist Baker, Smitten Kitchen, Love and Lemons, and Skinnytaste.\n- **Scrape direct recipe URLs** from any supported site or food blog.\n- **Crawl category, tag, or search-result pages** and follow their pagination.\n- **Walk sitemaps**, including one level of nested sitemap indexes.\n- **Parse ingredients, instructions, and nutrition** from JSON-LD, WP Recipe Maker, Tasty Recipes, Jetpack Recipe, or schema.org microdata.\n- **Filter** by rating, rating count, total time, and a required keyword.\n\n## Output per recipe (`recordType: \"recipe\"`)\n\n- `url`, `id` — canonical recipe URL (`id` mirrors `url`)\n- `platform` — site slug, e.g. `epicurious`, `tasty`, `bbcgoodfood`, `smittenkitchen`\n- `name`, `description` — title and short blurb, HTML stripped\n- `image` — hero image URL\n- `author` — `{name, url}`\n- `ratingValue`, `ratingCount`, `reviewCount` — average rating (0–5), number of ratings, number of written reviews\n- `prepTimeMinutes`, `cookTimeMinutes`, `totalTimeMinutes` — ISO-8601 durations and human durations such as `1 hr 15 min` are both supported; `totalTimeMinutes` falls back to prep + cook\n- `recipeYield` — servings or pieces, e.g. `\"8 slices\"`\n- `recipeCategory`, `recipeCuisine` — arrays\n- `keywords` — keyword tags\n- `recipeIngredient` — ingredient lines\n- `recipeInstructions` — step strings, HTML stripped, including `HowToSection` groups\n- `nutrition` — calories, protein, carbs, fat, saturated fat, cholesterol, sodium, fiber, sugar, serving size when published\n- `video` — `{url, name, thumbnailUrl}` when the recipe has one\n- `datePublished`, `dateModified` — dates as published by the site\n- `scrapedAt` — ISO 8601 UTC timestamp\n\nEmpty fields are omitted at every depth — never `null`, `\"\"`, `[]`, or `{}`.\n\n## Output per failed direct URL (`recordType: \"url_failed\"`)\n\nDirect URLs that cannot be read produce a typed row instead of disappearing:\n\n- `reason` — `unsupported_site` (AllRecipes or another explicitly blocked host), `not_found`, `anti_bot_block`, `no_recipe_jsonld`, `filtered_out`, or `fetch_error`\n- `url`, `platform`, `scrapedAt`\n\nIf every direct URL fails, or a search/listing yields candidates but none are recipes, the dataset also gets one `recordType: \"scrape_summary\"` row with the dominant reason and a plain-language message. A search that finds no candidate URLs at all reports it in the run status message.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search`, `byUrls`, `byListing`, `byTag` (legacy alias for `byListing`), or `bySitemap` |\n| `searchQuery` | string | `banana bread` | Keyword for `mode=search` |\n| `site` | select | `all` | One supported site, or `all` |\n| `recipeUrls` | array | `[\"https://www.epicurious.com/recipes/food/views/banana-bread\"]` | Direct recipe URLs for `mode=byUrls` |\n| `listingUrls` | array | – | Category/tag/search pages for `mode=byListing` |\n| `sitemapUrls` | array | – | Sitemap URLs for `mode=bySitemap` |\n| `maxItems` | integer | `50` | Hard cap on recipe records (1–1000) |\n| `maxPages` | integer | `2` | Pages per site or listing URL (1–10) |\n| `minRating` | integer | – | Minimum rating on a 0–500 scale (400 = 4.0/5) |\n| `minRatingCount` | integer | – | Minimum number of ratings |\n| `maxTotalTimeMinutes` | integer | – | Maximum prep + cook time |\n| `keywordIncludes` | string | – | Required keyword in name or description |\n| `proxy` | object | `{\"useApifyProxy\": false}` | Optional Apify Proxy configuration |\n\n### Examples\n\nSearch Epicurious for banana bread:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"banana bread\",\n  \"site\": \"epicurious\",\n  \"maxItems\": 20\n}\n```\n\nSearch every supported site:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"vegan dinner\",\n  \"site\": \"all\",\n  \"maxItems\": 50,\n  \"maxPages\": 2\n}\n```\n\nScrape direct URLs:\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"recipeUrls\": [\n    \"https://www.epicurious.com/recipes/food/views/banana-bread\",\n    \"https://tasty.co/recipe/banana-bread\",\n    \"https://www.bbcgoodfood.com/recipes/vegan-banana-bread\"\n  ]\n}\n```\n\nCrawl a category page and its next pages:\n\n```json\n{\n  \"mode\": \"byListing\",\n  \"listingUrls\": [\"https://www.epicurious.com/recipes/category/dessert\"],\n  \"maxPages\": 3,\n  \"maxItems\": 40\n}\n```\n\nWalk a sitemap:\n\n```json\n{\n  \"mode\": \"bySitemap\",\n  \"sitemapUrls\": [\"https://www.bbcgoodfood.com/sitemap.xml\"],\n  \"maxItems\": 100\n}\n```\n\n## Supported search sites\n\nBBC Good Food, Epicurious, Tasty, Food Network, NYT Cooking, Bon Appétit, Delish, Budget Bytes, Pinch of Yum, Minimalist Baker, Smitten Kitchen, Love and Lemons, and Skinnytaste. Direct URL and sitemap modes work on any site that publishes recipe JSON-LD or one of the supported WordPress recipe formats.\n\n## Compatibility with older inputs\n\nOld saved tasks keep working because legacy keys are mapped in code:\n\n- `mode=byTag` and `tagUrls` → `byListing` and `listingUrls`\n- `query`, `searchTerm`, `keyword`, `q` → `searchQuery`\n- `urls`, `recipeUrl`, `url` → `recipeUrls`\n- `sitemapUrl`, `sitemaps` → `sitemapUrls`\n- `maxResults` → `maxItems`\n- `maxPagesPerSite`, `pages` → `maxPages`\n- `siteScope`, `searchSites`, `sites` → `site`\n- `minRatingScore` (0–5) → `minRating` (0–500)\n- `mustContain`, `keywordFilter` → `keywordIncludes`\n\nOnly fields the actor actually reads are visible in the input schema. Unknown legacy keys are accepted by Apify and mapped inside the actor.\n\n## Limitations\n\n- **AllRecipes** is protected by Akamai Bot Manager and is rejected as `unsupported_site`.\n- **Serious Eats, Simply Recipes, Food & Wine, EatingWell, and Martha Stewart** currently return HTTP 403 to cookieless datacenter requests. They work in `byUrls` only if your proxy configuration can reach them; otherwise they appear as `anti_bot_block`.\n- Search pagination depends on the site. Tasty, NYT Cooking and Delish expose the first page only; BBC Good Food, Epicurious, Food Network, Bon Appétit and the WordPress sites support deeper pagination.\n- Search results are returned in the site's own relevance order. A result can occasionally be a round-up or article that has no recipe record; those candidates are skipped.\n- **Budget Bytes and Smitten Kitchen** return HTTP 403 from Apify cloud IPs for both search and direct recipe pages; both work from a local/residential connection. On cloud they surface as `anti_bot_block`; the other WordPress sites in the search list are unaffected.\n- Recipe data is only as complete as the source page. Missing fields are omitted instead of guessed.\n\n## Notes\n\nNo cookies, logins, or API keys are required. The actor fetches pages with a Chrome TLS fingerprint. Enable the optional `proxy` field only if you want to supply Apify Proxy groups; no proxy is needed for the supported sites' default paths.\n",
      "input": {
        "title": "Recipe Scraper Input",
        "description": "Scrape recipes from major recipe sites and food blogs. Search by keyword across supported sites, paste direct recipe URLs, point at category/search/tag pages, or walk a sitemap. The actor reads schema.org/Recipe JSON-LD first, with fallbacks for WP Recipe Maker, Tasty Recipes, Jetpack, and microdata. AllRecipes and a few other hard-blocked sites are not supported.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "How to find recipes. Search by keyword is the simplest; URL and sitemap modes are best when you already know the pages.",
            "editor": "select",
            "enum": [
              "search",
              "byUrls",
              "byListing",
              "byTag",
              "bySitemap"
            ],
            "enumTitles": [
              "Search by keyword — find recipes across supported sites",
              "By URLs — scrape a list of direct recipe URLs",
              "By listing pages — scrape category, tag, or search-result pages",
              "By tag pages (legacy alias for byListing)",
              "By sitemap — extract recipe URLs from sitemap.xml files"
            ],
            "default": "search",
            "prefill": "byUrls"
          },
          "searchQuery": {
            "title": "Search query (mode=search)",
            "type": "string",
            "description": "What to search for, e.g. `banana bread`, `vegan dinner`, or `chicken curry`.",
            "editor": "textfield",
            "default": "banana bread",
            "prefill": "banana bread"
          },
          "site": {
            "title": "Site to search (mode=search)",
            "type": "string",
            "description": "Pick one site, or `all` to search every supported site. Search coverage varies by site; unsupported sites still work in byUrls/bySitemap modes.",
            "editor": "select",
            "enum": [
              "all",
              "bbcgoodfood",
              "epicurious",
              "tasty",
              "foodnetwork",
              "nytcooking",
              "bonappetit",
              "delish",
              "budgetbytes",
              "pinchofyum",
              "minimalistbaker",
              "smittenkitchen",
              "loveandlemons",
              "skinnytaste"
            ],
            "enumTitles": [
              "All supported sites",
              "BBC Good Food",
              "Epicurious",
              "Tasty",
              "Food Network",
              "NYT Cooking",
              "Bon Appétit",
              "Delish",
              "Budget Bytes",
              "Pinch of Yum",
              "Minimalist Baker",
              "Smitten Kitchen",
              "Love and Lemons",
              "Skinnytaste"
            ],
            "default": "all",
            "prefill": "epicurious"
          },
          "recipeUrls": {
            "title": "Recipe URLs (mode=byUrls)",
            "type": "array",
            "description": "Direct recipe-page URLs from any supported site or food blog. AllRecipes URLs are rejected as unsupported.",
            "editor": "stringList",
            "default": [
              "https://www.epicurious.com/recipes/food/views/banana-bread"
            ],
            "prefill": [
              "https://www.epicurious.com/recipes/food/views/banana-bread"
            ]
          },
          "listingUrls": {
            "title": "Listing page URLs (mode=byListing)",
            "type": "array",
            "description": "Category, tag, or search-result pages. The actor extracts recipe links and follows page 2, 3, … where the site exposes a page parameter.",
            "editor": "stringList",
            "default": []
          },
          "sitemapUrls": {
            "title": "Sitemap URLs (mode=bySitemap)",
            "type": "array",
            "description": "Sitemap.xml URLs. The actor walks sitemap indexes and keeps recipe-looking URLs.",
            "editor": "stringList",
            "default": []
          },
          "maxItems": {
            "title": "Max recipes",
            "type": "integer",
            "description": "Hard cap on emitted recipe records.",
            "minimum": 1,
            "maximum": 1000,
            "default": 50,
            "prefill": 1
          },
          "maxPages": {
            "title": "Max pages per site/listing",
            "type": "integer",
            "description": "For search and listing modes, how many result pages to read per site or listing URL.",
            "minimum": 1,
            "maximum": 10,
            "default": 2,
            "prefill": 1
          },
          "minRating": {
            "title": "Minimum rating (optional)",
            "type": "integer",
            "description": "Drop recipes with a rating below this value on a 0–500 scale (400 = 4.0/5).",
            "minimum": 0,
            "maximum": 500
          },
          "minRatingCount": {
            "title": "Minimum rating count (optional)",
            "type": "integer",
            "description": "Drop recipes with fewer ratings than this.",
            "minimum": 0,
            "maximum": 10000000
          },
          "maxTotalTimeMinutes": {
            "title": "Maximum total time in minutes (optional)",
            "type": "integer",
            "description": "Drop recipes whose prep + cook time exceeds this many minutes.",
            "minimum": 1,
            "maximum": 100000
          },
          "keywordIncludes": {
            "title": "Must contain keyword (optional)",
            "type": "string",
            "description": "Drop recipes whose name and description do not contain this keyword.",
            "editor": "textfield"
          },
          "proxy": {
            "title": "Apify Proxy (optional)",
            "type": "object",
            "description": "No proxy is needed for the supported sites. Enable Apify Proxy only if you want to route requests through your own Apify proxy groups.",
            "editor": "proxy",
            "default": {
              "useApifyProxy": false
            }
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Multi-Site Recipe & Nutrition Data Extractor Output",
        "description": "Standardized recipe records from major recipe sites and food blogs, including ingredients, instructions, nutrition, ratings, times, yield, and images.",
        "properties": {
          "records": {
            "type": "string",
            "title": "Recipe records",
            "description": "Dataset of all scraped recipes.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Recipes",
              "transformation": {
                "fields": [
                  "name",
                  "platform",
                  "ratingValue",
                  "ratingCount",
                  "totalTimeMinutes",
                  "recipeYield",
                  "nutrition",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "2.0.1",
    "imageDigest": "57a639efdccf5d35fc4a06eb55cbf7b4fab25ebf46fe79fd5a44828a96130492",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.015637777777777778
    }
  }
}