Retail, grocery prices
Canadian grocery prices by store and postal code, as an API
Pick Loblaw banners and a postal code, then search for products or take the whole store. You get one row per product at that specific store: shelf price, sale and PC Optimum member price with their end dates, unit price per 100 g or ml, UPC barcode and whether it is in stock. $0.69 per 1,000 products, with no account or API key.
- $0.69 per 1,000 products
- 12 banners, 1,107 stores
- UPC and stock on every row
- Member prices with end dates
Is there an official Loblaws or PC Express API?
No. Loblaw publishes no public pricing API, as the Actor's README says, so price data means either a paid data product or reading what the banner websites show any visitor. This Actor does the second, at the level of one store: each banner prices independently, so the same product can differ by a dollar or more between them, and every row names the store, its address and its distance from your postal code.
What one row holds
Each product row has 67 fields. The ones most people build on:
| Field | What it holds |
|---|---|
price, was_price, is_on_sale, sale_ends | Shelf price, the regular price when on sale, and when the sale ends |
member_price, member_price_ends | PC Optimum member-only pricing, kept apart from the shelf price |
comparable_unit_price, comparable_unit | Price per 100 g or 100 ml; empty when a package size won't parse, so a wrong number never enters a comparison |
upc (and gtin with details) | Barcodes, so prices join straight onto your own product list |
stock_status, is_shoppable | Whether the item is actually available at that store today |
deal_text, deal_ends, multi_buy_deal, purchase_limit, pc_optimum_points | Promotions and their expiry dates |
product_id | Shared across the Loblaw catalogue, so the same product joins across banners |
store, location_name, location_address, distance_km | Which store priced it |
Sponsored products that the storefronts insert into search pages are dropped by default (include_sponsored keeps them, flagged). include_details adds nutrition, ingredients, category path and GTIN at one extra request per product.
Banners and stores
banners value | Banner | Stores | Provinces |
|---|---|---|---|
nofrills | No Frills | 350 | AB, BC, MB, NB, NL, NS, ON, PE, SK |
maxi | Maxi | 198 | NB, QC |
independent | Your Independent Grocer | 181 | AB, BC, NB, NL, NS, NT, ON, PE, QC, SK, YT |
superstore | Real Canadian Superstore | 119 | AB, BC, MB, ON, SK, YT |
wholesaleclub | Wholesale Club | 56 | AB, BC, MB, NB, NL, NS, ON, QC, SK |
rass | Atlantic Superstore | 52 | NB, NS, PE |
loblaw | Loblaws | 48 | AB, BC, ON |
zehrs | Zehrs | 42 | ON |
fortinos | Fortinos | 24 | ON |
provigo | Provigo | 20 | QC |
valumart | Valu-mart | 14 | ON |
independentcitymarket | Independent City Market | 3 | ON |
A postal code outside a banner's provinces stops with a clear message naming the provinces it serves, so a Quebec postal code never quietly returns an Ontario store. Maxi and Provigo default to French; search them with French terms.
Compare chains and stores in one run
banners takes a list and stores_per_banner prices the nearest 1 to 10 stores of each, so "No Frills versus Loblaws, two stores each" is one run, with every row naming its store. Because product_id is shared across banners, the rows join directly for a side-by-side price table.
A weekly basket for pricing teams
Schedule the same input weekly and keep each run's dataset. Then compare price and member_price per product_id per store between runs. The cost is easy to bound: rows = search terms x max_items_per_search x stores. For example, 50 search terms with max_items_per_search set to 3, at 3 banners x 3 stores each, is at most 1,350 rows: $0.93 a run, about $4.04 a month on a weekly schedule. A whole store instead (all_products) runs from about 2,000 products at a small Valu-mart to about 21,000 at a large No Frills, $1.38 to $14.49 per store.
Weekly flyers from other chains
This Actor covers the 12 Loblaw banners only; it returns no Sobeys, Metro or Walmart rows. For flyer deals from those chains and 2,500+ other retailers near a postal code, use the weekly flyer API; together they give shelf prices at Loblaw stores and promoted prices everywhere else.
What it costs
| Event | Price | Charged for |
|---|---|---|
| Product row | $0.00069 | Each product saved to your dataset |
| Run start | $0.0002 | Once per run, per GB of memory (the default 512 MB is one) |
10,000 product rows cost $6.90 plus the run start. sunny_eternity/loblaws-grocery-scraper is close in price: $0.001 per row on the Free plan and $0.0007 on Business on 2026-10-15. Compare the fields you need on a small run. If you want a maintained index rather than raw rows, GroceryPulse sells one: a weekly panel of 13 cities and 21 banners, $1,250 USD a month for its team files or $2,500 USD for its commercial API (its pricing page, 2026-10-06). That buys history and methodology this Actor doesn't have.
Limits
- Current prices only. The Actor stores no history itself; your history is the runs you schedule and keep.
- Loblaw banners only. Twelve banners, not every grocer in Canada.
- Search depth. A search term returns up to
max_items_per_search(default 500) per store; around 25,000 products are reachable per store. - Whole stores take minutes. The catalogue is walked in repeated passes, so a large store takes several minutes; rows stream in while it runs.
Ask for it from ChatGPT, Claude or Cursor
The Loblaws Grocery Scraper (with the flyer scraper) works as a tool in ChatGPT, Claude, Cursor and VS Code through Apify's hosted MCP server. Add this URL as a custom connector and sign in with your Apify account; runs bill to that account. Then ask in plain English, for example "compare the price of 2% milk and large eggs at the nearest No Frills and Loblaws to M6H 1V4".
https://mcp.apify.com/?tools=fetch-actor-details,yugenox/loblaws-grocery-scraper,yugenox/flipp-flyer-deals-scraperclaude mcp add --transport http yugenox-grocery "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/loblaws-grocery-scraper,yugenox/flipp-flyer-deals-scraper"The AI setup guide walks through each client.
Run it from code
Two products at the two nearest No Frills and Loblaws stores to a Toronto postal code, at most 10 matches per search per store: at most 80 rows, $0.0552 plus the run start.
// Save as run.mjs, then: npm i apify-client && APIFY_TOKEN=... node run.mjs
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yugenox/loblaws-grocery-scraper').call({
banners: [
"nofrills",
"loblaw"
],
search_terms: [
"2% milk",
"large eggs"
],
postal_code: "M6H 1V4",
stores_per_banner: 2,
max_items_per_search: 10
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.store, item.name, item.price);import os
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yugenox/loblaws-grocery-scraper").call(run_input={
"banners": ["nofrills", "loblaw"],
"search_terms": ["2% milk", "large eggs"],
"postal_code": "M6H 1V4",
"stores_per_banner": 2,
"max_items_per_search": 10,
})
if run is None:
raise RuntimeError("Run did not finish")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item.get("store"), item.get("name"), item.get("price"))# Small jobs: runs the Actor and returns the rows in one call (up to 5 minutes).
curl -X POST "https://api.apify.com/v2/acts/yugenox~loblaws-grocery-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"banners":["nofrills","loblaw"],"search_terms":["2% milk","large eggs"],"postal_code":"M6H 1V4","stores_per_banner":2,"max_items_per_search":10}'Not affiliated with Flipp, Loblaw Companies Limited, its banners, PC Optimum or any retailer named on this page.
Questions people ask
Is there an official Loblaws or PC Express pricing API?
No. Loblaw publishes no public pricing API. This Actor returns the prices the banner websites show any visitor, priced at the store nearest your postal code.
Can I get Sobeys, Metro or Walmart prices?
Not from this Actor: it covers the 12 Loblaw banners. Their flyer deals are available through the Flipp Flyer Deals Scraper on the weekly flyer API page.
Does it keep price history?
No. It returns current prices and stores no history. Schedule it and keep each run's dataset, then compare price per product_id per store.
Can I compare one product across chains?
Yes. Pass several banners in one run. product_id is shared across the Loblaw catalogue, so rows from different banners join directly.
How many products can one run return?
A search term returns up to max_items_per_search (default 500) per store. all_products walks a whole store: about 2,000 products at a small Valu-mart to about 21,000 at a large No Frills.
Is it legal to scrape Loblaw banner websites?
The Actor collects only product, price and store information that anyone can see on the banner websites without an account. That is generally legal, but you are responsible for how you use it, including Loblaw's terms. Ask a lawyer if you are unsure.
Run it on your own data
Open the Loblaws Grocery Scraper on Apify, pick banners and a postal code and press Start. You pay per product from your own Apify account, with no subscription to us.
Last updated 2026-10-15.