Flashfood Deals Scraper — Grocery Markdowns, Canada + US
Pricing
from $1.50 / 1,000 discounted items
Flashfood Deals Scraper — Grocery Markdowns, Canada + US
Scrape Flashfood's discounted near-expiry groceries by postal code, ZIP, city, store or the whole network: sale vs regular price, % off, best-before date, quantity left, department, barcode (GTIN) and store details. Monitor mode tracks new, repriced and sold-out items between runs.
Pricing
from $1.50 / 1,000 discounted items
Rating
0.0
(0)
Developer
Yugenox Corp
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Flashfood Deals Scraper — Grocery Markdowns in Canada + the US
Scrape the discounted, close-to-best-before groceries listed on Flashfood at No Frills, Loblaws, Real Canadian Superstore, Maxi, Provigo, Zehrs, Atlantic Superstore, Giant Eagle, Meijer, Tops, DashMart and hundreds of independents. Search by postal code, ZIP, city or coordinates, pull specific stores, or sweep the whole network (about 2,100 stores and 30,000+ live deals).
Each row is one discounted item: sale price vs regular price, % off, best-before date, days left, quantity left, department (English + French), barcode (GTIN) when available, photos, and the store it is at, with address, coordinates, distance, opening hours and pickup instructions.
Monitor mode compares each run with the previous one and outputs only what changed: new markdowns, price and quantity changes (with units sold since the last run), and items that sold out or expired.
No account or login is needed.
What you can do with it
- Deal-finder apps and newsletters: "50%+ off meat within 5 km of M5V", refreshed every hour.
- Shrink and markdown analytics for grocers and CPG brands: what gets marked down, where, how deep, how close to expiry, and how fast it sells.
- Price research: pair the
loblawUpc/gtinfields with regular shelf-price data to compare markdown prices with regular prices. - Food-rescue and community groups: find surplus fresh food near a neighbourhood.
- Store directories: every Flashfood partner store with coordinates and hours (stores-only mode).
Input examples
Deals near a postal code (the default form):
{ "locations": ["M5V 2T6"], "radiusKm": 20, "maxItems": 200 }
Several cities, only meat and seafood, 40%+ off, best before within 3 days:
{"locations": ["Toronto, ON", "Montréal, QC", "Pittsburgh, PA"],"radiusKm": 30,"departments": ["Meat", "Seafood"],"minDiscountPercent": 40,"expiringWithinDays": 3}
Specific stores (use storeId from any earlier run):
{ "storeIds": ["5ccc4fa913ed23170c14db02"], "includeStores": true }
The whole network, Canada only:
{ "fullNetwork": true, "countries": ["CA"] }
Hourly change feed (schedule this):
{ "locations": ["M5V 2T6"], "radiusKm": 10, "monitorMode": true, "stateKey": "toronto-core" }
Locations
Any of these work:
- a Canadian postal code:
M5V 2T6, or just the first three charactersM5V - a US ZIP code:
48226 - a place:
Toronto, ON,Pittsburgh, PA,Montréal,Detroit, Michigan, USA - coordinates:
43.6532,-79.3832
Every store within radiusKm is scraped, nearest first. There is no cap of 100 stores: large areas are split automatically until every store has been found.
Filters
| Input | What it keeps |
|---|---|
banners | Chains, e.g. No Frills, Maxi, Giant Eagle, Meijer (ignores case, spaces and accents) |
countries | CA and/or US |
keywords | Item names containing a word, e.g. salmon, poulet, bread |
departments | Departments, in English or French, e.g. Meat, Boulangerie |
minDiscountPercent | At least this % below the regular price |
maxPrice | Sale price at or below this amount |
expiringWithinDays | Best before within N days (0 = today) |
maxItems / maxStores | Caps for the whole run |
Output
One row per item (kind: "item"). This is a real row:
{"kind": "item","itemId": "6ab30bbf0be6e43a5fab9833","name": "PURI FANC GEMS MSE TUNA","price": 1.25,"originalPrice": 2.5,"discountPercent": 50,"savings": 1.25,"currency": "CAD","quantityAvailable": 1,"bestBefore": "2027-06-01","daysToExpiry": 251,"department": "Grocery","departmentFr": "Épicerie","legacyDepartment": "Grocery","storageTreatment": "NONE","isSnapEligible": false,"listedAt": "2026-09-22T23:14:07.233Z","imageUrl": "https://img.flashfood.com/products/lcl/media/en/5580/00005580055068_0_a1c1_000600_front_a05_@2.jpeg","imageGallery": ["https://img.flashfood.com/products/lcl/media/en/5580/00005580055068_0_a1c1_000600_front_a05_@2.jpeg"],"gtin": "00005580055068","loblawUpc": "05580055068","storeId": "5f2cdb299108010bf40533e2","storeName": "Jotis No Frills Vancouver","banner": "Nofrills","storeAddress": "310 West Broadway","city": "Vancouver","stateCode": "BC","countryCode": "CA","storeLatitude": 49.2628406,"storeLongitude": -123.1115665,"distanceKm": 1.57,"timezone": "America/Vancouver","storeHours": { "mon": "08:00-21:00", "tue": "08:00-21:00", "wed": "08:00-21:00", "thu": "08:00-21:00", "fri": "08:00-21:00", "sat": "08:00-21:00", "sun": "08:00-21:00" },"isEBTEnabled": false,"pickupInstructions": "Please see a cashier for order pickup and confirmation.","queryLocation": "Vancouver, BC","scrapedAt": "2026-09-24T05:40:47.467Z"}
Fields
Item: itemId, name, price, originalPrice, discountPercent, savings, currency (CAD or USD), quantityAvailable, bestBefore (YYYY-MM-DD), daysToExpiry (counted from today's date at the store), department, departmentFr, legacyDepartment, storageTreatment (FRESH_TO_FROZEN means "freeze on arrival"), isSnapEligible (US), listedAt, imageUrl, imageGallery, gtin, loblawUpc
Store: storeId, storeName, banner, storeAddress, city, stateCode, countryCode, storeLatitude, storeLongitude, distanceKm (from your location), timezone, storeHours, isEBTEnabled, pickupInstructions
Run: queryLocation, scrapedAt
Monitor mode adds: changeType (NEW, UPDATED, UNCHANGED, SOLD_OUT, EXPIRED), changedFields, previousPrice, previousQuantity, quantityDelta, unitsSoldSinceLastRun, firstSeenAt, hoursSinceLastRun
Store rows (includeStores or storesOnly, kind: "store"): address, coordinates, hours, pickup and checkout instructions, logo, website, and itemCount, the number of deals the store has listed right now.
A run summary (counts per location, change totals in monitor mode) is saved as the RUN_REPORT record in the run's key-value store.
Barcodes
gtin is filled for items listed from a retailer's product catalogue: most packaged goods at Loblaw banners, DashMart, Ren's Pets and some US chains. That is about 44% of all items across the network and around 60% in big Canadian cities. Items a store photographed itself, such as produce boxes and in-store bakery goods, have no barcode, so gtin is null for them.
loblawUpc is the same code in the format Loblaw's own product data uses (11 digits, no check digit). Use it to join Flashfood markdowns onto Loblaw shelf prices. It is only filled for Loblaw-banner packaged items.
Monitor mode
Turn on monitorMode and schedule the actor, for example hourly. Each run is compared with the previous run that used the same stateKey:
- NEW: the item was not listed last time.
- UPDATED: the price, regular price, quantity or best-before date changed.
changedFieldslists which ones, andunitsSoldSinceLastRunshows how many units went since the last run. - SOLD_OUT: the item was listed last time and is gone now, before its best-before date.
- EXPIRED: the item is gone and its best-before date has passed.
Unchanged items are left out, and not billed, unless you turn on emitUnchanged. Only stores that were fully scraped in a run can report sold-out items, so a run cut short by maxItems never reports false sell-outs.
Coverage
Flashfood is Canada-first. Canada has about 1,200 stores (Ontario, Quebec, Alberta, BC, the Maritimes and the Prairies), mostly Loblaw banners plus independents, DashMart and Ren's Pets. The US has about 900 stores, concentrated in Michigan, Ohio, Pennsylvania, New York, Indiana and Virginia (Giant Eagle, Meijer, Tops, Kroger, SpartanNash and regional grocers). A full network sweep on 2026-09-24 returned 33,082 live items: 18,336 in Canada and 14,746 in the US.
Some places have no Flashfood stores, including Boston and Washington DC. A location with no stores in range finishes normally with 0 items and a status message saying so, and no item is charged (only the small per-run start fee).
Speed
- A 20 km radius in a big city: roughly 5–15 seconds for 1,000–2,500 items.
- The whole network: about 3 minutes for about 33,000 items.
FAQ
How fresh is the data? It is live. Every run reads what is listed on Flashfood at that moment, and markdowns change throughout the day.
Do I need a Flashfood account? No. No login needed: no Flashfood account, cookie, phone or API key of your own. Datacenter proxies are enough (the free automatic Apify Proxy group works).
Is it legal to scrape Flashfood? This actor collects only publicly available information that the Flashfood app shows to anyone browsing deals without signing in: the discounted items each store lists (name, price, regular price, best-before date, quantity, photo) and the stores' business details (address, hours, pickup instructions). It does not collect information about individual people: it never touches user accounts, orders, carts or payments. Scraping public data is generally lawful, but how you use the results is up to you: follow the laws that apply to you (for example PIPEDA, CCPA or GDPR) and Flashfood's terms, and check with a lawyer if you are unsure. Apify's guide is a good starting point: Is web scraping legal?
Does it access any private data? No. It reads only the public store and deal listings. Everything behind a Flashfood login (your account, orders, payment methods) is never requested.
Why is gtin empty for some items? Those items were photographed in the store rather than listed from a product catalogue, so there is no barcode to report. See Barcodes.
What does daysToExpiry: 0 mean? The best-before date is today, at the store's local time.
Can I get a store's full list of deals? Yes. Put its storeId in storeIds and leave the filters empty.
What does a run cost? You pay per item row, plus the small per-run start fee shown on the Pricing tab. Store rows that come with items (includeStores) are free; in stores-only mode each store row is billed as a store event, because the store list is then the whole result. A run that finds nothing, or that stops because of an input problem, is charged the start fee only.
What if something goes wrong? The run still finishes as Succeeded, keeps everything it collected, and explains what happened in its status message. If your run's timeout is too short for Flashfood to answer, the message says so (60 s is plenty for most runs).
What if Flashfood updates its app? The scraper adapts on its own: it picks up a new app access key, slows down if Flashfood starts rate-limiting, and adjusts if Flashfood changes how many stores it returns per request. The status message says when that happened.