Meijer APImeijer.com ↗
Access Meijer store locations, digital weekly ad circulars, deal blocks, and store-specific sale pricing for products via 4 structured endpoints.
What is the Meijer API?
The Meijer API exposes 4 endpoints covering store lookup, weekly ad circulars, page-level deal blocks, and product-level sale pricing. Starting with search_stores, you can find any Meijer location by ZIP code or city, then walk the full chain through list_weekly_ads, get_weekly_ad_pages, and get_deal_products to reach individual product prices tied to a specific store and ad circular.
curl -X GET 'https://api.parse.bot/scraper/8edae1b6-4877-45c3-bcf7-024fa9158054/search_stores?location=60601' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace meijer-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Meijer Weekly Ad API — find a store, browse its ads, and check deal pricing."""
from parse_apis.meijer_com_api import Meijer, InputNotFound
client = Meijer()
# Find the nearest Meijer store to a Chicago ZIP code.
store = client.stores.search(location="60601", limit=1).first()
if store is None:
raise SystemExit("No stores found near that location.")
print(f"Nearest store: {store.display_name} (#{store.store_id}), {store.distance}")
# List the current weekly ad circulars for that store.
ad = store.ads.list(limit=1).first()
if ad is None:
raise SystemExit("No ads currently published for this store.")
print(f"Ad: {ad.name}, valid {ad.valid_from} – {ad.valid_to}, {ad.page_count} pages")
# Browse the first few pages of the ad and their deal blocks.
for page in store.pages.list(vehicle_id=ad.vehicle_id, limit=3):
print(f" Page {page.page_id}: {len(page.deals)} deals")
for deal in page.deals[:2]:
print(f" Deal: {deal.name} (block {deal.block_id})")
# Resolve each deal block to its store-priced products.
try:
for product in store.products.list(vehicle_id=ad.vehicle_id, block_id=deal.block_id, limit=5):
price_info = f"${product.customer_price}" if product.customer_price is not None else "no price"
print(f" {product.product_name} — {price_info}")
except InputNotFound:
print(" (deal block not found)")
print("exercised: stores.search / ads.list / pages.list / products.list")
Finds Meijer stores near a ZIP code or 'City, ST' text, sorted by distance, within a radius in miles (default 50). One round trip. Each store carries the numeric store_id that every other endpoint takes as its store input. An unrecognized location returns an empty stores list with total_results 0.
| Param | Type | Description |
|---|---|---|
| locationrequired | string | US ZIP code or 'City, ST' text to search around. |
| radius_miles | integer | Search radius in miles (positive integer). |
{
"type": "object",
"fields": {
"stores": "array of stores sorted by distance; store_id is the numeric store number used by the other endpoints, distance is the site's formatted miles text, region is an ISO code like US-IL",
"location": "the location text searched",
"radius_miles": "radius applied, in miles",
"total_results": "number of stores the site reports within the radius"
},
"sample": {
"data": {
"stores": [
{
"city": "Evergreen Park",
"phone": "+1 (555) 012-3456",
"region": "US-IL",
"distance": "11.5 Miles",
"latitude": 41.72475,
"store_id": "265",
"longitude": -87.68544,
"postal_code": "60805",
"display_name": "Evergreen Park, IL",
"address_line1": "9200 S. Western Ave.",
"pickup_available": true,
"delivery_available": true
}
],
"location": "60601",
"radius_miles": 50,
"total_results": 23
},
"status": "success"
}
}About the Meijer API
Store Discovery and Ad Lookup
search_stores accepts a location string (US ZIP code or City, ST format) and an optional radius_miles integer. It returns a sorted stores array where each entry carries a numeric store_id — the key input for every other endpoint — plus distance formatted as the site reports it, and a total_results count. An unrecognized location returns an empty stores list rather than an error.
list_weekly_ads takes a store_id and returns an ads array of currently published circulars for that store. Each ad entry includes a vehicle_id, ISO-8601 valid_from/valid_to timestamps with UTC offset, a page_count, and the ordered page_ids array that get_weekly_ad_pages consumes. Multiple ads may be active simultaneously — for example, a main Weekly Deals circular alongside a seasonal event flyer.
Pages and Deal Blocks
get_weekly_ad_pages requires store_id and vehicle_id, and accepts an optional page_id from list_weekly_ads.ads[*].page_ids. When page_id is omitted, the endpoint fetches every page of the circular up to an internal cap, returning them in a pages array with a pages_requested/pages_returned pair to track what came back. Each page includes image_url, its own valid_from/valid_to window, and a deals array of clickable block objects — each with a block_id, name, ad copy text, a coupon flag, and position metadata. Pages that fail individually appear in pages_failed with an error message rather than aborting the whole request. The deal_count field tallies total blocks across all returned pages.
Product-Level Sale Pricing
get_deal_products resolves a single block_id (from any deal in the pages response) to the products it covers at a given store. It returns a upcs array of all UPCs associated with the block and a products array of catalog entries — upc, product_name, image_url, is_primary_upc, and has_mperks, plus store-specific pricing fields that are null when the catalog does not have pricing data for that UPC at that location. product_count reflects how many UPCs the catalog recognized, which may be smaller than the full upcs list.
The Meijer API is a managed, monitored endpoint for meijer.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when meijer.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official meijer.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a weekly ad browser that maps Meijer deal blocks to product images and sale prices for a user's nearest store.
- Track price changes across weekly ad cycles by recording
valid_from/valid_totimestamps andproductspricing fields pervehicle_id. - Filter deals by
has_mperksflag to surface only loyalty-program-discounted products in a savings app. - Aggregate
deal_countacross all activeadsfor a store to measure promotional intensity over time. - Resolve every
block_idon a given ad page to its fullproductslist for structured grocery list generation. - Compare sale pricing on the same UPC across multiple
store_idvalues within a metro area usingget_deal_products. - Index current Meijer circular content by
nameand ad copy text to power a keyword-searchable deals feed.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Meijer have an official public developer API?+
What does get_deal_products return when a UPC isn't in the catalog?+
upcs array always reflects every UPC the site associates with the block. The products array contains only the subset the catalog recognized — store pricing fields on those entries are null when pricing data is unavailable for that store. product_count tells you how many entries made it into products, which can be zero even when upcs is non-empty.Can I fetch only a single page of a circular instead of all pages at once?+
page_id parameter to get_weekly_ad_pages with a value from list_weekly_ads.ads[*].page_ids — the endpoint then makes one round trip and returns exactly that page. Omitting page_id fetches every page up to the internal cap, which can involve multiple round trips and takes longer.Does the API cover historical weekly ads from previous weeks?+
list_weekly_ads returns only the circulars currently published for a store — there is no historical ad archive exposed. You can fork this API on Parse and revise it to add an endpoint that stores and retrieves past ad snapshots from your own data layer.Does the API return nutrition facts, ingredients, or other product detail beyond name and image?+
get_deal_products returns product_name, image_url, upc, is_primary_upc, has_mperks, and store-level pricing fields — extended product attributes like nutrition facts or ingredients are not included. You can fork this API on Parse and revise it to call additional product detail endpoints and merge that data into the response.