# Stop & Shop, Food Lion, Giant & Hannaford Grocery Scraper (`alduinxx/stop-shop-food-lion-giant-hannaford-scraper`) Actor

Grocery prices at the store you pick by ZIP code, from Stop & Shop (Stop and Shop), Food Lion, Giant Food, The GIANT Company and Hannaford: current and regular price, multi-buy deals, clip coupons, unit price, UPC, nutrition and ingredients. Five US chains in one run.

- **URL**: https://apify.com/alduinxx/stop-shop-food-lion-giant-hannaford-scraper.md
- **Developed by:** [Michael Hill](https://apify.com/alduinxx) (community)
- **Stats:** 6 total users, 2 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Grocery prices **as a specific store charges them** at five US chains: **Stop & Shop, Food Lion, Giant Food, The GIANT Company and Hannaford**. Give a ZIP code and each chain is priced at its nearest store. Every row has the current price, the regular price, the deal ("2 / $7.00", "$1.00 Off"), any clip coupon, the unit price and the UPC.

The five chains belong to Ahold Delhaize USA and run on one platform. This Actor reads the same data their own product pages show when you pick a store, for about 2,000 stores across the Northeast, Mid-Atlantic and Southeast.

### Why this one

| | Typical grocery scraper | This Actor |
|---|---|---|
| Price | ✅ | ✅ at the store you choose by ZIP code |
| Regular price when an item is on sale | rarely | ✅ `regularPrice` |
| The deal itself ("2 / $7.00", "$0.70 Off") | ❌ | ✅ `saleLabel`, `multiBuyQuantity`, `multiBuyPrice` |
| Clip coupons, with dates | ❌ | ✅ `couponTitle`, `couponDescription`, `couponStartDate`, `couponEndDate` |
| Unit price | rarely | ✅ `unitPrice`, `unitMeasure` |
| UPC | rarely | ✅ `upc` |
| Nutrition panel and ingredients | rarely | ✅ `nutrition`, `ingredients` |
| Which store the price is from | ❌ | ✅ `storeNumber`, `storeAddress`, `storeCity`, `storeState`, `storeZip` |

**Prices really are per store.** Of 82 products checked at two Stop & Shop stores near Boston and New York on 4 Oct 2026, 37 had a different price.

### What you get

| Field | Example |
|---|---|
| `banner` | Stop & Shop |
| `productId` | 18445: the product's id, the same on all five sites |
| `upc` | 3810053578: the UPC as the chain publishes it (see Notes) |
| `name`, `brand`, `size` | Purina Beggin' Strips Bacon & Cheese Flavor Dog Treats · Purina Beggin' · 6 OZ BAG |
| `price` | 3.5: what one item costs now at this store; on a multi-buy, the per-item price at the deal |
| `regularPrice` | 3.99 |
| `onSale` | true when `price` is below `regularPrice` |
| `saleLabel` | 2 / $7.00: the deal as the store shows it ("$0.70 Off", "10 / $10.00"…) |
| `multiBuyQuantity`, `multiBuyPrice` | 2, 7: how many you must buy and what they cost together |
| `regularMultiBuyQuantity`, `regularMultiBuyPrice` | 3, 5: an everyday "3 / $5.00" price that is not a sale |
| `unitPrice`, `unitMeasure` | 0.58, OZ: as the chain shows it (Hannaford writes "PER POUND") |
| `soldByWeight` | true for deli and produce sold by the pound (`price` is for the approximate size) |
| `outOfStock` | true when the store marks it out of stock (the price is still given) |
| `couponTitle`, `couponDescription`, `couponStartDate`, `couponEndDate`, `couponClipRequired` | Save $1.00 · when you buy TWO … · 2026-10-01 · 2026-11-14 · true |
| `snapEligible`, `alcohol`, `storeBrand`, `organic`, `kosher` | true / false |
| `dietaryLabels` | \["Gluten free", "Dairy free"]: the "free from" labels the chain filters on |
| `department`, `category`, `aisle` | Dairy & Eggs · Fat Free Skim Milk 1/2 Gallon · 11 |
| `description`, `ingredients`, `countryOfOrigin`, `manufacturer` | text as published |
| `nutrition` | { servingSize, servingsPerContainer, calories, totalFatG, saturatedFatG, transFatG, cholesterolMg, sodiumMg, totalCarbsG, dietaryFiberG, sugarsG, addedSugarsG, proteinG } |
| `imageUrl` | product image |
| `storeNumber`, `storeId`, `storeAddress`, `storeCity`, `storeState`, `storeZip` | 429 · 50000125 · 1100 Massachusetts Avenue · Dorchester · MA · 02125 |
| `url` | the product's page at that chain |
| `scrapedAt` | ISO timestamp |

Every row has every key; values a chain does not publish come back empty rather than missing.

### What people use it for

- **Price and promotion tracking**: shelf price, regular price and the deal, store by store, week to week
- **Price comparison apps** across the US Northeast and Mid-Atlantic, joined on UPC
- **CPG and brand teams**: your products' price, promotions, coupons and stock at each chain
- **Research**: food prices, promotion depth and frequency, SNAP-eligible baskets, nutrition

### How to use it

1. Choose the **Chains** (all five by default).
2. Put words in **Search terms**, such as `coffee`, `peanut butter` or `milk`. Or put product ids or URLs in **Product ids** to price exactly those products.
3. Optionally give a **ZIP code** to price each chain at its nearest store.
4. Set **Maximum products**, run it, and download the dataset.

#### Input example

```json
{
    "banners": ["stopandshop", "hannaford"],
    "keywords": ["coffee", "milk"],
    "zipCode": "02108",
    "maxProducts": 200
}
```

#### Monitoring a fixed basket

```json
{
    "banners": ["giantfood"],
    "productIds": ["206", "3896", "118441"],
    "zipCode": "20001"
}
```

### Notes

- **Which store.** With a ZIP code, each chain is priced at its store nearest to it, within 30 miles; a chain with no store that close is skipped and the log says so. Without one, each chain uses the store its website shows a new visitor: Stop & Shop 2515 (Mahopac, NY), Food Lion 2246 (South Boston, VA), Giant Food 308 (Edgewater, MD), The GIANT Company 6023 (Phoenixville, PA), Hannaford 8451 (Scarborough, ME). Every row names its store.
- **Maximum products is for the whole run** and is shared evenly between the chains you choose: 100 products across five chains is 20 each. A chain with no store near your ZIP code, or with no more matches, passes its unused share to the others. With product ids, each id is priced at every chain you choose.
- **Products a store doesn't carry** are left out. The log counts them per chain.
- **Search terms match words in the product name.** They are matched against the name in the product URL, not the aisle, as whole words or their plural: `egg` finds eggs, `tea` does not find steak. So `milk` does not return every dairy product, and it also finds Milk-Bone and milk chocolate; use more words, like `whole milk`, to narrow it.
- **Multi-buys.** On "2 / $7.00", `price` is the per-item price at the deal (3.50) and the deal is in `multiBuyQuantity` / `multiBuyPrice`. A product is only "on sale" when its price is below its regular price; an everyday "3 / $5.00" is in `regularMultiBuyQuantity` / `regularMultiBuyPrice` instead. A plain price cut has no `saleLabel`: `price` and `regularPrice` show it.
- **Coupons** are the chains' digital clip coupons shown with the product. They are not deducted from `price`.
- **UPC.** Most UPCs come as 10 digits (manufacturer and item code, without the leading number-system digit and the check digit); random-weight items have 11. They are given exactly as the chain publishes them.
- **Speed.** These sites are behind bot protection, so prices are read through Apify's Unblocker proxy, 100 products per request. Each request takes 20–40 seconds, and 10 run in parallel by default (**Parallel requests**).

### Pricing

**$5.00 per 1,000 products returned**, and nothing else to work out: platform usage, including the Unblocker proxy these sites require, is included. Each run also has a start fee of $0.00005.

Products a store doesn't carry, and chains skipped for having no store near your ZIP code, are free. **Maximum products** caps what a run costs: 100 products cost $0.50. If you set a maximum cost per run, the Actor stops when it is reached and keeps the products found so far.

### Related Actors

Canadian grocery chains with the same structured approach:

- [Sobeys Grocery Scraper](https://apify.com/alduinxx/sobeys-grocery-scraper)
- [Safeway Canada Grocery Scraper](https://apify.com/alduinxx/safeway-canada-grocery-scraper)
- [Foodland, Thrifty Foods, IGA & FreshCo Scraper](https://apify.com/alduinxx/foodland-thrifty-foods-iga-freshco-scraper)
- [Metro Grocery Scraper](https://apify.com/alduinxx/metro-grocery-scraper)

### Feedback

Found a product that looks wrong, or need a field that is missing? Open an issue on the **Issues** tab with the product URL and your ZIP code, and it will be looked at.

# Actor input Schema

## `banners` (type: `array`):

Which chains to read. Maximum products is shared evenly between them.

## `keywords` (type: `array`):

Matched against the product name in the product URL, e.g. coffee, peanut butter, milk. Any term can match. Leave empty to walk the whole catalogue.

## `productIds` (type: `array`):

Instead of search terms, the exact products to price: the number at the end of a product URL (e.g. 206), or the URL itself. The five sites share product ids, so each id is priced at every chain you choose. Useful for monitoring a fixed basket.

## `zipCode` (type: `string`):

Price each chain at its store nearest this US ZIP code (within 30 miles). A chain with no store that close is skipped. Leave empty for each chain's default online store.

## `maxProducts` (type: `integer`):

Stop after this many products in total, across all chosen chains. This also caps what the run costs.

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

Lower this if you see failures. Higher is faster but heavier on the sites.

## Actor input object example

```json
{
  "banners": [
    "stopandshop",
    "foodlion",
    "giantfood",
    "giantcompany",
    "hannaford"
  ],
  "keywords": [
    "coffee"
  ],
  "productIds": [],
  "zipCode": "",
  "maxProducts": 10,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `productsCsv` (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 = {
    "keywords": [
        "coffee"
    ],
    "maxProducts": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("alduinxx/stop-shop-food-lion-giant-hannaford-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 = {
    "keywords": ["coffee"],
    "maxProducts": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("alduinxx/stop-shop-food-lion-giant-hannaford-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "coffee"
  ],
  "maxProducts": 10
}' |
apify call alduinxx/stop-shop-food-lion-giant-hannaford-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alduinxx/stop-shop-food-lion-giant-hannaford-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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