# Seamless Food Delivery Scraper (`parseforge/seamless-scraper`) Actor

Scrape Seamless.com restaurant listings across 30+ US metros. Extracts names, cuisines, ratings, delivery fees, ETAs, addresses, coordinates, offers, and 40+ fields per restaurant.

- **URL**: https://apify.com/parseforge/seamless-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $18.75 / 1,000 result 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/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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 🥡 Seamless Food Delivery Scraper

> 🚀 **Pull Seamless restaurant listings, delivery fees, ETAs, ratings, cuisines, and geolocated addresses in seconds.** Filter by US metro, cuisine keyword, sort order, or order method. No API key, no registration, no manual CSV wrangling.

> 🕒 **Last updated:** 2026-05-16 · **📊 43 fields** per record · **30 preset US metros** · **Full delivery economics (fees, minimums, ETAs)** · **Live ratings and cuisine tags**

Seamless is the dominant restaurant-delivery marketplace in New York City and across most of the Eastern United States, with **40%+ share in core markets** and full inventory parity with parent platform Grubhub. The data behind every listing covers restaurant name, cuisines, delivery and pickup ETAs, delivery fees, minimum orders, ratings, geocoded address, and active promotions. The site renders that data inside a logged-in style web app, so getting a clean restaurant feed for analytics or aggregation has meant either scraping HTML page-by-page or licensing a four-figure SaaS feed.

This Actor reads the **same public Seamless restaurant index a regular visitor sees** and returns each restaurant as a flat JSON record. Pick one or more of the 30 preset metropolitan markets (NYC, Brooklyn, Queens, Boston, Chicago, Philadelphia, DC, Miami, LA, SF, Seattle, and 19 others), drop in custom latitude and longitude, or paste specific Seamless restaurant URLs. Filter the results by cuisine keyword, sort by rating, delivery time, distance, or delivery fee, and choose delivery or pickup mode. Each record covers **the restaurant ID and canonical URL, logo, name, full address split into street, city, state, ZIP, geocoded latitude and longitude, cuisines, rating and review count, price tier, delivery fee, minimum order, delivery and pickup ETAs (with min/max range), active promotional offers, restaurant tags and badges, and a freshness timestamp**.

| Target audience | Primary use cases |
|----------------|------------------|
| Food delivery aggregator platforms | Build comprehensive multi-platform price comparison tools |
| Restaurant market analysts | Metro-level restaurant supply and category mix reports |
| POS and restaurant tech vendors | Feed restaurant CRMs with competitor pricing and ETA data |
| Local business intelligence providers | Track restaurant openings, closings, and market dynamics |
| Consumer price comparison services | Monitor delivery fees and minimum orders across cities |
| Real estate and retail site selectors | Score neighborhoods by restaurant density and rating |

---

### 📋 What the Seamless Scraper does

- 🏙️ **Metro picker.** 30 preset US metros, each mapped to its city-center coordinates and ready to search with a single click.
- 📍 **Custom coordinates.** Drop in any US latitude and longitude to search around an arbitrary delivery point.
- 🔗 **URL targeting.** Paste specific Seamless restaurant URLs to pull individual restaurants by ID.
- 🔍 **Keyword filter.** Optional free-text query against cuisine, dish, or restaurant name.
- 🥡 **Order method.** Switch between delivery and pickup listings, each with its own ETA and availability.
- 📊 **Sort order.** Default (featured), rating, delivery time, distance, delivery fee, or popularity.

Every record covers the restaurant ID, canonical Seamless URL, slug, logo, name, current open status, cuisines, average rating with review count, price tier, delivery fee and minimum order (in dollars), delivery and pickup ETAs with min/max ranges, distance from the search point in miles, address split into street, city, state, and ZIP, geocoded latitude and longitude, phone number, active promotional offers and coupon counts, internal restaurant tags and badges, and a scrape timestamp.

> 💡 **Why it matters:** Seamless and Grubhub publish the most authoritative restaurant feed for the Northeast US. Pulling it directly gives you fresher numbers than any aggregator, with delivery economics (fees, minimums, ETAs) the public APIs of competitors do not expose.

---

### 🎬 Full Demo

🚧 Coming soon: a 3-minute walkthrough of the input form, the dataset view, and a worked example of building a city-level restaurant density dashboard.

---

### ⚙️ Input

<table>
<thead>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
</thead>
<tbody>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Maximum restaurants to return. Free plan capped at 10 (preview). Paid plans up to 1,000,000.</td></tr>
<tr><td><code>metros</code></td><td>array of enum</td><td>No</td><td>One or more of the 30 preset US metros to search. Leave empty if you supply custom coordinates or specific URLs.</td></tr>
<tr><td><code>searchQuery</code></td><td>string</td><td>No</td><td>Optional free-text query (cuisine, dish, or restaurant name).</td></tr>
<tr><td><code>sortBy</code></td><td>enum</td><td>No</td><td>Default (featured), <code>rating</code>, <code>delivery_time</code>, <code>distance</code>, <code>delivery_fee</code>, or <code>popular</code>.</td></tr>
<tr><td><code>orderMethod</code></td><td>enum</td><td>No</td><td><code>delivery</code> (default) or <code>pickup</code>.</td></tr>
<tr><td><code>includeOpenOnly</code></td><td>boolean</td><td>No</td><td>If true (default), restaurants currently marked closed or unavailable for online ordering are skipped.</td></tr>
<tr><td><code>latitude</code></td><td>number</td><td>No</td><td>Custom latitude (decimal degrees, US territory) to search around any point.</td></tr>
<tr><td><code>longitude</code></td><td>number</td><td>No</td><td>Custom longitude paired with the latitude above.</td></tr>
<tr><td><code>startUrls</code></td><td>array of URL</td><td>No</td><td>Specific Seamless restaurant URLs to scrape directly.</td></tr>
<tr><td><code>proxyConfiguration</code></td><td>object</td><td>No</td><td>Proxy configuration. Defaults to Apify US residential proxies.</td></tr>
</tbody>
</table>

Example: pull the top 50 New York City delivery restaurants sorted by rating.

```json
{
    "metros": ["new-york-ny"],
    "maxItems": 50,
    "orderMethod": "delivery",
    "sortBy": "rating"
}
````

Example: scan Brooklyn, Queens, Jersey City, and Hoboken for pickup-eligible Thai spots, top 100 results.

```json
{
    "metros": ["brooklyn-ny", "queens-ny", "jersey-city-nj", "hoboken-nj"],
    "searchQuery": "thai",
    "orderMethod": "pickup",
    "maxItems": 100
}
```

> ⚠️ **Good to Know:** Seamless blocks non-US traffic at the edge. The Actor enables US residential proxies by default when running on Apify. Some fields (`nextOpenAt`, `nextDeliveryTime`) only populate when a restaurant is currently closed; the Actor returns `null` rather than guessing.

***

### 📊 Output

Each record describes a single Seamless restaurant as a flat JSON object.

#### 🧾 Schema

| Field | Type | Example |
|-------|------|---------|
| 🖼️ `imageUrl` | string (URL) | `https://media-cdn.grubhub.com/.../ojgna6zu5m6tnhjyhxap.jpg` |
| 🏷️ `name` | string | `Mason Jar` |
| 🆔 `restaurantId` | string | `298054` |
| 🔗 `url` | string (URL) | `https://www.seamless.com/restaurant/mason-jar/298054` |
| 🪪 `slug` | string | `mason-jar` |
| 🟢 `isOpen` | boolean | `true` |
| 🍽️ `cuisines` | array of string | `["American","BBQ","Chicken","Dessert","Sandwiches","Wings"]` |
| ⭐ `rating` | number | `4.237` |
| 🔢 `ratingCount` | integer | `1213` |
| 💲 `priceRating` | integer (1-4) | `3` |
| 🚚 `deliveryFee` | number (USD) | `3.5` |
| 💰 `minDeliveryFee` | number (USD) | `2.99` |
| 🧾 `deliveryMinimum` | number (USD) | `10` |
| ⏱️ `deliveryEstimateMinutes` | integer | `35` |
| ⬇️ `deliveryEstimateLowerMinutes` | integer | `35` |
| ⬆️ `deliveryEstimateUpperMinutes` | integer | `45` |
| 🏃 `pickupEstimateMinutes` | integer | `5` |
| 📦 `availableForDelivery` | boolean | `true` |
| 🏪 `availableForPickup` | boolean | `true` |
| 🌊 `inundated` | boolean | `false` |
| 📐 `distanceInMiles` | number | `0.27` |
| 🛣️ `street` | string | `43 E 30th St` |
| 🏙️ `city` | string | `New York` |
| 🇺🇸 `state` | string | `NY` |
| 📮 `zip` | string | `10016` |
| 📍 `address` | string | `43 E 30th St, New York, NY, 10016` |
| 🌐 `latitude` | number | `40.744809` |
| 🌐 `longitude` | number | `-73.983735` |
| 📞 `phone` | string | `+1 2122133587` |
| 🎁 `offers` | array of string | `["$15 off - $15 off $100+"]` |
| 🎟️ `couponsAvailable` | boolean | `false` |
| 🔢 `couponsCount` | integer | `0` |
| 🏷️ `tags` | array of string | `["most_ordered","no_fees"]` |
| 🎖️ `badges` | array of string | `["restaurant_favorite","most_ordered"]` |
| 🆕 `newRestaurant` | boolean | `false` |
| 👍 `recommended` | boolean | `false` |
| 🔓 `nextOpenAt` | ISO datetime | `2026-05-16T15:00:00.000Z` |
| 🛵 `nextDeliveryTime` | ISO datetime | `2026-05-16T15:40:00.000Z` |
| 🗺️ `searchMetro` | string | `New York, NY` |
| 🧭 `searchLatitude` | number | `40.7484` |
| 🧭 `searchLongitude` | number | `-73.9857` |
| 🥡 `orderMethod` | string | `delivery` |
| 🕒 `scrapedAt` | ISO datetime | `2026-05-16T01:09:32.698Z` |

#### 📦 Sample records

<details>
<summary>🟢 Typical: Mason Jar, fully populated NYC delivery restaurant with active offer</summary>

```json
{
    "imageUrl": "https://media-cdn.grubhub.com/image/upload/v1541291579/ojgna6zu5m6tnhjyhxap.jpg",
    "name": "Mason Jar",
    "restaurantId": "298054",
    "url": "https://www.seamless.com/restaurant/mason-jar/298054",
    "slug": "mason-jar",
    "isOpen": true,
    "cuisines": ["American", "BBQ", "Chicken", "Dessert", "Sandwiches", "Wings"],
    "rating": 4.237027002446878,
    "ratingCount": 1213,
    "priceRating": 3,
    "deliveryFee": 3.5,
    "minDeliveryFee": 2.99,
    "deliveryMinimum": 10,
    "deliveryEstimateMinutes": 35,
    "deliveryEstimateLowerMinutes": 35,
    "deliveryEstimateUpperMinutes": 45,
    "pickupEstimateMinutes": 5,
    "availableForDelivery": true,
    "availableForPickup": true,
    "inundated": false,
    "distanceInMiles": 0.27,
    "street": "43 E 30th St",
    "city": "New York",
    "state": "NY",
    "zip": "10016",
    "address": "43 E 30th St, New York, NY, 10016",
    "latitude": 40.744809,
    "longitude": -73.983735,
    "phone": "+1 2122133587",
    "offers": ["$15 off - $15 off $100+"],
    "couponsAvailable": false,
    "couponsCount": 0,
    "tags": ["PRICING_ELIGIBLE_FOR_STANDARD_ORDER", "ALL_ACCESS", "most_ordered", "no_fees"],
    "badges": ["restaurant_favorite", "most_ordered", "coupons_available", "go_to"],
    "newRestaurant": false,
    "recommended": false,
    "nextOpenAt": null,
    "nextDeliveryTime": null,
    "searchMetro": "New York, NY",
    "searchLatitude": 40.7484,
    "searchLongitude": -73.9857,
    "orderMethod": "delivery",
    "scrapedAt": "2026-05-16T01:09:32.698Z"
}
```

</details>

<details>
<summary>🟡 Edge case: Del Sur Midtown, currently closed with reopening and next-delivery times</summary>

```json
{
    "imageUrl": "https://media-cdn.grubhub.com/image/upload/v1744914213/vfze4onhqimmmgl64j4a.png",
    "name": "Del Sur Midtown",
    "restaurantId": "327709",
    "url": "https://www.seamless.com/restaurant/del-sur-midtown/327709",
    "slug": "del-sur-midtown",
    "isOpen": false,
    "cuisines": ["Latin", "Bowls", "Colombian", "Gluten-Free", "Healthy", "Latin American", "Organic", "South American"],
    "rating": 4.4767595526888,
    "ratingCount": 3252,
    "priceRating": 3,
    "deliveryFee": 0,
    "minDeliveryFee": 0,
    "deliveryMinimum": 10,
    "deliveryEstimateMinutes": 40,
    "deliveryEstimateLowerMinutes": 40,
    "deliveryEstimateUpperMinutes": 50,
    "pickupEstimateMinutes": 10,
    "availableForDelivery": true,
    "availableForPickup": true,
    "inundated": false,
    "distanceInMiles": 0.22,
    "street": "40 W 38th St",
    "city": "New York",
    "state": "NY",
    "zip": "10018",
    "address": "40 W 38th St, New York, NY, 10018",
    "latitude": 40.751527,
    "longitude": -73.984662,
    "phone": "+1 6462741995",
    "offers": [],
    "couponsAvailable": false,
    "couponsCount": 0,
    "tags": ["PLUS", "famed_celebrated", "best_local_merchants", "no_fees", "budget_friendly"],
    "badges": ["restaurant_favorite", "budget_friendly", "most_ordered", "go_to"],
    "newRestaurant": false,
    "recommended": false,
    "nextOpenAt": "2026-05-16T15:00:00.000Z",
    "nextDeliveryTime": "2026-05-16T15:40:00.000Z",
    "searchMetro": "New York, NY",
    "searchLatitude": 40.7484,
    "searchLongitude": -73.9857,
    "orderMethod": "delivery",
    "scrapedAt": "2026-05-16T01:09:32.756Z"
}
```

</details>

<details>
<summary>🔴 Sparse: Bento Box 5th Ave, small virtual brand with 23 reviews and no pickup or offers</summary>

```json
{
    "imageUrl": "https://media-cdn.grubhub.com/image/upload/v1593095211/gmfpbfpic98iddtvkiin.png",
    "name": "Bento Box 5th Ave",
    "restaurantId": "7554352",
    "url": "https://www.seamless.com/restaurant/bento-box-5th-ave/7554352",
    "slug": "bento-box-5th-ave",
    "isOpen": true,
    "cuisines": ["Asian", "Chicken", "Must Try", "Seafood"],
    "rating": 4.086956521739131,
    "ratingCount": 23,
    "priceRating": 2,
    "deliveryFee": 0,
    "minDeliveryFee": 0,
    "deliveryMinimum": 0,
    "deliveryEstimateMinutes": 30,
    "deliveryEstimateLowerMinutes": 30,
    "deliveryEstimateUpperMinutes": 40,
    "pickupEstimateMinutes": 15,
    "availableForDelivery": true,
    "availableForPickup": false,
    "inundated": false,
    "distanceInMiles": 0.24,
    "street": "261 5th Ave",
    "city": "New York",
    "state": "NY",
    "zip": "10016",
    "address": "261 5th Ave, New York, NY, 10016",
    "latitude": 40.74507904,
    "longitude": -73.98674775,
    "phone": "+1 9293396904",
    "offers": [],
    "couponsAvailable": false,
    "couponsCount": 0,
    "tags": ["VIRTUAL", "famed_celebrated", "no_fees"],
    "badges": ["coupons_available", "go_to"],
    "newRestaurant": false,
    "recommended": false,
    "nextOpenAt": null,
    "nextDeliveryTime": null,
    "searchMetro": "New York, NY",
    "searchLatitude": 40.7484,
    "searchLongitude": -73.9857,
    "orderMethod": "delivery",
    "scrapedAt": "2026-05-16T01:09:32.877Z"
}
```

</details>

***

### ✨ Why choose this Actor

| 🎯 | Capability |
|----|-----------|
| 🔄 | **Real-time data.** Every run hits the live Seamless search index. No nightly snapshots, no stale CSV exports. |
| 💵 | **Full delivery economics.** Delivery fee, minimum order, min-delivery-fee discount baseline, ETAs with min/max range, and distance from the search origin. |
| 🗺️ | **30 preset US metros.** Click-pick from a curated list of Seamless coverage areas, or drop in any US lat/lon for full control. |
| ⭐ | **Per-restaurant ratings.** Precise rating values to three decimals plus the review count so you can weight by sample size. |
| 🎁 | **Promotional offers extracted.** Active discount titles and descriptions surface in a single `offers` array, ready for filter or display. |
| 🏷️ | **Cuisine, tag, and badge arrays.** Search Seamless taxonomy and merchandising tags exposed as flat arrays, useful for category mix analysis. |
| 🛠️ | **No API key, no registration.** Seamless publishes no public API; this Actor reads the same data the consumer site serves and returns clean JSON. |

> 📊 At launch the Actor covers **30 preset US metros**, **20 restaurants per page** with full pagination, and **43 typed fields per record** including geocoded address, fee economics, and ETAs.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|----------|------|----------|---------|---------|-------|
| Paid live restaurant APIs | $$$$ per seat | Multi-platform | Live | Rich UI | Account + license |
| Legacy community CSV dumps | Free | Partial, dated | Quarterly or stale | None | Manual download |
| Official site (manual browsing) | Free | Full | Live | Address bar only | Hours of clicking |
| In-house HTML scrapers | Dev time | Brittle | When you fix them | Whatever you build | Engineering team |
| **⭐ Seamless Food Delivery Scraper** *(this Actor)* | Pay-per-use | 30 US metros, full pagination | Live | Typed filters | One JSON input |

This Actor sits in the gap between four-figure restaurant-data licenses and brittle one-off HTML scrapers: same data the site publishes, no key, no per-seat fee.

***

### 🚀 How to use

1. 🔐 **Create an Apify account.** [Sign up here](https://console.apify.com/sign-up?fpr=vmoqkp) if you do not have one yet.
2. 🎯 **Open the Actor page.** Click the green **Try for free** button.
3. ✏️ **Fill in your filters.** Pick one or more metros, optionally add a cuisine keyword, choose a sort order, and set `maxItems`.
4. ▶️ **Run the Actor.** Hit **Start** and watch progress in the log panel as each page of restaurants is parsed.
5. 💾 **Export the dataset.** Download as JSON, CSV, or Excel, or push directly to a webhook, Google Sheet, or your own pipeline.

> ⏱️ **Total time:** under 60 seconds for the first 50 restaurants from one metro. Larger pulls scale linearly with the per-page fetch budget.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 🍱 Food delivery aggregators

- Build cross-platform price and ETA comparison tools
- Surface cheaper delivery fees or shorter ETAs to users
- Power restaurant discovery feeds with fresh inventory
- Track multi-platform restaurant overlap and gaps

</td>
<td width="50%">

#### 📊 Restaurant market analysts

- Quantify restaurant supply by metro and cuisine
- Track new openings, closings, and rating trends
- Benchmark delivery fees and minimum orders by city
- Score neighborhoods for retail and real-estate fit

</td>
</tr>
<tr>
<td width="50%">

#### 🍔 POS and restaurant tech vendors

- Feed merchant CRMs with competitor pricing context
- Surface peer ETAs to set realistic operator targets
- Enrich sales prospecting with cuisine and rating data
- Power onboarding flows with pre-filled restaurant profiles

</td>
<td width="50%">

#### 💡 Local business intelligence

- Map restaurant density and category mix by ZIP code
- Track Seamless coverage expansion across metros
- Score commercial corridors with rating-weighted density
- Feed urban-planning dashboards with delivery indicators

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating Seamless Scraper

Run on a schedule, trigger from your own apps, or integrate with a workflow tool.

- [**Node.js client**](https://docs.apify.com/api/client/js) for triggering runs and reading dataset items from JavaScript and TypeScript
- [**Python client**](https://docs.apify.com/api/client/python) for the same in Python
- [**REST API docs**](https://docs.apify.com/api/v2) for direct HTTP integration

Schedules let you run this Actor every morning, every Monday, or every Friday at 6 PM. Pair a daily run with a webhook into your data warehouse or a Google Sheet to keep your restaurant index fresh without lifting a finger.

***

### ❓ Frequently Asked Questions

<details>
<summary>🤔 <strong>What exactly does this Actor scrape from Seamless?</strong></summary>

It scrapes the public Seamless restaurant search listing, the same pages anyone in the US can browse without an account. Each record covers the restaurant name, ID, logo, canonical URL, cuisines, rating and review count, price tier, delivery fee and minimum order, delivery and pickup ETAs, distance, geocoded address, phone number, active promotional offers, and a freshness timestamp.

</details>

<details>
<summary>🔑 <strong>Do I need a Seamless or Grubhub account?</strong></summary>

No. Seamless does not require an account to browse the public restaurant index. The Actor reads the same data the consumer site serves to logged-out visitors using an anonymous session.

</details>

<details>
<summary>🌎 <strong>Why do I need US proxies?</strong></summary>

Seamless blocks non-US traffic at the network edge. The Actor enables US residential proxies by default when running on the Apify platform, so you do not need to configure anything. Custom proxy settings are available under Advanced if you want to override.

</details>

<details>
<summary>🏙️ <strong>Which US metros are supported?</strong></summary>

30 preset metros: New York, Brooklyn, Queens, Bronx, Jersey City, Hoboken, Newark, Boston, Cambridge, Chicago, Philadelphia, Washington DC, Baltimore, Miami, Atlanta, Los Angeles, San Francisco, Seattle, Denver, Houston, Dallas, Austin, Minneapolis, Detroit, Pittsburgh, Columbus, Orlando, Tampa, Phoenix, and San Diego. You can also supply custom latitude and longitude for any other US point.

</details>

<details>
<summary>📦 <strong>How fresh is the data?</strong></summary>

Every run hits the live Seamless search API. Records reflect inventory, fees, ETAs, and ratings at the moment of the run. Seamless updates restaurant availability and ETAs in real time as operators open and close.

</details>

<details>
<summary>📈 <strong>How many records can I pull per run?</strong></summary>

Free plan runs are capped at 10 items as a preview. Paid plans scale up to 1,000,000 items. A single metro typically surfaces a few hundred to a few thousand restaurants, so a paid run can retrieve full metro coverage in one shot.

</details>

<details>
<summary>💼 <strong>Can I use this data for commercial purposes?</strong></summary>

The records come from public Seamless restaurant listings. You remain responsible for compliance with your own use case and the Seamless terms. Verify your application against the site's terms and any guidance from your legal counsel before commercial deployment.

</details>

<details>
<summary>💳 <strong>Do I need a paid Apify plan to run this?</strong></summary>

No. Free plan users can preview up to 10 records per run. Paid plans unlock larger pulls, faster runs, and higher concurrency. See the [Apify pricing page](https://apify.com/pricing) for current tiers.

</details>

<details>
<summary>⚠️ <strong>What happens if a run fails?</strong></summary>

The Actor retries each request up to three times with exponential backoff. If a request still fails, the error is logged and the Actor continues with the next page. You only pay for items that returned data.

</details>

<details>
<summary>⚖️ <strong>Is scraping Seamless legal?</strong></summary>

The Actor reads only public, logged-out endpoints serving data the site already publishes. It respects rate limits, uses residential proxies by default, and adds no authentication bypass. As always with web scraping, your specific use case may have additional considerations; consult counsel for novel commercial applications.

</details>

<details>
<summary>🎁 <strong>Are promotional offers included?</strong></summary>

Yes. The `offers` array contains the title and description of each active offer attached to the restaurant (for example `"$15 off - $15 off $100+"`). The `couponsAvailable` and `couponsCount` fields signal whether additional coupons exist.

</details>

<details>
<summary>🥡 <strong>What is the difference between delivery and pickup mode?</strong></summary>

The `orderMethod` input toggles which Seamless listing the Actor queries. Delivery mode returns restaurants that will deliver to the search point with the corresponding delivery fee, minimum, and ETA. Pickup mode returns restaurants the user can collect from in person with the pickup ETA. Many restaurants offer both; some offer only one.

</details>

***

### 🔌 Integrate with any app

- [**Zapier**](https://apify.com/integrations) - push results to thousands of business apps
- [**Make**](https://www.make.com/en/integrations/apify) - visual workflow automation
- [**n8n**](https://n8n.io/integrations/apify/) - self-hostable workflow automation
- [**Airbyte**](https://airbyte.com/connectors/apify) - sync results into your data warehouse
- [**Google Sheets**](https://apify.com/apify/google-sheets) - dump runs straight into a spreadsheet
- [**Slack**](https://apify.com/apify/slack-message) - post notifications when fresh restaurant data arrives

***

### 🔗 Recommended Actors

- [**🍔 Grubhub Menu Scraper**](https://apify.com/parseforge/grubhub-scraper) - pull menus, prices, and item-level details from Grubhub restaurant pages
- [**🛒 Costco Product Scraper**](https://apify.com/parseforge/costco-scraper) - scrape Costco product listings, prices, and inventory for retail and grocery analysis
- [**🏠 Zillow Rentals Scraper**](https://apify.com/parseforge/zillow-rentals-scraper) - rental listings for site-selection and neighborhood density work alongside restaurant data
- [**🛍️ Ebay Scraper**](https://apify.com/parseforge/ebay-scraper) - eBay product listings, pricing, and seller details for marketplace research
- [**🏢 Commercial Real Estate Listings Scraper**](https://apify.com/parseforge/commercial-real-estate-listings-scraper) - office and retail leasing data for restaurant-fit retail-corridor analysis

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more food, retail, and local-business data scrapers.

***

**🆘 Need Help?**

Question, request, or stuck on a filter? [**Open our contact form**](https://tally.so/r/BzdKgA) and we will respond within one business day.

***

> ⚖️ **Disclaimer:** This Actor scrapes only public, logged-out Seamless restaurant pages. Seamless.com is operated by Grubhub Inc. and the data it publishes is the same public listing information shown to anyone visiting the site. You are responsible for ensuring your use complies with applicable law and the Seamless terms of use. We are not affiliated with Seamless, Grubhub Inc., Wonder Group, or any related entity.

# Actor input Schema

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

Maximum number of restaurants to return. Free users: limited to 10 items (preview). Paid users: optional, up to 1,000,000.

## `metros` (type: `array`):

Pick one or more US metro areas to search. Each metro uses its city-center coordinates to query the Seamless search API. Leave empty if you supply a custom latitude/longitude or specific restaurant URLs.

## `searchQuery` (type: `string`):

Optional free-text search (cuisine, dish, or restaurant name). Leave empty to return all restaurants in the selected metros.

## `sortBy` (type: `string`):

How to sort the results. Default uses the Seamless featured ranking.

## `orderMethod` (type: `string`):

Whether to query the delivery or pickup listing.

## `includeOpenOnly` (type: `boolean`):

If true, restaurants currently marked as closed or unavailable for online ordering are skipped.

## `latitude` (type: `number`):

Optional. Use a custom latitude (decimal degrees, US territory) instead of, or in addition to, the metro picker.

## `longitude` (type: `number`):

Optional. Use a custom longitude paired with the latitude above.

## `startUrls` (type: `array`):

Optional. Specific Seamless restaurant page URLs to scrape directly (e.g. https://www.seamless.com/restaurant/some-restaurant/1234567). Use this to target individual restaurants instead of a metro-wide search.

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

Proxy settings. US residential proxies are required because Seamless blocks non-US traffic.

## Actor input object example

```json
{
  "maxItems": 10,
  "metros": [
    "new-york-ny"
  ],
  "sortBy": "default",
  "orderMethod": "delivery",
  "includeOpenOnly": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "maxItems": 10,
    "metros": [
        "new-york-ny"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/seamless-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 = {
    "maxItems": 10,
    "metros": ["new-york-ny"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/seamless-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 '{
  "maxItems": 10,
  "metros": [
    "new-york-ny"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call parseforge/seamless-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Seamless Food Delivery Scraper",
        "description": "Scrape Seamless.com restaurant listings across 30+ US metros. Extracts names, cuisines, ratings, delivery fees, ETAs, addresses, coordinates, offers, and 40+ fields per restaurant.",
        "version": "1.0",
        "x-build-id": "9R6So69At77L3H7Tf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~seamless-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-seamless-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/parseforge~seamless-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-seamless-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/parseforge~seamless-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-seamless-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": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Maximum number of restaurants to return. Free users: limited to 10 items (preview). Paid users: optional, up to 1,000,000."
                    },
                    "metros": {
                        "title": "Metropolitan markets",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Pick one or more US metro areas to search. Each metro uses its city-center coordinates to query the Seamless search API. Leave empty if you supply a custom latitude/longitude or specific restaurant URLs.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "new-york-ny",
                                "brooklyn-ny",
                                "queens-ny",
                                "bronx-ny",
                                "jersey-city-nj",
                                "hoboken-nj",
                                "newark-nj",
                                "boston-ma",
                                "cambridge-ma",
                                "chicago-il",
                                "philadelphia-pa",
                                "washington-dc",
                                "baltimore-md",
                                "miami-fl",
                                "atlanta-ga",
                                "los-angeles-ca",
                                "san-francisco-ca",
                                "seattle-wa",
                                "denver-co",
                                "houston-tx",
                                "dallas-tx",
                                "austin-tx",
                                "minneapolis-mn",
                                "detroit-mi",
                                "pittsburgh-pa",
                                "columbus-oh",
                                "orlando-fl",
                                "tampa-fl",
                                "phoenix-az",
                                "san-diego-ca"
                            ],
                            "enumTitles": [
                                "New York, NY",
                                "Brooklyn, NY",
                                "Queens, NY",
                                "Bronx, NY",
                                "Jersey City, NJ",
                                "Hoboken, NJ",
                                "Newark, NJ",
                                "Boston, MA",
                                "Cambridge, MA",
                                "Chicago, IL",
                                "Philadelphia, PA",
                                "Washington, DC",
                                "Baltimore, MD",
                                "Miami, FL",
                                "Atlanta, GA",
                                "Los Angeles, CA",
                                "San Francisco, CA",
                                "Seattle, WA",
                                "Denver, CO",
                                "Houston, TX",
                                "Dallas, TX",
                                "Austin, TX",
                                "Minneapolis, MN",
                                "Detroit, MI",
                                "Pittsburgh, PA",
                                "Columbus, OH",
                                "Orlando, FL",
                                "Tampa, FL",
                                "Phoenix, AZ",
                                "San Diego, CA"
                            ]
                        }
                    },
                    "searchQuery": {
                        "title": "Search keyword (optional)",
                        "type": "string",
                        "description": "Optional free-text search (cuisine, dish, or restaurant name). Leave empty to return all restaurants in the selected metros."
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "default",
                            "rating",
                            "delivery_time",
                            "distance",
                            "delivery_fee",
                            "popular"
                        ],
                        "type": "string",
                        "description": "How to sort the results. Default uses the Seamless featured ranking.",
                        "default": "default"
                    },
                    "orderMethod": {
                        "title": "Order method",
                        "enum": [
                            "delivery",
                            "pickup"
                        ],
                        "type": "string",
                        "description": "Whether to query the delivery or pickup listing.",
                        "default": "delivery"
                    },
                    "includeOpenOnly": {
                        "title": "Open restaurants only",
                        "type": "boolean",
                        "description": "If true, restaurants currently marked as closed or unavailable for online ordering are skipped.",
                        "default": true
                    },
                    "latitude": {
                        "title": "Custom latitude",
                        "type": "number",
                        "description": "Optional. Use a custom latitude (decimal degrees, US territory) instead of, or in addition to, the metro picker."
                    },
                    "longitude": {
                        "title": "Custom longitude",
                        "type": "number",
                        "description": "Optional. Use a custom longitude paired with the latitude above."
                    },
                    "startUrls": {
                        "title": "Restaurant URLs",
                        "type": "array",
                        "description": "Optional. Specific Seamless restaurant page URLs to scrape directly (e.g. https://www.seamless.com/restaurant/some-restaurant/1234567). Use this to target individual restaurants instead of a metro-wide search.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. US residential proxies are required because Seamless blocks non-US traffic.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
