# Kroger API — store-level shelf prices, sale and multi-buy deals, stock, aisle and full product data (nutrition, UPC) for Kroger and its 18 banners

> 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.
> ReefAPI engine `kroger` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/kroger/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/kroger/v1/stores — 2 credits
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.

**Parameters:**
- `zip` (string, optional) — US 5-digit ZIP code; stores are returned nearest first (the source returns up to 50 locations per ZIP, fuel centers included).
- `location_id` (string, optional) — Look up ONE store by its 8-digit location id instead of a ZIP.
- `banner` (enum, optional) — With `zip`: pick the nearest store of this banner. With `stores`: only this banner's stores. [one of: kroger, ralphs, frysfood, kingsoopers, fredmeyer, smithsfoodanddrug, qfc, harristeeter, dillons, bakersplus, citymarket, gerbes, jaycfoods, payless, marianos, metromarket, picknsave, foodsco, food4less]
- `include_fuel` (boolean, optional, default false) — Also return fuel-center locations (they have no grocery prices).

**Returns:** stores[]{location_id, store_number, banner, banner_name, name, legal_name, address{lines[], city, state, postal_code, country}, lat, lng, phone, distance_miles, store_type, is_fuel_center, ways_to_shop[], supported (true = usable with search/product), is_open, open_text, open_24h, hours[]{days, hours}, departments[], division} + total, fuel_centers_excluded

**Example request body:**
```json
{
  "zip": "45202"
}
```

### POST https://api.reefapi.com/kroger/v1/search — 3 credits
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.

**Parameters:**
- `query` (string, required) — What to search for, as typed in the Kroger search box (e.g. milk, greek yogurt, coffee).
- `location_id` (string, optional) — The store's 8-digit Kroger location id (from the `stores` action, e.g. 01400929 = Kroger University Plaza, Cincinnati). Prices, stock and aisle are this store's. Any Kroger-family banner works (Ralphs, Fred Meyer, King Soopers, ...). `location_id` or `zip` is required.
- `zip` (string, optional) — US 5-digit ZIP. Used only when `location_id` is not given: the nearest grocery store to that ZIP (of `banner`, if given) is used and returned in `store`.
- `banner` (enum, optional) — With `zip`: pick the nearest store of this banner. With `stores`: only this banner's stores. [one of: kroger, ralphs, frysfood, kingsoopers, fredmeyer, smithsfoodanddrug, qfc, harristeeter, dillons, bakersplus, citymarket, gerbes, jaycfoods, payless, marianos, metromarket, picknsave, foodsco, food4less]
- `brand` (string, optional) — Only this brand, spelled exactly as in a row's `brand` (case-sensitive at the source: 'Kroger' matches 66 milk products, 'kroger' none). One brand per call.
- `on_sale` (boolean, optional, default false) — Only products with a current sale or deal at the store (milk at one store: 929 -> 351).
- `nutrition` (enum, optional) — Only products carrying this dietary / nutrition tag. [one of: organic, gluten_free, kosher, vegan, vegetarian, lactose_free, low_sodium, sugar_free, pescatarian]

**Returns:** store{location_id, banner, name, address, ...}, total (the source's own count; capped at 1000), total_is_capped, returned, sponsored_count, results[]{upc, gtin14, title, brand, size, url, image, department, category, subcategory, categories[], regular_price, sale_price, on_sale, discount_pct, price_tag, price_text, regular_price_text, sale_ends_at, multibuy{quantity, total, per_unit, must_buy, text}, regular_unit_price{amount_cents, unit, display}, sale_unit_price, sold_by, seller_name, currency, available_to_sell, stock_level, aisle{description, number, side, bay, shelf, position_in_bay, facings}, ways_to_shop{in_store, pickup, delivery, ship}, snap_eligible, rating, review_count, dietary[], nutritional_claims[], sponsored, rank}

**Example request body:**
```json
{
  "query": "milk",
  "location_id": "01400929"
}
```

### POST https://api.reefapi.com/kroger/v1/product — 3 credits
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.

**Parameters:**
- `upc` (string, optional) — Kroger's 13-digit UPC exactly as search rows return it (0001111041700). A printed 12-digit UPC-A or a 14-digit GTIN with a valid check digit is converted.
- `url` (string, optional) — A Kroger-family product page URL (/p/<slug>/<upc>).
- `location_id` (string, optional) — The store's 8-digit Kroger location id (from the `stores` action, e.g. 01400929 = Kroger University Plaza, Cincinnati). Prices, stock and aisle are this store's. Any Kroger-family banner works (Ralphs, Fred Meyer, King Soopers, ...). `location_id` or `zip` is required.
- `zip` (string, optional) — US 5-digit ZIP. Used only when `location_id` is not given: the nearest grocery store to that ZIP (of `banner`, if given) is used and returned in `store`.
- `banner` (enum, optional) — With `zip`: pick the nearest store of this banner. With `stores`: only this banner's stores. [one of: kroger, ralphs, frysfood, kingsoopers, fredmeyer, smithsfoodanddrug, qfc, harristeeter, dillons, bakersplus, citymarket, gerbes, jaycfoods, payless, marianos, metromarket, picknsave, foodsco, food4less]

**Returns:** store{...}, item{all search-row fields, description, receipt_description, country_of_origin, weight, dimensions{}, temperature, family_tree{}, images[]{perspective, url}, rating_breakdown{5..1}, aisles[], fulfillment[]{type, sellable, inventory_level, unavailable_message, max_order_quantity, regular_price, sale_price}, nutrition{ingredients, allergens, warning, preparation_states[]{description, serving_size, servings_per_container, facts[]{name, value, unit, daily_value_pct}}, flags{}}, alcohol, age_restricted, hazmat, prop65_warning_required, sold_in_store_only}

**Example request body:**
```json
{
  "upc": "0001111041700",
  "location_id": "01400929"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=kroger
- Human docs page: https://reefapi.com/docs/kroger
- Overview page: https://reefapi.com/kroger-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
