# Tasty Recipes Scraper (`shahidirfan/tasty-recipes-scraper`) Actor

Scrape recipes from Tasty with ingredients, instructions, prep times & nutrition facts. Build recipe databases for food apps, meal planners & content platforms. Structured JSON output, handles pagination, perfect for recipe aggregators & culinary AI datasets.

- **URL**: https://apify.com/shahidirfan/tasty-recipes-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Tasty Recipes Scraper

Extract complete recipe data from Tasty.co at scale. Collect ingredients, step-by-step instructions, cooking times, nutritional information, ratings, tags, and video URLs from any recipe. Paste a Tasty URL or type keywords to find recipes. Perfect for meal planning apps, food blogs, nutrition tracking, and recipe database creation.

### Features

- **Keyword & URL Search** - Search by keyword or paste any Tasty URL (tag page, search results, or single recipe)
- **Complete Recipe Data** - Every recipe includes full ingredients with quantities, step-by-step instructions, nutrition facts, ratings, and video URLs
- **API-Powered Extraction** - Fast and reliable collection using Tasty's official backend API
- **Automatic Pagination** - Collect hundreds of recipes with full details in a single run
- **Lightweight & Fast** - Minimal resource usage with quick execution times

### Use Cases

#### Recipe Database Creation

Build a comprehensive recipe database for meal planning apps, food blogs, or nutrition tracking tools. Each recipe includes structured ingredients with quantities and units, making it ready for database import.

#### Nutritional Analysis

Collect detailed nutrition information including calories, fat, carbs, protein, fiber, and sugar. Perfect for diet tracking apps, meal prep services, and health research.

#### Content Research

Food content creators can study recipe formats, cooking techniques, ingredient combinations, and presentation styles from thousands of recipes organized by category.

#### Meal Planning Services

Analyze cooking times, difficulty levels, and ingredient requirements to build customized meal plans. Filter by tags like quick meals, comfort food, healthy options, and dietary preferences.

---

### Input Parameters

| Parameter            | Type    | Required | Default          | Description                                     |
| -------------------- | ------- | -------- | ---------------- | ----------------------------------------------- |
| `url`                | String  | No       | -                | Tasty.co page URL (tag, search, or recipe page) |
| `keyword`            | String  | No       | `chicken dinner` | Search keyword used when no URL is provided     |
| `results_wanted`     | Integer | No       | `20`             | Maximum number of recipes to collect            |
| `max_pages`          | Integer | No       | `50`             | Safety cap on API pages (20 recipes per page)   |
| `proxyConfiguration` | Object  | No       | `{}`             | Apify proxy settings (optional)                 |

---

### Output Data

Each recipe in the output dataset contains:

| Field                | Type   | Description                                                           |
| -------------------- | ------ | --------------------------------------------------------------------- |
| `id`                 | Number | Unique recipe identifier                                              |
| `name`               | String | Recipe name                                                           |
| `slug`               | String | URL slug                                                              |
| `recipe_url`         | String | Full recipe URL on Tasty.co                                           |
| `description`        | String | Recipe description                                                    |
| `thumbnail_url`      | String | Main thumbnail image URL                                              |
| `thumbnail_alt_text` | String | Thumbnail alt text                                                    |
| `video_url`          | String | Video URL (if available)                                              |
| `total_time_minutes` | Number | Total cooking time in minutes                                         |
| `cook_time_minutes`  | Number | Active cook time in minutes                                           |
| `prep_time_minutes`  | Number | Prep time in minutes                                                  |
| `num_servings`       | Number | Number of servings                                                    |
| `servings_text`      | String | Serving size label                                                    |
| `tags`               | Array  | Recipe tags and categories                                            |
| `credits`            | Array  | Recipe credits and contributors                                       |
| `ingredients`        | Array  | Ingredients with name, quantity, unit, and section                    |
| `instructions`       | Array  | Step-by-step cooking instructions with display text                   |
| `nutrition`          | Object | Nutritional information (calories, fat, carbs, protein, fiber, sugar) |
| `ratings`            | Object | Rating score, positive and negative counts                            |
| `seo_title`          | String | SEO title                                                             |

---

### Usage Examples

#### Search by Keyword

Search for recipes by keyword:

```json
{
    "keyword": "chicken dinner",
    "results_wanted": 20
}
````

#### Scrape a Tag Page

Paste any Tasty tag URL:

```json
{
    "url": "https://tasty.co/tag/desserts",
    "results_wanted": 50
}
```

#### Search by Query

Use a search results URL directly:

```json
{
    "url": "https://tasty.co/search?q=vegetarian+pasta",
    "results_wanted": 30
}
```

#### Single Recipe

Get full details for a specific recipe:

```json
{
    "url": "https://tasty.co/recipe/creamy-tuscan-chicken"
}
```

***

### Sample Output

```json
{
    "id": 2955,
    "name": "Sweet & Sour Chicken",
    "recipe_url": "https://tasty.co/recipe/sweet-sour-chicken",
    "description": "Indulge in this mouthwatering Sweet & Sour Chicken...",
    "total_time_minutes": 35,
    "num_servings": 4,
    "nutrition": {
        "calories": 394,
        "fat": 9,
        "carbs": 34,
        "protein": 38
    },
    "ratings": {
        "score": 97,
        "count_total": 5050
    },
    "ingredients": [
        { "name": "chicken breast", "quantity": "1", "unit": "lb", "section": "Chicken" },
        { "name": "soy sauce", "quantity": "2", "unit": "tbsp", "section": "Sauce" }
    ],
    "instructions": [
        { "display_text": "Season chicken with salt and pepper..." },
        { "display_text": "Fry until golden and crispy..." }
    ],
    "tags": ["chicken", "asian", "dinner", "weeknight"],
    "credits": []
}
```

***

### Tips for Best Results

#### Use URLs for Precision

- Tag URLs give you all recipes in a category (e.g., `weeknight`, `desserts`, `healthy`)
- Search URLs let you narrow results with specific queries
- Single recipe URLs return complete details for one recipe

#### Set Appropriate Limits

- Start with 20 recipes for testing
- Increase to 100-500 for production runs
- The API returns up to several thousand results per query

#### Optimize Performance

- No proxy needed for most runs
- Enable proxy only if rate limiting occurs
- Full detail fetching adds one API call per recipe

***

### Integrations

Connect your recipe data with:

- **Google Sheets** - Export for meal planning analysis
- **Airtable** - Build searchable recipe databases
- **Notion** - Create organized recipe collections
- **Webhooks** - Send to custom endpoints

#### Export Formats

- **JSON** - For developers and APIs
- **CSV** - For spreadsheet analysis
- **Excel** - For business reporting
- **XML** - For system integrations

***

### Frequently Asked Questions

#### How many recipes can I collect?

You can collect all available recipes matching your search or tag query. Popular categories like weeknight have over 3000 recipes available.

#### Does it include ingredients and instructions?

Yes, every recipe includes full ingredients with quantities and units, plus step-by-step cooking instructions. Detailed nutrition facts and ratings are also included automatically.

#### Can I search by keyword or URL?

Both. You can type any keyword to search recipes, or paste a Tasty URL including tag pages, search results, and individual recipe pages. The actor automatically detects the input type.

#### Do I need a proxy?

No proxy is required. The API-based approach is lightweight and works without proxy under normal usage.

#### Is the data up to date?

Yes, the actor fetches live data from Tasty's API on each run, ensuring you always get the latest recipes and their complete details.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/schedules)

***

### Legal Notice

This actor is designed for legitimate data collection purposes. Users are responsible for ensuring compliance with website terms of service and applicable laws. Use data responsibly and respect rate limits.

# Actor input Schema

## `url` (type: `string`):

A Tasty.co page URL to scrape. Supports tag pages (e.g., https://tasty.co/tag/weeknight), search results (e.g., https://tasty.co/search?q=chicken), or recipe pages (https://tasty.co/recipe/recipe-name).

## `keyword` (type: `string`):

Search for recipes matching this keyword. Used when no URL is provided.

## `results_wanted` (type: `integer`):

The maximum number of recipes to collect.

## `max_pages` (type: `integer`):

Safety cap on API pages to fetch (20 recipes per page). Not used for single recipe URLs.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy if needed.

## Actor input object example

```json
{
  "keyword": "chicken dinner",
  "results_wanted": 20,
  "max_pages": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "keyword": "chicken dinner",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/tasty-recipes-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 = {
    "keyword": "chicken dinner",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/tasty-recipes-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 '{
  "keyword": "chicken dinner",
  "results_wanted": 20
}' |
apify call shahidirfan/tasty-recipes-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tasty Recipes Scraper",
        "description": "Scrape recipes from Tasty with ingredients, instructions, prep times & nutrition facts. Build recipe databases for food apps, meal planners & content platforms. Structured JSON output, handles pagination, perfect for recipe aggregators & culinary AI datasets.",
        "version": "0.0",
        "x-build-id": "iNqioNoOynPeB3vDc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~tasty-recipes-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-tasty-recipes-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/shahidirfan~tasty-recipes-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-tasty-recipes-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/shahidirfan~tasty-recipes-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-tasty-recipes-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": {
                    "url": {
                        "title": "Tasty.co URL",
                        "type": "string",
                        "description": "A Tasty.co page URL to scrape. Supports tag pages (e.g., https://tasty.co/tag/weeknight), search results (e.g., https://tasty.co/search?q=chicken), or recipe pages (https://tasty.co/recipe/recipe-name)."
                    },
                    "keyword": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Search for recipes matching this keyword. Used when no URL is provided."
                    },
                    "results_wanted": {
                        "title": "Maximum number of recipes",
                        "minimum": 1,
                        "type": "integer",
                        "description": "The maximum number of recipes to collect.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum number of API pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap on API pages to fetch (20 recipes per page). Not used for single recipe URLs.",
                        "default": 50
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy if needed.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
