Foodland, Thrifty Foods, IGA & FreshCo Scraper — Canada
Pricing
from $0.75 / 1,000 results
Foodland, Thrifty Foods, IGA & FreshCo Scraper — Canada
Prices, promotions and full nutrition panels for 150,000 products across four Canadian grocery banners. Compare the same SKU between stores.
Pricing
from $0.75 / 1,000 results
Rating
0.0
(0)
Developer
Michael Hill
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
1
Monthly active users
4.7 days
Issues response
2 days ago
Last modified
Categories
Share
Most grocery scrapers give you a name and a price. This one gives you the regular price, the sale price, and the date the promotion ends — plus a 16-field nutrition panel — across four Canadian grocery banners at once.
Foodland, Thrifty Foods, IGA and FreshCo, in one run. About 150,000 products combined, across 700 stores. Enter a postal code to get the nearest store's own prices on each banner, or pick up to 10 stores by number. Export to CSV, Excel, JSON, or pull it straight from the API.
Why this one
| Typical grocery scraper | This Actor | |
|---|---|---|
| Current price | ✅ | ✅ |
| Regular price when an item is on sale | ❌ | ✅ regularPrice |
| When the promotion ends | ❌ | ✅ priceValidUntil |
| Multi-buy offers ("Buy 2 for $12") | ❌ | ✅ multiBuyQuantity, multiBuyPrice |
| Full nutrition panel | ❌ | ✅ 16 fields |
| Same product across several stores | ❌ | ✅ shared sku |
If you are tracking promotions rather than just prices, that middle block is the difference between "this costs $4.99" and "this is $4.99 until Wednesday, normally $6.79."
The four banners
| Banner | Stores | Where | Products |
|---|---|---|---|
| Foodland | 210 | Ontario, Nova Scotia, Newfoundland and Labrador, New Brunswick, PEI | 43,000 |
| Thrifty Foods | 26 | British Columbia | 38,000 |
| IGA | 300 | Quebec, New Brunswick | 39,000 |
| FreshCo | 167 | Discount: Ontario, Alberta, BC, Manitoba, Saskatchewan, Nova Scotia | 33,000 |
All four are Empire Company banners and share one product ID. The same sku identifies the same item in every store, so a single run gives you the same product priced in Ontario, BC and Quebec side by side — which is exactly the comparison a plain price scraper cannot do.
Sobeys and Safeway are covered by separate Actors and use the same sku, so all six line up together.
What you get
| Field | Example |
|---|---|
banner | Foodland — which banner the row came from |
name | Compliments Canola Oil 100% Pure 946 ml |
brand | Compliments (empty for unbranded items) |
price | 6.29 — the current price, promotional if one is running |
regularPrice | 8.49 — the regular price; same as price when nothing is on offer |
onSale | true / false |
priceValidUntil | 2026-09-16 — when a promotion ends |
priceAboveRegular | true / false — true when the banner's own data lists a price above the regular price (rare; see Notes) |
multiBuyQuantity | 2 — how many you must buy for the multi-buy price; empty when there is no multi-buy |
multiBuyPrice | 12.00 — what that many cost together ("Buy 2 for $12") |
multiBuyUnitPrice | 6.00 — the price per item when you buy that many |
multiBuyValidUntil | 2026-09-30 — when the multi-buy ends |
currency | CAD |
availability | InStoreOnly or OutOfStock |
storeId | 8253 — the banner's store number the price comes from (see Notes) |
storeName | IGA Atwater — that store's name |
storeAddress, storeCity, storeProvince, storePostalCode | the store's address |
storeDistanceKm | 1.8 — how far that store is from the postal code you entered; empty when you didn't enter one |
category | Oils, Vinegars & Salad Dressing |
categoryPath | Pantry > Oils, Vinegars & Salad Dressing |
sku | 135163 — the internal Empire ID, shared across banners; not a UPC |
imageUrl | Link to the product image, where one is published |
url | Link to the product page |
scrapedAt | ISO timestamp |
With Include nutrition panel on (the default), each row also carries servingSize, calories, fat, saturatedFat, transFat, omega3, omega6, cholesterol, sodium, carbohydrate, fibre, sugar, protein, calcium, iron and potassium.
What people use it for
- Promotion tracking — every discounted row carries the regular price and the end date, not just the sale price
- Regional price comparison — the same SKU in Ontario, BC and Quebec from one run
- Discount-banner benchmarking — FreshCo against the full-service banners, same product IDs
- Nutrition and diet apps — a large Canadian food database with real retail prices attached
- Research — food price inflation, assortment differences between regions
How to use it
- Pick your Banners. All four are selected by default.
- Put one or more words in Search terms —
milk,bread,coffee,chips ahoy. Leave it empty to walk the whole catalogue. Or, to get products you already know, paste their page addresses into Product URLs instead. - Optionally enter a Postal code, such as
H3C 2M2, to get the prices at the nearest store of each banner — or put store numbers in Store numbers. Leave both empty for the prices each website shows by default. - Set Maximum products. This is the total across all banners and stores, and it is your spend ceiling — the budget is split evenly between them, so 100 products across four banners is about 25 each.
- Run it. Results appear in the dataset tab and export in any format.
Finding the right products
- Search terms are matched against the product name in the page address. Accents, capitals and punctuation don't matter:
québon,QuebonandQUÉBONfind the same products, andlaysfinds Lay's. - A term with several words finds products that contain all of them, in any order.
chips ahoyfinds the Chips Ahoy products and nothing else;cookiefinds hundreds of cookies. Any term can match, somilkandcreamas two terms finds both. - Each word can match anywhere in the name, so short words catch more than you expect (
comalso matchescompliments). Products where the word stands on its own come first, somilklists milk before buttermilk. - French words work too. The names in the page addresses are mostly English, so common French grocery words also look for their English word:
laitfinds milk,biscuitsfinds cookies,croustillesfinds chips. When iga.ca also publishes its list with French names, a search reads that list as well. A product found under both names is returned and charged once. - Every match is listed, free, as
MATCHESunder the Storage tab, with its name and address, whether or not Maximum products let the run fetch it. When the maximum cuts a search short, the log says so. Copy the products you want fromMATCHESinto Product URLs. - Product URLs fetch exactly the pages you give, from any of the four sites, in English or French, with no product list involved. Store numbers and postal codes still apply: each page is priced at the chosen stores of its own banner.
- There is no search by SKU: the banners' page addresses don't contain it. Every row has its
sku, so a broader search and a filter onskuworks, and Product URLs fetch known products directly.
Tips
- Leave the proxy on. These banners block unproxied requests outright.
- If you see failures, lower Parallel requests.
Prices at your store, by postal code
Each banner prices every store separately, and its website shows the prices of whichever store is selected. This Actor can do the same:
- Postal code: enter one, such as
H3C 2M2(or justH3C), and the run prices products at the nearest store of each selected banner that has stores in that province. A Toronto code gets the nearest FreshCo and the nearest Foodland; a Montréal code gets the nearest IGA. Set Nearest stores to price, per banner up to 10 to compare the stores around you. Every row carries the store's number, name, address and its distance from your postal code. - Store numbers: if you already know them, put up to 10 in Store numbers instead, such as
8093for IGA Duke in Montréal, from any of the four banners. Each store is priced on its own banner, and store numbers take priority over a postal code. Every run saves the full list of stores (banner, number, name, address, postal code and coordinates) asSTORESunder the Storage tab. - Only each store's own prices are returned. For many products, a store has no price of its own; the website then quietly shows another store's price and says "Out of stock" at yours. This Actor checks every page and skips those products instead of passing another store's price off as yours. Skipped products are not charged. The run log says how many were skipped for each store.
- Maximum products is the total for the run, shared between stores: 100 products over 4 stores is 25 each. Every store of a banner works through the same products in the same order, so the stores' rows line up for comparison.
- Outside the banners' area: a postal code in a province where none of the selected banners has stores stops the run straight away with a clear message that says which banner (or which of the company's Sobeys and Safeway scrapers) does have stores there. So does a store number that isn't one of these banners' grocery stores. Nothing is scraped or charged per product. Pharmacy-only locations are left out, because they are not grocery stores.
- Distances are measured from the middle of the postal code's area (its first three characters), from the community itself for a full rural code (one with a 0 in second place), or from the store itself when you enter a store's own postal code, and rounded.
Pricing
$0.75 per 1,000 products, plus a $0.00005 start fee that is small enough to ignore. You are charged per product returned — nothing for products that fail, nothing for products a chosen store has no price for, and nothing for the sitemap pages the run reads to find them. Choosing stores does not change the price per product. A 100-product run costs about $0.08, and 1,000 products about $0.75.
Notes
- Prices can differ between stores of the same banner, and
storeIdsays whose price you have. In a small sample (29 products, 26 Sep 2026), wherever the default IGA store and another Quebec IGA both had their own price for a product, about one price in four differed, usually by 30 to 50 cents. Without a postal code or store numbers, each website prices a product from a default store, or from another store of the same banner when the default one has no price for it. In a 1,000-product random sample (250 per banner, 25 Sep 2026) the default store covered about one product in four at Foodland, half at FreshCo, and three in five at IGA and Thrifty Foods. These are the prices the website shows; in-store prices may vary. - Stock depends on the store. Items are listed
InStoreOnlyorOutOfStock, and with a store chosen that reflects the store you picked. - Multi-buy offers are included. "Buy 2 for $12" and "$2.99 each when you buy 2 or more" are not part of the price data the banners publish for search engines, so most scrapers miss them; this Actor reads them from the promotion data in the same page and reports the quantity, the total, the price per item and the end date. In the same sample, about one product in fifty carried an active multi-buy (22 of 997: Foodland 10, Thrifty Foods 9, IGA 2, FreshCo 1). Promotions change weekly, so treat that as a snapshot. Only offers open to every shopper are reported — Scene+ member-only offers, points, percentage-off and free-item deals are not.
priceAboveRegularflags a contradictory row. Very occasionally a banner's own data lists a price above the regular price — on one IGA product in September 2026, a "2 for $5" total was published as the price of one. The published values are passed through unchanged, and the flag lets you filter or check them.- Every product carries a price — 1,000 of 1,000 in the August random sample — but Foodland publishes a price of 0.00 on about 2% of products (6 of 250 in the September sample). Treat a 0 as "no price set", not as free.
- About a third of the catalogue is
OutOfStockat any time, and it varies by banner — Foodland runs nearest a quarter, Thrifty Foods nearer two in five. Those rows still carry price and nutrition data. - About one product in six is on offer at any time, ranging from 14% at FreshCo to 22% at Thrifty Foods.
- Roughly a quarter of products publish no image, and about one in ten no brand. IGA has the best brand coverage of the four. Missing values come back empty rather than missing, so your CSV columns stay stable.
- About four in five products publish usable nutrition data, and a filled panel averages roughly half of its sixteen fields.
- Nutrition values come through exactly as published, which means some are numbers (
220) and some are strings with units (21 g). A published0is a measured zero, not a gap. - This reads the structured product data each banner publishes on its own pages for search engines, and only follows URLs listed in their public sitemaps, or the product pages you give it. It does not touch account, cart, or checkout areas, which their robots.txt files disallow.
- Postal area locations come from GeoNames under the CC BY 4.0 licence.
Problems or requests
Open an issue on the Actor's Issues tab. Bug reports get fixed and reasonable field requests usually get added.