Bon Appétit Recipes Scraper — Ingredients & Steps avatar

Bon Appétit Recipes Scraper — Ingredients & Steps

Pricing

from $7.00 / 1,000 recipe records

Go to Apify Store
Bon Appétit Recipes Scraper — Ingredients & Steps

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

9 hours ago

Last modified

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.

FieldWhat it contains
url, recipeIdRecipe URL and its slug, for example chicken-pasta-primavera
name, descriptionRecipe title and summary
imageMain photo URL
authorRecipe developer, for example Jesse Szewczyk
datePublishedPublish date as an ISO timestamp
prepTime, cookTime, totalTimeTimes as Bon Appétit writes them, for example 45 minutes; prep and cook are often null
recipeYieldServings, for example 4 servings
recipeCategory, recipeCuisine, keywordsTags such as dinner, italian, sheet-pan dinners
ingredientsOne string per ingredient line, exactly as published
instructionsOne string per step
nutritionNutrition values when published; null otherwise, or when includeNutrition is off
scrapedAt, warningsCollection 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:

InputDefaultNotes
startUrlsemptyUp to 50 Bon Appétit recipe, category or search page URLs
searchQueryemptyA keyword such as chicken pasta; the Actor opens Bon Appétit's search page for it
maxResults10Recipes to return, 1–100
maxPages3Index or search pages to read for recipe links, 1–10; direct recipe URLs do not count
includeNutritiontrueKeep 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 os
from apify_client import ApifyClient
client = 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.

EventFREEBRONZESILVERGOLDPLATINUMDIAMOND
Recipe recordUSD 0.01USD 0.01USD 0.01USD 0.007USD 0.007USD 0.007
Actor start (per started GB of allocated memory)USD 0.005USD 0.005USD 0.005USD 0.005USD 0.005USD 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:

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.

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