Grocery Flyer Scraper — Weekly Deals & Price Drops
Pricing
$80.00 / 1,000 per merchant flyer digests
Grocery Flyer Scraper — Weekly Deals & Price Drops
Scrape every grocery store flyer for a US ZIP or Canadian postal code from Flipp: item name, sale price, brand and validity dates across 110+ merchants. Tracks week-over-week price drops and outputs a markdown digest ready for an AI meal planner. No login or API key.
Pricing
$80.00 / 1,000 per merchant flyer digests
Rating
0.0
(0)
Developer
Scrapers Delight
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Get every grocery store flyer for a US ZIP or Canadian postal code in one run — item name, sale price, brand, and the exact dates the deal runs — across 110+ merchants from a single input.
Then it does the part nobody else does: tells you what changed since last week.
🔄 Since last run (2026-08-03)26 new · 56 cheaper · 0 pricier · 0 endedPrice drops| Item | Was | Now | Save | Merchant || Fresh Boneless, Skinless Chicken Breast | $8.19 | $6.69 | $1.50 | Starsky || Long Eggplant | $3.48 | $1.98 | $1.50 | Food Depot |
What you get
One row per flyer item:
| field | notes |
|---|---|
merchant, merchantId | the store |
name, brand | product as printed on the flyer |
price, priceRaw | sale price (null when the flyer prints no price — see below) |
validFrom, validTo | exactly when the deal runs |
isMultiProductBundle | ⚠︎ flag — see the honesty note |
changeType | new · price_drop · price_rise · unchanged |
previousPrice, priceDelta | versus your last run |
imageUrl | product cutout image |
categories, flyerId, postalCode, locale | provenance |
Plus OUTPUT.md — a markdown digest in the key-value store: price drops sorted by biggest saving,
what's new this week, then the full listing grouped by merchant. Paste it straight into ChatGPT/Claude
and ask for a meal plan built around what's actually on sale.
Pick your own stores
Most people shop at four or five places. Run once in discovery mode to see what's available:
{ "postalCode": "M5V3L9", "listMerchantsOnly": true }
That returns every store delivering flyers to your postal code — 115 for downtown Toronto, 51 of them grocery — with name, merchant ID, categories and flyer dates. Pick yours, then:
{ "postalCode": "M5V3L9", "merchants": ["sobeys", "Costco", "3384"] }
The merchants list accepts any mix of:
- store names, case-insensitive and partial —
"sobeys"matches"Sobeys" - merchant IDs from the discovery run —
"3384" - pasted flipp.com links — any 4+ digit run in the URL is read as a merchant ID
Anything that matches nothing is called out by name in the log rather than silently ignored, and an
explicit store list is never truncated by maxMerchants (that cap only guards unfiltered runs).
Picking stores also improves the data: a real-grocer list measured 91.3% price fill against 78.9% for the broad category filter.
Why stores and not flyer links
Flipp's website is a single-page app — a bogus flyer id and a real one return byte-identical HTML — so a pasted link can't be validated. And flyer IDs are reissued every week when new flyers publish, so a saved flyer link would break every 7 days. Merchant IDs are stable (verified: no merchant carries more than one), so a saved store list keeps working. Links are still accepted, but they're read as a merchant hint, not a flyer address.
Weekly monitoring
Set an Apify Schedule and each run diffs against the last one for that postal code. Flyers run
about seven days (validFrom→validTo), so weekly is the natural cadence — point it at the
morning your local flyers drop. Daily works too and costs little; most days will simply report few
changes.
- Run 1 writes the baseline and reports no changes.
- Run 2+ label every row and add the "Since last run" section.
- Snapshots are per postal code + locale, so you can track several areas independently.
onlyChanges: truenarrows the dataset to just new + changed rows, ideal for a recurring schedule.
Input
| input | default | notes |
|---|---|---|
postalCode | — required | M5V3L9 (Canada) or 10001 (US). Partial codes are rejected. |
merchants | — | Your stores: names, merchant IDs or pasted links. Empty = use the category filter. |
listMerchantsOnly | false | Discovery run — return the available stores and scrape nothing. |
locale | en-ca | en-ca or en-us. US and Canada only. |
maxMerchants | 15 | Uncapped, a dense metro emits ~18,000 items. |
categories | Groceries, Pharmacy, Restaurants | Filters flyers before fetching them. |
allCategories | false | Take every flyer (mostly hardware/sporting goods). |
trackChanges | true | Diff against your previous run. |
onlyChanges | false | Emit only what changed (ignored on run 1). |
includeMarkdown | true | Write OUTPUT.md. |
Pricing
$0.08 per merchant flyer digest — one charge per merchant, not per item. A default 15-merchant run costs about $1.20; all 139 merchants in a dense metro about $11.
Per-item pricing would be dishonest here: a single postal code yields ~18,000 items, so any sane per-row rate bills $45–113 for one run. The merchant-week is also the unit you actually care about. Merchants are charged before their rows are pushed, so if you hit a budget cap you get complete merchant digests rather than a fragment of every one.
Honest limits
- ~78% of items carry a price. Some flyer tiles are image-only or promotional; those come back
with
price: nullrather than a guess. - ~36% of item names bundle multiple products under one price — "RED BULL or GURU ENERGY DRINK,
$5.50". Those are flagged
isMultiProductBundleand marked ⚠︎ in the digest. Treat them as an offer, not a per-SKU price. If you are doing per-SKU price intelligence, filter them out. - US and Canada only. Other locales return no data.
- Change tracking matches on
merchant + normalised name, because item IDs are re-issued with each new flyer. About 1.4% of rows share a merchant+name pair and collapse into one tracked item. - An invalid-but-well-formed code (e.g.
00000) makes the upstream API return an empty list rather than an error; this Actor fails loudly instead of reporting a silent successful empty run.
Data comes from Flipp's public flyer service. You are responsible for complying with Flipp's Terms of Service and for how you use the data.