FoodHero Scraper - Grocery Deals, Prices & Stores
Pricing
from $1.20 / 1,000 deal or store records
FoodHero Scraper - Grocery Deals, Prices & Stores
Scrape FoodHero surplus grocery deals across Canada by area, store or offer ID. Extract products, brands, regular and discounted prices, savings, portions left, best-before dates and CO2 savings, plus store names, chains, addresses, coordinates and types.
Pricing
from $1.20 / 1,000 deal or store records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
FoodHero Scraper - Surplus Grocery Deals in Canada
Collect discounted surplus-grocery deals from FoodHero, the Canadian app that helps stores sell surplus food before it goes to waste. Search by area, or paste a store or offer id, and get one clean row per deal with the product, both prices, the discount, how many portions are left, the best-before date, and the store behind it.
FoodHero operates in Canada. The default connection settings work on every plan, and which deals you get back is decided by the areas you search, not by where the connection exits.
What you get
One row per surplus deal (recordType: "offer"), with:
- Product - name, brand, description, size, department, photo
- Price - regular price, deal price, discount %, currency (CAD)
- Availability - portions left, sold-out flag, last-call flag, best-before date (raw and ISO)
- Impact - CO2 saved, new-arrival flag
- Store - name, chain, store type, full address, city, province, postal code, coordinates, distance from your search point, and (optionally) phone, website and description
A pasted store that lists nothing right now comes back as a single store row
(recordType: "store") so a target you named always returns something.
Input
- Mode - Search deals by area or Store or offer ids.
- Areas to search (search mode) - one or more
lat,lngpairs or Canadian place names (Toronto, Montreal, Vancouver). Leave empty to cover every FoodHero city in Canada at once. - Radius (km) - keep only stores within this distance of each area.
- Store name contains - keep only stores whose name matches (Sobeys, IGA, Safeway, Foodland, Thrifty…). Applies in both modes.
- Include sold-out deals - also return deals with zero portions left.
- Add store phone, website and description - richer store contact info (one extra request per store, so a little slower).
- Store or offer ids (URL mode) - one target per entry. FoodHero has no public web
page for a store, so paste its 24-character id: a bare id is read as a store, or
prefix it (
store/<id>oroffer/<id>) to be explicit. - Max items / Max pages per area - limits.
- Resume from a previous run - paste an interrupted run's ID (or its dataset ID) to carry on without returning what it already saved.
- Incremental mode - for scheduled runs: after the first run, return only what is NEW, UPDATED or REAPPEARED. Optional Emit unchanged / Emit expired toggles.
- MCP connectors - optionally pipe the results into apps you already use.
- Proxy - the default shared pool reaches FoodHero on every plan; leave it as it is unless you have a reason to use your own proxy.
Resume and recurring updates
These are two different things.
Resume finishes ONE interrupted collection. Paste that run's ID (or its
dataset ID) into resumeFromRunId and the deals it already saved are skipped.
Incremental mode is for running the same selection again and again - every
morning, say, to watch fresh surplus appear and sold-out deals disappear. The
actor remembers the previous run of that selection and, from the second run on,
returns only what changed. Each row then carries changeType, changedFields,
firstSeenAt and lastSeenAt. Memory is kept per selection (mode, areas,
radius, store-name filter, sold-out toggle and pasted ids); set stateKey to
name a campaign or to deliberately share one.
EXPIRED rows are only produced when a run scanned the whole selection. A run
stopped by maxItems or maxPages, a run whose area could not be fully read, a
run where a pasted id was refused, and a resumed run all skip that step and say
so in the log: a partial scan must never report a live deal as gone.
Example output
{"recordType": "offer","productName": "Sliced Braided Brioche","productBrand": "Sample Bakery","price": 13.99,"discountPrice": 7.0,"discountPercent": 50,"currency": "CAD","itemLeft": 1,"isSoldOut": false,"bestBeforeAt": "2027-01-22T15:56:05+00:00","storeName": "IGA Complexe Desjardins","city": "Montreal","state": "QC","country": "CA","latitude": 45.5075,"longitude": -73.5654,"distanceKm": 0.65}
Send results into your apps (MCP connectors)
Results can optionally be piped into apps you already use, through Model Context
Protocol connectors, as a delivery step after the collection. Authorize a
connector under Apify, Settings, API and Integrations, then select it in the
mcpConnectors field of the input. For Notion, also set notionParentPageUrl
to the page under which deal pages should be created; maxNotifyListings caps
how many deals are written to each connector.
What arrives in the connector is a condensed, human readable summary per deal: a
title plus the key fields flattened to plain text. Nested objects collapse to
their main value and long lists are trimmed to a few entries, so a long product
description may be shortened there. The complete record always stays in the
Apify dataset, which this step never changes. Leaving mcpConnectors empty
skips the export entirely.
Notes
- The actor reads live availability, so deals change through the day - run again later to catch fresh surplus.
- Access to the deals is handled for you behind the scenes; no account setup is needed. Keep your usage respectful of FoodHero's terms.
- FoodHero currently operates in Canada, so searching outside Canada returns nothing. Use Canadian areas - or leave the area empty to cover every FoodHero city at once.