# Kroger Product & Price Scraper (`axlymxp/kroger-product-scraper`) Actor

Scrape Kroger.com grocery products — store-scoped prices, promos, unit price, stock level, ratings, brand, size, categories and images — by keyword, UPC, product URL, or the full catalog. Compare prices across multiple stores. Clean JSON for Sheets or BI. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/kroger-product-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 dataset items

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

## Kroger Product & Price Scraper

**Extract Kroger.com grocery products — with store-specific prices, promotions, stock levels, ratings and images — by keyword, UPC, product URL, or the entire catalog.** Kroger prices and availability change from store to store; this Actor lets you pin a store (or compare several) and returns clean, structured JSON ready for Sheets, BI or your app.

It renders each page through a real browser, so Kroger's Akamai anti-bot layer doesn't break your run — and it combines search *and* full product detail in one rich row.

***

### Who uses this

- **Price intelligence & CPG analysts** — monitor price, promo and unit price by store; compare the same SKU across multiple locations.
- **Grocery & deal/coupon sites** — surface sale items, unit prices and stock at the shopper's local store.
- **App & SaaS developers** — a stable JSON product feed with UPC lookup and whole-catalog enumeration.
- **Market researchers** — assortment, brands, categories and ratings across Kroger's catalog.

### What you get (output fields)

| Field                                       | Type            | Description                                                       |
| ------------------------------------------- | --------------- | ----------------------------------------------------------------- |
| `upc` / `gtin14`                            | string          | Kroger product identifiers                                        |
| `title`                                     | string          | Product name                                                      |
| `brand`                                     | string          | Brand name                                                        |
| `size`                                      | string          | Customer-facing size (e.g. `28 fl oz`)                            |
| `department` / `commodity` / `subCommodity` | string          | Kroger taxonomy                                                   |
| `categories`                                | array           | Category breadcrumb                                               |
| `regularPrice`                              | number          | Regular price at the chosen store                                 |
| `promoPrice`                                | number          | Promo/sale price when on sale                                     |
| `onSale`                                    | boolean         | Whether a promo price is active                                   |
| `priceDisplay`                              | string          | Price as shown (e.g. `$5.99`)                                     |
| `unitPrice`                                 | string          | Equivalized unit price (e.g. `$0.21/fl oz`)                       |
| `currency`                                  | string          | `USD`                                                             |
| `stockLevel`                                | string          | `HIGH` / `LOW` / `TEMPORARILY_OUT_OF_STOCK` …                     |
| `available`                                 | number          | Units available at the store                                      |
| `fulfillment`                               | array           | e.g. `PICKUP`, `DELIVERY`, `IN_STORE`                             |
| `rating` / `reviewCount`                    | number          | Average rating and review count                                   |
| `dietaryInformation`                        | array           | Dietary claims (e.g. `Gluten Free`, `Kosher`, `Organic`)          |
| `countryOfOrigin`                           | string          | Country of origin when available                                  |
| `weight` / `dimensions`                     | string / object | Pack weight and dimensions when available                         |
| `imageUrl` / `images`                       | string / array  | Product image URLs                                                |
| `url`                                       | string          | Product page URL                                                  |
| `storeLocationId`                           | string          | Store the price/stock is for                                      |
| `sourceType` / `sourceValue`                | string          | How the row was found (`search`, `upc`, `product_url`, `catalog`) |
| `scrapedAt`                                 | string          | ISO-8601 timestamp                                                |

> Note: Kroger's public web catalog exposes dietary **claims** (Gluten Free, Organic, Kosher…), not a full nutrition-facts panel or ingredient list.

### High-value use cases

1. **Multi-store price comparison** — pass several `storeLocationIds` and watch how price, promo and stock differ by location for the same UPC.
2. **Promo & markdown tracking** — schedule daily runs on a keyword or UPC set and diff `promoPrice` / `onSale` to catch deals and price changes.
3. **Assortment & share-of-shelf** — search category keywords to map brands, sizes and ratings across the catalog.
4. **Catalog feed** — enumerate the whole catalog (via the sitemap) to seed a product database, then keep it fresh with targeted UPC runs.
5. **Competitive/retail media analytics** — combine price, unit price and stock signals into dashboards.

### Input parameters

| Field               | Type    | Default    | Description                                                 |
| ------------------- | ------- | ---------- | ----------------------------------------------------------- |
| `searchQueries`     | array   | —          | Keywords to search (each returns ~24 full-detail products)  |
| `upcs`              | array   | —          | 13-digit UPCs to look up                                    |
| `productUrls`       | array   | —          | `https://www.kroger.com/p/<slug>/<upc>` URLs                |
| `scrapeAllProducts` | boolean | `false`    | Enumerate the whole catalog via the sitemap                 |
| `locationId`        | string  | `02100953` | Store whose prices/stock to use                             |
| `storeLocationIds`  | array   | —          | Optional list of stores to compare (overrides `locationId`) |
| `maxItems`          | integer | `100`      | Stop after this many rows (store × product)                 |
| `zyteApiKey`        | string  | —          | Optional — use your own Zyte key                            |

Provide at least one of `searchQueries`, `upcs`, `productUrls`, or `scrapeAllProducts`. Find a store's `locationId` in Kroger's store locator (the 8-digit store number).

#### Example input

```json
{
    "searchQueries": ["almond milk", "organic coffee"],
    "storeLocationIds": ["02100953", "70600346"],
    "maxItems": 100
}
```

#### Example output row

```json
{
    "upc": "0086102900012",
    "title": "MALK Organic Vanilla Almond Milk - Dairy Free",
    "brand": "Malk",
    "size": "28 fl oz",
    "categories": ["Natural & Organic", "Dairy"],
    "regularPrice": 5.99,
    "promoPrice": null,
    "onSale": false,
    "unitPrice": "$0.21/fl oz",
    "currency": "USD",
    "stockLevel": "LOW",
    "available": 4,
    "fulfillment": ["PICKUP"],
    "rating": 4.5,
    "reviewCount": 12,
    "dietaryInformation": ["Gluten Free", "Kosher"],
    "imageUrl": "https://www.kroger.com/product/images/xlarge/front/0086102900012",
    "url": "https://www.kroger.com/p/malk-organic-vanilla-almond-milk-dairy-free/0086102900012",
    "storeLocationId": "02100953",
    "sourceType": "search",
    "scrapedAt": "2026-08-21T12:00:00+00:00"
}
```

### Scheduling & integrations

- **Schedule** daily/hourly runs from the Apify Console to track prices and stock over time.
- **Webhooks** fire on run completion — push new rows to your endpoint.
- **Export** to JSON, CSV, Excel, or Google Sheets; or pull from the **Dataset API**.
- Wire into **Make**, **Zapier**, **n8n**, or an **S3** bucket for a hands-off pipeline.

### Use it from an AI assistant (MCP)

This Actor runs great as a tool for AI agents via the **Apify MCP server**. Point your MCP-compatible client (Claude, Cursor, VS Code) at Apify, then ask it to run `axlymxp/kroger-product-scraper` with a `searchQueries` or `upcs` input and read the dataset back — perfect for on-demand grocery price lookups inside an agent workflow.

### FAQ

**Which store's prices do I get?** The store set by `locationId` (or each of `storeLocationIds`). Kroger prices, promos and stock are store-scoped, so always set the store you care about.

**How many products per search?** Each keyword returns Kroger's first result page (~24 products) with full detail. Use `upcs` / `productUrls` for exact items, or `scrapeAllProducts` for the whole catalog.

**How fresh is the data?** Every row is fetched live at run time and stamped with `scrapedAt`. Schedule runs for time series.

**Is it reliable against Kroger's anti-bot?** Yes — pages are rendered through a real residential browser, which clears Akamai Bot Manager that blocks plain HTTP scrapers.

**Do I need my own Zyte key?** No. A key is built in; you can optionally supply `zyteApiKey` to use your own account.

**Is this legal?** The Actor collects only publicly available catalog data (no login, no personal data). You are responsible for complying with Kroger's Terms and applicable laws.

**Nutrition facts / ingredients?** The public web catalog exposes dietary *claims* (Organic, Gluten Free…) but not a full nutrition panel or ingredient list, so those aren't included.

**Support.** Issues are monitored and typically answered within a day — open an issue on the Actor page.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on Kroger, e.g. "almond milk". Each query returns the first page of matching products (~24) with full detail.

## `upcs` (type: `array`):

13-digit Kroger UPCs (e.g. 0001111041660). Each is looked up and returned with full store-scoped detail.

## `productUrls` (type: `array`):

Kroger product page URLs, e.g. https://www.kroger.com/p/<slug>/<upc>. The UPC is read from the URL and the product is scraped in full.

## `scrapeAllProducts` (type: `boolean`):

Enumerate every product in Kroger's catalog via the sitemap and scrape each (one render per product — use Max products to cap the run and cost).

## `locationId` (type: `string`):

Kroger store whose prices/inventory to use (Kroger is store-scoped). Find it in the store locator or the x-active-modality cookie. Defaults to a public store.

## `storeLocationIds` (type: `array`):

Optional list of store location IDs. When set, every product is scraped at each store so you can compare prices and stock across locations. Overrides the single Store location ID above.

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

Stop after pushing this many product rows (counts every store × product row).

## `zyteApiKey` (type: `string`):

Optional. Provide your own Zyte API key to render pages through your account. Leave empty to use the built-in residential rendering.

## Actor input object example

```json
{
  "searchQueries": [
    "almond milk",
    "organic coffee"
  ],
  "upcs": [
    "0001111041660",
    "0086102900012"
  ],
  "productUrls": [
    {
      "url": "https://www.kroger.com/p/malk-organic-vanilla-almond-milk-dairy-free/0086102900012"
    }
  ],
  "scrapeAllProducts": false,
  "locationId": "02100953",
  "storeLocationIds": [
    "02100953",
    "70600346"
  ],
  "maxItems": 100
}
```

# 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 = {
    "searchQueries": [
        "almond milk"
    ],
    "locationId": "02100953"
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/kroger-product-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 = {
    "searchQueries": ["almond milk"],
    "locationId": "02100953",
}

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

```

## MCP server setup

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