# Princess Auto Scraper — Prices, Clearance & Store Stock (`yugenox/princess-auto-scraper`) Actor

Scrape Princess Auto (Canada) by search, category, URL or item number: prices, clearance, Hot Buys and sales, plus stock at every store and online. Optional UPC, MPN, specs, weight and live stock check. Whole catalogue in about 2 minutes.

- **URL**: https://apify.com/yugenox/princess-auto-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product 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

## Princess Auto Scraper: Prices, Clearance and Store Stock

Scrape **Princess Auto** (princessauto.com), Canada's tool, equipment and parts chain. You get prices, **clearance**, **Hot Buys** and sale items, plus **how many units each of the ~60 stores has** and how much is in stock online. You can search by keyword, category, page URL or item number, or scrape the **whole catalogue (about 38,000 product variations) in about two minutes**.

No login and no browser are needed, and a small run finishes in seconds.

### What you can do with it

- **Hunt clearance and Hot Buys at your stores.** Tick *Clearance only*, enter your stores (e.g. `Mississauga`, `Scarborough`) and *In stock only*. You get every clearance item on the shelf there, with the discount and quantity.
- **Monitor prices and stock** of specific items every day with *Item numbers*.
- **Resellers and flippers:** find deep discounts (`discountPct`) with real quantities per store before you drive there.
- **Catalogue and competitor analysis:** get every product with category path, brand, rating, review count, list and sale price.
- **Product data:** turn on *Include product details* to add UPC, manufacturer part number, GTIN, full specifications, weight, dimensions, country of origin, manuals and all images.

### Input

| Field | What it does |
|---|---|
| **Search terms** | Keywords, just like the site's search box (`drill`, `air compressor`, `trailer hitch`). |
| **Categories** | Names, paths or numbers: `Hand Tools`, `Welding`, `Air and Power > Compressors`, `9718`. |
| **Princess Auto URLs** | Search, category, Clearance, Hot Buy, brand and product pages from princessauto.com. |
| **Item numbers** | The 7-digit item number (`8634669`) or product code (`PA1000002512`, which returns all its sizes/variations). |
| **Max results** | Total rows for the run (`0` = no limit). |
| **Clearance / Hot Buys / On sale / New arrivals only** | Deal filters. With nothing else filled in, they scrape that whole deals section. |
| **Stores** | Store name, city (`Calgary` = both stores), province (`ON`, `Quebec`) or store number. |
| **In stock only** | Only items in stock at those stores (or anywhere, if no stores are given). |
| **Brands, Min/Max price** | Narrow further (`Powerfist`, `DEWALT`, `Makita`…). |
| **Sort** | Best match (default), newest, price low→high / high→low, top rated. |
| **Store stock in each row** | Stores that have it (default), every store including zeros, or counts only. |
| **One row per variation** | On (default): each size/variant is its own row with its own price and stock. Off: one row per product with a `variants` list. |
| **Include product details** | UPC / MPN / GTIN, description, specs, weight, dimensions, manuals, images. |
| **Live stock check** | Re-checks stock against the store inventory system at run time. |
| **Language** | English or French names, categories and URLs. |

Leave search terms, categories, URLs and item numbers **all empty** to scrape the whole catalogue, or the whole deals section you ticked.

#### Example: clearance in stock at two Toronto-area stores

```json
{
  "clearanceOnly": true,
  "stores": ["Mississauga", "Scarborough"],
  "inStockOnly": true,
  "maxItems": 0
}
```

#### Example: daily price and stock watch

```json
{
  "skus": ["9048984", "8634669", "PA1000002512"],
  "storeInventory": "all",
  "liveInventoryCheck": true
}
```

### Output

One row per product variation. Here is a real row (shortened), with *Include product details* on and three stores selected:

```json
{
  "sku": "9048984",
  "productId": "PA0009048984",
  "name": "20V 1/2 in. Cordless Drill/Driver, Tool Only",
  "brand": "Powerfist",
  "url": "https://www.princessauto.com/en/product/20v-1-2-in-cordless-drill-driver-tool-only/PA0009048984/9048984",
  "imageUrl": "https://cdn11.bigcommerce.com/s-xq5b6wwjc4/images/stencil/original/products/53955/18221/9048984_A0CG_00_01__04848.1774825598.jpg",
  "price": 59.99,
  "listPrice": 59.99,
  "salePrice": null,
  "discountPct": null,
  "currency": "CAD",
  "isOnSale": false,
  "isClearance": false,
  "isHotBuy": false,
  "saleEndsOn": null,
  "rating": 3.75,
  "reviewCount": 4,
  "category": "Drills",
  "categoryPath": "Air and Power > Cordless Tools > Drills and Drivers > Drills",
  "onlineStock": 254,
  "storesInStockCount": 57,
  "totalStoreQty": 258,
  "selectedStoresInStockCount": 3,
  "selectedStoresQty": 12,
  "storeInventory": [
    { "storeId": "71", "storeName": "Mississauga", "city": "Mississauga", "province": "ON", "qty": 5, "status": "lowStock" },
    { "storeId": "95", "storeName": "Scarborough", "city": "Scarborough", "province": "ON", "qty": 4, "status": "lowStock" },
    { "storeId": "98", "storeName": "Markham", "city": "Markham", "province": "ON", "qty": 3, "status": "lowStock" }
  ],
  "shipToHome": true,
  "skuStatus": "A",
  "isHazardous": false,
  "mpn": "203514003002",
  "gtin": "008310",
  "description": "This cordless drill/driver features metal keyless chuck and gear construction, a 2-speed selector…",
  "specifications": { "Chuck Size (in.)": "1/2", "Voltage Rating (V DC)": "20", "No Load Speed (RPM)": "0 to 450 and 0 to 1,700" },
  "weight": { "value": 3.1, "unit": "lb" },
  "dimensions": { "height": { "value": 8.2, "unit": "in" }, "width": { "value": 3.7, "unit": "in" }, "depth": { "value": 9.1, "unit": "in" } },
  "countryOfOrigin": "CN",
  "manuals": [{ "label": "…Manual-Multilingual", "url": "https://…/9048984_manualhb_00_01_v01_manuel_enfr.pdf" }],
  "source": { "type": "sku", "input": "9048984" },
  "scrapedAt": "2026-09-24T03:11:03.097Z"
}
```

**Stock fields**

- `onlineStock` is the quantity at the online distribution centre.
- `storesInStockCount` / `totalStoreQty` cover all stores.
- `selectedStores…` fields appear when you pick stores.
- `storeInventory[].status` is `inStock`, `lowStock` (fewer than 10) or `outOfStock`.

**Deal fields**

- `salePrice` / `discountPct` / `amountSaved` are only set when the item is below its regular price.
- `saleEndsOn` is set when the site shows an end date.

The dataset has three views: **Overview**, **Deals** and **Product details**.

### FAQ

**How fresh is the stock?** It is the same availability the website shows, refreshed throughout the day. Turn on *Live stock check* to re-read every row's stock from the store inventory system at run time.

**Why do some rows have no brand or UPC?** Princess Auto doesn't publish a brand for its surplus and house items, and many items have no UPC. The actor returns what the site has and never makes values up.

**Can I get more than 10,000 results?** Yes. Big categories and the whole catalogue are split automatically into sub-categories or price bands, so nothing is cut off.

**How long does it take?** 50 items take a few seconds, and the full catalogue about 2 minutes. *Include product details* opens each product page, so allow roughly 1 second per row.

**Which stores are covered?** All Princess Auto stores in Canada (AB, BC, MB, NB, NL, NS, ON, PE, QC, SK) and the online warehouse.

**French?** Set *Language* to *Français* to get French names, categories, descriptions and `/fr/` URLs.

**Is it legal to scrape Princess Auto?** This Actor only collects publicly available data: product listings, prices, deals, product details and store stock that anyone can see on Princess Auto's website without an account. Collecting publicly available data is generally legal, but you're responsible for how you use it. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as Princess Auto's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from pages Princess Auto shows to any visitor without logging in. It never uses a login, never touches private or restricted accounts, and never reaches password-protected areas.

# Actor input Schema

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

Keywords to search, exactly like the search box on princessauto.com (e.g. "drill", "air compressor", "trailer hitch"). Each term runs its own search.

## `categories` (type: `array`):

Category names, paths or numbers: "Hand Tools", "Trailer", "Air and Power > Compressors", "Welding", or "9718" (the number in a /category/ URL). A department with more than 10,000 products is split into sub-categories automatically.

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

Pages from princessauto.com: search results (/en/search?q=…), categories (/en/category/9718 or /en/air-and-power/…), Clearance (/en/clearance), Hot Buys (/en/hot-buy), brand pages (/en/brands/powerfist/1676) and product pages (/en/product/…).

## `skus` (type: `array`):

Specific products to track: the 7-digit item number shown on the product page (e.g. 8634669) or the product code (e.g. PA1000002512, returns every variation). Great for daily price and stock monitoring.

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

Maximum rows across the whole run. 0 = no limit. If you leave search terms, categories, URLs and item numbers all empty, the actor scrapes the whole catalogue (about 38,000 variations), or only the deals you tick below.

## `maxItemsPerQuery` (type: `integer`):

Cap for each individual search term, category or URL. 0 = no per-query limit.

## `clearanceOnly` (type: `boolean`):

Only clearance items. With no search terms or categories, this scrapes the whole Clearance section.

## `hotBuyOnly` (type: `boolean`):

Only Hot Buy items.

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

Only items currently on sale.

## `newArrivalsOnly` (type: `boolean`):

Only items flagged as new arrivals.

## `stores` (type: `array`):

Stores you care about: store name ("Mississauga", "Winnipeg East"), city ("Calgary" = both Calgary stores), province ("ON", "Quebec") or store number ("71"). Each row then shows stock at these stores. Leave empty for all 60 stores.

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

Only items in stock at the stores above (or, with no stores given, in stock at any store or online).

## `brands` (type: `array`):

Only these brands, e.g. "Powerfist", "DEWALT", "Makita" (not case-sensitive).

## `minPrice` (type: `integer`):

Lowest price to include, in dollars.

## `maxPrice` (type: `integer`):

Highest price to include, in dollars.

## `sort` (type: `string`):

Order of results. "Best match" returns the most relevant search results first and still collects every result when you ask for more than one page. Price sorts use each product's lowest price.

## `storeInventory` (type: `string`):

How much per-store stock to include. Every row always has online stock, the number of stores that have it and the total store quantity.

## `splitVariants` (type: `boolean`):

On: every size/variation is its own row with its own item number, price and stock (recommended). Off: one row per product with a "variants" list.

## `includeDetails` (type: `boolean`):

Adds UPC, manufacturer part number, GTIN, description, features, full specifications, weight, dimensions, country of origin, manuals and all images. Opens each product page, so it is slower.

## `liveInventoryCheck` (type: `boolean`):

Re-checks every row's stock against the store inventory system at run time (the default stock figures are already refreshed throughout the day). Adds about one request per 10 products.

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

Product names, categories, descriptions and URLs in English or French.

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

Parallel requests. The default is fast and safe.

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) works well. A residential fallback is used automatically if requests start failing. If you pick Residential here, search uses it, but the store list, category list and product pages still load over Apify Proxy datacenter. Product pages (Include product details) never use residential; if they can't load, details are skipped and not charged.

## Actor input object example

```json
{
  "searchTerms": [
    "drill"
  ],
  "maxItems": 50,
  "maxItemsPerQuery": 0,
  "clearanceOnly": false,
  "hotBuyOnly": false,
  "onSaleOnly": false,
  "newArrivalsOnly": false,
  "inStockOnly": false,
  "sort": "auto",
  "storeInventory": "inStock",
  "splitVariants": true,
  "includeDetails": false,
  "liveInventoryCheck": false,
  "language": "en",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped products.

## `run` (type: `string`):

Status and statistics for this run.

# 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 = {
    "searchTerms": [
        "drill"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/princess-auto-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 = {
    "searchTerms": ["drill"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/princess-auto-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 '{
  "searchTerms": [
    "drill"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/princess-auto-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/princess-auto-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/c9Vs43lt7IF9z6cOV/builds/B2vPDDA3qyS0wulwI/openapi.json
