Discover/Meijer API
live

Meijer APImeijer.com

Access Meijer store locations, digital weekly ad circulars, deal blocks, and store-specific sale pricing for products via 4 structured endpoints.

Endpoint health
verified 4h ago
get_weekly_ad_pages
get_deal_products
search_stores
list_weekly_ads
4/4 passing latest checkself-healing
Endpoints
4
Updated
4h ago

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.

This call costs1 credit / call— charged only on success
Try it
US ZIP code or 'City, ST' text to search around.
Search radius in miles (positive integer).
api.parse.bot/scraper/8edae1b6-4877-45c3-bcf7-024fa9158054/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/8edae1b6-4877-45c3-bcf7-024fa9158054/search_stores?location=60601' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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")
All endpoints · 4 totalmissing one? ·

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.

Input
ParamTypeDescription
locationrequiredstringUS ZIP code or 'City, ST' text to search around.
radius_milesintegerSearch radius in miles (positive integer).
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
4h ago
Latest check
4/4 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • 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_to timestamps and products pricing fields per vehicle_id.
  • Filter deals by has_mperks flag to surface only loyalty-program-discounted products in a savings app.
  • Aggregate deal_count across all active ads for a store to measure promotional intensity over time.
  • Resolve every block_id on a given ad page to its full products list for structured grocery list generation.
  • Compare sale pricing on the same UPC across multiple store_id values within a metro area using get_deal_products.
  • Index current Meijer circular content by name and ad copy text to power a keyword-searchable deals feed.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Meijer have an official public developer API?+
Meijer does not publish a public developer API or documented data feed for its weekly ads or store data.
What does get_deal_products return when a UPC isn't in the catalog?+
The 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?+
Yes. Pass the 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.
Page content last updated . Spec covers 4 endpoints from meijer.com.
Related APIs in Food DiningSee all →