Bon Appétit Recipes Scraper — Ingredients & Steps
Pricing
from $7.00 / 1,000 recipe records
Bon Appétit Recipes Scraper — Ingredients & Steps
Scrape Bon Appétit recipes by URL or keyword into JSON: ingredients, steps, total time, yield, author and keywords. For recipe apps. USD 10 per 1,000.
Pricing
from $7.00 / 1,000 recipe records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 hours ago
Last modified
Categories
Share
Bon Appétit Recipes Scraper collects public Bon Appétit (bonappetit.com) recipes and returns one structured record per recipe: name, description, image, author, publish date, times, yield, keywords, ingredients, step-by-step instructions and nutrition when the page publishes it. It is built for recipe apps, meal-planning tools, food researchers and AI agents that need recipe data as JSON or CSV, and it costs USD 10 per 1,000 recipes on the FREE tier (USD 0.01 per recipe, USD 7 per 1,000 on GOLD).
Give it recipe URLs, a Bon Appétit index or search page, or just a keyword. With no input at all it reads the public recipes index.
What data does the Bon Appétit recipes scraper return?
Each dataset item is one recipe. Values come from the recipe's structured data on the page, with the visible title, description and image as fallbacks.
| Field | What it contains |
|---|---|
url, recipeId | Recipe URL and its slug, for example chicken-pasta-primavera |
name, description | Recipe title and summary |
image | Main photo URL |
author | Recipe developer, for example Jesse Szewczyk |
datePublished | Publish date as an ISO timestamp |
prepTime, cookTime, totalTime | Times as Bon Appétit writes them, for example 45 minutes; prep and cook are often null |
recipeYield | Servings, for example 4 servings |
recipeCategory, recipeCuisine, keywords | Tags such as dinner, italian, sheet-pan dinners |
ingredients | One string per ingredient line, exactly as published |
instructions | One string per step |
nutrition | Nutrition values when published; null otherwise, or when includeNutrition is off |
scrapedAt, warnings | Collection time and notes such as missing structured data |
Every record also has recordType: "recipe". The run writes an OUTPUT summary with the status (data, empty or blocked), stop reason, records, charged records, pages fetched, blocked and failed pages, and warnings.
How do I scrape Bon Appétit recipes by URL or keyword?
Use any combination of three inputs:
| Input | Default | Notes |
|---|---|---|
startUrls | empty | Up to 50 Bon Appétit recipe, category or search page URLs |
searchQuery | empty | A keyword such as chicken pasta; the Actor opens Bon Appétit's search page for it |
maxResults | 10 | Recipes to return, 1–100 |
maxPages | 3 | Index or search pages to read for recipe links, 1–10; direct recipe URLs do not count |
includeNutrition | true | Keep nutrition values when the page has them |
Specific recipes:
{"startUrls": [{ "url": "https://www.bonappetit.com/recipe/chicken-pasta-primavera" },{ "url": "https://www.bonappetit.com/recipe/a-really-big-chicken-parm" }],"maxResults": 2}
Recipes for a keyword:
{"searchQuery": "chicken pasta","maxResults": 25,"maxPages": 3}
A search for chicken pasta returned 12 recipe links on the first results page in a 2026-10-26 check, so set maxPages higher when you want more than a dozen recipes from one keyword.
Can I build a recipe dataset or recipe API from Bon Appétit?
Yes, within limits. One run returns up to 100 recipes, and you can schedule runs or call the Actor from code to grow a dataset over time. Each record keeps its source URL for attribution. Bon Appétit's recipe text and photos are copyrighted, so use the data for research, personal tools or internal analysis rather than republishing it.
JavaScript with apify-client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/bon-appetit-recipes-scraper').call({searchQuery: 'salmon',maxResults: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const recipe of items) console.log(recipe.name, recipe.totalTime, recipe.recipeYield);
Python with apify-client:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/bon-appetit-recipes-scraper").call(run_input={"startUrls": [{"url": "https://www.bonappetit.com/recipe/chicken-pasta-primavera"}],"maxResults": 1,})for recipe in client.dataset(run.default_dataset_id).iterate_items():print(recipe["name"], len(recipe["instructions"]), "steps")
How accurate are the ingredients and instructions?
Both come straight from the recipe's structured data. Each step is one complete string, and each ingredient line is one item, commas included: "4 oz. Parmesan, finely grated (about 2 cups), divided" stays a single item, so the item count equals the number of ingredient lines on the page. Ingredient lines are not split into quantity, unit and name.
Use it from an AI assistant
Bon Appétit Recipes Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/bon-appetit-recipes-scraper to your client and ask, for example: "Find five Bon Appétit salmon recipes that take under an hour and list their ingredients." Each recipe is charged at the prices below, so give the assistant a recipe limit.
What does the output look like?
Two records produced by the Actor's parser from live Bon Appétit pages, shortened (ingredients re-checked on 2026-10-27).
[{"recordType": "recipe","url": "https://www.bonappetit.com/recipe/chicken-pasta-primavera","recipeId": "chicken-pasta-primavera","name": "Chicken Pasta Primavera With Lemon","description": "Crispy, Parmesan-coated chicken cutlets crown this creamy, lemony pasta primavera loaded with peas, asparagus, and green beans.","author": "Jesse Szewczyk","datePublished": "2026-03-23T06:00:00.000-04:00","prepTime": null,"cookTime": null,"totalTime": "45 minutes","recipeYield": "4 servings","keywords": ["main", "dinner", "spring", "penne", "chicken breast", "asparagus", "lemon"],"ingredients": ["2 large skinless, boneless chicken breasts (about 1½ lb. total),patted dry", "Kosher salt, freshly ground pepper", "8 oz. penne"],"instructions": ["Holding a long knife parallel to cutting board and working one at a time, slice 2 large sk…"],"nutrition": null,"warnings": []},{"recordType": "recipe","url": "https://www.bonappetit.com/recipe/a-really-big-chicken-parm","recipeId": "a-really-big-chicken-parm","name": "A Really Big Chicken Parm","author": "Jesse Szewczyk","totalTime": "1 hour","recipeYield": "4 servings","keywords": ["dinner", "italian", "ground chicken", "parmesan", "sheet-pan dinners"],"ingredients": ["1 lb. ground chicken", "2 large eggs", "3 oz. Parmesan, finely grated ( about 1½ cups)", "1 cup panko"],"nutrition": null,"scrapedAt": "2026-10-26T12:21:12.711Z","warnings": []}]
Pricing: how much does it cost to scrape Bon Appétit recipes?
The Actor uses pay-per-event pricing with platform usage included. You pay per recipe record delivered, plus a start fee per started GB of allocated memory.
| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|
| Recipe record | USD 0.01 | USD 0.01 | USD 0.01 | USD 0.007 | USD 0.007 | USD 0.007 |
| Actor start (per started GB of allocated memory) | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 |
The default memory is 512 MB (maximum 1 GB), so a default run pays one start event.
Worked totals on the FREE tier:
- Default input (10 recipes at 512 MB): 10 × USD 0.01 + USD 0.005 = USD 0.105
- 100 recipes at 512 MB: 100 × USD 0.01 + USD 0.005 = USD 1.005
Pages that are blocked, fail or have no recipe are not charged. The start message and the OUTPUT cost estimate use your live per-recipe price, and the run stops cleanly when your spending limit is reached.
When should I use it, and when not?
Use it when you want Bon Appétit recipes specifically: a seasonal set of Bon Appétit Thanksgiving or pasta recipes, a test-kitchen recipe database, or ingredients and steps for a meal-planning prototype.
Use another Actor when:
- You want other recipe sites: NYT Cooking Recipe Scraper, AllRecipes Search Scraper, Food Network Recipes Scraper, Tasty Recipe Scraper or King Arthur Baking Recipe Scraper.
- You need more than 100 recipes in one run, ratings or reader reviews. This Actor does not return them.
Limits and reliability
- Volume: 1–100 recipes and 1–10 discovery pages per run.
- Requests: one HTTP request per page, fetched one at a time, with up to three attempts per page.
- Blocking: HTTP 401, 403, 429 and challenge pages are counted as blocked in
OUTPUT; no record is invented for them, and a run where every page was blocked ends as failed with no recipe charges. - Freshness: pages are read live at run time.
FAQ
Do I need a Bon Appétit subscription or login?
No. The Actor reads public pages only and does not bypass logins, paywalls or CAPTCHAs.
How many recipes can I get per run?
Up to 100. For more, run it again with other URLs or keywords, or schedule it.
Does it include nutrition facts?
Only when the recipe page publishes them in its structured data. Many Bon Appétit recipes do not, so nutrition is often null.
Does it return ratings or reviews?
No. The output has no rating or review fields.
Why are times written as text like "1 hour"?
Times are passed through as Bon Appétit publishes them. Prep and cook times are often missing, while total time is usually present.
What happens when no recipe matches?
The run finishes with an empty status in OUTPUT, a clear status message and no recipe charges. Only the start event is billed.
Related Actors
- NYT Cooking Recipe Scraper: NYT Cooking recipes
- AllRecipes Search Scraper: AllRecipes search results and recipes
- Food Network Recipes Scraper and Tasty Recipe Scraper: more recipe sources
- Canada Open Data Scraper: another structured-data tool from the same developer
Legal and compliance
The Actor reads public Bon Appétit pages without logging in or bypassing access controls. Recipe text, photos and branding belong to their owners; keep the source URL, credit Bon Appétit, and do not republish full recipes without permission. This tool is not affiliated with Bon Appétit or Condé Nast, and this is not legal advice.
Last verified: 2026-10-27