Yugenox Data

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.

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:

FieldWhat it holds
price, was_price, is_on_sale, sale_endsShelf price, the regular price when on sale, and when the sale ends
member_price, member_price_endsPC Optimum member-only pricing, kept apart from the shelf price
comparable_unit_price, comparable_unitPrice 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_shoppableWhether the item is actually available at that store today
deal_text, deal_ends, multi_buy_deal, purchase_limit, pc_optimum_pointsPromotions and their expiry dates
product_idShared across the Loblaw catalogue, so the same product joins across banners
store, location_name, location_address, distance_kmWhich 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

Store counts from the README of build 0.1.14 (1,107 stores, read live from Loblaw's own store directory when the README was written), checked against the live build on 2026-10-15.
banners valueBannerStoresProvinces
nofrillsNo Frills350AB, BC, MB, NB, NL, NS, ON, PE, SK
maxiMaxi198NB, QC
independentYour Independent Grocer181AB, BC, NB, NL, NS, NT, ON, PE, QC, SK, YT
superstoreReal Canadian Superstore119AB, BC, MB, ON, SK, YT
wholesaleclubWholesale Club56AB, BC, MB, NB, NL, NS, ON, QC, SK
rassAtlantic Superstore52NB, NS, PE
loblawLoblaws48AB, BC, ON
zehrsZehrs42ON
fortinosFortinos24ON
provigoProvigo20QC
valumartValu-mart14ON
independentcitymarketIndependent City Market3ON

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

One price on every Apify plan, read from the Actor's pricing on 2026-10-15.
EventPriceCharged for
Product row$0.00069Each product saved to your dataset
Run start$0.0002Once 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

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".

MCP server URL
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.

JavaScript
// 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);

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.