# Canadian Tire Scraper (`crawloop/canadian-tire-scraper`) Actor

Scrape Canadian Tire product search: price, was-price, rating, SKU, and store quantity. Keyword or search URL. JSON export for price checks.

- **URL**: https://apify.com/crawloop/canadian-tire-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Canadian Tire Scraper

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Canadian Tire Corporation, Limited or its affiliates. Data is read from publicly accessible product search results only. No login. You are responsible for complying with applicable law and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

This Canadian Tire scraper reads the public product search and saves one row per product. Each row has the current price, the previous price when it is higher, the rating, the SKU, and the shelf quantity at the store number you set. Use it as a Canadian Tire API alternative: export JSON to a dataset from Python, Node.js, or an MCP assistant.

Reviews, flyers, and checkout are outside this Actor. A keyword or a search URL returns the public catalog cards for that query.

| Canadian retail search | US store price | US electronics |
| :--- | :--- | :--- |
| Canadian Tire Scraper ◄── you are here | [Walmart Scraper](https://apify.com/crawloop/walmart-scraper) | [Newegg Product Scraper](https://apify.com/crawloop/newegg-product-scraper) |

### When to use

- Pull current Canadian Tire prices for a keyword or a search URL
- Read shelf quantity at a chosen store number
- Keep only products flagged on sale
- Export SKU, brand, rating, and product URL to JSON

A product page URL saves that product only. Category trees and customer reviews are not separate modes.

### Key features

- Keyword search and search-results URLs
- One product from a product page URL
- Price, was-price, rating, review count, and SKU
- Shelf quantity for a store number
- English or French catalog
- Optional on-sale filter
- HTTP fetch, 256 MB, no browser

`maxItems` caps how many rows are saved. Products that are skipped by the sale filter are not charged.

### Input

| Field | Required | Description |
| :--- | :--- | :--- |
| `queries` | One of these | Search terms, such as `cordless drill` |
| `startUrls` | One of these | A search-results URL, or a product page URL |
| `storeId` | No | Store number for price and quantity. Default `365` |
| `language` | No | `en` or `fr`. Default `en` |
| `onSaleOnly` | No | Keep only products flagged on sale. Default false |
| `maxItems` | No | Stop after this many products. Default 40, maximum 1000 |

#### Input example

```json
{
  "queries": ["cordless drill"],
  "storeId": "365",
  "language": "en",
  "onSaleOnly": false,
  "maxItems": 40
}
```

### Output

| Field | Description |
| :--- | :--- |
| `title` | Product title |
| `brand` | Brand |
| `price` | Current price in CAD at `storeId` |
| `wasPrice` | Previous price when it is higher than `price` |
| `isOnSale` | Sale flag from the search card |
| `rating` | Average rating |
| `reviewCount` | Review count |
| `sku` | SKU |
| `code` | Product code |
| `storeQuantity` | Shelf quantity at `storeId` |
| `productUrl` | Product page |
| `searchTerm` | Query or product code that returned the row |

#### Output example

```json
{
  "code": "0548737P",
  "sku": "054-8737-2",
  "title": "Mastercraft 20V Cordless Drill/Driver with 76-pc Accessory Kit",
  "brand": "Mastercraft",
  "price": 129.99,
  "wasPrice": null,
  "currency": "CAD",
  "isOnSale": false,
  "rating": 4.38,
  "reviewCount": 156,
  "storeQuantity": 15,
  "storeId": "365",
  "productUrl": "https://www.canadiantire.ca/en/pdp/mastercraft-20v-cordless-drill-driver-0548737p.html",
  "searchTerm": "cordless drill"
}
```

### Use cases

- Check a short list of tools against the current catalog price
- Watch shelf quantity at one store number
- Build a sale list for a keyword without opening each product page

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/canadian-tire-scraper").call({
  queries: ["cordless drill"],
  storeId: "365",
  maxItems: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="YOUR_APIFY_TOKEN")
run = client.actor("crawloop/canadian-tire-scraper").call(run_input={
    "queries": ["cordless drill"],
    "storeId": "365",
    "maxItems": 40,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~canadian-tire-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"queries\":[\"cordless drill\"],\"storeId\":\"365\",\"maxItems\":40}"
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store name.

Example prompts:

- "Run Canadian Tire Scraper for cordless drill at store 365 and return title, price, and store quantity"
- "Scrape Canadian Tire for snow blower and keep only rows flagged on sale"
- "Run Canadian Tire Scraper for a product code, then compare the price with Walmart Scraper for the same tool"

### Suite next step

After the Canadian catalog row, run [Walmart Scraper](https://apify.com/crawloop/walmart-scraper) when the same product also needs a US store price.

### FAQ

#### Does this include reviews or the weekly flyer?

No. Each row is a product search card: price, rating count, SKU, and store quantity. Review text and flyer deals are not collected.

#### Which store is the price for?

`storeId` selects the store. Price and `storeQuantity` follow that number. The default is `365`.

#### Can I schedule a sale check?

Yes. Set `onSaleOnly` to true and schedule the run. Products that are not flagged on sale are skipped.

# Actor input Schema

## `queries` (type: `array`):

Canadian Tire product search terms, such as cordless drill.

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

Canadian Tire search-results URLs, or a single product page URL. A product URL saves that product only.

## `storeId` (type: `string`):

Canadian Tire store number used for price and shelf quantity. Default 365.

## `language` (type: `string`):

Catalog language.

## `onSaleOnly` (type: `boolean`):

Keep products flagged on sale. Other search hits are skipped and not charged.

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

Stop after this many products across all searches.

## Actor input object example

```json
{
  "queries": [
    "cordless drill"
  ],
  "storeId": "365",
  "language": "en",
  "onSaleOnly": false,
  "maxItems": 40
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "queries": [
        "cordless drill"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/canadian-tire-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 = { "queries": ["cordless drill"] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/canadian-tire-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 '{
  "queries": [
    "cordless drill"
  ]
}' |
apify call crawloop/canadian-tire-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/canadian-tire-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/gGfcO5c3pmzIFHGXU/builds/UPcKN8ykFyT4bXzYn/openapi.json
