# Wendy's Menu Scraper: Store Prices, Nutrition, and Changes (`getascraper/wendys-menu-prices-scraper`) Actor

Collect public Wendy's store prices, availability, nutrition, modifiers, national catalog items, and factual changes. Export typed menu rows for scheduled monitoring, spreadsheets, and APIs without checkout or login. Pay per menu item, with store-level prices clearly separated from national data.

- **URL**: https://apify.com/getascraper/wendys-menu-prices-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.47 / 1,000 menu items

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🍔 Wendy's Menu Scraper: Store Prices, Nutrition, and Changes

Track public Wendy's menu prices by restaurant, compare locations, and monitor nutrition, availability, limited-time offers, and factual menu changes over time. The Actor also supports the US national catalog, clearly separated from store-specific prices.

<table width="100%" style="display:table;width:100%"><tr><td style="border:1px solid #F4B942;background:#FFF8E7;padding:16px;color:#3B2A10"><strong style="color:#3B2A10">Know what changed before your next report.</strong><br><span style="color:#3B2A10">Schedule store snapshots for price, availability, and menu movement that stays tied to a public restaurant source.</span></td></tr></table>

<table width="100%"><tr><td style="border:1px solid #F4B942;background:#FFFFFF;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">Store prices</strong><br><span style="color:#3B2A10">Resolve public locations and capture their current prices.</span></td><td style="border:1px solid #F4B942;background:#FFFFFF;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">Nutrition</strong><br><span style="color:#3B2A10">Add factual source nutrition and allergen flags when requested.</span></td><td style="border:1px solid #F4B942;background:#FFFFFF;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">Changes</strong><br><span style="color:#3B2A10">Find new, changed, unchanged, and safely removed items.</span></td><td style="border:1px solid #F4B942;background:#FFFFFF;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">Comparisons</strong><br><span style="color:#3B2A10">See price spread signals when two or more stores are requested.</span></td></tr></table>

### 🔍 What does this Actor do?

It collects anonymous public Wendy's menu data through two modes:

- `storeSnapshot` resolves public US addresses or restaurant IDs, then returns store-specific menu rows and prices.
- `nationalCatalog` returns the public US catalog. National catalog rows never imply a store price.

The default is one Birmingham, Alabama location, 20 menu rows, no optional enrichment, and `snapshotAndChanges` output.

### 🧭 How it works

<table width="100%"><tr><td style="border:1px solid #F4B942;background:#FFF8E7;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">1. Choose a source</strong><br><span style="color:#3B2A10">Use a public address, restaurant ID, or the national catalog.</span></td><td style="border:1px solid #F4B942;background:#FFF8E7;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">2. Apply filters</strong><br><span style="color:#3B2A10">Narrow by category, day part, availability, price, calories, or item text.</span></td><td style="border:1px solid #F4B942;background:#FFF8E7;padding:14px;color:#3B2A10"><strong style="color:#3B2A10">3. Schedule monitoring</strong><br><span style="color:#3B2A10">Reuse a state name to identify factual changes between complete runs.</span></td></tr></table>

### 🧾 Input

| Field | Type | Required | Description |
|---|---|---:|---|
| `mode` | enum | No | `storeSnapshot` or `nationalCatalog`. |
| `addresses` | array of strings | Store mode | Public US addresses, ZIP codes, or cities. |
| `restaurantIds` | array of strings | Store mode | Known public Wendy's restaurant IDs. |
| `maxStoresPerAddress` | integer | No | Nearby stores returned per address, from 1 to 5. |
| `searchRadiusMiles` | integer | No | Public location search radius, from 1 to 50 miles. |
| `categories` | array of strings | No | Source category names to keep. |
| `searchTerm` | string | No | Match item names, display names, or descriptions. |
| `dayPart` | enum | No | `all`, `breakfast`, or `lunch`. |
| `onlyAvailable` | boolean | No | Keep only source-available items. |
| `onlyCombos` | boolean | No | Keep combo items only. |
| `onlyLimitedTimeOffers` | boolean | No | Keep limited-time offers only. |
| `minPrice`, `maxPrice` | number | No | Optional US dollar price bounds. |
| `minCalories`, `maxCalories` | number | No | Optional calorie bounds. |
| `includeFullNutrition` | boolean | No | Add source-backed nutrition numbers. |
| `includeModifiers` | boolean | No | Add public modifier groups and prices. |
| `includeIngredientsAndAllergens` | boolean | No | Add explicit source allergen flags. |
| `includeImages` | boolean | No | Include only complete public image URLs supplied by the source. |
| `outputMode` | enum | No | `snapshot`, `snapshotAndChanges`, or `changesOnly`. |
| `stateName` | string | No | Separate monitoring histories. |
| `maxItems` | integer | No | Rows emitted, from 1 to 500. |
| `proxyConfiguration` | object | No | Direct HTTP by default, with optional Apify proxy selection. |

### 📦 Data table

| Field | Type | Description |
|---|---|---|
| `itemName`, `displayName` | string | Public menu item names. |
| `restaurantId`, `storeName`, `storeAddress` | string | Store identity and address in store mode. |
| `price`, `calories`, `latitude`, `longitude` | number | Typed factual numeric values when supplied. |
| `categoryName`, `categoryNames`, `dayPart` | string, array | Source taxonomy and day-part labels. |
| `isAvailable`, `isCombo`, `isLimitedTimeOffer`, `isFreestyle` | boolean | Source status flags. |
| `nutrition` fields | number | Optional full source nutrition values. |
| `modifiers`, `allergens` | array, object | Optional source modifier and allergen details. |
| `changeType` | string | `new`, `changed`, `unchanged`, or `removed`. |
| `changedFields`, `previousPrice`, `priceDeltaAmount` | array, number | Factual change details when state comparison supports them. |
| `runPriceMin`, `runPriceMax`, `runPriceSpreadAmount` | number | Cross-store comparison fields when enough valid prices exist. |
| `scrapedAt`, `changeDetectedAt`, `removedAt` | string | ISO timestamps when available. |

### 💰 Pricing

This Actor uses pay per event at $0.00062 per menu item. Empty runs cost nothing, and there is no subscription requirement. Apify displays the current rate before you start a run.

### ⭐ Enjoying Wendy's Menu Scraper: Store Prices, Nutrition, and Changes?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#FFF1F1;border:1px solid #F2B8BB;border-left:5px solid #D71920;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px;color:#D71920">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">Keep your restaurant price reports current without another manual menu check.</span><br><span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps restaurant analysts and menu researchers find this Actor. Your feedback also tells us what to build next.</span></td></tr><tr><td style="padding:0;background:#D71920;border:1px solid #F2B8BB;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/wendys-menu-prices-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Does this return store prices?

Yes. `storeSnapshot` returns the public price exposed for each requested restaurant. `nationalCatalog` is kept separate because national catalog data is not a store quote.

#### Does it require a Wendy's login?

No. It uses anonymous public menu and location data. It never requests credentials or checkout information.

#### Can I monitor changes?

Yes. Reuse a `stateName` with `snapshotAndChanges` or `changesOnly`. Incomplete or capped runs never infer removals.

#### Are missing values filled in?

No. Missing source values are omitted. The Actor does not invent prices, nutrition, images, or contact data.

### 🔗 Other actors

- [Dunkin' Donuts Menu Scraper: Items, Nutrition & Category Data](https://apify.com/getascraper/dunkin-menu-scraper) ↗ for a comparable menu dataset.
- [Swiggy Scraper: Restaurants, Ratings & Menus](https://apify.com/getascraper/swiggy-scraper) ↗ for restaurant and menu discovery.
- [Yandex Eda Scraper: Restaurant, Menu & Price Data Extractor](https://apify.com/getascraper/yandex-eda-scraper) ↗ for public restaurant menu data.
- [Talabat UAE Restaurant Scraper: مطاعم طلبات](https://apify.com/getascraper/talabat-restaurant-scraper) ↗ for restaurant menus in the UAE.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/wendys-menu-prices-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose store-specific menu prices or the US national catalog.

## `addresses` (type: `array`):

Public US addresses, ZIP codes, or cities used to resolve nearby Wendy's restaurants in store mode.

## `restaurantIds` (type: `array`):

Known public Wendy's restaurant IDs. Use this when you already know the locations to monitor.

## `maxStoresPerAddress` (type: `integer`):

Maximum nearby restaurants returned for each address, sorted by source distance.

## `searchRadiusMiles` (type: `integer`):

Maximum distance used by the public location lookup for each address.

## `categories` (type: `array`):

Keep menu items whose public source category matches one of these names.

## `searchTerm` (type: `string`):

Match item name, display name, or source description. Leave blank to keep all names.

## `dayPart` (type: `string`):

Keep all items, breakfast items, or lunch items based on the source day-part label.

## `onlyAvailable` (type: `boolean`):

Exclude items that Wendy's marks unavailable for the requested menu scope.

## `onlyCombos` (type: `boolean`):

Keep only source menu entries identified as combo items.

## `onlyLimitedTimeOffers` (type: `boolean`):

Keep only items with the source limited-time-offer flag.

## `minPrice` (type: `number`):

Optional minimum source price in US dollars.

## `maxPrice` (type: `number`):

Optional maximum source price in US dollars.

## `minCalories` (type: `number`):

Optional minimum calorie value from the source nutrition record.

## `maxCalories` (type: `number`):

Optional maximum calorie value from the source nutrition record.

## `includeFullNutrition` (type: `boolean`):

Add source-backed macro and micronutrient numbers when Wendy's exposes them.

## `includeModifiers` (type: `boolean`):

Add public modifier groups, names, actions, descriptions, and prices.

## `includeIngredientsAndAllergens` (type: `boolean`):

Add only explicit source ingredient descriptions and allergen flags.

## `includeImages` (type: `boolean`):

Include an image only when Wendy's provides a complete public URL in the response.

## `outputMode` (type: `string`):

Choose current snapshots, snapshots with change metadata, or changes only.

## `stateName` (type: `string`):

Separate independent histories when monitoring different store groups or workflows.

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

Maximum menu rows emitted after filtering, deduplication, and price derivation.

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

Direct HTTP is the default. Select an Apify proxy only if a high-volume run needs it.

## Actor input object example

```json
{
  "mode": "storeSnapshot",
  "addresses": [
    "345 Valley Avenue, Birmingham, AL 35209"
  ],
  "restaurantIds": [],
  "maxStoresPerAddress": 1,
  "searchRadiusMiles": 25,
  "categories": [],
  "dayPart": "all",
  "onlyAvailable": true,
  "onlyCombos": false,
  "onlyLimitedTimeOffers": false,
  "includeFullNutrition": false,
  "includeModifiers": false,
  "includeIngredientsAndAllergens": false,
  "includeImages": false,
  "outputMode": "snapshotAndChanges",
  "stateName": "default",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `sourceConfig` (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 = {
    "mode": "storeSnapshot",
    "addresses": [
        "345 Valley Avenue, Birmingham, AL 35209"
    ],
    "restaurantIds": [],
    "maxStoresPerAddress": 1,
    "searchRadiusMiles": 25,
    "categories": [],
    "dayPart": "all",
    "onlyAvailable": true,
    "onlyCombos": false,
    "onlyLimitedTimeOffers": false,
    "includeFullNutrition": false,
    "includeModifiers": false,
    "includeIngredientsAndAllergens": false,
    "includeImages": false,
    "outputMode": "snapshotAndChanges",
    "stateName": "default",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/wendys-menu-prices-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 = {
    "mode": "storeSnapshot",
    "addresses": ["345 Valley Avenue, Birmingham, AL 35209"],
    "restaurantIds": [],
    "maxStoresPerAddress": 1,
    "searchRadiusMiles": 25,
    "categories": [],
    "dayPart": "all",
    "onlyAvailable": True,
    "onlyCombos": False,
    "onlyLimitedTimeOffers": False,
    "includeFullNutrition": False,
    "includeModifiers": False,
    "includeIngredientsAndAllergens": False,
    "includeImages": False,
    "outputMode": "snapshotAndChanges",
    "stateName": "default",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/wendys-menu-prices-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "storeSnapshot",
  "addresses": [
    "345 Valley Avenue, Birmingham, AL 35209"
  ],
  "restaurantIds": [],
  "maxStoresPerAddress": 1,
  "searchRadiusMiles": 25,
  "categories": [],
  "dayPart": "all",
  "onlyAvailable": true,
  "onlyCombos": false,
  "onlyLimitedTimeOffers": false,
  "includeFullNutrition": false,
  "includeModifiers": false,
  "includeIngredientsAndAllergens": false,
  "includeImages": false,
  "outputMode": "snapshotAndChanges",
  "stateName": "default",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call getascraper/wendys-menu-prices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/wendys-menu-prices-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yFpIrk2j2F2oKUHfc/builds/5FggA5qgAUSyfrN8f/openapi.json
