# Subway Store Locations Scraper — Hours, Phone & Services (`datacach/subway-locations-scraper`) Actor

Scrape Subway restaurant locations in the US: address, phone, geolocation, opening hours, and services (breakfast, catering, delivery) from store page URLs. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/datacach/subway-locations-scraper.md
- **Developed by:** [DataCach](https://apify.com/datacach) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 stores

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

## Subway Store Locations Scraper

Scrape **Subway restaurant locations** in the US and export **address, phone number, geolocation, opening hours, and services** as structured **JSON, CSV, or Excel** — no coding required.

### What is Subway Store Locations Scraper?

Subway Store Locations Scraper is a tool that **extracts complete store data from Subway US restaurant pages** on <a href="https://restaurants.subway.com/united-states" target="_blank">restaurants.subway.com</a>. Give it a list of store page URLs and it returns one clean, structured record per restaurant: **street address**, **city**, **state**, **ZIP code**, **phone number**, **latitude/longitude**, **opening hours** for every day of the week, and the **services** each store offers (breakfast, catering, mobile ordering, delivery).

It reads the store data embedded in each public page — the same data the Subway website itself displays — so results are accurate and fast, with no browser rendering involved.

### What can Subway Store Locations Scraper do?

- 🥪 **Extract full location details** for any Subway restaurant in the United States
- 📍 **Geolocation included** — routable latitude/longitude for mapping and routing
- 🕐 **Opening hours per day** — structured intervals, ready to parse
- 🛎️ **Services per store** — breakfast, catering, mobile ordering, and Subway delivery availability
- 📤 **Export data** as JSON, CSV, Excel, or HTML from the dataset
- ⚡ **Run at scale** with configurable concurrency and automatic deduplication of input URLs
- 🔁 **Automate on Apify**: schedule recurring runs, monitor them, trigger via **API**, and connect to **Zapier, Make, and other integrations**

### What data does Subway Store Locations Scraper extract?

| Field | Description |
|---|---|
| `name` | Restaurant brand name |
| `street`, `city`, `state`, `zipcode` | Full store address |
| `phone` | Store phone number (E.164 format) |
| `latitude`, `longitude` | Routable geolocation coordinates |
| `hours_raw` | Opening hours for every day of the week, with open/close intervals |
| `services` | Services shown on the store page (Breakfast, Catering, Mobile Ordering, Subway Delivery) |
| `pickup_and_delivery` | Pickup and delivery options (In-Store Pickup, Delivery) |
| `url` | The scraped Subway restaurant page URL |

### How do I scrape Subway restaurant locations?

1. Get Subway store page URLs — typically by running the <a href="https://apify.com/datacach/subway-store-locator-scraper" target="_blank">**Subway Store Locator Scraper**</a> Actor, or from your own list.
2. Open this Actor, paste the URLs into the **Restaurant URLs** field on the Input tab.
3. Optionally adjust **Max concurrency** (default 5 is a safe balance of speed vs. reliability).
4. Click **Start**. Each restaurant becomes one dataset record.
5. Download your data from the **Output** tab in JSON, CSV, Excel, or HTML.

### Input

The Actor needs just one thing: a list of **Subway restaurant page URLs** (each starting with `https://restaurants.subway.com/`). You can also tune **Max concurrency** — how many store pages are fetched in parallel. Duplicate URLs are removed automatically.

### Output example

```json
{
  "url": "https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road",
  "name": "Subway",
  "street": "644 Ozark Road",
  "city": "Abbeville",
  "state": "AL",
  "zipcode": "36310",
  "phone": "+13345851021",
  "latitude": 31.55100650846701,
  "longitude": -85.2832063982217,
  "hours_raw": {
    "hours": [
      { "day": "MONDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "TUESDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "WEDNESDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "THURSDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "FRIDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "SATURDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false },
      { "day": "SUNDAY", "intervals": [{ "start": 800, "end": 2100 }], "isClosed": false }
    ]
  },
  "services": ["Breakfast", "Catering", "Mobile Ordering", "Subway Delivery"],
  "pickup_and_delivery": ["In-Store Pickup", "Delivery"]
}
```

You can download the dataset in various formats such as JSON, CSV, Excel, or HTML.

### Use cases for Subway location data

- 🗺️ **Location intelligence & mapping** — plot every Subway store with accurate coordinates
- 🏪 **Retail site selection** — analyze competitor density before opening a new food location
- 📊 **Market research** — study coverage, hours, and service availability (delivery, catering) by region
- 🚚 **Food delivery platforms** — keep restaurant address, phone, and hours data fresh
- 📇 **Lead generation & enrichment** — verified phone numbers and addresses for franchise outreach
- 🔄 **Data pipelines** — schedule recurring runs on Apify and push updates to your systems via API

### Subway-related Actors

| Actor | What it does |
|---|---|
| <a href="https://apify.com/datacach/subway-store-locator-scraper" target="_blank">**Subway Store Locator Scraper**</a> | Discovers all Subway US store page URLs — the natural first step before this Actor |

### FAQ

#### Is it legal to scrape Subway store locations?

This Actor collects only **publicly available data** — the same store information anyone can see on the Subway website. It does not collect personal or gated data. Still, you should review Subway's Terms of Service and consult a legal professional for your specific use case.

#### Can I get Subway location data via API?

Yes. Every Apify Actor is automatically an **API**: start runs, monitor progress, and fetch dataset items programmatically via the <a href="https://docs.apify.com/api/v2" target="_blank">Apify API</a> or the JavaScript/Python clients.

#### How do I get the list of Subway restaurant URLs?

Run the <a href="https://apify.com/datacach/subway-store-locator-scraper" target="_blank">**Subway Store Locator Scraper**</a> Actor first — it discovers store page URLs across the US. Then feed its output into this Actor.

#### Why did some URLs fail or get blocked?

Subway's site uses anti-bot protection. The Actor detects blocks and reports them in the log instead of returning bad data. Lowering **Max concurrency** reduces the chance of blocks; failed URLs can simply be re-run.

#### Does it work for Subway restaurants outside the US?

The Actor currently supports **US store pages** on `restaurants.subway.com`. URLs from other domains are rejected during validation.

### Support and feedback

Found a bug or need a new field? Open an issue on the Actor's **Issues tab** and we'll get back to you. If you need a **custom scraping solution** (other restaurant chains, custom outputs, delivery integrations), feel free to reach out through the Actor page.

# Actor input Schema

## `links` (type: `array`):

Subway restaurant page URLs to extract metadata from, one per line. Each URL must start with <code>https://restaurants.subway.com/</code>, e.g. <code>https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road</code>. Typically this is the output of the Subway Store Locator Scraper Actor. Duplicate URLs are removed automatically. The free plan processes only the first 5 links.

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

Maximum number of restaurant pages fetched in parallel. Higher values finish large runs faster but increase the chance of being blocked by Subway's anti-bot protection; lower values are gentler and more reliable. The default of 5 is a safe balance.

## Actor input object example

```json
{
  "links": [
    "https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road"
  ],
  "maxConcurrency": 5
}
```

# Actor output Schema

## `dataset` (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 = {
    "links": [
        "https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/subway-locations-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 = { "links": ["https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road"] }

# Run the Actor and wait for it to finish
run = client.actor("datacach/subway-locations-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 '{
  "links": [
    "https://restaurants.subway.com/united-states/al/abbeville/644-ozark-road"
  ]
}' |
apify call datacach/subway-locations-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/L9tWHI1oiQyzr9Xxc/builds/DM0O8f3MMHQE1yGpk/openapi.json
