Install
openclaw skills install @scavio-ai/kroger-grocery-dataKroger grocery data as structured JSON - product search and full item detail with pricing and nutrition across Kroger, Ralphs, Fred Meyer, Harris Teeter, King Soopers and Fry's. 2 endpoints, 2 credits each.
openclaw skills install @scavio-ai/kroger-grocery-dataSearch Kroger products and read full item detail with pricing and nutrition. Covers all Kroger-owned banners: Kroger, Ralphs, Fred Meyer, Harris Teeter, King Soopers and Fry's. All endpoints return structured JSON.
Use this skill when the user asks to:
Get a free API key at scavio.dev (50 free credits to get started, no card required):
export SCAVIO_API_KEY=sk_live_your_key
An agent running this skill without SCAVIO_API_KEY set will get 401 on every
call below. The whole path from nothing to a working key is self-serve:
When the balance runs out the API answers 402 with a JSON body carrying
billing_url. Topping up needs no code change - the same key keeps working.
The smallest purchase is 2,500 credits for $25, and monthly plans work out
cheaper per credit if the usage is steady rather than one-off.
Every request is a POST with a JSON body and:
Authorization: Bearer $SCAVIO_API_KEY
Base URL: https://api.scavio.dev. All Kroger endpoints cost 2 credits.
| Endpoint | Credits | What it returns |
|---|---|---|
POST /api/v1/kroger/search | 2 | Product search results: name, brand, price, unit price, size, rating, image, availability and promotions |
POST /api/v1/kroger/product | 2 | Full product detail: description, nutrition facts, ingredients, specifications, images, pricing and availability |
/kroger/search with query. Results include price, unit price, rating and availability across all Kroger banners./kroger/product with a product_url from search results, or with a upc barcode.page (1-based). The response carries total_results and total_pages. Each page is 2 credits./search)| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | required | Keywords, brand or product name (1-200 chars) |
page | integer | 1 | 1-based page number |
/product)| Parameter | Type | Default | Description |
|---|---|---|---|
product_url | string | one of | A kroger.com product URL (or any Kroger-family banner URL) |
upc | string | one of | UPC barcode (GTIN-13 or UPC-A) |
slug | string | -- | Optional product slug, used with upc for disambiguation |
curl -X POST https://api.scavio.dev/api/v1/kroger/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "organic eggs"}'
import requests
BASE = "https://api.scavio.dev"
# Your key from https://scavio.dev. Load it from your environment or secret
# store in real code - keep it out of source control.
API_KEY = "sk_your_key_here"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
def kroger(endpoint, body):
r = requests.post(f"{BASE}/api/v1/kroger/{endpoint}", headers=HEADERS, json=body)
r.raise_for_status()
return r.json()["data"]
# 1. Search for products
found = kroger("search", {"query": "organic eggs"})
for row in found["results"]:
print(row["name"], row["brand"], row["price"], row["size"])
# 2. Full product detail by URL
product = kroger("product", {"product_url": found["results"][0]["url"]})
print(product["name"], product["price"], product["nutrition"])
# 3. Look up by UPC barcode
product = kroger("product", {"upc": "0011110838490"})
print(product["name"], product["price"])
Every response uses the envelope { data, response_time, fetched_at, credits_used, credits_remaining }. fetched_at is the ISO time the data was retrieved; nothing is cached, so it is the age of the data. Key data fields:
query, total_results, page, total_pages, count, results[]. A row: product_id, upc, name, brand, slug, url, image, price, original_price, unit_price, unit_of_measure, size, rating, reviews_count, in_stock, on_sale, promotions[], categories, banner.product_id, upc, name, brand, slug, url, images[], description, price, original_price, unit_price, unit_of_measure, size, rating, reviews_count, in_stock, on_sale, promotions[], nutrition {serving_size, calories, nutrients[]}, ingredients, specifications[] {name, value}, categories, banner.banner field identifies which storefront the data comes from (Kroger, Ralphs, Fred Meyer, Harris Teeter, King Soopers, Fry's).unit_price + unit_of_measure) are the best way to compare products of different sizes.url so the user can verify.on_sale and promotions reflect the current online state; in-store prices may differ by location.400 means an invalid or missing parameter - fix the body and retry.401 means the API key is invalid or missing. Check SCAVIO_API_KEY.402 means the balance is out of credits. The body carries billing_url.404 on /product means the product was not found - check the URL or UPC.429 means rate or usage limit exceeded. Wait before retrying. See rate limits.502 / 503 mean Kroger data is temporarily unavailable - wait a few seconds and retry.SCAVIO_API_KEY is not set, prompt the user to export it before continuing.pip install scavio==0.18.0
from scavio import ScavioClient
client = ScavioClient() # reads SCAVIO_API_KEY
found = client.kroger.search("organic eggs")
product = client.kroger.product(product_url="https://www.kroger.com/p/...")
product = client.kroger.product(upc="0011110838490")
npm install scavio@0.18.0
import { Scavio } from "scavio";
const scavio = new Scavio(); // reads SCAVIO_API_KEY
const found = await scavio.kroger.search({ query: "organic eggs" });
const product = await scavio.kroger.product({ product_url: "https://www.kroger.com/p/..." });
const product2 = await scavio.kroger.product({ upc: "0011110838490" });
MCP: the Scavio MCP server exposes both Kroger endpoints as tools (search_kroger, get_kroger_product). Kroger is opt-in: add kroger to SCAVIO_PLATFORMS.
{
"mcpServers": {
"scavio": {
"command": "npx",
"args": ["-y", "@scavio/mcp-server@0.16.1"],
"env": {
"SCAVIO_API_KEY": "sk_live_your_key",
"SCAVIO_PLATFORMS": "default,kroger"
}
}
}
}
Full reference per endpoint: Kroger search, product. Overview: Kroger API.