Whole Foods Scraper: Store Prices, Sales & Prime Deals by ZIP avatar

Whole Foods Scraper: Store Prices, Sales & Prime Deals by ZIP

Pricing

from $5.00 / 1,000 products

Go to Apify Store
Whole Foods Scraper: Store Prices, Sales & Prime Deals by ZIP

Whole Foods Scraper: Store Prices, Sales & Prime Deals by ZIP

Scrape Whole Foods Market products and prices for any store by ZIP code or store ID: regular, sale and Prime member prices with sale dates, unit price, UPC, brand, size, diets, ingredients and stock. Search terms, category pages or product URLs. Pay only for products delivered.

Pricing

from $5.00 / 1,000 products

Rating

0.0

(0)

Developer

Zaiq

Zaiq

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Whole Foods Market Scraper: Store Prices, Sales and Prime Member Prices by ZIP Code

Get Whole Foods Market products with the prices of the store you choose: the regular price, the sale price everyone pays, the Prime member price, sale start and end dates, a unit price, the UPC, brand, size, category, diets, ingredients and whether the store has the product. Choose stores by ZIP code or store number; prices differ from store to store, and every row says which store its price belongs to.

What it does

  • Finds the store for each ZIP code you give (the same store wholefoodsmarket.com picks for that ZIP code), or uses the store numbers you give.
  • Runs your search terms, category pages and product URLs at every store, following pages until your limit.
  • Returns one row per product per store: regular price, sale price, Prime member price, sale dates, a unit price per fluid ounce, ounce or count, UPC, brand, size, category path, image, product URL and availability at that store.
  • With product details on (the default), also returns ingredients, diets (organic, vegan, gluten-free and so on) and certifications.
  • Deals only: returns just the products on sale or with a Prime member price.
  • The same product found twice at one store (for example by two search terms) is returned and charged once.

The data comes from the catalogue wholefoodsmarket.com shows for each store. No login, no account and no Amazon sign-in are used.

Who uses it

  • Price monitoring and retail analysts tracking Whole Foods prices and promotions across regions.
  • Brands and distributors checking their shelf prices, sale depth and Prime member pricing store by store.
  • Price comparison and shopping apps that need store-level prices matched by UPC.
  • Researchers studying grocery prices and how they vary between cities.

Example

The same 365 by Whole Foods Market organic milks at five stores, from a run on 4 October 2026 (ZIP codes 78704, 98004, 60614, 10001 and 94110):

Product (UPC)Austin TXBellevue WAChicago ILNew York NYSan Francisco CA
Organic Lactose Free Whole Milk, 64 fl oz (099482514754)$5.49$5.49$5.39$5.99$6.49
Organic Whole Milk, 128 oz (099482516635)$7.49$7.59$7.99not sold therenot sold there

"Not sold there" came back as a free row for the product URL at those two stores.

In an earlier run the same day, 9 of the 13 products found at three or more of five stores had different prices.

Other test runs on 4 October 2026:

  • 350 products for the search term "cheese" at the San Francisco (Noe Valley) store in 53 seconds with product details, or 9 seconds without; 343 of the 350 had a UPC.
  • Deals only, New York (Manhattan West): 50 products, each with its sale price, Prime member price and sale end date, for example a 12 oz coffee at $16.99 regular, $13.20 on sale and $11.88 for Prime members until 6 October.
  • A ZIP code with no Whole Foods store nearby (99950, Alaska) came back as a free row saying so.

Input

{
"searchTerms": ["organic whole milk", "sourdough bread"],
"categoryUrls": ["https://www.wholefoodsmarket.com/products/dairy-eggs"],
"productUrls": ["https://www.wholefoodsmarket.com/product/365-by-whole-foods-market-organic-whole-milk-128-oz-b09fblv8qy"],
"zipCodes": ["78704", "98004", "10001"],
"maxItemsPerQuery": 100,
"maxItems": 1000,
"onSaleOnly": false,
"includeDetails": true
}
FieldWhat it does
searchTermsWords to search for, as a shopper would type them. Each term is searched at every store.
categoryUrlsCategory pages such as https://www.wholefoodsmarket.com/products/dairy-eggs or .../products/milk-cream, or just the last part (milk-cream).
productUrlsProduct pages, or Amazon ASINs such as B09FBLV8QY. Each is checked at every store.
zipCodesFive-digit ZIP codes. Each gives the store wholefoodsmarket.com picks for it.
storeIdsWhole Foods store numbers, for example 10145 (Lamar, Austin TX). Shown on every row as storeId.
maxItemsPerQueryProducts per search term or category at each store (default 100).
maxItemsProducts in total (default 1,000; 0 means no limit, your spending limit still applies).
onSaleOnlyOnly products on sale or with a Prime member price.
includeDetailsOpen each product's page for its UPC, ingredients, diets, certifications, category path and availability (default on). Off is faster.
includeFailuresAdd a free row for each ZIP code without a store, empty search or unreadable product (default on).
maxConcurrency, proxyConfigurationJobs at once (default 4) and the proxy (US residential by default).

Output

One row per product per store. A row from the run above, with long text shortened:

{
"retailer": "Whole Foods Market",
"storeId": "10145",
"storeName": "Whole Foods Market Lamar",
"storeAddress": "525 N Lamar Blvd.",
"storeCity": "Austin",
"storeState": "TX",
"storeZip": "78703",
"requestedZip": "78704",
"productId": "B09FBL77P3",
"upc": "099482516673",
"name": "Organic Whole Milk, 64 FZ",
"brand": "365 by Whole Foods Market",
"size": "64 FZ",
"sizeQuantity": 64,
"sizeUnit": "fl oz",
"price": 4.49,
"regularPrice": 4.49,
"salePrice": null,
"onSale": false,
"loyaltyPrice": null,
"loyaltyPriceLabel": null,
"currency": "USD",
"unitPrice": 0.0702,
"unitPriceUnit": "fl oz",
"unitPriceComputed": true,
"promotionText": null,
"promotionStart": null,
"promotionEnd": null,
"inStock": true,
"category": "Milk & Cream",
"categoryPath": ["Dairy & Eggs", "Milk & Cream"],
"imageUrl": "https://m.media-amazon.com/images/S/assets.wholefoodsmarket.com/PIE/product/41AmX6HGOvL.jpg",
"productUrl": "https://www.wholefoodsmarket.com/product/365-by-whole-foods-market-organic-whole-milk-64-fz-b09fbl77p3",
"source": "365 organic whole milk",
"sourceType": "search",
"position": 3,
"scrapedAt": "2026-10-04T15:59:32Z",
"charged": true,
"dietTags": ["Organic"],
"certifications": ["Certified Organic"],
"ingredients": "ORGANIC MILK VITAMIN D3"
}
  • price is what a shopper pays without Prime: the sale price when there is one, otherwise the regular price. loyaltyPrice is the Prime member price (loyaltyPriceLabel: "Prime member price"), with promotionStart and promotionEnd.
  • unitPrice is worked out from the price and the size (unitPriceComputed: true), per fluid ounce, ounce or count. It is left empty when the size could mean one item or the whole pack (for example "4PK, 12 fl oz"). Products sold by the pound (soldByWeight: true) have their price per pound.
  • upc is the 12-digit UPC-A. Whole Foods publishes it without the check digit; the check digit is added.
  • requestedZip is the ZIP code you gave that led to the store; it is empty when you chose the store by number.
  • Fields the retailer does not publish (aisle, stock level, rating, SNAP) are present and empty, so rows from the other grocery scrapers in this series line up column for column.
  • Failure rows have error set and charged: false.
  • The run's key-value store has RUN-SUMMARY: stores used, products written, failures, stop reason and traffic.

Where the prices come from

Each price is the price wholefoodsmarket.com shows for that store at the time in scrapedAt. Prices differ between stores and change with weekly sales; always use the store columns (storeId, storeName, storeZip) with the price. The site's prices are its in-store catalogue prices; delivery or pickup ordered through Amazon can be priced differently. The Actor does not read Amazon.com.

Use it from code, automations and AI agents

  • API: run it and get the results in one call: POST https://api.apify.com/v2/acts/zaiq~whole-foods-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
  • Python (pip install apify-client):
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/whole-foods-scraper").call(run_input={'searchTerms': ['milk'], 'zipCodes': ['78704'], 'maxItemsPerQuery': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
  • No code: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
  • AI agents (MCP): add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: https://mcp.apify.com?tools=zaiq/whole-foods-scraper.

Pricing

You pay only for product rows: $0.005 per product ($5 per 1,000), Apify platform usage included. Failure rows, duplicates and retries are free. Your spending limit for the run is respected: the run stops cleanly before going over it.

Limits

  • One store per ZIP code: the one wholefoodsmarket.com assigns. To compare several stores in one city, give their store numbers.
  • A search or category returns at most 10,000 products (the site's own limit); split big categories into smaller ones.
  • Product details add one small request per product; for large daily price checks, switch them off.
  • No ratings, reviews, aisle locations or stock counts: wholefoodsmarket.com does not publish them.
  • Only stores in the United States.

FAQ

Do I need a Whole Foods or Amazon account? No. The Actor reads the public store catalogue and never signs in.

How do I find a store number? Run once with a ZIP code: every row has storeId, storeName and the address.

Why is a product missing at one store? Stores carry different ranges. A product URL that a store does not carry comes back as a free row saying so.

Why is the unit price empty for some products? When the size is ambiguous (a pack count next to a size), the Actor does not guess; the price and size are still there.

Can I get only deals? Yes: switch on Deals only. Every row then has a sale price or a Prime member price.