# Kroger Scraper - $1.50 / 1000 Products (`scrapeunblocker/kroger-scraper`) Actor

Scrape Kroger and its 18 banners (Ralphs, Fred Meyer, King Soopers, Harris Teeter...) priced for one store by id or ZIP: search or product pages with price, sale and multibuy deals, unit price, stock, aisle, pickup/delivery, ingredients and nutrition. $1.50 per 1000 products.

- **URL**: https://apify.com/scrapeunblocker/kroger-scraper.md
- **Developed by:** [Scrapeunblocker](https://apify.com/scrapeunblocker) (community)
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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

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

## Kroger Scraper

Scrape **Kroger and its 18 banner stores** as clean JSON: **Kroger, Ralphs, Fred Meyer, King Soopers, Fry's, Smith's, QFC, Dillons, Baker's, City Market, Gerbes, Food 4 Less, Harris Teeter, Mariano's, Metro Market, Pick 'n Save, Jay C, Pay Less and FoodsCo**. Get **search results** or **product pages**, priced for **one store** (by store id or ZIP code). Every product comes with the current, regular and sale price, the **promotion** (sale, price drop, multibuy, must buy, buy one get one), **unit price**, **stock level**, **aisle**, pickup / delivery / in-store / ship availability, rating, categories and image; product pages add the description, **ingredients, allergens, nutrition facts**, dietary claims, category path and every image. Prices in USD.

### Features

- **19 store chains** - pick the banner; one actor for the whole Kroger family.
- **Store-specific prices** - give a store id or a ZIP code (nearest store of the banner that takes online orders); every item says which store it is priced for.
- **Search mode** - the first page of products for each search term (up to 24), in the site's own order, with an optional brand filter.
- **Product mode** - one product per input (`products`: Kroger product id, UPC barcode or product link) with nutrition and ingredients.
- **Many inputs per run** - search terms or products in parallel.

### Use cases

- **Local price monitoring** - the same basket priced at stores in different cities and banners.
- **Promotions research** - this week's sales, multibuys and BOGO deals per store.
- **Shelf and stock checks** - stock level and aisle location at a store.
- **Product databases** - UPC, ingredients, allergens and nutrition facts.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `search` | `search` or `product`. |
| `banner` | string | `kroger` | `kroger`, `ralphs`, `fredmeyer`, `kingsoopers`, `frysfood`, `smithsfoodanddrug`, `qfc`, `dillons`, `bakersplus`, `citymarket`, `gerbes`, `foodfourless`, `harristeeter`, `marianos`, `metromarket`, `picknsave`, `jaycfoods`, `payless`, `foodsco`. |
| `queries` | array | `milk` | Search terms (search mode). |
| `products` | array | - | Kroger product ids, UPC barcodes or product links (product mode). |
| `storeId` | string | - | 8-digit Kroger store id. |
| `zip` | string | - | US ZIP code: the banner's nearest store. Leave `storeId` and `zip` empty for the banner's default store. |
| `brand` | string | - | Search mode: only these brands, e.g. `Kroger\|Simple Truth`. |
| `maxResults` | integer | `24` | Products per search term (1-24). |
| `concurrency` | integer | `3` | Inputs processed at the same time (1-5). |

#### Example input

```json
{
  "mode": "search",
  "banner": "ralphs",
  "zip": "90012",
  "queries": ["eggs", "coffee"],
  "maxResults": 24
}
```

### Output

One dataset item per product, with the input it came from and the store it is priced for. A search item:

```json
{
  "mode": "search",
  "input": "milk",
  "banner": "kroger",
  "store": { "storeId": "01400473", "name": "Newport", "city": "Newport", "state": "KY", "zip": "41071", "pricesFor": "pickup" },
  "productId": "0001111041700",
  "upc": "011110417008",
  "gtin14": "00011110417008",
  "name": "Kroger® 2% Reduced Fat Milk Gallon",
  "brand": "Kroger",
  "size": "1 gal",
  "url": "https://www.kroger.com/p/kroger-2-reduced-fat-milk-gallon/0001111041700",
  "image": "https://www.kroger.com/product/images/large/front/0001111041700",
  "price": 2.89,
  "regularPrice": 2.89,
  "salePrice": null,
  "onSale": false,
  "savings": null,
  "promotion": null,
  "unitPrice": { "price": 0.0226, "unit": "fl oz", "text": "$0.02/fl oz" },
  "soldBy": "unit",
  "priceIsEstimate": false,
  "currency": "USD",
  "priceText": "$2.89",
  "available": true,
  "stockLevel": "HIGH",
  "unavailableReason": null,
  "maxOrderQuantity": 140,
  "fulfillment": { "pickup": true, "delivery": true, "inStore": true, "ship": false },
  "aisle": { "number": "100", "description": "DAIRY", "side": "L", "bay": "18", "shelf": "2" },
  "rating": 3.09,
  "reviewCount": 88,
  "categories": ["Dairy"],
  "snapEligible": true,
  "offers": [],
  "position": 1,
  "sponsored": false
}
```

A product-mode item adds the product page's details (lists shortened):

```json
{
  "description": "Kroger® Reduced Fat 2% Milkfat Milk Gallon is refreshing and contains 35% less fat than regular milk.",
  "highlights": ["1 gal Jug of Kroger® 2% Reduced Fat Milk Gallon"],
  "images": ["https://www.kroger.com/product/images/xlarge/front/0001111041700"],
  "ingredients": "Milk, Skim Milk, Vitamin A Palmitate, Vitamin D3.",
  "allergens": "Contains Milk and its derivates.",
  "nutrition": {
    "servingSize": "8 fl oz (240mL)",
    "servingsPerContainer": 16.0,
    "preparation": null,
    "nutrients": [{ "name": "Protein", "amount": 8.0, "unit": "g", "dailyValuePercent": null }]
  },
  "dietary": ["Kosher", "Pescatarian", "Vegetarian"],
  "claims": ["Low Sodium", "No Added Sugar"],
  "organic": false,
  "glutenFree": false,
  "kosher": true,
  "nonGmo": false,
  "taxonomy": ["Dairy & Eggs > Milk & Dairy Free Milk > 1%, 2%, & Skim Milk"],
  "countryOfOrigin": "UNITED STATES",
  "storage": "Refrigerated",
  "weight": "8.62 [lb_av]",
  "ratingBreakdown": { "5": 39, "4": 4, "3": 4, "2": 8, "1": 33 },
  "alcohol": false,
  "ageRestricted": false
}
```

Per search term, the `LISTINGS` record in the key-value store keeps the store, `totalResults` and the products collected.

### Pricing

**$1.50 per 1000 products** (pay per result). A search term or product that returns nothing (no match at that store, an unknown product or store id) is listed in the `ERRORS` record of the key-value store and is not charged.

### Notes

- Prices are the store's pickup prices (in-store prices for stores without pickup), in USD.
- A search returns the first page of results, up to 24 products per search term.
- A product that a store does not carry (e.g. another banner's own-label product) is reported in `ERRORS`, not charged.

Powered by [ScrapeUnblocker](https://www.scrapeunblocker.com).

# Actor input Schema

## `mode` (type: `string`):

Search: the first page of products for each search term (up to 24). Product: one product each, with description, ingredients, allergens and nutrition facts.

## `banner` (type: `string`):

Which Kroger-family site to scrape. A product link picks its own banner.

## `queries` (type: `array`):

Used when What to scrape = Search. What to search, e.g. milk, coca cola, gluten free bread. One per line.

## `products` (type: `array`):

Used when What to scrape = Product. Kroger product ids (0001111041700), UPC barcodes (011110417008) or product links from any banner (https://www.kroger.com/p/kroger-2-reduced-fat-milk-gallon/0001111041700). One per line.

## `storeId` (type: `string`):

Optional 8-digit Kroger store id (e.g. 01400929): prices, stock and aisles of that store. The id is in the store field of every item.

## `zip` (type: `string`):

Optional US ZIP code: prices at the banner's nearest store that takes online orders. Leave Store id and ZIP empty for the banner's default store.

## `brand` (type: `string`):

Search mode: only products of these brands, e.g. Kroger or Kroger|Simple Truth (separate several with |).

## `maxResults` (type: `integer`):

Upper limit of products for each search term (1-24, the first page of results).

## `concurrency` (type: `integer`):

How many search terms or products to process at the same time (1-5).

## Actor input object example

```json
{
  "mode": "search",
  "banner": "kroger",
  "queries": [
    "milk"
  ],
  "storeId": "",
  "zip": "",
  "brand": "",
  "maxResults": 10,
  "concurrency": 3
}
```

# Actor output Schema

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

One item per product with the input it came from, its position and the store it is priced for

## `listings` (type: `string`):

Per search term: the store, total results and products collected

## `errors` (type: `string`):

Inputs that returned no products (no match, unknown product or store, blocked), with the reason (not billed)

# 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 = {
    "queries": [
        "milk"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapeunblocker/kroger-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 = {
    "queries": ["milk"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapeunblocker/kroger-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 '{
  "queries": [
    "milk"
  ],
  "maxResults": 10
}' |
apify call scrapeunblocker/kroger-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapeunblocker/kroger-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/fgdW1PEXZHwGuCiFa/builds/uaIVVm6FbfNuTSYke/openapi.json
