# Smith's Scraper: Grocery Prices, Deals & Aisles by Store (`zaiq/smiths-food-scraper`) Actor

Smith's (smithsfoodanddrug.com) products for any search at the stores you choose: regular and card price, unit price, stock level, aisle and shelf, UPC and rating. Every run shows what changed since your last one. No account needed.

- **URL**: https://apify.com/zaiq/smiths-food-scraper.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (community)
- **Categories:** E-commerce, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Smith's Scraper: grocery prices, card deals, aisles and price tracking by store (smithsfoodanddrug.com)

[![Smith's Scraper: Grocery Prices, Deals & Aisles by Store](https://api.apify.com/v2/key-value-stores/4VJNANhwKgqPpXtAi/records/hero-smiths-food-scraper.jpg)](https://api.apify.com/v2/key-value-stores/4VJNANhwKgqPpXtAi/records/film-retail-price-tracking.mp4)

**[Watch the 22-second film: price tracking](https://api.apify.com/v2/key-value-stores/4VJNANhwKgqPpXtAi/records/film-retail-price-tracking.mp4)**

Get **Smith's products without an account**: **the store's regular and card price, unit price, stock level, aisle and shelf, UPC, rating, image and link**, for any search at the stores you choose, by ZIP code or store ID.

**Try it in a minute:** the form is filled in. Press Start and you get up to 24 real products for about $0.12.

**Run it again and see what changed:** every product is compared with your last run, with nothing to set up and at no extra cost. Schedule it daily and filter on `priceStatus` for a price-drop feed.

Built for **grocery price monitoring in Utah, Nevada and the Mountain West**, **CPG brand and shelf checks**, **promotion tracking** and **price comparison apps**.

### What you get

| Field | What it holds |
|---|---|
| Products | `upc`, `title`, `brand`, `size`, `price`, `cardPrice`, `onSale`, `offerText`, `offerEnds`, `currency`, `unitPrice`, `unitOfMeasure`, `rating`, `reviews`, `category`, `categoryPath`, `storage`, `image`, `url`, `search`, `rank` |
| At the store | `storeId`, `stockLevel`, `inStock`, `aisleNumber`, `aisle`, `aisleSide`, `bay`, `shelf` |
| With Description and ingredients on | `description`, `ingredients`, `allergens`, `countryOfOrigin`, `organic`, `glutenFree` |
| Price tracking, on every row | `previousPrice`, `priceChange`, `priceChangePercent`, `priceStatus` (`first-seen`, `unchanged`, `dropped`, `raised`, `no-price`), `firstSeenAt` |

### What people use it for

- **Price monitoring:** track the same searches at the same stores every day
- **Shelf checks:** stock level, aisle, bay and shelf per store for CPG brands
- **Promotion tracking:** every card price, with the offer and when it ends
- **Competitor research:** compare stores, ZIP codes and brands
- **Price comparison apps:** a clean feed with UPCs, images and links
- **Regional pricing:** see how one product's price moves from store to store

### How to use it

1. Enter **searches**, then **ZIP codes** or **Store IDs**.
2. Add **Brands** to reach past the first 24, or turn on **On sale only**.
3. Click **Start**. Schedule it daily and filter on `priceStatus`.

### Input

| Field | Example | Notes |
|---|---|---|
| Searches | `milk` | Words to search for, up to 24 products each |
| ZIP codes | `84101` | The nearest stores to each |
| Stores per ZIP code | `1` | Up to 10 |
| Store IDs | empty | Eight-digit IDs from an earlier run |
| Brands | empty | Each search once per brand |
| On sale only | off | Only products with a card price |
| Description and ingredients | off | More detail, at no extra charge |
| Track price changes | on | Compares every product with your last run; free |
| Tracking list name | empty | Optional: separate lists keep separate histories |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "kind": "product",
  "upc": "0000000012345",
  "title": "Sample Brand 2% Milk",
  "brand": "Sample Brand",
  "size": "1 gal",
  "price": 4.69,
  "cardPrice": 3.99,
  "onSale": true,
  "offerText": "$3.99",
  "currency": "USD",
  "unitPrice": 0.03,
  "unitOfMeasure": "fl oz",
  "previousPrice": 4.69,
  "priceChange": 0,
  "priceStatus": "unchanged",
  "stockLevel": "HIGH",
  "inStock": true,
  "aisleNumber": "61",
  "aisle": "Dairy",
  "bay": "5",
  "shelf": "2",
  "storeId": "00000001",
  "url": "https://www.smithsfoodanddrug.com/p/sample-brand-2-milk/0000000012345",
  "search": "milk",
  "rank": 1
}
```

A record named `SUMMARY` in the run's key-value store says what each input returned, with any notes (for example an account that does not exist), what was charged and how much traffic the run used.

### Pricing

- **$0.005 per product**
- Price tracking and ingredients cost nothing extra
- Refused pages are free

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| A search at one store, 24 products | $0.12 |
| 20 searches at 5 stores, about 2,400 products | about $12 |
| Daily check of 200 products for a month | $30 |

On Apify's Scale and Business plans the per-event prices are lower (Store discounts). Set **Maximum cost per run** and the Actor stops cleanly when it is reached: you never pay more than that.

### Tips

- Use specific searches: 2% milk, oat milk and whole milk return three different lists.
- Add Brands to read past the first 24 for a word.
- Schedule a daily run and filter on `priceStatus` = `dropped` for a price-drop feed.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/smiths-food-scraper").call(run_input={"searches": ["milk"], "zipCodes": ["84101"]})
for row in client.dataset(run.default_dataset_id).iterate_items():
    print(row)
```

**JavaScript**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/smiths-food-scraper').call({"searches": ["milk"], "zipCodes": ["84101"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~smiths-food-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"searches": ["milk"], "zipCodes": ["84101"]}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "Smith's's milk prices at the store nearest 84101". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- **Up to 24 products per search per store:** that is what Smith's's search page shows a signed-out visitor, and its next pages repeat the same list. Whole-store and category reads are not offered.
- A fixed basket by UPC is not offered: product pages refuse plain requests. Search for the product's name instead.
- Prices are the website's for that store's pickup; delivery and in-store prices can differ.
- If an address is refused the Actor tries another and never solves a check. Pages it could not read are listed in SUMMARY and not charged.

### FAQ

**How does price tracking work?**

Each run compares every product with your last run and adds the previous price, the change and a status. It keeps one small key-value store in your Apify account and costs nothing extra. Run one list at a time, and turn it off with `trackPrices: false`.

**Do I need a Smith's account?**

No. It reads what a signed-out shopper sees on smithsfoodanddrug.com.

**How do I choose a store?**

Give a ZIP code for the nearest stores, or a store ID from the `storeId` column of an earlier run.

**What does it cost to run?**

Only the event above; there is no monthly fee.

### Related Actors from Zaiq

- [walmart-scraper](https://apify.com/zaiq/walmart-scraper): prices at Walmart
- [target-scraper](https://apify.com/zaiq/target-scraper): prices at Target

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: smith's scraper, smith's prices, smith's api, smith's grocery prices, us grocery prices, kroger family prices, grocery price monitoring, smith's product data.

# Actor input Schema

## `searches` (type: `array`):

What to search Smith's for, one per line. The site shows up to 24 products per search, so use specific words: 2% milk, oat milk, whole milk.

## `zipCodes` (type: `array`):

The nearest Smith's stores to each ZIP code. Prices and aisles differ by store and every row says which store it is for. Empty with no store IDs uses the site's default store.

## `storesPerZip` (type: `integer`):

How many of the nearest stores to read for each ZIP code.

## `storeIds` (type: `array`):

Eight-digit store IDs, one per line, from the storeId column of an earlier run.

## `brands` (type: `array`):

Run each search once per brand, spelled as on the site. Each brand gets its own 24 products, which also reaches past the first 24.

## `onSaleOnly` (type: `boolean`):

Only products with a card price. Other rows are never charged.

## `includeDetails` (type: `boolean`):

Add description, ingredients, allergens, country of origin, organic and gluten-free claims to each row, at no extra charge.

## `trackPrices` (type: `boolean`):

Compares every product with your last run and adds the previous price, the change and a status. Free.

## `trackingName` (type: `string`):

Optional: separate lists keep separate histories.

## Actor input object example

```json
{
  "searches": [
    "milk"
  ],
  "zipCodes": [
    "84101"
  ],
  "storesPerZip": 1,
  "onSaleOnly": false,
  "includeDetails": false,
  "trackPrices": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset: the results.

## `summary` (type: `string`):

What each input returned, and notes.

# 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 = {
    "searches": [
        "milk"
    ],
    "zipCodes": [
        "84101"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/smiths-food-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 = {
    "searches": ["milk"],
    "zipCodes": ["84101"],
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/smiths-food-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 '{
  "searches": [
    "milk"
  ],
  "zipCodes": [
    "84101"
  ]
}' |
apify call zaiq/smiths-food-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaiq/smiths-food-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/t2Qix0Ab1TjdvV8eA/builds/DH9H0SyLAj9CgKYhh/openapi.json
