Kroger API & Scraper
Kroger prices are set per store, so this API always answers for one store.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
`stores` turns a US ZIP code into the nearby Kroger-family stores with their location_id, banner, address, phone, hours and ways to shop. `search` returns the first 24 products for a query at that store: UPC, GTIN-14, title, brand, size, department, regular price, sale price with its end date, multi-buy deals such as 10 For $12.00, unit price per ounce or pound, the store's sellable stock count and stock level, aisle and shelf, whether it can be bought in store, for pickup, delivery or shipping, rating, dietary tags and a flag on sponsored placements. `product` takes a UPC and returns the same store price plus every aisle location, the full nutrition panel, ingredients, allergens, description, country of origin, weight, dimensions and all images. Kroger, Ralphs, Fred Meyer, King Soopers, Fry's, Smith's, QFC, Harris Teeter, Dillons, Baker's, City Market, Gerbes, JayC, Pay Less, Mariano's, Metro Market, Pick 'n Save, Foods Co and Food 4 Less are all covered.
What a Kroger field actually contains
Fields that read differently from how they look. Every row was measured against live Kroger pages on 2026-10-14.
| Field | What it holds |
|---|---|
| upc | Kroger's 13-digit product number without check digit (0001111041700). Pass it unchanged to product; a printed 12-digit UPC-A or a 14-digit GTIN with a valid check digit is converted. Search to product returned the same UPC and the same prices on 14 of 14 products. |
| regular_price, sale_price | The shelf price at the store in `store`, in US dollars. sale_price is only set when it is really below the regular price; discount_pct is computed from the two. On 143 products across 6 searches the price matched the price Kroger prints on its own product card 141 times; the other 2 were bananas, whose card shows a per-pound price. |
| multibuy | Deals that need more than one unit: quantity, total, per_unit and the deal text. "10 For $12.00" means 1.20 each. On a "Buy 3 For $15.00" deal Kroger's single price stays the regular one, so must_buy is true and sale_price stays empty. |
| price_is_estimate, weight_price | Produce and meat sold by weight: the price is Kroger's "about $1.45 each" estimate and weight_price holds the real price per pound ($0.69/lb). |
| available_to_sell, stock_level | The store's sellable count as Kroger publishes it (for example 195) and its level: HIGH, LOW or TEMPORARILY_OUT_OF_STOCK. Kroger does not publish a count for every product: filled on 183 of 240 rows, never on beer, rarely on soda. |
| aisle | Where the product sits in that store: aisle name and number, side, bay and shelf. product lists every location when there are several. Filled on 238 of 240 rows. |
| sponsored | True on paid placements Kroger mixes into the results: 46 of 240 rows, between 0 and 9 per search. |
| total | Kroger's own count of matches at that store. It stops at 1,000 (total_is_capped), and one call returns the first 24 results. |
The same product costs different amounts in different stores: a gallon of Kroger 2% milk was $2.99 in a Cincinnati store and $3.19 in Rolla, Missouri, at the same minute, and the number of matching products differed too (929 against 603 for "milk"). Always pass the store you care about; the response names the store it priced.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/kroger/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"location_id": "01400929"
}
}{
"ok": true,
"meta": {
"api": "kroger",
"endpoint": "search",
"mode": "live",
"latency_ms": 3999.6,
"record_count": 24,
"bytes": 1523663,
"cache_hit": false,
"total": 929,
"store_location_id": "01400929",
"banner": "kroger",
"modality": "IN_STORE",
"price_basis": "shelf price at the store in `store` (Kroger loyalty-card sale prices as the site shows them logged out); first 24 results only",
"upstream_requests": 2,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "78a88974f7ff4519",
"queue_ms": 1.6,
"fetched_at": "2026-10-14T18:57:28.060Z"
},
"data": {
"query": {
"query": "milk"
},
"store": {
"location_id": "01400929",
"store_number": "00929",
"banner": "kroger",
"banner_name": "Kroger",
"name": "University Plaza",
"address": {
"lines": [
"1 W Corry St"
],
"city": "Cincinnati",
"state": "OH",
"postal_code": "45219",
"country": "US"
},
"phone": "[redacted-phone]",
"distance_miles": null,
"ways_to_shop": [
"pickup",
"in_store"
]
},
"total": 929,
"total_is_capped": false,
"returned": 24,
"has_more": true,
"sponsored_count": 1,
"results": [
{
"upc": "0001111041700",
"gtin14": "00011110417008",
"title": "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/xlarge/front/0001111041700",
"department": "Dairy & Eggs",
"category": "Milk & Dairy Free Milk",
"subcategory": "1%, 2%, & Skim Milk",
"categories": [
"Dairy"
],
"regular_price": 2.99,
"sale_price": null,
"on_sale": false,
"price_tag": "WhiteTag",
"price_text": "$2.99",
"regular_price_text": "$2.99",
"sale_ends_at": null,
"multibuy": null,
"regular_unit_price": {
"amount_cents": 2.34,
"unit": "PER FLUID OUNCE",
"display": "$0.02/fl oz"
},
"sale_unit_price": null,
"sold_by": "Unit",
"price_is_estimate": false,
"weight_price": null,
"seller_name": "Kroger",
"currency": "USD",
"discount_pct": null,
"available_to_sell": 169,
"stock_level": "HIGH",
"aisle": {
"description": "DAIRY",
"number": "100",
"side": "L",
"bay": "3",
"shelf": "1",
"position_in_bay": "1",
"facings": 4
},
"ways_to_shop": {
"delivery": true,
"in_store": true,
"pickup": true,
"ship": false
},
"snap_eligible": true,
"rating": 3.09,
"review_count": 88,
"dietary": [
"Kosher",
"Pescatarian",
"Vegetarian"
],
"nutritional_claims": [
"Low Sodium",
"No Artificial Ingredients",
"No Added Sugar"
],
"sponsored": false,
"rank": 1
},
{
"upc": "0001111040101",
"gtin14": "00011110401014",
"title": "Kroger® Vitamin D Whole Milk Gallon",
"brand": "Kroger",
"size": "1 gal",
"url": "https://www.kroger.com/p/kroger-vitamin-d-whole-milk-gallon/0001111040101",
"image": "https://www.kroger.com/product/images/xlarge/front/0001111040101",
"department": "Dairy & Eggs",
"category": "Milk & Dairy Free Milk",
"subcategory": "Whole Milk",
"categories": [
"Dairy"
],
"regular_price": 2.99,
"sale_price": null,
"on_sale": false,
"price_tag": "WhiteTag",
"price_text": "$2.99",
"regular_price_text": "$2.99",
"sale_ends_at": null,
"multibuy": null,
"regular_unit_price": {
"amount_cents": 2.34,
"unit": "PER FLUID OUNCE",
"display": "$0.02/fl oz"
},
"sale_unit_price": null,
"sold_by": "Unit",
"price_is_estimate": false,
"weight_price": null,
"seller_name": "Kroger",
"currency": "USD",
"discount_pct": null,
"available_to_sell": 282,
"stock_level": "HIGH",
"aisle": {
"description": "DAIRY",
"number": "100",
"side": "L",
"bay": "6",
"shelf": "1",
"position_in_bay": "1",
"facings": 4
},
"ways_to_shop": {
"delivery": true,
"in_store": true,
"pickup": true,
"ship": false
},
"snap_eligible": true,
"rating": 2.85,
"review_count": 102,
"dietary": [
"Vegetarian",
"Kosher",
"Pescatarian"
],
"nutritional_claims": [
"No Artificial Ingredients",
"No Added Sugar",
"Low Sodium"
],
"sponsored": false,
"rank": 2
},
{
"upc": "0001111041600",
"gtin14": "00011110416001",
"title": "Kroger® 2% Reduced Fat Milk Half Gallon",
"brand": "Kroger",
"size": "1/2 gal",
"url": "https://www.kroger.com/p/kroger-2-reduced-fat-milk-half-gallon/0001111041600",
"image": "https://www.kroger.com/product/images/xlarge/front/0001111041600",
"department": "Dairy & Eggs",
"category": "Milk & Dairy Free Milk",
"subcategory": "1%, 2%, & Skim Milk",
"categories": [
"Dairy"
],
"regular_price": 1.99,
"sale_price": null,
"on_sale": false,
"price_tag": "WhiteTag",
"price_text": "$1.99",
"regular_price_text": "$1.99",
"sale_ends_at": null,
"multibuy": null,
"regular_unit_price": {
"amount_cents": 3.11,
"unit": "PER FLUID OUNCE",
"display": "$0.03/fl oz"
},
"sale_unit_price": null,
"sold_by": "Unit",
"price_is_estimate": false,
"weight_price": null,
"seller_name": "Kroger",
"currency": "USD",
"discount_pct": null,
"available_to_sell": 171,
"stock_level": "HIGH",
"aisle": {
"description": "DAIRY",
"number": "100",
"side": "L",
"bay": "3",
"shelf": "4",
"position_in_bay": "1",
"facings": 6
},
"ways_to_shop": {
"delivery": true,
"in_store": true,
"pickup": true,
"ship": false
},
"snap_eligible": true,
"rating": 2.68,
"review_count": 66,
"dietary": [
"Kosher",
"Pescatarian",
"Vegetarian"
],
"nutritional_claims": [
"Low Sodium",
"No Artificial Ingredients",
"No Added Sugar"
],
"sponsored": false,
"rank": 3
}
]
}
}What the Kroger API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| stores | Kroger-family stores near a US ZIP code (up to 50, nearest first) or one store by location_id: the location_id the price actions take, banner (Kroger, Ralphs, Fred Meyer, King Soopers, Fry's, Smith's, QFC, Harris Teeter,...), address, coordinates, phone, distance, ways to shop (in store / pickup / delivery), opening hours, departments. Fuel centers are excluded unless include_fuel=true. `zip` or `location_id` is required. | Pricing teams call stores to get kroger-family stores near a US ZIP code (up to 50, nearest first) or one store by location_id. | zip, location_id, banner, include_fuel |
| search | Search one Kroger-family store's catalogue: the first 24 results for `query`, priced AT THAT STORE. Each row: UPC, GTIN-14, title, brand, size, department, regular price, sale price + end date, multi-buy deal (e.g. 10 For $12.00), unit price per oz/lb/count, price tag type, the store's sellable stock count and stock level, aisle and shelf, ways to shop (in store / pickup / delivery / ship), SNAP eligibility, rating, dietary tags, sponsored flag. Filters: brand, on_sale, nutrition. `query` and (`location_id` or `zip`) are required. | Marketplace operators call search to search one Kroger-family store's catalogue. | query, location_id, zip, banner, brand, ... |
| product | One product at one Kroger-family store by UPC: everything in a search row (store price, sale, multi-buy, unit price, stock count, stock level) plus every aisle location, the per-way fulfillment summary (in store / pickup / delivery with max order quantity), full nutrition panel (serving size, nutrients, ingredients, allergens), marketing description, country of origin, weight, dimensions, all images, rating breakdown and restriction flags. `upc` (or a product `url`) and (`location_id` or `zip`) are required. | Catalog enrichment teams call product to get one product at one Kroger-family store by UPC. | upc, url, location_id, zip, banner |
Call search from your stack
curl -X POST https://api.reefapi.com/kroger/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","location_id":"01400929"}'import requests
r = requests.post(
"https://api.reefapi.com/kroger/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"location_id": "01400929"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/kroger/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"location_id": "01400929"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.kroger.search with {"query":"milk","location_id":"01400929"}.Who uses this API and why
- Track the shelf price and sale price of a basket of UPCs at the stores you care about, week by week.
- Compare one product's price across Kroger, Ralphs, Fred Meyer and King Soopers stores in different cities.
- Monitor which brands run sales and multi-buy deals, and when those deals end.
- Build store-aware shopping lists with aisle, shelf and stock level for each item.
- Collect nutrition panels, ingredients and allergens by UPC for a food database.
Questions developers ask before integrating
Do I need a Kroger account or loyalty card?
No. Everything is read logged out, and the prices are the ones Kroger shows a visitor who picked that store, sale prices included.
How do I choose the store?
Call stores with a ZIP code and pass a location_id to search or product, or pass zip directly and the nearest grocery store is used and returned in store. For ZIP 45202 the source listed 50 locations, 18 of them grocery stores; fuel centers are left out unless include_fuel=true.
Does it cover Ralphs, Fred Meyer, King Soopers and the other banners?
Yes, 19 banners in total. A store id of any banner works, and the store block tells you which banner it is. On 2026-10-14 a Ralphs store in Los Angeles matched 856 products for "milk", a King Soopers store in Denver 924.
Which filters are there?
brand, on_sale and nutrition, each checked against the unfiltered count at the same store in the same run: "milk" 929, brand Kroger 66, on sale 342, organic 88, gluten free 391. brand is case-sensitive at Kroger: use the spelling from a row's brand.
Can I page through all results or sort by price?
No. One search returns the first 24 results in Kroger's own order, with the total count. Narrow with a more specific query or the filters to reach other products.
Do you return digital coupons?
No. Coupons are not part of what Kroger shows logged out. Sale and multi-buy prices are returned; the on_sale filter covers everything Kroger marks as a saving.
How fresh is the data?
Every call reads Kroger live; nothing is cached. In our two runs a search took 4.3 and 5.4 seconds at the median, a product 3.0 and 3.1 seconds, a store lookup 1.0 and 1.7 seconds.
Is the nutrition label included?
Yes, on product: serving size, servings per container, each nutrient with its value and unit, ingredients and allergens, as Kroger publishes them.
What is the Kroger API?
Kroger API is a ReefAPI endpoint group for store-level shelf prices, sales, multi-buy deals, stock and aisle for kroger and its 18 us grocery banners. It returns live JSON through POST requests under /kroger/v1.
Is the Kroger API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Kroger calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Kroger login or account?
No login to Kroger is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Kroger data?
The page example is captured from a live stores call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Kroger API use?
Kroger actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Kroger from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call kroger actions with the same key, credit pool and JSON envelope used by normal REST requests.