canadian-tire-api
Skill48 starsChanged 35 days agoMITView on GitHub
Canadian Tire API: search canadiantire.ca at the store you choose with that store's CAD price, regular price and stock, read full product detail, check price and stock for up to 50 SKUs in one call, find stores near a postal code with their stock and aisle for an item, and list each store's clearance and deals. 6 endpoints, 1 credit each.
- Reads credentials
- Installs packages
- Sends data out
In this repository81 other files it gives its agents.
- airbnb-scraper-apiSkill
- aldi-grocery-dataSkill
- aliexpress-product-dataSkill
- amazon-product-dataSkill
- apple-app-store-apiSkill
- booking-com-hotel-dataSkill
- capterra-reviews-apiSkill
- chatgpt-scraper-apiSkill
- chewy-product-dataSkill
- companies-house-apiSkill
- costco-product-dataSkill
- cvs-product-dataSkill
- decathlon-product-dataSkill
- dollar-general-apiSkill
- douyin-scraper-apiSkill
- ebay-product-dataSkill
- etsy-product-dataSkill
- facebook-scraper-apiSkill
- g2-software-reviews-apiSkill
- gemini-scraper-apiSkill
- github-apiSkill
- glassdoor-salary-dataSkill
- google-ads-transparency-apiSkill
- google-ai-mode-apiSkill
- google-flights-apiSkill
- google-hotels-apiSkill
- google-maps-apiSkill
- google-news-apiSkill
- google-play-store-apiSkill
- google-search-apiSkill
- google-shopping-apiSkill
- google-trends-apiSkill
- harbor-freight-apiSkill
- heb-grocery-dataSkill
- home-depot-product-dataSkill
- iherb-product-dataSkill
- indeed-jobs-apiSkill
- instagram-scraper-apiSkill
- kroger-grocery-dataSkill
- kuaishou-scraper-apiSkill
- linkedin-ad-library-apiSkill
- linkedin-scraper-apiSkill
- lowes-product-dataSkill
- menards-product-dataSkill
- mercadolibre-product-dataSkill
- meta-ad-library-apiSkill
- micro-center-apiSkill
- nordstrom-product-dataSkill
- nordstrom-rack-product-dataSkill
- petco-product-dataSkill
- petsmart-product-dataSkill
- pinterest-apiSkill
- realtor-com-property-dataSkill
- reddit-search-apiSkill
- redfin-property-dataSkill
- rightmove-property-dataSkill
- sams-club-product-dataSkill
- scavioSkill
- sec-edgar-apiSkill
- sephora-product-dataSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. About 0 are common, 3 are distinctive, and 11 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
11
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 23
Use this skill when the user asks to:
- Distinctive: line 25
Check what an item costs at a specific Canadian Tire store, and how many are in stock there and in which aisle
- Distinctive: line 27
Check price and stock for a list of SKUs at one store
- Very specific: line 49
When the balance runs out the API answers 402 with a JSON body carrying billing_url.
- Very specific: line 52
Every request is a POST with a JSON body and:
- Very specific: line 75
Pick the store: call /canadiantire/stores with the user's postal_code (or latitude and longitude).
- Very specific: line 76
Search at that store: call /canadiantire/search with query (or category_id) and store_id.
- Very specific: line 77
One product in full: call /canadiantire/product with the code as product_code and the same store_id.
- Very specific: line 78
Many SKUs at once: call /canadiantire/availability with store_id and up to 50 skus.
- Very specific: line 79
Which nearby store has it: call /canadiantire/stores with sku.
- Very specific: line 80
Markdowns: call /canadiantire/clearance or /canadiantire/deals with store_id.
- Very specific: line 246
Every response uses the envelope { data, response_time, fetched_at, credits_used, credits_remaining }.
- Very specific: line 256
Every price and stock figure belongs to store_id.
- Very specific: line 260
Never fabricate prices, stock or aisles.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Canadian Tire API - Store Prices, Stock, Clearance, Deals
Search Canadian Tire and read products at the store you choose: that store's price and regular price in CAD, units in stock and aisle, sale and clearance flags, and pickup and delivery dates. Check up to 50 SKUs at once, find stores near a postal code with their stock of one item, and list a store's clearance and deals. All endpoints return structured JSON.
When to trigger
Use this skill when the user asks to:
- Find tools, automotive, home or outdoor products at Canadian Tire by keyword or category
- Check what an item costs at a specific Canadian Tire store, and how many are in stock there and in which aisle
- Find which Canadian Tire stores near a postal code have an item in stock
- Check price and stock for a list of SKUs at one store
- List clearance items at a Canadian Tire store
- List a store's sale prices, instant rebates, special buys or Triangle Rewards offers
- Compare Canadian Tire prices across stores or provinces, or monitor them
Setup
Get a free API key at scavio.dev (50 free credits to get started, no card required):
export SCAVIO_API_KEY=sk_live_your_keyIf you do not have a key yet
An agent running this skill without SCAVIO_API_KEY set will get 401 on every
call below. The whole path from nothing to a working key is self-serve:
- Sign up at dashboard.scavio.dev - email or Google, no card required.
- A key is created for the account automatically at signup. It is on the dashboard under API Keys, ready to copy.
- A new account starts with 50 credits. Every endpoint in this skill costs 1 credit.
When the balance runs out the API answers 402 with a JSON body carrying
billing_url. Topping up needs no code change - the same key keeps working.
Every request is a POST with a JSON body and:
Authorization: Bearer $SCAVIO_API_KEYEndpoints
Base URL: https://api.scavio.dev. All Canadian Tire endpoints cost 1 credit.
| Endpoint | Credits | What it returns |
POST /api/v1/canadiantire/search | 1 | 24 results per page at one store: price and regular price (CAD), price range for multi-variant items, savings, badges, rebate, rating, review count, brand, part number, SKUs, and stock at the store and online |
POST /api/v1/canadiantire/product | 1 | One product by code: breadcrumb, images, videos, descriptions, features, specifications, price and regular price, warranty, manuals, variants with their SKUs, and the store's stock and pickup and ship-to-home dates |
POST /api/v1/canadiantire/stores | 1 | Stores near a postal code or coordinates, nearest first: store_id, name, address, phone, coordinates, distance, weekly hours, services. With sku, each store's stock quantity and aisle for it |
POST /api/v1/canadiantire/availability | 1 | Up to 50 SKUs at one store in one call: price, regular price, sale and clearance flags, price valid-until date, quantity, aisle, online stock, pickup and delivery dates. Unknown SKUs are listed in not_found |
POST /api/v1/canadiantire/clearance | 1 | Every clearance item at one store, 100 per page, filtered to items Canadian Tire lists as available there by default |
POST /api/v1/canadiantire/deals | 1 | Items on a deal at one store, 100 per page: sale, instant_rebate, special_buy or loyalty (Triangle Rewards) |
Workflow
Prices and stock are per store, and differ by province (Quebec prices differ from Ontario's), so pin the store first.
- Pick the store: call
/canadiantire/storeswith the user'spostal_code(orlatitudeandlongitude). Each row has astore_id. - Search at that store: call
/canadiantire/searchwithquery(orcategory_id) andstore_id. Each row has acode(like0547273P) and its 7-digitsku. - One product in full: call
/canadiantire/productwith thecodeasproduct_codeand the samestore_id. - Many SKUs at once: call
/canadiantire/availabilitywithstore_idand up to 50skus. This is the cheap way to watch a list of items at one store. - Which nearby store has it: call
/canadiantire/storeswithsku. Each store getsquantityandaislefor that item. - Markdowns: call
/canadiantire/clearanceor/canadiantire/dealswithstore_id.
Parameters
Search (/search)
| Parameter | Type | Default | Description |
query | string | one of | Keywords. Pass this or category_id. A broad word like "drill" that the site answers with a category page returns that category's products |
category_id | string | one of | DC followed by 7 digits (e.g. DC0002209), or a canadiantire.ca category URL ending in one |
store_id | string | required | Store number from /stores, e.g. "600" |
page | integer | 1 | 1-based page (1-100), 24 results per page |
sort | string | relevance | relevance, price_asc, price_desc, newest, rating or bestseller |
in_stock_only | boolean | false | Only items in stock at store_id |
Product (/product)
| Parameter | Type | Default | Description |
product_code | string | required | The code of a search result, e.g. 0547273P |
store_id | string | required | Store number |
Stores (/stores)
| Parameter | Type | Default | Description |
postal_code | string | one of | Canadian postal code (or its first 3 characters), e.g. M5V 2T6 |
latitude, longitude | number | one of | Coordinates to search around, instead of postal_code |
radius_km | number | 25 | Search radius in km, 1-200 |
limit | integer | 10 | Stores to return, nearest first, 1-50 |
sku | string | - | 7-digit SKU; each store also gets its stock quantity and aisle for it |
Availability (/availability)
| Parameter | Type | Default | Description |
store_id | string | required | Store number |
skus | string[] | required | 1-50 SKUs, 7 digits each (the sku of a search result or product variant) |
Clearance (/clearance)
| Parameter | Type | Default | Description |
store_id | string | required | Store number |
page | integer | 1 | 1-based page (1-100), 100 results per page |
in_stock_only | boolean | true | Only clearance items Canadian Tire lists as available at store_id. Its index counts nearly every clearance item as available, so 10-25% of rows can still show store_quantity 0 or null: filter on store_quantity > 0 for what is on the shelf |
Deals (/deals)
| Parameter | Type | Default | Description |
store_id | string | required | Store number |
type | string | required | sale (this week's sale prices), instant_rebate, special_buy or loyalty (Triangle Rewards offers) |
page | integer | 1 | 1-based page (1-100), 100 results per page |
Examples
curl -X POST https://api.scavio.dev/api/v1/canadiantire/availability \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"store_id": "600", "skus": ["0547273", "0438858"]}'Captured response (store 600; trimmed to 1 of 2 items):
{
"data": {
"store_id": "600",
"count": 2,
"not_found": [],
"items": [
{
"sku": "0547273",
"sku_number": "054-7273-0",
"part_number": "DCK277D2",
"price": 199.99,
"was_price": 299.99,
"price_range": null,
"was_price_range": null,
"savings": "Save 33% ($100.00)",
"is_on_sale": true,
"is_clearance": false,
"badges": ["BESTSELLER", "TESTEDFORLIFE", "PROMO"],
"rebate": null,
"price_valid_until": "2026-11-05T23:59:59.000Z",
"quantity": 3,
"aisle": "Aisle 219",
"warehouse_quantity": 1596,
"sellable": true,
"orderable": true,
"pickup": { "enabled": true, "eta": "2026-10-31T12:30:00.000Z" },
"ship_to_home": { "enabled": false, "eta_earliest": "2026-11-02T00:00:00.000Z", "eta_latest": null },
"express_delivery": { "enabled": true, "eta": "2026-10-31T13:00:00.000Z", "order_by": "2026-10-31 16:30:00.0" },
"warehouse_pickup_eta": "2026-11-06T00:00:00.000Z",
"warehouse_ship_eta": "2026-11-07T00:00:00.000Z"
}
]
},
"response_time": 1974,
"credits_used": 1
}A captured /stores row for {"postal_code": "M5V 2T6", "sku": "0438858"} (hours trimmed to one day):
{
"store_id": "621",
"name": "Liberty Village, ON",
"address": {
"line1": "5 Joe Shuster Way",
"line2": null,
"city": "Toronto",
"province": "ON",
"postal_code": "M6K 0C7",
"formatted": "5 Joe Shuster Way, Ontario, Toronto, M6K 0C7"
},
"phone": "4165883232",
"latitude": 43.639935,
"longitude": -79.423492,
"distance_km": 1.94,
"timezone": "America/Toronto",
"hours": [{ "day": "Sunday", "open": "8:00 AM", "close": "10:00 PM" }],
"services": [],
"curbside_pickup": true,
"quantity": 2,
"aisle": null,
"warehouse_quantity": 4
}import requests
BASE = "https://api.scavio.dev"
# Your key from https://scavio.dev. Load it from your environment or secret
# store in real code - keep it out of source control.
API_KEY = "sk_your_key_here"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
def ct(endpoint, body):
r = requests.post(f"{BASE}/api/v1/canadiantire/{endpoint}", headers=HEADERS, json=body, timeout=120)
r.raise_for_status()
return r.json()["data"]
# 1. The user's store
store = ct("stores", {"postal_code": "M5V 2T6", "limit": 1})["stores"][0]
sid = store["store_id"]
# 2. Search at that store, in stock only
rows = ct("search", {"query": "dewalt drill", "store_id": sid, "in_stock_only": True})["products"]
# 3. Price and stock for every hit in one call
skus = [r["sku"] for r in rows if r["sku"]][:50]
for it in ct("availability", {"store_id": sid, "skus": skus})["items"]:
print(it["sku"], it["price"], "was", it["was_price"], "qty", it["quantity"], it["aisle"])
# 4. This store's clearance
clr = ct("clearance", {"store_id": sid})
print(clr["total_results"], "clearance items at", store["name"])Response shapes
Every response uses the envelope { data, response_time, fetched_at, credits_used, credits_remaining }. Nothing is cached; fetched_at is when Canadian Tire answered.
- search / clearance / deals -
query,category_id,category_name,corrected_query,redirect_url(search) ordeal_type(clearance, deals),store_id,page,page_size,total_results,total_pages,count,categories[]{category_id,name},products[](position,code,sku,skus[],sku_number,part_number,title,brand,url,image,rating,review_count,price,was_price,price_range{min,max},was_price_range,savings,is_on_sale,is_clearance,badges[],rebate{message,price_after_rebate},is_multi_variant,store_quantity,warehouse_quantity,sellable,warranty). - product -
code,name,brand,url,breadcrumb[],images[],videos[],rating,review_count,short_description,description,features[],specifications[]{label,value},part_number, the price fields above,warranty,manuals[],status,sellable,store_id,store_quantity,warehouse_quantity,pickup,ship_to_home,express_delivery,warehouse_pickup_eta,warehouse_ship_eta,options[],variants[]{sku,sku_number,part_number,name,url,status,sellable,badges[],specifications[]}. - stores -
latitude,longitude,location_source,postal_code,fsa,radius_km,sku,count,stores[](store_id,name,url,address{line1,line2,city,province,postal_code,formatted},phone,latitude,longitude,distance_km,timezone,hours[]{day,open,close},services[],curbside_pickup, and withsku:quantity,aisle,warehouse_quantity). - availability -
store_id,count,not_found[],items[](sku,sku_number,part_number, price fields,price_valid_until,quantity,aisle,warehouse_quantity,sellable,orderable,pickup,ship_to_home,express_delivery,warehouse_pickup_eta,warehouse_ship_eta).
Guardrails
- Prices are in Canadian dollars:
199.99is CA$199.99. - Every price and stock figure belongs to
store_id. Prices differ by province (Quebec differs from Ontario), so never carry a price from one store to another; name the store when quoting. - A multi-variant product (tires, sizes, colours) has
price: nulland aprice_rangeinstead. Use/availabilitywith the variant's 7-digitskufor one exact price. store_quantity/quantityis units at the store;warehouse_quantityis the online warehouse, not the store.- Canadian Tire returns
ratingandreview_countonly; there is no review text endpoint. - Never fabricate prices, stock or aisles. Only return what the API returned, with the product
url.
Failure handling
400means a missing or invalid parameter (nostore_id, neitherquerynorcategory_id, aproduct_codenot like0547273P, a SKU that is not 7 digits, or an unknown dealtype).401means the API key is invalid or missing. CheckSCAVIO_API_KEY.402means the balance is out of credits. The body carriesbilling_url.404on/productmeans no such product code; re-run the search for a freshcode. Not charged. On/availabilityunknown SKUs are not an error: they come back innot_found.429means rate or usage limit exceeded. Wait before retrying. See rate limits.502means Canadian Tire is temporarily unavailable. It is not charged; retry after a few seconds.
SDKs
pip install scavio==0.31.0
npm install scavio@0.31.0import { Scavio } from "scavio";
const scavio = new Scavio(); // reads SCAVIO_API_KEY
const { data: near } = await scavio.canadianTire.stores({ postal_code: "M5V 2T6", limit: 1 });
const store_id = near.stores[0].store_id;
const found = await scavio.canadianTire.search({ query: "dewalt drill", store_id });
const stock = await scavio.canadianTire.availability({ store_id, skus: ["0547273", "0438858"] });
const deals = await scavio.canadianTire.deals({ store_id, type: "sale" });MCP: the Scavio MCP server exposes all 6 endpoints as tools (search_canadian_tire, get_canadian_tire_product, get_canadian_tire_stores, get_canadian_tire_availability, get_canadian_tire_clearance, get_canadian_tire_deals). Canadian Tire is opt-in: add canadiantire to SCAVIO_PLATFORMS.
{
"mcpServers": {
"scavio": {
"command": "npx",
"args": ["-y", "@scavio/mcp-server@0.29.0"],
"env": {
"SCAVIO_API_KEY": "sk_live_your_key",
"SCAVIO_PLATFORMS": "default,canadiantire"
}
}
}
}Docs
Full reference per endpoint: search, product, stores, availability, clearance, deals. Overview: Canadian Tire API.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

