# Taco Bell Menu Prices Scraper (`automation-lab/taco-bell-menu-prices`) Actor

Export public default Taco Bell US menu prices, calories, product IDs, images and URLs by food category. Compare menu assortment snapshots; prices are not restaurant-specific.

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

## Pricing

from $1.09 / 1,000 item extracteds

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

## Taco Bell Menu Prices Scraper

Export **Taco Bell menu prices** from the anonymous US public menu into structured product rows. Refresh menu assortment snapshots for restaurant research, spreadsheet comparisons and downstream data pipelines.

**These are default public prices, not restaurant-specific prices.** Every row explicitly includes `storeId: null` and `priceScope: "default-public-menu"`. There is no store search, ordering, account login, built-in price history or change alert service.

### What does it extract?

One row per unique top-level menu product across your selected food categories. Product codes are deduplicated globally, in category order. Ingredients inside combos are not separate products.

| Field | Meaning |
| --- | --- |
| `productId`, `name` | Official product code and displayed name |
| `price`, `currency`, `displayedPrice` | Numeric default price, USD currency and source formatting |
| `calories` | Source calorie text, preserving ranges; null if missing |
| `imageUrls` | Source image URLs; no image downloads |
| `url` | Canonical official product link |
| `sourceCategory`, `sourceUrl` | First requested category supplying this product |
| `storeId`, `priceScope` | Explicit non-local price provenance |
| `scrapedAt` | Category extraction time in ISO format |

### Who is it for?

Restaurant analysts can compare assortment between saved snapshots. Researchers can join prices and calorie text by stable product code. Data teams can feed CSV exports or JSON datasets into their existing reporting workflow.

### Why use this Actor?

The export distinguishes anonymous public pricing from local quotes instead of implying that national prices apply to every restaurant. Category provenance and timestamps make independently collected snapshots easier to audit. It extracts official structured page data without downloading media or launching a browser.

### Getting started

1. Keep the default `tacos` category or choose supported category slugs.
2. Set a global maximum number of unique products.
3. Start the Actor and wait for its final status.
4. Open the default dataset, inspect the price scope, then download JSON, CSV or Excel using Apify's export controls.

```json
{"categories":["tacos"],"maxItems":100}
```

### Inputs and matching semantics

| Input | Default | Behavior |
| --- | --- | --- |
| `categories` | `["tacos"]` | Exact, case-sensitive category slugs; 1–17 entries. Duplicate categories are fetched once. No keyword search or substring matching. |
| `maxItems` | `100` | Global unique-product cap after deduplication, integer 1–1000. Console prefill: 20. Zero is invalid. Does not increase upstream assortment. |

Supported categories: `breakfast`, `best-sellers`, `cantina-chicken-menu`, `featured`, `online-exclusives`, `boxes-and-combos`, `party-packs`, `specialties`, `tacos`, `burritos`, `quesadillas`, `nachos`, `luxe-value-menu`, `snacks-sweets`, `drinks`, `bowls`, `vegetarian`.

Only these inputs are supported. Unknown fields, store IDs and arbitrary URLs are rejected rather than silently ignored. A selected category is fetched as a whole page; exporting one row may still require a whole category request. Products shared across categories retain the first encountered source category, not an exhaustive membership list.

### Output example

A representative official public menu record observed during development is shown below. Prices and assortment can change.

```json
{
  "productId": "22100",
  "name": "Crunchy Taco",
  "price": 1.99,
  "currency": "USD",
  "displayedPrice": "$1.99",
  "calories": "170",
  "imageUrls": ["https://www.tacobell.com/images/22100_crunchy_taco_269x269.jpg"],
  "url": "https://www.tacobell.com/food/tacos/crunchy-taco",
  "sourceCategory": "tacos",
  "sourceUrl": "https://www.tacobell.com/food/tacos",
  "storeId": null,
  "priceScope": "default-public-menu",
  "scrapedAt": "2026-10-26T15:00:00.000Z"
}
```

### How much does it cost to extract Taco Bell menu prices?

Pay-per-event pricing includes a **$0.005 start fee** and a per-product fee. The BRONZE product price is **$0.00181 per product**. At this BRONZE rate, 1 product costs $0.00681, 25 cost $0.05025, and 100 cost $0.186. These are estimated Actor event charges, not local restaurant food prices.

| Apify Store discount tier | Per product |
| --- | --- |
| FREE | $0.0020815 |
| BRONZE | $0.00181 |
| SILVER | $0.0014118 |
| GOLD | $0.001086 |
| PLATINUM | $0.001086 |
| DIAMOND | $0.001086 |

Discount tiers follow your qualifying aggregate monthly Store spend under Apify's rules, not a private per-Actor volume schedule. The start fee is the same across tiers.

Only unique exported product rows receive the product event. Duplicates and rejected records do not. A valid started run can incur the start fee even if the upstream page later fails. Apify account/platform charges can apply separately. Check the live pricing panel before running.

### Limits and failure behavior

The observed menu is a snapshot, not guaranteed nationwide availability or an orderable quote. Some menu pages may differ by time or source configuration. Local store prices, customized products, dietary guarantees, full nutrition panels, ingredient variants and delivery pricing are outside scope.

The Actor uses US datacenter proxy access automatically, with at most three fresh sessions per category for transient responses, challenges or an unexpected selected-store page. A selected-store response is discarded, never relabeled as public-default pricing. It has no automatic residential fallback. Requests are sequential and bounded by a 30-second request timeout. Missing structured data, empty unexpected categories, invalid product records or a selected-store context cause an explicit failed run rather than fabricated output. Failed runs can contain partial rows from earlier categories; do not treat those as a complete export.

### Integrations

Use Apify's dataset download to load CSV into a spreadsheet, or fetch JSON into a warehouse job. An Apify schedule can refresh snapshots, and your own external workflow can compare `productId` and `price` across runs. This Actor does not retain historical snapshots or calculate change alerts itself. The `RUN_STATS` key-value record exposes requests, response bytes, retries, scanned products and saved rows for diagnostics.

### API usage

Use an Apify API token from your account; do not put it into public code or screenshots. The synchronous endpoint below is suitable for a short request; use asynchronous run polling for larger workflows.

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~taco-bell-menu-prices/run-sync-get-dataset-items' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"categories":["tacos"],"maxItems":100}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/taco-bell-menu-prices').call({
  categories: ['tacos'], maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 100 });
console.log(items);
```

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/taco-bell-menu-prices').call(
    run_input={'categories': ['tacos'], 'maxItems': 100})
items = client.dataset(run['defaultDatasetId']).list_items(limit=100).items
print(items)
```

### MCP use with AI assistants

Select this stable Actor-specific endpoint, not an unqualified growing tool catalog:

```bash
claude mcp add --transport http apify \
  'https://mcp.apify.com?tools=automation-lab/taco-bell-menu-prices'
```

Claude Desktop, Cursor, and VS Code: use equivalent desktop/editor client configuration where HTTP transport is supported:

```json
{"mcpServers":{"apify":{"type":"http","url":"https://mcp.apify.com?tools=automation-lab/taco-bell-menu-prices"}}}
```

Authenticate as required by your client. Discover actual names and argument schemas with read-only `tools/list`; Actor selection also exposes run, dataset, key-value and abort helpers, not exactly one tool. Discovery is not permission to execute or abort.

Example prompt: “Export public default Taco Bell tacos, up to 25 products, then show product name, price and calories. Explain that these are not store quotes.”

For an authorized invocation, start once and retain its run ID, status and storage IDs. Those IDs are metadata, not result rows. `call-actor` waits at most 45 seconds (default 30). If still running, check the same run with `get-actor-run`, backing off 2, 4, 8 seconds capped at 10, with a total 120-second deadline and client timeout exceeding the selected server wait plus transport margin. On client timeout recover the known run; never restart merely to poll. If its ID is unknown, report uncertainty. At the deadline report pending with its ID and stop.

After success, fetch `get-dataset-items` from the returned dataset ID with explicit `limit`, `offset` and required fields. Example consumer budget: 20 source rows per page, at most 100 rows and 64 KiB UTF-8 serialized content admitted to model context across all pages, whichever comes first. Enforce byte limits host-side before model injection, even for an oversized page; otherwise do not claim a hard byte guarantee. Track source offsets rather than transformed row counts. Report partial/truncated status and continuation offset when stopped at a budget. Failed runs remain failures even if partial rows exist. Full exports belong in storage/downstream processing, not model context. Tool discovery and caching behavior depend on the client; no numeric token-savings guarantee is made.

### Legality and responsible use

This independent tool is not affiliated with Taco Bell. Respect source terms, applicable laws, data rights and reasonable request volumes. Public accessibility does not establish unrestricted reuse rights. Do not use default menu prices as a consumer order quote or nutritional/medical advice.

### Diagnostics and privacy

Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days. No account credentials or customer restaurant selections are required by this Actor. The runtime uses no AI model. Apify hosts datasets, logs and key-value records under your account storage retention settings; delete them through Apify storage controls when no longer needed. No cross-run cache or history is retained by this Actor. US datacenter proxy traffic and private diagnostic processing are operated at our expense. For help, open the Actor's Apify Store Issues tab.

### FAQ and troubleshooting

**Can I select a ZIP code or restaurant?** No. This Actor intentionally extracts only the public default US menu.

**Why did I get fewer rows than maxItems?** The cap is not a target. A category has a finite assortment, and products shared by categories are deduplicated.

**Why did a run fail after producing rows?** A later category may have been blocked or changed shape. Earlier rows are partial output; inspect the failure message before reuse.

**Are images downloaded?** No, only official image URLs are exported.

**Can I monitor price changes?** Save separate runs using your own schedule and comparison workflow. Built-in history and alerts are not provided.

### Related workflows

This is a standalone source-specific data product. It does not require another Actor, a restaurant ordering service or a purchased dataset. Use standard Apify datasets, schedules and webhooks to connect it to your own analysis pipeline.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/taco-bell-menu-prices/changelog.md

# Actor input Schema

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

Exact category slugs, in processing order. Defaults to tacos. Duplicate categories are fetched once. Products appearing in multiple categories are exported once with their first encountered source category. Only anonymous US default menu prices, never restaurant-specific prices.

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

Global maximum unique product rows across all requested categories after deduplication. Default 100, range 1–1000; zero is not unlimited. Category pages are fetched whole; the last page can contain more source products than exported rows. Source assortment may contain fewer products.

## Actor input object example

```json
{
  "categories": [
    "tacos"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Unique public default menu product rows

## `stats` (type: `string`):

Request bytes retries and product counts for this run

# 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 = {
    "categories": [
        "tacos"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/taco-bell-menu-prices").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 = {
    "categories": ["tacos"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/taco-bell-menu-prices").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 '{
  "categories": [
    "tacos"
  ],
  "maxItems": 20
}' |
apify call automation-lab/taco-bell-menu-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/taco-bell-menu-prices"
        }
    }
}
```

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/j4bCFmLSOF15J6oQy/builds/CUxnExRUykldgprd9/openapi.json
