September 22, 2026 · 14 min read
Canadian Tire Scraper: Get Product Data for $5.00 per 1,000 Results
The Canadian Tire Scraper retrieves product codes, pricing, sale discounts, stock quantities, ratings, and technical specifications directly from CanadianTire.ca for 5.00 USD per 1,000 results. Operating via 17 distinct input controls, this scraper bypasses generic browser automation limitations by querying Canadian Tire's internal search API directly. The tool supports localized stock checks by accepting any valid retail store ID as a reference parameter. This Actor is designed for retail businesses and software developers requiring structured, programmatic access to Canadian Tire product catalogs; it is not suited for users trying to automate checkout procedures or add items to cart.
What does a Canadian Tire Scraper run cost?
Each result costs $0.005 on the free tier, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.01 per GB of Actor memory.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
At 5.00 USD per 1,000 results, pricing scales strictly based on the volume of extracted data. The maxItems and maxPages controls have the absolute largest effect on your final bill, as they govern how many API requests are executed. The cheapest way to confirm that the scraper returns your target fields is to execute a trial run using mode set to search with maxItems capped at 5 records.
How do you run Canadian Tire Scraper from the API?
The schema marks 1 of its 17 controls as required: mode. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for Canadian Tire Scraper, so the request works once your token is in place.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~canadian-tire-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"search","searchQuery":"hammer","categoryCode":"DC0002027","productCodes":["0574127P"],"sortBy":"relevance","onSaleOnly":false,"inStockOnly":false,"dealType":"","availabilityType":"","featuredType":"","storeId":"144","maxItems":48,"maxPages":20}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"mode": "search",
"searchQuery": "hammer",
"categoryCode": "DC0002027",
"productCodes": [
"0574127P"
],
"sortBy": "relevance",
"onSaleOnly": False,
"inStockOnly": False,
"dealType": "",
"availabilityType": "",
"featuredType": "",
"storeId": "144",
"maxItems": 48,
"maxPages": 20
}
run = client.actor("crawlerbros~canadian-tire-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"mode": "search",
"searchQuery": "hammer",
"categoryCode": "DC0002027",
"productCodes": [
"0574127P"
],
"sortBy": "relevance",
"onSaleOnly": false,
"inStockOnly": false,
"dealType": "",
"availabilityType": "",
"featuredType": "",
"storeId": "144",
"maxItems": 48,
"maxPages": 20
}
const run = await client.actor('crawlerbros~canadian-tire-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.
Which Canadian Tire Scraper inputs matter, and which can you skip?
The input schema exposes 17 controls, with mode being the single mandatory field that dictates whether you are searching, browsing, or lookup up SKUs. The searchQuery, categoryCode, and productCodes fields change the returned result set most drastically and should be populated mutually exclusively. Most users should leave server-side filters like dealType, availabilityType, and featuredType unset on their first run to prevent over-filtering.
mode(string): search = keyword search. category = browse a category listing. byProductCodes = fetch exact products by their Canadian Tire product code. Default:"search".searchQuery(string): Keyword to search for on Canadian Tire, e.g. 'hammer' or 'garden hose'.categoryCode(string): Canadian Tire category code to browse, e.g. 'DC0002027' (Drills). Find it in a category page URL: canadiantire.ca/en/cat/.../{slug}-{categoryCode}.html.productCodes(array): Exact Canadian Tire product codes to fetch, e.g. '0574127P'. Find it at the end of a product page URL.sortBy(string): How results are ordered by Canadian Tire before client-side filters are applied. Default:"relevance".minPrice(number): Only include products priced at or above this amount, in Canadian dollars (CAD).maxPrice(number): Only include products priced at or below this amount, in Canadian dollars (CAD).minRating(number): Only include products with a customer rating at or above this value (0-5). Products with no rating data are always included.onSaleOnly(boolean): Only include products currently marked on sale/clearance. Default:false.inStockOnly(boolean): Only include products with available stock quantity. Default:false.brand(string): Only include products whose brand name contains this text (case-insensitive), e.g. 'mastercraft'.dealType(string): Only include products matching this specific deal type, applied server-side by Canadian Tire's own search API. Leave unset for no deal filter. Default:"".availabilityType(string): Only include products matching this availability category, applied server-side by Canadian Tire's own search API. Leave unset for no availability filter. Default:"".featuredType(string): Only include products carrying this merchandising badge, applied server-side by Canadian Tire's own search API. Leave unset for no badge filter. Default:"".storeId(string): Canadian Tire store ID to use as the reference store for stock quantity and availability fields, e.g. '144'. Find it via Canadian Tire's Store Locator (canadiantire.ca/en/store-locator.html) -- the numeric ID appears at the end of the store-details page URL. Defaults to a Toronto reference store if left blank.maxItems(integer): Maximum number of records to return. Default:48.maxPages(integer): Maximum number of result pages (48 products/page) to walk before stopping. Default:20.
Fixed-choice controls: mode accepts search, category, byProductCodes; sortBy accepts relevance, priceAsc, priceDesc, newest, ratingDesc, bestseller; dealType accepts , `clearance`, `sale`, `limitedTimeOffer`, `specialBuy`; `availabilityType` accepts , inStoreOnly, onlineOnly, inStockAtMyStore; featuredType accepts ``, exclusive, topRated, bestSeller, testedForLife, newArrivals.
Move one control per run. Compare each new sample against the previous one and keep the accepted, uncertain, and excluded counts side by side. A control that increases volume without improving decision quality still bills at $0.005 per result.
What does Canadian Tire Scraper return?
Returned records are ideal for pricing comparison, inventory monitoring, and technical specification compilation. They conspicuously omit structured customer review texts, returning instead the average rating and ratingsCount. You can rely on the data for direct catalog import as it includes clean manufacturer part numbers, images, and feature bullets.
The Actor does not publish a per-field output list, so treat the first run as the specification: collect a small sample and record which fields are present before anything downstream depends on them.
How do you build the workflow end to end?
Open Canadian Tire Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Select the mode control and set it to search to find items by keyword, category to browse a catalog section, or byProductCodes to fetch specific SKUs.
- If using search mode, input a term like 'hammer' in the searchQuery textfield, then leave optional filters blank to check the raw API response.
- If using category mode, extract the alphanumeric category code from a CanadianTire.ca URL and assign it to the categoryCode field.
- To target a specific local branch, locate the numeric store identifier via the online Store Locator and input it as the storeId parameter.
- Configure maxItems and maxPages to low boundaries like 48 and 1 respectively for your initial trial run to minimize cost.
- Run the Actor and review the dataset output inside the platform console, verifying that the returned records populate correct productCode and price values.
- Confirm that the currency field is present and marked as CAD before scaling up the input parameters for a full production run.
How do you apply it? Three worked playbooks
These are Canadian Tire Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Price monitoring
Outcome: Price monitoring -- track prices and sale discounts for specific products or categories over time.
Configure: Set mode to 'byProductCodes' and populate productCodes with a list of target Canadian Tire SKU strings. Provide a specific storeId, such as '144', to ensure the localized stock levels match your target location.
Working method: Execute a localized baseline run to capture originalPrice, isOnSale, and stockQuantity across your designated items. Schedule this execution daily, and write a script to compare the current price and stockQuantity against the prior run's dataset to identify price drops or depletion events.
Deliverable: A daily CSV file containing productCode, price, originalPrice, isOnSale, and stockQuantity across the selected store ID.
Stop condition: The execution returns 0 results for verified product codes, indicating a structural change in the upstream product API payload.
Use case 2: Market research
Outcome: Market research -- analyze brand presence, ratings, and pricing across a product category.
Configure: Set mode to 'category' and set categoryCode to 'DC0002027'. Keep the default sortBy set to 'relevance' to align with the category landing page.
Working method: Start with a single broad category code and run the scraper with maxItems set to 100. Inspect the returned JSON array to verify that fields like brand, rating, ratingsCount, and specifications are consistently populated.
Deliverable: A structured JSON dataset containing detailed product records, feature bullets, and brand classifications for catalog comparison.
Stop condition: The scraper returns success but the dataset contains empty objects or fails to populate the brand field across multiple records.
Use case 3: Deal hunting
Outcome: Deal hunting -- filter for on-sale products or the best-rated items in a category.
Configure: Set mode to 'search', input the target query in searchQuery, and set the onSaleOnly boolean to true. Alternatively, set dealType to 'clearance' or 'sale' for server-side filtering.
Working method: Run the query daily to fetch active clearance items, ordering results by priceAsc via the sortBy control. Filter the output records programmatically to extract records where discountPercent is populated and greater than 0.
Deliverable: An export of active discounted items featuring originalPrice, discountPercent, and isOnSale flags.
Stop condition: The discountPercent field is consistently absent from records that are marked with the clearance badge in the output.
What breaks, and how do you design around it?
- Canadian Tire's product pages are served behind Akamai bot management, which challenges plain (non-browser-fingerprinted) HTTP clients with a 403. This actor's fetcher uses a browser-matching TLS fingerprint to reliably pass this check, so
productUrlvalues in the output always resolve to the real product page in an actual browser -- a manualcurlHEAD check from a non-browser client may show a 403 instead, which is expected Akamai behavior and not a broken link. Image URLs (images) are always directly accessible from any client. - Canadian Tire's own
priceAsc/priceDescsort (confirmed directly against their raw API response) is not a strict global ascending/descending order across the full result set -- prices are correctly ordered within local runs but the sort appears to blend in relevance/product-family grouping. Every individual filter (price range, rating, sale, brand) is honored exactly; only the overall sort order across a large result set may not be perfectly monotonic. This is an upstream characteristic, not an actor defect.
Upstream bot defenses block non-browser clients with a 403 status code, which means the productUrl fields in the output must be opened in a standard web browser or simulated environment to resolve properly. Because Canadian Tire's own sorting logic blends item grouping with price rankings, priceAsc and priceDesc sorts may not be strictly monotonic. You should handle sorting downstream in your own processing pipeline rather than relying on upstream sorting.
When should you not use Canadian Tire Scraper?
Do not use this Actor if you require real-time national stock updates across hundreds of physical retail locations simultaneously, as inventory tracking is limited to the single reference store ID specified per run. If your operational workflows depend on receiving immediate push notifications for stock changes, this batch-oriented crawler is not the correct tool. Instead, querying an official wholesale vendor inventory catalog, if your business has partner access, would be a more direct alternative. Furthermore, if you are looking to extract customer text reviews rather than numerical product metrics, this scraper will fail to meet your requirements as it only extracts average ratings.
What should you check before trusting the output?
- Verify that productCode values are populated and do not contain empty strings, which would indicate a structural extraction issue.
- Check that price values are positive float numbers and that currency equals CAD for every record retrieved.
- Ensure that when priceIsStartingFrom is set to true, the priceRangeMax field is present and greater than the base price field.
- Set an automated alert to pause scheduled runs if more than twenty percent of returned records return empty string arrays for featureBullets.
None of this proves a record is correct. It gives a scheduled Canadian Tire Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What currency are the returned pricing metrics reported in?
All prices are returned in Canadian Dollars (CAD). This matches the home market of CanadianTire.ca, and the currency field in the JSON output will always show CAD for every scraped product.
How are prices handled when a product has multiple variants?
If a product varies by size or color, the price field reports the lowest available variant price. In this scenario, the boolean flag priceIsStartingFrom is set to true, and the maximum variant price is output in the priceRangeMax field.
How do I check product availability at my local store?
You can target any specific branch by inputting its numeric store identifier into the storeId control. This ensures that the returned stockQuantity, onlineStockQuantity, and isUrgentLowStock fields reflect real-time inventory at that exact retail location.
Why do some records lack a rating or originalPrice field?
The scraper only includes fields that are actively populated by Canadian Tire's database. If an item has never been rated or is not currently discounted, the rating or originalPrice fields are omitted entirely to maintain clean, accurate data.
How much does it cost to run a search for 10,000 products?
Based on the platform pricing of 5.00 USD per 1,000 results on the free tier, extracting a dataset of 10,000 product records will cost exactly 50.00 USD. Adjusting the maxItems control helps you control and predict this cost precisely.
Where to go next
Start with the Canadian Tire Scraper Actor page for the current input schema, pricing tier, and run history.
If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:
- Search results scrapers covers 11 Actors in this family.
- Product and price scrapers covers 378 Actors in this family.
Readers running Canadian Tire Scraper commonly pair it with:
- Otomoto Car Listings Scraper Scrape vehicle listings from Otomoto.pl - Poland's largest car marketplace with 200,000+ listings.
- RockAuto Parts Scraper Search RockAuto.com, the largest free public US auto-parts catalogue by keyword or part number.
- Zooplus Pet Products Scraper Scrape Zooplus, Europe's largest online pet shop.
- Heritage Auctions Scraper Scrape Heritage Auctions (ha.com) - the world's largest collectibles auctioneer.
- Udemy Course Scraper Scrape Udemy courses with search by keyword, browse by category, filter by level/rating/price.
- Best Buy Scraper Scrape Best Buy product listings by search keyword or product URL.
- Eventbrite Events Scraper Extract events from Eventbrite like title, date, venue, organizer, ticket price, image, tags.
- Home Depot Product Scraper Scrape product listings from homedepot.com by keyword or direct URL.
Related guides:
- Vivian Health Jobs Scraper: Build 3 Robust Healthcare Data Playbooks
- United Real Estate Homes for Sale Scraper: 3 Practical Use Cases
- Uganda Business Directory Scraper: 3 Operational Workflows
- Tally (Cactus) DAO Governance Scraper: $5.00 per 1,000 results (2026)
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-22.
Actor last updated by its maintainers on 2026-08-07.
Run outcome figures cover the 30 day public window ending 2026-09-22.
● Featured actors
Canadian Tire Scraper
Scrape CanadianTire.ca products by keyword search, category browse, or exact product code. Get prices, sale discounts, ratings, images, feature bullets and specifications.
Run on Apify ↗