# Bon Appetit Scraper | Gourmet Recipes and Articles (`parseforge/bonappetit-scraper`) Actor

Collect recipes and food articles from Bon Appetit with ingredients, methods, prep and cook times, servings, ratings, author, and tags. Power culinary apps, food content platforms, meal planners, and AI recipe assistants with gourmet content from a top food publication.

- **URL**: https://apify.com/parseforge/bonappetit-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Marketing, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🍽️ Bon Appétit Recipe Scraper

> 🚀 **Export Bon Appétit recipes to CSV, Excel, JSON, or XML in seconds.** Search by keyword or category and get full ingredient lists, step-by-step instructions, ratings, and author credits - no API key, no registration required.

> 🕒 **Last updated:** 2026-05-22 · **📊 17 fields** per record · **🍳 Thousands of recipes** · **🌍 Covers all cuisines** · **⭐ Includes ratings and reviews**

The **Bon Appétit Scraper** extracts recipes from Bon Appétit magazine's website (bonappetit.com) and returns **17 fields per record**, including full ingredient lists, step-by-step cooking instructions, cook times, servings, ratings, review counts, author credits, and tags. All data is sourced from the JSON-LD structured data embedded in each recipe page.

Bon Appétit is one of the world's most respected food and recipe publications, with decades of trusted recipes from professional chefs and food editors. This Actor makes their publicly available recipe catalog searchable and downloadable in any format in under a minute.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Food bloggers, recipe app developers, culinary researchers, meal planning platforms, AI training datasets, home cooks, nutrition analysts | Recipe database building, meal planning apps, ingredient analysis, cooking time research, food trend analysis, culinary NLP training |

---

### 📋 What the Bon Appétit Scraper does

Three flexible workflows in a single run:

- 🔍 **Keyword search.** Search by any term like `pasta`, `chocolate`, `grilled chicken`, or `vegan`.
- 🏷️ **Category filter.** Filter by ingredient or cuisine category like `dessert`, `salad`, `italian`, or `quick`.
- 📦 **Bulk export.** Collect up to 1,000,000 recipes for large-scale dataset creation.

Each record includes the recipe image, title, description, author, star rating, review count, full ingredient list, step-by-step instructions, cook time, total time, servings, difficulty, tags, source URL, and publication date.

> 💡 **Why it matters:** manually copying recipes is slow and loses structure. Building your own parser means handling HTML quirks, JSON-LD variations, and pagination by hand. This Actor handles all of that and returns clean, structured data ready for databases, apps, or AI pipelines.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded recipe dataset._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>searchQuery</code></td><td>string</td><td><code>"pasta"</code></td><td>Keyword to search for recipes. Leave empty to use <code>category</code> instead.</td></tr>
<tr><td><code>category</code></td><td>string</td><td><code>null</code></td><td>Category tag to filter recipes (e.g. <code>dessert</code>, <code>chicken</code>, <code>salad</code>). Used when <code>searchQuery</code> is empty.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Maximum recipes to return. Free plan caps at 10; paid plan at 1,000,000.</td></tr>
</tbody>
</table>

**Example: 10 pasta recipes.**

```json
{
    "searchQuery": "pasta",
    "maxItems": 10
}
````

**Example: 50 dessert recipes by category.**

```json
{
    "category": "dessert",
    "maxItems": 50
}
```

> ⚠️ **Good to Know:** Bon Appétit serves publicly accessible recipes with full JSON-LD structured data. Some older recipes may not include cook time in the structured data - the `cookTime` and `totalTime` fields will be `null` for those records. The `difficulty` field is derived from recipe tags and will be `null` when Bon Appétit has not tagged a difficulty level.

***

### 📊 Output

Each record contains 17 fields:

| Field | Type | Description |
|---|---|---|
| 🖼️ `imageUrl` | string | High-resolution recipe photo URL |
| 📌 `title` | string | Recipe title |
| 📝 `description` | string | Short recipe summary |
| 👤 `author` | string | Recipe author name |
| ⭐ `rating` | number | Aggregate star rating (e.g. `4.8`) |
| 💬 `reviewCount` | integer | Number of user reviews |
| 🥕 `ingredients` | array | Full ingredient list with measurements |
| 📋 `instructions` | array | Step-by-step cooking instructions |
| 🍳 `cookTime` | string | Active cook time (e.g. `"22 minutes"`) |
| ⏰ `totalTime` | string | Total recipe time including resting |
| 🍽️ `servings` | string | Serving size (e.g. `"4 servings"`) |
| 🎯 `difficulty` | string | Difficulty level from tags (e.g. `"easy"`) |
| 🔖 `tags` | array | Recipe tags (cuisine, occasion, technique) |
| 🔗 `url` | string | Source recipe URL |
| 📅 `publishedAt` | string | Original publication date (ISO 8601) |
| 🕒 `scrapedAt` | string | Timestamp of scrape run (ISO 8601) |
| ❌ `error` | string | Error message if scrape failed, else `null` |

**Sample record 1 - Pasta Alla Vodka:**

```json
{
  "imageUrl": "https://assets.bonappetit.com/photos/5a8da4996497380283798c16/16:9/w_4991,h_2807,c_limit/rigatoni-with-vodka-sauce.jpg",
  "title": "Pasta Alla Vodka",
  "description": "This easy vodka pasta recipe combines tomato paste, cream, and a splash of booze for a dinner that comes together quickly, using just a few pantry ingredients.",
  "author": "Claire Saffitz",
  "rating": 4.8,
  "reviewCount": 511,
  "ingredients": [
    "Kosher salt",
    "1 medium onion",
    "4 garlic cloves",
    "2 Tbsp. extra-virgin olive oil",
    "2 Tbsp. tomato paste",
    "½ tsp. crushed red pepper flakes",
    "¾ cup vodka",
    "¾ cup heavy cream",
    "2 Tbsp. unsalted butter",
    "12 oz. rigatoni",
    "1 oz. Parmesan, finely grated"
  ],
  "instructions": [
    "Bring a large pot of lightly salted water to a boil.",
    "While water comes to a boil, peel and finely chop 1 medium onion and 4 garlic cloves...",
    "Heat 2 Tbsp. extra-virgin olive oil in a large heavy pot over medium..."
  ],
  "cookTime": "30 minutes",
  "totalTime": "30 minutes",
  "servings": "4 servings",
  "difficulty": "easy",
  "tags": ["dinner", "pasta", "tomato", "italian", "easy", "quick", "main", "nut-free"],
  "url": "https://www.bonappetit.com/recipe/rigatoni-with-easy-vodka-sauce",
  "publishedAt": "2018-01-01T05:00:00.000-05:00",
  "scrapedAt": "2026-05-22T03:08:40.123Z",
  "error": null
}
```

**Sample record 2 - Homemade Pasta Dough:**

```json
{
  "imageUrl": "https://assets.bonappetit.com/photos/57d828806520aa8f7013c947/master/w_4269,h_2935,c_limit/fresh-pasta-dough.jpg",
  "title": "Homemade Pasta Dough",
  "description": "A bit of olive oil gives this fresh pasta dough recipe extra flexibility and versatility. Use it to make fettuccine, pappardelle, ravioli, or lasagna.",
  "author": "Rick Martinez",
  "rating": 4.2,
  "reviewCount": 310,
  "ingredients": [
    "3 large eggs, beaten to blend",
    "2 cups (250 g) all-purpose flour",
    "1 Tbsp. olive oil",
    "1 tsp. Diamond Crystal or ½ tsp. plus ⅛ tsp. Morton kosher salt",
    "Cornmeal or semolina flour (for dusting)"
  ],
  "instructions": [
    "Mix 3 large eggs, beaten to blend, 2 cups (250 g) all-purpose flour, 1 Tbsp. olive oil, and 1 tsp. kosher salt in the bowl of a stand mixer with your hands until a shaggy dough forms...",
    "Dust a large rimmed baking sheet with cornmeal or semolina flour...",
    "Repeat without folding, adjusting machine one setting thinner after every pass..."
  ],
  "cookTime": "35 minutes",
  "totalTime": "45 minutes",
  "servings": "Makes about 1 pound",
  "difficulty": null,
  "tags": ["dinner", "pasta", "dough", "italian", "main", "nut-free"],
  "url": "https://www.bonappetit.com/recipe/fresh-pasta-dough",
  "publishedAt": "2016-09-23T04:00:03.000-04:00",
  "scrapedAt": "2026-05-22T03:08:39.244Z",
  "error": null
}
```

***

### ✨ Why choose this Actor

| Feature | Detail |
|---|---|
| 📐 **Structured JSON-LD parsing** | Extracts data from Bon Appétit's embedded Schema.org Recipe markup - no brittle HTML selectors |
| 🥕 **Full ingredient lists** | Every ingredient with exact measurements, not just a count |
| 📋 **Step-by-step instructions** | Each cooking step as a separate array element, ready for display |
| ⭐ **Real ratings and reviews** | Aggregate rating value and review count per recipe |
| 👤 **Author attribution** | Named author credit for every recipe |
| 🔖 **Rich tags** | Cuisine type, occasion, cooking technique, dietary restrictions |
| 🕒 **Publication dates** | Original publish date for freshness sorting |
| 📦 **Scales to 1,000,000 items** | Reliable pagination and rate-limiting built in |

***

### 📈 How it compares to alternatives

| Feature | This Actor | Manual scraping | Other scrapers |
|---|---|---|---|
| JSON-LD parsing | Yes | Build it yourself | Varies |
| Full ingredient list | Yes | Requires HTML parser | Often truncated |
| Step-by-step instructions | Yes | Complex to extract | Often combined |
| Author + rating + reviews | Yes | Multiple selectors | Often missing |
| Keyword search | Yes | Not available | Rarely |
| Scales to 1M+ | Yes | Memory-limited | Often not |
| No API key needed | Yes | Yes | Yes |
| Export to CSV/Excel/JSON | Yes | Manual work | Varies |

***

### 🚀 How to use

1. **Create a free account** - [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp)
2. **Open the Actor** - Search for "Bon Appétit Scraper" in the Apify Store or go directly to the Actor page
3. **Set your input** - Enter a search query like `pasta` or a category like `dessert`, set your `maxItems`
4. **Run the Actor** - Click "Start" and wait for the run to complete (typically under 2 minutes for 50 recipes)
5. **Download your data** - Export as CSV, Excel, JSON, or XML from the dataset tab

***

### 💼 Business use cases

#### Recipe App Development

Build a recipe discovery app seeded with thousands of Bon Appétit recipes. The structured ingredient arrays and instruction steps are ready to render directly in mobile or web UIs. Use the tags array to build faceted category navigation.

#### Meal Planning Platforms

Ingest recipes in bulk, index by cook time and tags, and build personalized weekly meal plan generators. The `servings` and `totalTime` fields power recipe scaling and schedule optimization.

#### Food Content and SEO

Food bloggers and content teams can monitor the Bon Appétit recipe catalog to identify trending cuisines, seasonal topics, and ingredient combinations. Use publication dates to track what's being published month-by-month.

#### AI and NLP Training Data

Build culinary language models, recipe generation systems, or ingredient substitution engines using clean, structured recipe text. The `ingredients` and `instructions` arrays are pre-split and ready for tokenization.

***

### 🔌 Automating Bon Appétit Scraper

Connect this Actor to thousands of apps using Apify's native integrations:

- **Make (Integromat)** - Trigger a recipe scrape on a schedule and push results to Google Sheets or Airtable
- **Zapier** - When a run completes, send new recipe data to Slack, Notion, or a CRM
- **Webhook** - POST the dataset URL to any endpoint when the run finishes
- **Apify API** - Call the Actor programmatically from any codebase using the REST API or official client libraries (Node.js, Python)
- **Google Sheets** - Use Apify's Google Sheets integration to sync recipe data directly to a spreadsheet
- **Slack** - Get a Slack notification with recipe counts and a dataset download link when each run completes

***

### 🌟 Beyond business use cases

#### Culinary Research and Education

Academics and culinary schools can use the dataset to study recipe composition, ingredient co-occurrence patterns, and the evolution of food trends over decades of Bon Appétit publication history.

#### Creative Projects

Writers, food photographers, and home cooks exploring new cuisines can use keyword and category search to discover recipes they wouldn't normally encounter. Filter by tags like `"nut-free"` or `"quick"` to match dietary needs or time constraints.

#### Non-Profit and Community Work

Food banks, community kitchens, and nutrition outreach organizations can extract large recipe collections to build free cooking resources, printable recipe cards, or ingredient-based meal suggestions for clients.

#### Experimentation and Prototyping

Developers prototyping recipe recommendation engines, flavor pairing tools, or ingredient substitution algorithms need large, clean datasets fast. This Actor provides that in minutes rather than weeks of scraper development.

***

### 🤖 Ask an AI assistant about this scraper

You can ask an AI assistant questions like:

- "What fields does the Bon Appétit Scraper return?"
- "How do I filter recipes by category using this Actor?"
- "How do I connect this scraper to Google Sheets using Make?"
- "What's the difference between `searchQuery` and `category` inputs?"

The structured output and clean schema make it easy to integrate with AI pipelines, chatbots, and recommendation systems.

***

### ❓ Frequently Asked Questions

**❓ Does this require a Bon Appétit subscription?**
No. This Actor scrapes publicly accessible recipe pages. No login, subscription, or API key is required.

**❓ How many recipes can I scrape?**
Free users get up to 10 recipes per run. Paid users can scrape up to 1,000,000 recipes per run.

**❓ How fast does it run?**
A typical run of 50 recipes completes in under 2 minutes. Larger runs scale proportionally with built-in rate limiting to avoid being blocked.

**❓ Can I search by multiple keywords?**
Yes. Enter a phrase in `searchQuery` like `"chocolate cake"` or `"grilled chicken"` and the Actor will search for matching recipes.

**❓ What's the difference between `searchQuery` and `category`?**
Both perform a keyword search on Bon Appétit's search page. `searchQuery` takes priority. If only `category` is provided, it is used as the search term. Use `category` for single-topic filtering like `"dessert"` or `"pasta"`.

**❓ Are ingredients returned as a structured list?**
Yes. The `ingredients` field is a JSON array where each element is one ingredient with its measurement (e.g. `"2 cups all-purpose flour"`).

**❓ Are instructions returned per-step?**
Yes. The `instructions` field is a JSON array where each element is one cooking step, ready to display as a numbered list.

**❓ Why are some `cookTime` or `totalTime` fields null?**
Bon Appétit's structured data does not include time fields for all recipes, particularly older ones. When a recipe does not include timing in its JSON-LD data, those fields will be `null`.

**❓ Why is `difficulty` sometimes null?**
Difficulty is derived from Bon Appétit's own tagging. Not all recipes are tagged with a difficulty level. When the difficulty tag (`easy`, `medium`, etc.) is absent, the field returns `null`.

**❓ Can I export the data to Excel or CSV?**
Yes. Apify's dataset viewer lets you download results in CSV, Excel, JSON, and XML formats from the Storage tab after each run.

**❓ How do I run this on a schedule?**
In the Actor settings on Apify Console, click "Schedule" and set a cron expression. The Actor will run automatically and store each run's results in a separate dataset.

**❓ Is the data real-time?**
Yes. Every run fetches live data from Bon Appétit's website. There is no caching or pre-stored data.

***

### 🔌 Integrate with any app

Connect this Actor to your workflow using Apify's native integrations:

| Integration | Use case |
|---|---|
| Google Sheets | Sync recipes to a spreadsheet for team collaboration |
| Airtable | Build a searchable recipe database with custom views |
| Notion | Import recipes into a Notion database for meal planning |
| Slack | Get run summaries posted to a channel automatically |
| Make (Integromat) | Multi-step automation with hundreds of supported apps |
| Zapier | Trigger workflows in 6,000+ apps when a run completes |
| Apify REST API | Call from any codebase with the official Node.js or Python SDK |
| Webhooks | POST dataset URLs to any custom endpoint on run completion |
| Excel | Download CSV and open directly in Microsoft Excel |
| BigQuery / Snowflake | Feed cleaned recipe data into a data warehouse |

***

### 🔗 Recommended Actors

| Actor | Description |
|---|---|
| [Serious Eats Scraper](https://apify.com/parseforge/seriouseats-scraper) | Scrape recipes from Serious Eats with full ingredients, nutrition, and technique guides |
| [BBC Good Food Scraper](https://apify.com/parseforge/bbcgoodfood-scraper) | Export BBC Good Food recipes with ratings, cook times, and calorie counts |
| [Allrecipes Scraper](https://apify.com/parseforge/allrecipes-scraper) | Collect crowd-sourced recipes with user ratings, reviews, and ingredient lists |
| [Food.com Scraper](https://apify.com/parseforge/food-com-scraper) | Scrape Food.com recipes with serving sizes, prep times, and nutrition data |
| [Yummly Scraper](https://apify.com/parseforge/yummly-scraper) | Extract Yummly recipes filtered by dietary restrictions and cuisine type |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for 150+ ready-to-use data extractors covering food, travel, jobs, finance, and more.

***

**Disclaimer:** This Actor is an independent tool for accessing publicly available recipe data from Bon Appétit for legitimate research, development, and personal use. It is not affiliated with, endorsed by, or connected to Bon Appétit or Conde Nast. Use responsibly and in accordance with Bon Appétit's Terms of Service. Recipe content is copyright of Bon Appétit and its authors.

# Actor input Schema

## `searchQuery` (type: `string`):

Search for recipes by keyword (e.g. 'pasta', 'chicken', 'chocolate cake'). Leave empty to use category filter.

## `category` (type: `string`):

Filter by recipe category tag (e.g. 'pasta', 'dessert', 'chicken', 'salad'). Used as search query when searchQuery is empty.

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## Actor input object example

```json
{
  "searchQuery": "pasta",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "pasta",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/bonappetit-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "pasta",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/bonappetit-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "pasta",
  "maxItems": 10
}' |
apify call parseforge/bonappetit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/bonappetit-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bon Appetit Scraper | Gourmet Recipes and Articles",
        "description": "Collect recipes and food articles from Bon Appetit with ingredients, methods, prep and cook times, servings, ratings, author, and tags. Power culinary apps, food content platforms, meal planners, and AI recipe assistants with gourmet content from a top food publication.",
        "version": "0.1",
        "x-build-id": "MjGTyS5Fo3cyusNqL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~bonappetit-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-bonappetit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~bonappetit-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-bonappetit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~bonappetit-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-bonappetit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search for recipes by keyword (e.g. 'pasta', 'chicken', 'chocolate cake'). Leave empty to use category filter."
                    },
                    "category": {
                        "title": "Category",
                        "type": "string",
                        "description": "Filter by recipe category tag (e.g. 'pasta', 'dessert', 'chicken', 'salad'). Used as search query when searchQuery is empty."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
