# Menupages Restaurants Search Scraper (`stealth_mode/menupages-restaurants-search-scraper`) Actor

Scrape restaurant listings from MenuPages.com including names, addresses, phone numbers, cuisines, service types, and hours. Perfect for food tech developers, market researchers, and local business analysts needing structured restaurant data.

- **URL**: https://apify.com/stealth\_mode/menupages-restaurants-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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

## MenuPages.com Restaurant Scraper: Extract Restaurant Listings at Scale

---

### What Is MenuPages.com?

MenuPages.com is a popular US restaurant discovery platform listing thousands of restaurants by city, neighborhood, and cuisine type. It provides detailed business information including menus, hours, and contact details. Manually collecting this data city-by-city is impractical — the **MenuPages Restaurant Scraper** automates bulk extraction from search/listing pages into clean, structured records.

---

### Overview

The **MenuPages.com Restaurant Search Scraper** crawls paginated restaurant listing pages and extracts key business data for each result. It suits:

- **Food tech developers** building restaurant aggregators or recommendation engines
- **Market researchers** analyzing dining trends by city or cuisine
- **Local SEO agencies** auditing restaurant business profiles
- **Data brokers** maintaining up-to-date food service directories

The scraper handles paginated URLs natively, respects configurable item limits, and can skip failed URLs gracefully for uninterrupted bulk runs.

---

### Input Format

```json
{
  "ignore_url_failures": true,
  "max_items_per_url": 200,
  "urls": [
    "https://menupages.com/restaurants/ca-los-angeles/2"
  ]
}
````

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | `array` | — | URLs of paginated restaurant listing pages to scrape. Add one per line or use bulk edit. Example: `https://menupages.com/restaurants/ca-los-angeles/2` |
| `max_items_per_url` | `integer` | `20` | Maximum number of restaurant records to collect per URL. Set higher (e.g., `200`) for larger city pages. |
| `ignore_url_failures` | `boolean` | `true` | If `true`, the scraper continues running when a URL fails, skipping it instead of stopping the entire run. Recommended for bulk jobs. |

> **Tip:** MenuPages organizes listings by state-city slug and page number (e.g., `/ca-los-angeles/2`). To collect all restaurants in a city, supply multiple paginated URLs sequentially.

***

### Output Format

#### Sample Record

```json
{
  "id": "1137483",
  "name": "AT Bangkok",
  "street_address": "2770 Fletcher Dr",
  "phone": "3235226880",
  "logo": "https://media-cdn.grubhub.com/image/upload/v1555290864/zvvlrpbmkhsywoarmasv.jpg",
  "url": "at-bangkok/2770-fletcher-dr-los-angeles",
  "package_state_type_id": 13,
  "zip_code": "90039",
  "restaurant_hours": [
    {
      "hour_type": "Primary",
      "day": "Monday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Monday",
      "hours": "4:00 PM - 9:00 PM"
    },
    {
      "hour_type": "Primary",
      "day": "Tuesday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Tuesday",
      "hours": "4:00 PM - 9:00 PM"
    },
    {
      "hour_type": "Primary",
      "day": "Thursday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Thursday",
      "hours": "4:00 PM - 9:00 PM"
    },
    {
      "hour_type": "Primary",
      "day": "Friday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Friday",
      "hours": "4:00 PM - 9:30 PM"
    },
    {
      "hour_type": "Primary",
      "day": "Saturday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Saturday",
      "hours": "4:00 PM - 9:30 PM"
    },
    {
      "hour_type": "Primary",
      "day": "Sunday",
      "hours": "11:30 AM - 3:00 PM"
    },
    {
      "hour_type": "Secondary",
      "day": "Sunday",
      "hours": "4:00 PM - 9:30 PM"
    }
  ],
  "cuisines": [
    "Soup",
    "Thai",
    "Asian",
    "Noodles"
  ],
  "service_type": "DELIVERY_AND_PICKUP",
  "from_url": "https://menupages.com/restaurants/ca-los-angeles/2"
}
```

Each restaurant record contains the following fields:

| Field | Meaning |
|---|---|
| `ID` | Unique MenuPages internal identifier for the restaurant |
| `Name` | Restaurant display name as listed on the platform |
| `Street Address` | Full street address of the location |
| `Zip Code` | Postal code for geographic filtering and mapping |
| `Phone` | Contact phone number |
| `URL` | Direct link to the restaurant's MenuPages profile page |
| `Logo` | URL of the restaurant's logo image |
| `Restaurant Hours` | Operating hours, typically structured by day |
| `Cuisines` | Cuisine categories (e.g., Italian, Mexican, Sushi) |
| `Service Type` | Available service modes (e.g., Dine-in, Delivery, Takeout) |
| `Package State Type ID` | Internal flag indicating the restaurant's listing tier or subscription package on MenuPages |

***

### How to Use

1. **Find listing URLs** — Browse MenuPages.com to your target city (e.g., `menupages.com/restaurants/ca-los-angeles`). Note the page numbers for pagination.
2. **Build your URL list** — Add paginated URLs to the `urls` array. For full city coverage, include all pages (e.g., `/ca-los-angeles/1`, `/ca-los-angeles/2`, ...).
3. **Set item limit** — Adjust `max_items_per_url` based on how many results each page contains (typically 10–20 per page).
4. **Run the scraper** — Start the actor and monitor progress in the run log.
5. **Export** — Download results as JSON, CSV, or Excel.

**Common issues:**

- Supplying a restaurant *detail* URL instead of a *listing/search* URL will return no results.
- Very high `max_items_per_url` values on short pages are harmless — the scraper stops when results are exhausted.

***

### Use Cases & Business Value

- **Restaurant directory apps:** Populate local dining guides with verified contact data and hours
- **Delivery platform research:** Map service-type coverage (delivery vs. dine-in) across neighborhoods
- **Cuisine trend analysis:** Identify dominant cuisine types by ZIP code or city district
- **Lead generation:** Build outreach lists for food service vendors or marketing agencies

***

### Conclusion

The **MenuPages.com Restaurant Scraper** turns paginated city listing pages into structured, exportable datasets in minutes. With fields covering contact info, hours, cuisines, and service types, it provides everything needed to fuel restaurant intelligence workflows. Configure your target cities, run, and export.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the restaurants list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://menupages.com/restaurants/ca-los-angeles/2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://menupages.com/restaurants/ca-los-angeles/2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/menupages-restaurants-search-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 = {
    "urls": ["https://menupages.com/restaurants/ca-los-angeles/2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/menupages-restaurants-search-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 '{
  "urls": [
    "https://menupages.com/restaurants/ca-los-angeles/2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/menupages-restaurants-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Menupages Restaurants Search Scraper",
        "description": "Scrape restaurant listings from MenuPages.com including names, addresses, phone numbers, cuisines, service types, and hours. Perfect for food tech developers, market researchers, and local business analysts needing structured restaurant data.",
        "version": "0.0",
        "x-build-id": "F73TAxdER6WmIxj50"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~menupages-restaurants-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-menupages-restaurants-search-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/stealth_mode~menupages-restaurants-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-menupages-restaurants-search-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/stealth_mode~menupages-restaurants-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-menupages-restaurants-search-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": {
                    "urls": {
                        "title": "URLs of the restaurants list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the restaurants list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
