# Taco Bell Menu Scraper: Store Prices & Calories (`memo23/taco-bell-menu-scraper`) Actor

Taco Bell menu data at store level. Give it a street address, ZIP or store number and get ~140 products with the location's real prices, calories, categories and full store details — address, hours, phone. Batch any number of stores. US residential proxy required. JSON or CSV.

- **URL**: https://apify.com/memo23/taco-bell-menu-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Taco Bell Menu Scraper

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tacobell/logo.png" width="140" alt="Taco Bell Menu Scraper"></p>

**Paste a street address, get that Taco Bell's actual menu.** Prices as that store charges them, calories on every item, all 16 menu categories, and the full store record — address, phone, hours and store number. Batch as many locations as you like in one run.

| Input | Rows emitted |
|---|---|
| `4620 U.S. 280, Birmingham, AL 35242` | ~140 priced products at the store nearest that address |
| `35242` (ZIP) | ~140 priced products at the nearest store in that ZIP |
| `Birmingham, AL` (city) | ~140 priced products at the nearest store in that city |
| Store number `029138` | ~140 priced products at that exact store, address included |

> ⚠️ **A US residential proxy is required.** Taco Bell redirects non-US IPs away from its ordering APIs. This actor defaults to Apify Residential pinned to the US; if you supply your own proxy, it must exit from a US IP.

### How it works

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tacobell/how-it-works.png" alt="How the Taco Bell Menu Scraper works"></p>

Each location is geocoded, matched to the nearest Taco Bell, and that store's own menu is read directly. Street addresses go through the US Census geocoder; ZIP codes and city names fall back to Nominatim. Because the address is turned into coordinates first, spelling and abbreviations never matter — "Highway" or "Hwy", "South" or "S" resolve to the same store.

The prices are per-store, not a national menu. A Soft Taco is $1.89 in Birmingham, $2.99 in Times Square and $2.39 in San Francisco; a Chalupa Supreme runs $5.19, $6.79 and $5.79 across those three. A national menu would hide all of it.

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `addresses` | array of strings | one of these two | Street addresses, ZIP codes or city names. Mix them freely. |
| `storeNumbers` | array of strings | one of these two | Taco Bell store numbers, e.g. `029138`. Returns the address too. |
| `maxStoresPerAddress` | integer | no | Stores per location, nearest first. Default `1`. |
| `includeUnpriced` | boolean | no | Also emit products with no set price. Default `false`. |
| `maxItems` | integer | no | Row cap. Default `5000`. |
| `maxConcurrency` | integer | no | Parallel HTTP calls. Default `6`. |
| `proxy` | object | no | US residential proxy. Defaults to Apify Residential (US). Required. |

#### Example input

```json
{
  "addresses": ["4620 U.S. 280, Birmingham, AL 35242"],
  "maxStoresPerAddress": 1,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

### Output schema

One row per orderable product per store. A product listed under several category headings (Best sellers, Tacos, a value menu) is emitted once, with every category name kept in `categories`.

```jsonc
{
  "type": "menu-item",

  "storeNumber": "029138",
  "storeName": "029138",
  "storeAddress": "4623 Highway 280 S.",
  "storeCity": "Birmingham",
  "storeState": "AL",
  "storePostalCode": "35242",
  "storeCountry": "US",
  "storeLatitude": 33.429333,
  "storeLongitude": -86.707535,
  "storePhone": "+12059915192",
  "searchedAddress": "4620 U.S. 280, Birmingham, AL 35242",  // echoes your input

  "itemId": "22110",
  "itemName": "Soft Taco",
  "categoryName": "Best sellers",
  "categories": ["Best sellers", "Tacos"],
  "productType": "…",
  "foodType": "…",

  "price": 1.89,               // this store's price, in USD
  "priceFormatted": ".89",
  "currency": "USD",
  "calories": "180",

  "isModifiable": true,
  "isPurchasable": true,
  "imageUrl": "https://www.tacobell.com/…",
  "productUrl": "https://www.tacobell.com/food/…",
  "scrapedAt": "2026-09-04T07:50:00.000Z"
}
```

#### Field coverage

Measured across 141 products from the Birmingham store:

| Field | Coverage |
|---|---|
| `price`, `calories`, `imageUrl`, store columns | 100% |

### Pricing

| Event | When it fires | Rate |
|---|---|---|
| Actor start | Once per run | $0.005 |
| Result | Per product row returned | $0.0008 |

A store returns roughly 140 priced products, so one location runs about $0.12 plus the proxy traffic it uses. A US residential proxy is required, so each run also consumes residential proxy GB from whatever proxy you configure.

### What makes this richer than the competition

| Capability | Other Taco Bell actors | This actor |
|---|---|---|
| Search by street address | Limited | Street address, ZIP, city and store number |
| Prices specific to the store | Partial | Yes, proven to differ between stores |
| Calories on every product | Partial | Yes |
| Full store record (hours, phone, coords) | No | Yes |
| Store number returns the address | Often no | Yes |
| Batch many locations per run | Limited | Yes |

### Notes & limitations

- **A US residential proxy is required.** Taco Bell redirects non-US IPs to yum.com on its store and menu APIs. A non-US exit returns zero rows; the actor fails fast with a clear message rather than looking broken.
- **United States only.** Taco Bell's US region is the only one this actor reads.
- **Spelling and abbreviations don't matter.** The address is geocoded before any matching, so the wording never has to match Taco Bell's own formatting.
- **Free items carry a $0 price.** Sauce packets and similar are real menu items priced at $0, and are included by default.
- **Products are deduped across categories.** A product shown under several headings is one row; the full set of headings is in `categories`.

### 🤖 For AI Agents & LLM Apps

**Purpose.** Returns the menu of a specific Taco Bell store in the United States — per-store prices, calories, categories and the full store record. Requires a US residential proxy.

**Minimal tested input.**

```json
{ "addresses": ["4620 U.S. 280, Birmingham, AL 35242"], "maxStoresPerAddress": 1,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" } }
```

**Output fields (flat).** `type`, `storeNumber`, `storeName`, `storeAddress`, `storeCity`, `storeState`, `storePostalCode`, `storeCountry`, `storeLatitude`, `storeLongitude`, `storePhone`, `searchedAddress`, `itemId`, `itemName`, `categoryName`, `categories`, `productType`, `foodType`, `price`, `priceFormatted`, `currency`, `calories`, `isModifiable`, `isPurchasable`, `imageUrl`, `productUrl`, `scrapedAt`.

**Behaviour worth knowing.**

- One row per product per store; roughly 140 priced rows per store.
- A US residential proxy is mandatory; a non-US exit yields zero rows.
- `addresses` accepts street addresses, ZIP codes and city names together.
- `searchedAddress` echoes the input string that produced the row.
- Prices are US dollars as numbers; `calories` is a string (can be a range like "670-2050").
- Free items have a $0 price. No credentials or token are required beyond the US proxy.

### ⚠️ Disclaimer

This actor collects publicly available menu information published by Taco Bell for its United States restaurants. It does not access private, personal or authenticated user data, and it does not attempt to bypass authentication. Menu content, prices, calorie values and trademarks belong to their respective owners; Taco Bell® is a registered trademark of Taco Bell IP Holder, LLC, and this actor is not affiliated with, endorsed by or sponsored by Taco Bell or Yum! Brands. Prices and availability change frequently and by location — treat every row as a snapshot taken at `scrapedAt`, and verify anything you rely on for a purchase against the store directly. Calorie values are reproduced as published and must not be treated as medical advice. You are responsible for using the output in line with applicable law and Taco Bell's terms.

### SEO Keywords

taco bell menu scraper, taco bell prices api, taco bell menu data, taco bell calories scraper, fast food menu scraper, restaurant menu api, taco bell store locator api, menu price monitoring, fast food price tracking, taco bell location prices, quick service restaurant data, menu item pricing dataset, restaurant price intelligence, store level menu pricing, competitive menu analysis, taco bell nacho fries price, chalupa price by location, taco bell value menu, menu extraction api, us fast food data

# Actor input Schema

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

One US location per line. A street address, ZIP or city returns the nearest store(s). Addresses are geocoded, so spelling and abbreviations never matter. Examples: '4620 U.S. 280, Birmingham, AL 35242', '35242', 'Birmingham, AL'.

## `storeNumbers` (type: `array`):

Store numbers, when you already know them (for example '029138'). These skip geocoding and return that store's menu with its full address.

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

How many stores to return per location, nearest first. Leave at 1 for an exact address.

## `includeUnpriced` (type: `boolean`):

Emit products with no set price. Off by default. Free items (like sauce packets) have a $0 price and are always included.

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

Hard cap on dataset rows. A store carries roughly 140 priced products.

## `maxConcurrency` (type: `integer`):

How many HTTP calls run in parallel. The default suits most runs.

## `proxy` (type: `object`):

A US residential proxy is REQUIRED — Taco Bell redirects non-US IPs away from its ordering APIs. Defaults to Apify Residential pinned to the US. A non-US exit returns zero rows.

## Actor input object example

```json
{
  "addresses": [
    "4620 U.S. 280, Birmingham, AL 35242",
    "10036"
  ],
  "maxStoresPerAddress": 1,
  "includeUnpriced": false,
  "maxItems": 5000,
  "maxConcurrency": 6,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "addresses": [
        "4620 U.S. 280, Birmingham, AL 35242",
        "10036"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/taco-bell-menu-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 = {
    "addresses": [
        "4620 U.S. 280, Birmingham, AL 35242",
        "10036",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/taco-bell-menu-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 '{
  "addresses": [
    "4620 U.S. 280, Birmingham, AL 35242",
    "10036"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call memo23/taco-bell-menu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/taco-bell-menu-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/93QeygVsXgBlnYui9/builds/6Ad4z8HfW6a5LeVoM/openapi.json
