# RONA Scraper: Canada Home Improvement Prices, Stock & Specs (`fayoussef/rona-scraper`) Actor

Scrape RONA.ca products in English and French from any category, search or product URL. Export price, sale price, regular price, stock by store, UPC, model, brand, rating, specs and images to JSON, CSV or Excel. Fast, reliable and maintained.

- **URL**: https://apify.com/fayoussef/rona-scraper.md
- **Developed by:** [Youssef Farhan](https://apify.com/fayoussef) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## RONA Scraper: Canada Home Improvement Prices, Stock & Specs

> **What is the RONA Scraper?** It is an Apify Actor that scrapes products from [RONA.ca](https://www.rona.ca), one of Canada's largest home improvement retailers, in **English and French**. Paste any RONA category, search or product URL and get one clean row per product: price, sale and regular price, stock across RONA stores, brand, model number, UPC, rating, category, specifications and images, as JSON, CSV or Excel.

**Scrape RONA prices and product data at scale.** One category of 210 cordless drills takes about 5 seconds; 1,000 products take well under a minute. The Actor covers RONA's whole online catalog (over 150,000 products on 2026-10-03), from tools and hardware to flooring, paint, appliances, outdoor and seasonal items, and returns every product in a listing, across all its pages.

Built for **contractors and resellers** comparing supplier prices, **competing retailers and brands** monitoring RONA pricing and promotions, **price comparison and deal sites**, **e-commerce and market research teams**, and **data teams** that need a RONA.ca API they can call on a schedule.

### A reliable RONA scraper, maintained regularly

RONA.ca sits behind two anti-bot systems (Cloudflare and DataDome) that change often and break simple scrapers without warning. This Actor is built to keep working:

- **It reads RONA's own product catalog data**, the same data the RONA website search loads, instead of fragile page layouts. A redesign of the site does not break it.
- **It is tested and maintained regularly.** When RONA changes something, the Actor is updated as fast as possible. Every run is monitored, so failures are usually spotted before anyone reports them.
- **Blocked requests are retried automatically** on fresh Canadian residential IPs, with clear progress lines in the log, so a run never looks frozen.
- **Bad input fails fast and loud**: a URL from another site, a typo in the domain or an unknown product is reported in the log in seconds, never retried in silence.
- **No duplicates**: each product appears once, even when several of your URLs or searches cover it.

Found a problem? Open an issue in the **Issues** tab and it gets fixed.

### Key features at a glance

- **Any RONA URL works**: category listings, sub-categories, promotion and seasonal pages, search results and single product pages, in English (`/en/product/...`) or French (`/fr/produit/...`).
- **Search terms**: type keywords in English or French (`dewalt drill`, `perceuse makita`), a SKU or a model number.
- **Bilingual output**: English and French title, description, category path and URL on every row.
- **Prices**: catalog price on every product; with **Product page details** on, the exact current price, regular price, savings amount and sale end date.
- **Stock**: the number of RONA stores that stock each product, optionally the store numbers, plus store and online stock with Product page details on.
- **Identifiers**: SKU (article number), UPC barcode, manufacturer model number, RONA product number.
- **Specifications**: the key specs from the catalog, plus the full specification table (often 30+ rows) with Product page details on.
- **Images**: the main image in high resolution, and every gallery image with Product page details on.
- **Big categories handled**: categories with more than 10,000 products are read through their sub-categories automatically, so nothing is cut off.
- **Export anywhere**: JSON, CSV, Excel, XML or JSONL, or straight into Google Sheets, Airtable, Make, Zapier or n8n.

### What data does the RONA scraper extract?

| Field | Example | Description |
|---|---|---|
| `sku` | 00277650 | RONA article number |
| `title_en` / `title_fr` | DEWALT 20V BRUSHLESS Compact Hammer Drill Kit... / Perceuse à percussion compacte DEWALT 20V... | Product name in English and French |
| `brand` | DEWALT | Brand |
| `model_number` | DCD798D1 | Manufacturer model number |
| `upc` | 885911657600 | UPC barcode |
| `price` | 148 | Current price in CAD |
| `regular_price` | 239 | Regular price before the sale (Product page details) |
| `on_sale` / `savings` / `sale_ends` | true / 91 / 2026-11-04 | Sale flag, amount saved and sale end date (Product page details) |
| `catalog_price` | 148 | Price from RONA's catalog, on every product |
| `price_source` | product page | Where `price` came from: `product page` or `catalog` |
| `rating` / `review_count` | 4.8 / 28 | Average customer rating and number of reviews |
| `stores_in_stock` | 213 | Number of RONA stores that stock the product |
| `store_ids_in_stock` | \["00397", "00904", ...] | Store numbers that stock it (option **List stocking stores**) |
| `store_stock` / `online_stock` | 6 / 73 | Units at your chosen RONA store and for online delivery (Product page details) |
| `stock_store_number` | 83162 | The RONA store the prices and stock refer to (option **RONA store number**) |
| `pickup_available` / `parcel_delivery_available` / `truck_delivery_available` | true | Fulfilment options (Product page details) |
| `category_path_en` / `category_path_fr` | Tools > Power Tools > Cordless Drills and Drivers | Full category path in both languages |
| `category_id` | 01-110-080-002 | RONA category id |
| `specifications_en` / `specifications_fr` | {"Battery Voltage": "20V MAX", ...} | Specifications; the full table is in `specifications_fr` with Product page details on |
| `description_en` / `description_fr` | This DEWALT 20V MAX\* brushless kit includes... | Product description in plain text |
| `image_url` / `images` | https://cdn.rona.ca/images/00277650\_L.jpg | Main image and gallery |
| `url_en` / `url_fr` | https://www.rona.ca/en/product/... | Product page in each language |
| `listed_on` | 2025-03-11 | Date the product was added to RONA's catalog |
| `scraped_at` | 2026-10-03T13:26:57+00:00 | When the row was scraped |

Every row also carries `sales_channel`, `availability`, `price_unit`, `product_number`, `rona_product_id`, `catalog_product_id`, `details_scraped`, `details_error`, `source` (the input that found it) and `search_match` (`keyword` or `similar` for search results).

#### Output example

```json
{
  "sku": "00277650",
  "title_en": "DEWALT 20V BRUSHLESS Compact Hammer Drill Kit with Battery and Charger",
  "title_fr": "Perceuse à percussion compacte DEWALT 20V, sans balais avec batterie et chargeur",
  "brand": "DEWALT",
  "model_number": "DCD798D1",
  "upc": "885911657600",
  "price": 148,
  "regular_price": 239,
  "on_sale": true,
  "savings": 91,
  "sale_ends": "2026-11-04",
  "currency": "CAD",
  "rating": 4.8,
  "review_count": 28,
  "stores_in_stock": 213,
  "store_stock": 6,
  "online_stock": 73,
  "category_path_en": "Tools > Power Tools > Cordless Drills and Drivers",
  "category_path_fr": "Outils > Outils portatifs > Perceuses et visseuses sans fil",
  "url_en": "https://www.rona.ca/en/product/dewalt-20v-brushless-compact-hammer-drill-kit-with-battery-and-charger-dcd798d1-00277650",
  "image_url": "https://cdn.rona.ca/images/00277650_L.jpg"
}
```

### How to scrape RONA products

1. Open a category, search or product on [rona.ca](https://www.rona.ca) and copy the URL from your browser.
2. Paste it into **RONA URLs** (add as many as you like), or type keywords into **Search terms**.
3. Set **Max products**, and turn on **Product page details** if you need exact sale prices, stock and full specs.
4. Click **Start**. Download the results as JSON, CSV or Excel, or connect them to your tools.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | list of URLs | Any rona.ca category, search, promotion or product URL, English or French |
| `searchTerms` | list of text | Keywords, SKUs or model numbers to search on RONA |
| `keywordMatchesOnly` | true / false | Skip the similar products RONA's search adds after the keyword matches |
| `maxItems` | number | Stop after this many products (empty = everything) |
| `productDetails` | true / false | Open each product page for exact prices, sale end date, stock, full specs and all images |
| `includeStoreIds` | true / false | Add the store numbers that stock each product |
| `storeNumber` | text | RONA store for prices, stock and clearance (default 83162, Mississauga, ON) |

```json
{
  "startUrls": [
    { "url": "https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003" },
    { "url": "https://www.rona.ca/fr/produit/perceuse-a-percussion-compacte-dewalt-20v-sans-balais-avec-batterie-et-chargeur-dcd798d1-00277650" }
  ],
  "searchTerms": ["laminate flooring"],
  "maxItems": 500,
  "productDetails": true
}
```

### Which RONA URLs are supported?

| URL type | Example |
|---|---|
| Category | `https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003` |
| French category | `https://www.rona.ca/fr/outils/outils-portatifs-158001/perceuses-et-visseuses-sans-fil-158003` |
| Department or landing page | `https://www.rona.ca/en/hardware`, `https://www.rona.ca/en/drills-and-drivers` |
| Seasonal or curated listing | `https://www.rona.ca/webapp/wcs/stores/servlet/RonaAjaxCatalogSearchView?navDescriptors=324411&...` |
| Brand page | `https://www.rona.ca/en/brand/bostitch` |
| Flyer deals and clearance | `.../RonaPromoFlyerView?navDescriptors=38805&...`, `.../RonaPromoClearanceView?navDescriptors=38893&...`, `https://www.rona.ca/en/promotions/clearance` |
| Filtered listing | Any category or search after you pick a brand, price range or other filter on rona.ca (`navDescriptors=1832+38827`, `navRangeFilters=...`) |
| Search | `https://www.rona.ca/en/search?q=dewalt`, `https://www.rona.ca/fr/recherche?q=perceuse` |
| Product | `https://www.rona.ca/en/product/...-00277650`, `https://www.rona.ca/fr/produit/...-00277650` |

Plain categories and searches are read from RONA's product catalog, which is fast. Brand, promotion, flyer, clearance and filtered listings are read page by page from rona.ca itself, so you get exactly the products the page shows, with the exact price on the listing (`price_source` = `listing page`). Paste the URL from your browser after setting your filters, and the Actor follows them.

### Who uses a RONA scraper?

- **Contractors, renovators and resellers**: compare RONA prices with other suppliers before buying in bulk.
- **Competing retailers and brands**: monitor RONA's prices, sales and promotions on the products you also sell, and check how your brand is listed.
- **Price comparison and deal sites**: track sale prices and sale end dates across Canada.
- **Market researchers and analysts**: build datasets of Canadian home improvement prices by category and brand.
- **E-commerce teams**: enrich your catalog with UPCs, model numbers, specs and images.

### Pricing

This Actor is **pay per event**: you pay for each product saved to the dataset, plus a separate event for each product whose page was opened when **Product page details** is on. Leave it off and you only pay for the products. **The current rates are shown on this Actor's Store page.**

| Event | What triggers it |
|---|---|
| Product | One product saved to the dataset |
| Product page details | One product page opened for exact prices, stock and full specs |

On the Apify Free plan, each run returns up to 50 products, so you can check the data before subscribing to an [Apify plan](https://apify.com/pricing?fpr=youssef).

### Tips

- **Track RONA prices over time**: schedule a daily or weekly run and add [Dataset Diff](https://apify.com/fayoussef/dataset-diff?fpr=youssef) to receive only price changes and new products by Slack, Telegram or email.
- **Fast and cheap first**: leave **Product page details** off for a quick catalog snapshot (price, brand, model, UPC, stock count). Turn it on when you need the exact sale price and end date.
- **Same results as RONA's search**: a search returns RONA's keyword matches first, then the similar products RONA suggests, exactly like rona.ca. Each row says which in `search_match` (`keyword` or `similar`). Turn on **Keyword matches only** to keep just the keyword matches (for `laptop`: 6 instead of 101).
- **Join with other retailers**: `upc` and `model_number` let you match RONA products with Home Depot, Canadian Tire or Amazon data.

### Frequently asked questions (FAQ)

**What is RONA?**
RONA is a Canadian home improvement retailer, founded in Quebec in 1939, with hundreds of stores across Canada and an online store at rona.ca in English and French.

**Is there a RONA API?**
RONA has no public API for its products. This Actor works as a RONA.ca API alternative: call it through the Apify API and get clean JSON for any category, search or product.

**What is the difference between `price` and `catalog_price`?**
`catalog_price` comes from RONA's catalog and is on every product. It matched the price shown on the website for most products in our tests, but during a sale it can show the regular price instead. With **Product page details** on, `price` is the exact price shown on the product page, with `regular_price`, `savings` and `sale_ends`.

**Why is the full specification table in French?**
RONA blocks automated access to its English product pages much more strictly than to the French ones, so the Actor reads product details from the French page. Prices, stock, ratings and identifiers are the same in both languages, and the key specs are also given in English in `specifications_en`.

**Why does a search return products that do not contain my words?**
RONA's own search does the same: after the products that match your words, it suggests similar products (for `laptop`, about 95 desks and accessories after 6 real matches). The Actor returns what rona.ca shows, and marks each row `search_match` = `keyword` or `similar`. Turn on **Keyword matches only** to drop the similar ones.

**Which store are prices and stock for?**
The store in **RONA store number** (default 83162, Mississauga, ON), shown on every row as `stock_store_number`. RONA's website picks a store from your location, and clearance lists and stock differ from store to store, so the Actor uses one fixed store for the whole run, which keeps runs comparable. `stores_in_stock` tells you how many RONA stores carry the product, and **List stocking stores** gives their numbers.

**Can I scrape a whole department?**
Yes. Paste the department URL (for example `https://www.rona.ca/en/hardware`) and leave **Max products** empty. Departments with more than 10,000 products are read through their sub-categories automatically.

**Does it support scheduling and alerts?**
Yes. Use the Apify scheduler to refresh daily or weekly, and [Dataset Diff](https://apify.com/fayoussef/dataset-diff?fpr=youssef) to get only what changed.

**Is it legal to scrape RONA?**
The Actor collects publicly listed product information (names, prices, stock, specs). It collects no personal data. You are responsible for using the data in line with RONA's terms and applicable law.

**Something is not working?**
Open an issue in the **Issues** tab and I will fix it quickly.

### Use via API or MCP

Call this Actor through the Apify REST API, or connect it to an AI agent (Claude, ChatGPT, Cursor) through the Apify MCP server, so an agent can look up RONA prices on demand:

```
https://mcp.apify.com/actors/fayoussef/rona-scraper
```

Full API docs: <https://docs.apify.com/api/v2>

### En français : extracteur de produits RONA

Cet Actor extrait les produits de [RONA.ca](https://www.rona.ca) en **français et en anglais** : prix, prix régulier, rabais et date de fin de la promotion, stock en magasin et en ligne, marque, numéro de modèle, CUP, note des clients, catégorie, caractéristiques et images. Collez n'importe quelle URL RONA (catégorie, recherche, promotion ou fiche produit, par exemple `https://www.rona.ca/fr/produit/...`) ou tapez des mots-clés comme `perceuse makita`. Résultats en JSON, CSV ou Excel, avec planification et API.

### Need a custom scraper?

Need Home Depot Canada, Canadian Tire or another retailer, extra fields or a scheduled price report? Email youssefarhan24@gmail.com or [suggest a site](https://automationbyexperts.com/apify). More Canadian data by me: [Kijiji](https://apify.com/fayoussef/kijiji-scraper?fpr=youssef), [AutoTrader.ca](https://apify.com/fayoussef/autotrader-canada?fpr=youssef), [RentFaster](https://apify.com/fayoussef/rentfaster-scraper?fpr=youssef), [Canada411](https://apify.com/fayoussef/canada411-ca?fpr=youssef).

# Actor input Schema

## `startUrls` (type: `array`):

Any rona.ca page, in English or French: a category listing (`https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003`), a search (`https://www.rona.ca/en/search?q=dewalt`), a promotion or seasonal listing (`.../RonaAjaxCatalogSearchView?navDescriptors=324411`) or a single product page (`https://www.rona.ca/en/product/...-00277650` or `https://www.rona.ca/fr/produit/...-00277650`). A listing returns every product in it, across all pages.

## `productDetails` (type: `boolean`):

Also open each product's page on rona.ca to add the exact current price, regular price, savings and sale end date, review count, store and online stock, delivery and pickup options, the full specification table (in French) and every product image. Slower and billed per product; without it you still get the catalog price, brand, model, UPC, rating, category, main specs and the number of stores that stock each product.

## `includeStoreIds` (type: `boolean`):

Add the RONA store numbers that have each product in stock (often 100+ per product). The count of stocking stores is always included.

## `storeNumber` (type: `string`):

The RONA store whose prices, stock and clearance listings you want, as a store number (for example `83162`). Leave empty for the default store, 83162 in Mississauga, ON. Every page of the run uses this one store, so results stay consistent between runs.

## `searchTerms` (type: `array`):

Optional keywords searched on RONA, one per line, in English or French (`dewalt drill`, `laminate flooring`, `perceuse`). Also accepts a SKU or a model number. Results match RONA's own search: keyword matches first, then the similar products RONA suggests (see Keyword matches only).

## `keywordMatchesOnly` (type: `boolean`):

For searches, skip the 'similar products' RONA adds after the real keyword matches (for `laptop`: 6 keyword matches, then about 95 similar desks and accessories). Off returns the same products as rona.ca search. Every search row has `search_match` = `keyword` or `similar` either way.

## `maxItems` (type: `integer`):

Stop after this many products in total. Leave empty to scrape every product the URLs and searches cover.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003"
    }
  ],
  "productDetails": false,
  "includeStoreIds": false,
  "keywordMatchesOnly": false,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One bilingual record per RONA product: price, sale, stock, brand, model, UPC, rating, category, specs and images.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/rona-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003" }],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/rona-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.rona.ca/en/tools/power-tools-158001/cordless-drills-and-drivers-158003"
    }
  ],
  "maxItems": 100
}' |
apify call fayoussef/rona-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fayoussef/rona-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/a3xNxaPcaBfgAs54B/builds/pSfbY2TgnbfgmeGwV/openapi.json
