Superstore & No Frills Grocery Price Scraper API - Canada
Pricing
from $0.75 / 1,000 results
Superstore & No Frills Grocery Price Scraper API - Canada
Scrape Loblaws, Real Canadian Superstore & No Frills product data, prices, PC Optimum offers & deals. Fast, no-code Loblaws scraper. Export JSON/CSV.
Pricing
from $0.75 / 1,000 results
Rating
5.0
(1)
Developer
JChaw
Maintained by CommunityActor stats
3
Bookmarked
65
Total users
12
Monthly active users
3 days ago
Last modified
Categories
Share
Superstore, No Frills & Loblaws Grocery Price Scraper API
Extract grocery prices and product data from Real Canadian Superstore, No Frills, and Loblaws, including product names, current prices, sale prices, unit prices, package sizes, product images, product URLs, PC Optimum offers, and multi-buy deals.
This Actor is built for Canadian grocery price monitoring, retail analytics, grocery price comparison apps, food inflation research, and automated grocery data pipelines.
Use it to search products, scrape categories, monitor prices by postal code or store location, and export structured grocery data as JSON, CSV, Excel, or through the Apify API.
⚡ Quick start
Search Real Canadian Superstore for a few common items near Vancouver — paste this input and run:
{"banner": "superstore","search_terms": ["eggs", "milk", "chicken breast"],"postal_code": "V5X 0C4"}
Run in the Apify console
- Click Try for free (or Run) on the actor page.
- In the Input tab, paste the JSON above — switch to the JSON view first if needed.
- Click Start. Results stream into the Output tab as they arrive.
- Download from Storage → Dataset as JSON, CSV, or Excel.
Run via the API
Get your API token from console.apify.com/settings/integrations, then:
curl -X POST \"https://api.apify.com/v2/acts/sunny_eternity~loblaws-grocery-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"banner": "superstore", "search_terms": ["eggs", "milk", "chicken breast"], "postal_code": "V5X 0C4"}'
This synchronous endpoint is best for small test runs. It can timeout on larger scrapes. For scheduled runs, large categories, or recurring monitoring, use the async /runs endpoint and fetch results later from the returned defaultDatasetId. Official JavaScript and Python clients are also available.
Want a larger scrape? Use categories instead of search_terms (e.g., ["fruits-vegetables", "dairy-eggs"]). Replace "V5X 0C4" with your own Canadian postal code. Switch "banner" to "nofrills" or "loblaw" to target a different banner.
🔗 Related Actors
Need every Canadian banner in one call? Use the aggregate actor:
- Canadian Grocery Price Comparison — Query in, comparison out. One call, six banners (Loblaws, Real Canadian Superstore, No Frills, Save-On-Foods, PriceSmart Foods, T&T) with match-confidence scoring and normalized unit prices.
Pair this with our other per-retailer scrapers for full coverage:
- Save-On-Foods & PriceSmart Grocery Scraper — Western Canada coverage for Save-On-Foods and PriceSmart Foods.
- T&T Supermarket Scraper — Canada's largest Asian grocery chain, across BC, AB, ON, and QC.
Who is this for?
- Developers building grocery price comparison apps
- Retail analysts monitoring Canadian grocery prices
- CPG brands tracking competitor pricing and promotions
- Researchers studying food inflation and grocery affordability
- Data teams building product price databases
- Agencies and consultants creating retail dashboards
- Indie hackers building shopping, deal, or price alert tools
Features
- 🚀 Fast & reliable: No slow browser automation, no CAPTCHAs — get clean structured data in seconds
- 🛒 Three banners, one scraper: Extract data from Real Canadian Superstore, No Frills, and Loblaws with a single actor
- 📊 Complete product data: Names, prices, unit prices, package sizes, images, URLs, and product IDs
- 💰 Sale & promo tracking: Capture was-prices, multi-buy deals, and PC Optimum points offers
- 📍 Location-aware pricing: Auto-resolve the nearest store by Canadian postal code or specify a store ID
- ⚖️ Normalized unit prices: Get comparable $/100g or $/100ml pricing across products
- 📁 Multiple export formats: Download scraped data as JSON, CSV, or Excel
- 🔌 Integrations: Connect with Zapier, Make, Google Sheets, webhooks, and the Apify API
What data does Loblaws Grocery Scraper extract?
| 🏷️ Product name | 💲 Price & sale price |
|---|---|
| 📦 Package size (e.g., 500g) | 📊 Unit price (e.g., $0.66/100g) |
| 🖼️ Product image URL | 🔗 Product page URL |
| 🆔 Product ID | 📍 Store location ID |
| ⚖️ Selling type (by weight/by unit) | 📈 Comparable unit price (normalized) |
| 🏷️ Multi-buy deals | 💎 PC Optimum offers |
⬇️ Input
| Field | Type | Required | Description |
|---|---|---|---|
banner | string | ✅ | Store banner: superstore, nofrills, or loblaw |
categories | string[] | ❌ | Departments or subcategories to scrape (multi-select dropdown) |
categoryUrls | string[] | ❌ | Custom category URLs for subcategories not in the dropdown |
search_terms | string[] | ❌ | Keyword search queries (e.g., "milk", "organic eggs"); when combined with categories, acts as a name filter instead of a separate search call |
postal_code | string | ❌ | Canadian postal code to auto-resolve the nearest store |
locationId | string | ❌ | Explicit store location ID (takes priority over postal_code) |
At least one of
categories,categoryUrls, orsearch_termsmust be provided.
Category selection
The categories dropdown supports 130+ options organized by department:
- 📁 Departments (e.g.,
fruits-vegetables,deli) — scrapes all subcategories within - └ Subcategories (e.g.,
deli/deli-meat,bakery/bread) — scrapes a single subcategory all— scrapes the entire store across all departments
When you select a department, the actor dynamically discovers all its subcategories via the store's API and queues each one for scraping.
Example inputs
Single subcategory:
{"banner": "superstore","categories": ["bakery/bread"]}
Entire department:
{"banner": "superstore","categories": ["deli", "bakery"]}
Mix of departments and subcategories:
{"banner": "superstore","categories": ["meat", "dairy-eggs/cheese", "frozen-food/frozen-pizza"]}
Full store scrape with location:
{"banner": "superstore","categories": ["all"],"postal_code": "V6M 2P8"}
Search terms only:
{"banner": "superstore","search_terms": ["organic eggs", "oat milk"]}
Category + keyword filter:
{"banner": "superstore","categories": ["dairy-eggs"],"search_terms": ["cheese", "yogurt"]}
Note: When
categories(orcategoryUrls) andsearch_termsare both provided, the search terms act as keyword filters on the category results rather than triggering separate search API calls. Only products whose names contain at least one of the specified terms are returned. Usesearch_termsalone (withoutcategories) for a dedicated search query.
Custom URL (for L4 subcategories not in dropdown):
{"banner": "superstore","categoryUrls": ["https://www.realcanadiansuperstore.ca/en/food/fruits-vegetables/fresh-vegetables/lettuce-leafy-vegetables/c/29612"]}
⬆️ Output
Results are stored in a dataset accessible from the Output or Storage tab. Export as JSON, CSV, or Excel.
JSON output example
{"store": "Real Canadian Superstore","name": "Bananas","price": "0.69","unit_price": "454 g, $0.15/100g","image_url": "https://assets.shop.loblaws.ca/products/...","product_url": "https://www.realcanadiansuperstore.ca/bananas/p/...","product_id": "21023456","location": "1517","category": "fresh-fruits","selling_type": "by_weight","package_size": "454g","parsed_package_size": {"size": 454,"unit": "g"},"normalized_package_size": {"size": 454,"unit": "g"},"parsed_unit_price": {"value": 0.15,"quantity": 100,"unit": "g","unit_type": "weight"},"comparable_unit_price": 0.15,"was_price": 0.89,"is_on_sale": true,"multi_buy_deal": "2 for $1.00","pc_optimum_offer": "1000 points"}
Output fields
| Field | Description |
|---|---|
store | Store name (Real Canadian Superstore, No Frills, or Loblaws) |
name | Product display name |
price | Current price (without $ symbol) |
unit_price | Raw unit price string from store (e.g., "454 g, $0.15/100g") |
product_url | Direct link to product page |
selling_type | by_weight or by_unit — how the product is priced |
package_size | Package size as string (e.g., "500g", "2l") |
parsed_unit_price | Structured unit price with value, quantity, and unit |
comparable_unit_price | Normalized price per 100g or 100ml for comparison |
was_price | Previous price before sale (null if not on sale) |
is_on_sale | Whether the product currently has a deal |
multi_buy_deal | Multi-buy promotion text (e.g., "2 for $5.00") |
pc_optimum_offer | PC Optimum loyalty points offer, if any |
🏪 Supported stores
| Banner | Store Name |
|---|---|
superstore | Real Canadian Superstore |
nofrills | No Frills |
loblaw | Loblaws |
The scraper works identically across all three banners.
🔧 Environment variables
| Variable | Required | Description |
|---|---|---|
BULLSEYE_API_KEY | ❌ | API key for postal code → store ID resolution |
BULLSEYE_CLIENT_ID | ❌ | Client ID for postal code → store ID resolution |
These are only needed if you use the postal_code input field. If you always specify locationId directly, they are not required.
❓ FAQ
Is there an official Loblaws API?
Loblaws does not offer a public API for product or pricing data. This actor gives you a reliable, structured alternative — fresh grocery data without the maintenance overhead of building your own scraper.
Is it legal to scrape Loblaws?
Scraping publicly available product and price information is generally legal, but you are responsible for complying with Loblaws' terms of service and any applicable laws in your jurisdiction. Use the data responsibly and avoid excessive request volume.
How much does it cost to run?
The actor runs on Apify's pay-per-usage model. Small scrapes (a few categories or search terms) typically fit within Apify's free tier credits. Larger full-store scrapes scale with the number of products and API calls.
Can I scrape multiple categories at once?
Yes! Select multiple departments or subcategories in the categories dropdown, or use "all" to scrape the entire store. You can also combine categories with search terms in a single run.
How does category selection work?
Selecting a department (e.g., "Deli") scrapes all of its subcategories automatically. The actor queues every subcategory under the chosen department, so you get the full department's products in one run.
How do I find the location ID for my store?
Use the postal_code field instead — the actor will automatically resolve the nearest store. Alternatively, common Vancouver store IDs:
Real Canadian Superstore: 1517 (Marine Dr), 1520 (Grandview Hwy)
No Frills: 3641 (Denman), 3410 (Fraser), 3671 (Alma), 9532 (Hastings E)
Loblaws: 1050 (Toronto default)
Can I integrate the Loblaws scraper with other tools?
Yes! Use Apify integrations to connect with Zapier, Make, Google Sheets, Airbyte, and more. You can also trigger runs via webhooks or the Apify API and export scraped data as JSON, CSV, or Excel.
Can I schedule recurring Loblaws scrapes?
Yes — use Apify's built-in scheduler to run the actor daily, weekly, or on any cron schedule. This is ideal for tracking grocery price history over time or monitoring sales and PC Optimum offers.
📝 Your feedback
We're always working on improving the performance of our Actors. If you've got any technical feedback for Loblaws Grocery Scraper or found a bug, please create an issue on the Actor's Issues tab.