# Canadian Tire, Sport Chek & Mark's Scraper: Prices & Stock (`alduinxx/canadian-tire-sport-chek-marks-scraper`) Actor

Scrape Canadian Tire, Sport Chek and Mark's: price, regular price, sale, clearance, sale end date, shelf stock and aisle at the store nearest a postal code, and online stock, for every size and colour. Search terms, category or product URLs, deals only, or the whole catalogue.

- **URL**: https://apify.com/alduinxx/canadian-tire-sport-chek-marks-scraper.md
- **Developed by:** [Michael Hill](https://apify.com/alduinxx) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 results

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

Prices, sales, clearance and stock for every product at **Canadian Tire**, **Sport Chek** and **Mark's**, with **one row per size and colour**: the price, the regular price, the sale's end date, the savings the site advertises, **shelf stock at the store nearest a postal code** (and the aisle, at Canadian Tire) and online stock.

### Why this one

| | This Actor |
|---|---|
| Three Canadian Tire Corporation banners in one run | ✅ Canadian Tire, Sport Chek, Mark's |
| One row per size and colour, with its own price and stock | ✅ `sku`, `colour`, `size` |
| Sale price, regular price, sale end date, advertised savings | ✅ `price`, `regularPrice`, `saleEnds`, `savings` |
| Clearance flag | ✅ `clearance` |
| Shelf stock at the store nearest a postal code, and its aisle | ✅ `storeQuantity`, `storeAisle` |
| Online (warehouse) stock | ✅ `onlineQuantity` |
| Search terms, category pages, product pages, the whole catalogue, or deals only | ✅ |

### What you get

One real row (Canadian Tire, store 467 Edmonton Downtown, 10 Oct 2026, from the product's URL):

| Field | Example |
|---|---|
| `banner` | Canadian Tire |
| `productCode`, `sku` | 0548737P · 0548737 (Canadian Tire item 054-8737-2) |
| `name`, `brand` | Mastercraft 20V Cordless Drill/Driver with 76-pc Accessory Kit and case with PWRPOD 2 Ah Battery and Charger · Mastercraft |
| `colour`, `size`, `variant` | empty here; on apparel e.g. BLACK · S · Second Size Range: Regular |
| `url`, `imageUrl` | the product page and its image (the size and colour's own page on multi-variant products) |
| `category`, `categoryPath` | Drills · Tools & Hardware > Power Tools > Drills & Accessories > Drills |
| `rating`, `ratingsCount` | 4.36 · 159 |
| `price`, `regularPrice`, `onSale` | 69.99 · 129.99 · true |
| `clearance` | false |
| `saleEnds`, `savings` | 2026-10-14 · Save 46% ($60.00) |
| `badges` | \["EXCLUSIVE", "TOPRATED", "PROMO"] |
| `fee` | empty here; 0.65 in Québec, where Canadian Tire's price includes the provincial environmental fee |
| `storeId`, `storeName`, `storeAddress`, `storeCity`, `storeProvince`, `storePostalCode`, `storeDistanceKm` | 467 · Edmonton Downtown, AB · 11839 Kingsway NW · Edmonton · AB · T5G 3J7 · 3.15 |
| `storeQuantity`, `storeAisle` | 3 · Aisle 28 |
| `onlineQuantity` | 1407 |
| `sellable` | true |
| `scrapedAt` | ISO timestamp |

Every row has every key; values a site does not publish for a product come back empty rather than missing.

### What people use it for

- **Deal and clearance tracking**: every sale and clearance item, with the date the sale ends
- **Price monitoring**: a brand's or a category's prices across Canadian Tire, Sport Chek and Mark's
- **Stock checks**: whether a size and colour is on the shelf at a given store before driving there
- **Brands and suppliers**: how products are priced, discounted and stocked across the three chains

### How to use it

1. Choose the **Banners**.
2. Add **Search terms** (e.g. `running shoes`, `cordless drill`, `winter jacket`), **Category URLs** or **Product URLs**. Leave them all empty to read the whole catalogue.
3. Tick **Deals only** for just the sale and clearance listings, or **In stock at the store only**.
4. Add a **Postal code** for shelf stock at each banner's nearest store.
5. Set **Maximum results** and run it.

#### Input examples

```json
{
    "banners": ["Sport Chek"],
    "searchTerms": ["running shoes"],
    "postalCode": "T5J 0N3",
    "maxResults": 500
}
```

```json
{
    "banners": ["Canadian Tire", "Sport Chek", "Mark's"],
    "dealsOnly": true,
    "maxResults": 5000
}
```

```json
{
    "productUrls": [
        "https://www.canadiantire.ca/en/pdp/mastercraft-20v-cordless-drill-driver-with-76-pc-accessory-kit-and-case-with-pwrpod-2-ah-battery-and-charger-0548737p.html",
        "https://www.sportchek.ca/en/pdp/nike-sportswear-men-s-club-fleece-2-0-pullover-hoodie-83810987f.html"
    ],
    "postalCode": "M5B 2H6"
}
```

### Notes

- **One row per size and colour.** Sport Chek's Nike Club Fleece hoodie alone has 111, each with its own price and stock. **Maximum results** counts rows and is shared evenly between the banners (a banner that runs out passes its share on).
- **Sale and clearance are per size and colour.** A product the site lists under clearance often has only some colours on clearance; each row says whether its own size and colour is (`onSale`, `clearance`, `badges`).
- **Prices are the same across the country** online, so the postal code mainly decides whose shelf stock you see. The exception is Québec, where Canadian Tire's price includes the provincial environmental fee (`fee`, e.g. 0.65).
- **Which store.** With a postal code, each banner's store nearest to it (its distance in `storeDistanceKm`; Sport Chek has no stores in Québec, so a Québec postal code gets the nearest one in Ontario). Without one, a downtown Toronto store for each banner.
- **Deals only** uses each site's own deal listings: Sport Chek and Mark's "Sale" and "Clearance"; Canadian Tire's "Sale", "Limited Time Offer", "Store Clearance", "Special Buy" and "Instant Rebate". Only the sizes and colours that are themselves on a deal are kept, and **In stock at the store only** likewise keeps only those on the shelf.
- **Search terms** go through each site's own search, so results match what a shopper sees for the same words.
- **Catalogue sizes (10 Oct 2026):** Canadian Tire about 67,000 products, Sport Chek about 17,300, Mark's about 5,500, each with several sizes and colours.
- **`regularPrice`** is empty when a site shows a discount without a regular price (Sport Chek's "Discount Applied" promotions).
- **`category` and `categoryPath`** come from each product's own category trail. Canadian Tire items with a single SKU are read straight from the listing, which makes Canadian Tire runs several times faster, so theirs is the category being listed (category pages and the whole catalogue) and is empty for search terms.
- **Speed** (11 Oct 2026, default 2 GB memory): 9,000 rows from the three whole catalogues in about 4 minutes; a search term of a few hundred rows in under a minute. Deals only and In stock only read every size of a product to find the matching ones, so they take longer per row.

### Pricing

**$0.75 per 1,000 rows** (one row per size and colour), and nothing else to work out: platform usage, including the residential proxies these sites require, is included. Each run also has a start fee of $0.00005.

Sizes and colours a site gives no price for are free. **Maximum results** caps what a run costs: 100 rows cost $0.075, and 10,000 rows $7.50. If you set a maximum cost per run, the Actor stops when it is reached and keeps the rows found so far.

### Related Actors

- [Harbor Freight Scraper: Prices, Deals, Coupons & Store Stock](https://apify.com/alduinxx/harbor-freight-scraper)
- [Stop & Shop, Food Lion, Giant & Hannaford Grocery Scraper](https://apify.com/alduinxx/stop-shop-food-lion-giant-hannaford-scraper)
- [Metro Grocery Scraper](https://apify.com/alduinxx/metro-grocery-scraper)
- [Sobeys Grocery Scraper](https://apify.com/alduinxx/sobeys-grocery-scraper)

### Feedback

Found a row that looks wrong, or need a field that is missing? Open an issue on the **Issues** tab with the product URL, and it will be looked at.

# Actor input Schema

## `banners` (type: `array`):

Which stores to read. Search terms and the whole-catalogue mode apply to these; category and product URLs are read from their own site whatever is chosen here.

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

Searched with each site's own search, e.g. "running shoes", "cordless drill", "winter jacket". Leave empty, with no categories or products, to read the whole catalogue.

## `categoryUrls` (type: `array`):

Category pages from canadiantire.ca, sportchek.ca or marks.com, e.g. https://www.sportchek.ca/en/cat/footwear-DC2000009.html

## `productUrls` (type: `array`):

Product pages from any of the three sites. A page for one size or colour (…-83810987f.334511888.html) gives just that SKU. With one banner chosen, a bare product code (0548737P, 83810987F) or a Canadian Tire item number (054-8737-2) also works.

## `dealsOnly` (type: `boolean`):

Only products in each site's own deal listings (sale, clearance, limited-time offers…).

## `inStockOnly` (type: `boolean`):

Only sizes and colours with stock on the shelf at the chosen store.

## `postalCode` (type: `string`):

Shelf stock (and, in Québec, Canadian Tire's price with the provincial fee) from each banner's store nearest this postal code, e.g. M5B 2H6. Empty: a downtown Toronto store for each banner.

## `maxResults` (type: `integer`):

Rows to return in total. Each size and colour is one row, so one hoodie can be 60 rows. Shared evenly between the banners.

## `maxConcurrency` (type: `integer`):

How many requests run at once.

## Actor input object example

```json
{
  "banners": [
    "Sport Chek"
  ],
  "searchTerms": [
    "hoodie"
  ],
  "categoryUrls": [],
  "productUrls": [],
  "dealsOnly": false,
  "inStockOnly": false,
  "postalCode": "",
  "maxResults": 20,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `rowsCsv` (type: `string`):

No description

# 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 = {
    "banners": [
        "Sport Chek"
    ],
    "searchTerms": [
        "hoodie"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alduinxx/canadian-tire-sport-chek-marks-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 = {
    "banners": ["Sport Chek"],
    "searchTerms": ["hoodie"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alduinxx/canadian-tire-sport-chek-marks-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 '{
  "banners": [
    "Sport Chek"
  ],
  "searchTerms": [
    "hoodie"
  ],
  "maxResults": 20
}' |
apify call alduinxx/canadian-tire-sport-chek-marks-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alduinxx/canadian-tire-sport-chek-marks-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/fEg2SkAA63s4foaur/builds/gGbRbKT1Vgp8bSSXc/openapi.json
