Whole Foods Market APIwholefoodsmarket.com ↗
Access Whole Foods Market product data, store-specific pricing, weekly sales, and store locations via 6 structured API endpoints. ZIP-code-aware pricing included.
What is the Whole Foods Market API?
The Whole Foods Market API covers 6 endpoints for retrieving grocery product data, store locations, and weekly promotional pricing from wholefoodsmarket.com. The search_products endpoint returns per-product fields including price_current, ingredients, diet_types, and availability scoped to the Whole Foods store serving a given ZIP code. You can also browse the full catalog by category, look up individual products by ASIN, and pull active sale promotions for a specific store.
curl -X GET 'https://api.parse.bot/scraper/51e4baf2-1a29-4eda-a2b1-d52afdac2133/search_products?limit=5&query=milk&zip_code=10001' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for grocery products by keyword. Returns one row per product with pricing, availability, ingredients, diet types, and images as shown for the Whole Foods store serving the given ZIP code; each row's location_zip reports the ZIP actually used (the default when none is supplied). One call performs a fixed handful of requests regardless of result count. Pagination is not supported; limit caps the returned rows (max 30) while total_count is the site's approximate count of all matches. A query the store has no products for returns an empty results array with total_count 0. An empty query is rejected as invalid input; a search page missing its product data yields an extraction error rather than an empty success.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return (max 30) |
| queryrequired | string | Search keyword (e.g., 'milk', 'organic bread') |
| zip_code | string | 5-digit US ZIP code for location-specific pricing and availability |
{
"type": "object",
"fields": {
"meta": "object containing query and zip_code used",
"results": "array of product objects with product_id, name, brand, price_current, availability, description, ingredients, and more",
"total_count": "integer total number of matching products"
},
"sample": {
"data": {
"meta": {
"query": "milk",
"zip_code": "10001"
},
"results": [
{
"name": "Organic Whole Milk, 64 Oz (Half Gallon)",
"brand": "Organic Valley",
"category": {
"displayName": "Grocery",
"productType": "DAIRY_BASED_DRINK",
"glProductGroupSymbol": "gl_fresh_perishable"
},
"snap_ebt": "SNAP EBT eligible",
"image_url": "https://m.media-amazon.com/images/I/71V8yVZRLSL.jpg",
"diet_types": [
"kosher",
"halal"
],
"product_id": "B000O6K8TI",
"unit_price": "0.09 per fluid ounce",
"description": "Organic Valley milk comes from small family farms...",
"ingredients": "Organic Valley Whole Milk, Kosher, Halal, USDA Certified Organic, Non-GMO, 64 Fluid Ounce (Pack of 6)",
"product_url": "https://www.wholefoodsmarket.com/grocery/product/B000O6K8TI",
"availability": "in_stock",
"location_zip": "10001",
"size_display": "64 Oz",
"price_current": 5.99,
"price_original": null,
"size_normalized": {
"unit": "oz",
"value": 64
},
"last_checked_utc": "2026-06-10T06:36:40Z"
}
],
"total_count": 291
},
"status": "success"
}
}About the Whole Foods Market API
Product Search and Browse
The search_products endpoint accepts a query string and an optional zip_code to return up to 30 products at a time. Each result includes product_id (ASIN), name, brand, price_current, availability, description, ingredients, and diet_types. The meta object in the response reports the ZIP code actually used, which matters because pricing and availability vary by store. The list_products endpoint enables paginated catalog browsing without a keyword — use offset and limit (up to 100 rows per page, offset ceiling of 500) along with a category slug from list_product_categories to navigate specific aisles. The response includes has_more, next_offset, total_count, and accessible_count to manage pagination.
Product Details and Categories
get_product_details retrieves a single product by its ASIN and returns name, brand, description, ingredients, image_url, diet_types, snap_ebt eligibility text, unit_price, and a category object with productType and displayName. Note that price_current and offer data may be null if the product page lacks store-specific context. list_product_categories requires no inputs and returns the full set of category slugs — roughly a dozen aisles — each with a category slug and a human-readable name. These slugs feed directly into list_products as the category parameter.
Stores and Weekly Sales
find_stores accepts a 5-digit ZIP code or a city/store name string and returns matching store records including store_id, name, address, coordinates, hours, phone, and prime_eligible. The get_weekly_sales endpoint takes a store_id (obtained from find_stores) and returns current promotional items with regular_price, sale_price, prime_price, validity dates, brand, and an associated product ASIN. This makes it straightforward to correlate sale promotions back to full product detail records.
The Whole Foods Market API is a managed, monitored endpoint for wholefoodsmarket.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when wholefoodsmarket.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 wholefoodsmarket.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 grocery price comparison tool using
search_productswith different ZIP codes to surface regional price differences - Track weekly Prime member discounts by polling
get_weekly_salesacross multiple store IDs - Populate a diet-filtered recipe app with product
ingredientsanddiet_typesfields fromsearch_products - Check SNAP EBT eligibility for specific products using the
snap_ebtfield fromget_product_details - Display the nearest Whole Foods store with hours and Prime eligibility using
find_storeswith a user's ZIP code - Catalog all products in a specific aisle using
list_productswith acategoryslug fromlist_product_categories - Monitor in-stock availability changes for a set of product ASINs by polling
get_product_detailsover time
| 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 Whole Foods Market have an official developer API?+
How does pricing vary across requests, and what does the `meta` object tell me?+
search_products and list_products accept a zip_code parameter that scopes results to the store serving that area. The meta object in the response reports the zip_code actually used — which may differ from your input if the ZIP was not recognized — so you can confirm which store's pricing applies to the results you received.Does `get_weekly_sales` include nutritional data or ingredient lists for promoted items?+
get_weekly_sales response covers promotional fields — regular_price, sale_price, prime_price, validity dates, brand, and headline — but does not include ingredients or nutritional data inline. Each promotion record carries a product ASIN, so you can pass that to get_product_details to retrieve ingredients, diet_types, and description for promoted items.Is there a limit to how deep into a product listing I can paginate with `list_products`?+
offset parameter is capped at 500, and accessible_count in the response reports exactly how many rows of a given listing are reachable through paging. The total_count field reflects the full catalog size as reported by the site, but rows beyond the accessible window cannot be fetched. For deeper catalog access you can fork this API on Parse and revise it to extend that ceiling.