# Kijiji Scraper | Canadian Classified Listings (`parseforge/kijiji-scraper`) Actor

Scrape Kijiji classified ads across Canada for cars, real estate, jobs, and goods with title, price, location, seller, posted date, photos, and full description. Track Canadian marketplaces for resale arbitrage, real estate research, and competitive market intelligence.

- **URL**: https://apify.com/parseforge/kijiji-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🍁 Kijiji.ca Listings Scraper

> 🚀 **Pull live Kijiji listings in seconds.** Real estate (houses, condos, rentals, rooms, commercial) and Buy & Sell, filtered by category, province, keyword, or price. No API key, no registration, no manual CSV wrangling.

> 🕒 **Last updated:** 2026-05-22 · **📊 35+ fields** per listing · **3M+ live listings on source** · **Pagination + detail enrichment** · **Pure HTTP, no headless browser**

Kijiji is Canada's largest general classifieds platform with roughly 85% market share of the country's local buy-and-sell traffic and a real estate vertical that hosts over **244,000 active property listings** across every province. This actor extracts listings from any vertical at [kijiji.ca](https://www.kijiji.ca): houses for sale, condos, apartments and condos for rent, room rentals, short-term rentals, commercial space, land, and the full Buy & Sell catalog. Each record carries the title, asking price in CAD, address with city, province, latitude and longitude, full image gallery, view count, listing date, seller type (private vs business), and the canonical attribute set Kijiji exposes for that vertical (bedrooms, bathrooms, sqft on real estate; condition, brand, model on classifieds).

You feed it a Kijiji search or category URL, the same one you copy from your browser after applying filters on the site, and the actor walks every page until it has the records you asked for. Each record optionally enriches with the listing detail page so you also get view counts, the full description, all photos at full resolution, and seller phone (when public). Use it for daily monitoring of new rental listings, off-market real estate lead discovery, price intelligence on used goods, dealer benchmarking, or research into Canada's informal economy.

| 🎯 Target audience | 🛠️ Primary use cases |
|---|---|
| Real estate agents, property managers, leasing agents, used-car dealers, market researchers, e-commerce resellers | Rental price tracking, off-market lead discovery, daily new listing alerts, competitor pricing, dealer benchmarking, price arbitrage |

---

### 📋 What the Kijiji Listings Scraper does

- 🏘️ **Real estate built in.** Scrape houses for sale, condos, apartments and condos for rent, rooms, short-term rentals, commercial, land, all from one actor.
- 📍 **Filter by location.** Pass a Canada-wide URL, any province URL (Ontario, Quebec, BC, Alberta, all 13 provinces and territories), or city-level URLs.
- 🔎 **Filter by keyword.** Bake the keyword into the URL or pass it via the `keyword` input, both work.
- 🏷️ **Filter by category.** 13 real estate sub-categories and 32 Buy & Sell sub-categories, each with its own slug and URL.
- 💰 **Filter by price, condition, seller type, ad type.** Apply the filters on Kijiji.ca, then paste the URL, the actor follows whatever you set.
- 🔍 **Detail-page enrichment.** Optional second pass per listing to grab views, full description, full-res photos, end date, and seller phone.

Each record includes the listing title, listing ID, listing URL, primary image and full image gallery, price (number) and price type (FIXED / CONTACT / SWAP_TRADE / GIVE_AWAY), currency, category ID and full category path, seller type and ID, verified flag, address, city, province, latitude, longitude, image count, full description, all attributes (bedrooms, bathrooms, sqft, parking, pets, condition, brand, etc. depending on vertical), view count, status, listing type (OFFER / WANTED), activation date, and end date.

> 💡 **Why it matters:** Kijiji aggregates the largest pool of Canadian real estate and classifieds inventory, but it has no public API. Without this actor, the only options are manual browsing or fragile DIY scrapers. This one returns clean, typed JSON in seconds and is the basis for daily-listing alerts, price indices, and lead pipelines.

---

### 🎬 Full Demo

🚧 Coming soon: a 3-minute walkthrough showing how to pull daily new rental listings for one neighbourhood, set up a schedule, and route the dataset to a Google Sheet.

---

### ⚙️ Input

<table>
<thead>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
</thead>
<tbody>
<tr><td>startUrl</td><td>string</td><td>yes</td><td>Any Kijiji.ca search or category URL: real estate, buy-sell, or any keyword search. Defaults to all real estate across Canada. Apply filters on the site, then paste the URL.</td></tr>
<tr><td>maxItems</td><td>integer</td><td>no</td><td>Cap on records returned. Free plan: 10. Paid: up to 1,000,000.</td></tr>
<tr><td>keyword</td><td>string</td><td>no</td><td>Optional free-text keyword applied on top of the start URL.</td></tr>
<tr><td>category</td><td>string</td><td>no</td><td>Pick a category from the dropdown (real estate or buy-sell sub-categories). Overrides the URL's category segment when set.</td></tr>
<tr><td>province</td><td>string</td><td>no</td><td>Province filter (Ontario, Quebec, BC, etc.). Overrides the URL's province segment when set.</td></tr>
<tr><td>priceMin / priceMax</td><td>integer</td><td>no</td><td>Price range filter in CAD.</td></tr>
<tr><td>forSaleBy</td><td>string</td><td>no</td><td>Owner (private seller) or Business / Dealer.</td></tr>
<tr><td>sortBy</td><td>string</td><td>no</td><td>Most recent (default), least recent, lowest price, highest price.</td></tr>
<tr><td>fetchListingDetails</td><td>boolean</td><td>no</td><td>If true (default), fetches each listing's detail page to populate viewCount, full description, full-res photos, end date, and seller phone.</td></tr>
<tr><td>proxyConfiguration</td><td>object</td><td>no</td><td>Apify Proxy. Datacenter is fine for most runs.</td></tr>
</tbody>
</table>

Example, all houses for sale across Canada, 50 most recent:

```json
{
  "startUrl": "https://www.kijiji.ca/b-houses-for-sale/canada/c35l0",
  "maxItems": 50,
  "sortBy": "DATE_DESC"
}
````

Example, Toronto apartments and condos for rent under $2,500, with detail enrichment:

```json
{
  "startUrl": "https://www.kijiji.ca/b-apartments-condos/city-of-toronto/c37l1700273",
  "maxItems": 200,
  "priceMax": 2500,
  "fetchListingDetails": true
}
```

> ⚠️ **Good to Know:** Make sure the URL ends in `/cXlY` (e.g. `c35l0` for houses-for-sale Canada-wide, `c37l1700273` for Toronto apartments). That's how Kijiji encodes category and location, and the actor uses that segment to walk pagination.

***

### 📊 Output

Each record is a flat JSON object, drop it straight into Postgres, BigQuery, Sheets, or Make / Zapier without further processing.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `imageUrl` | string | `https://media.kijiji.ca/api/v1/...webp` |
| 📝 `title` | string | `The Riverfront Bliss: A bungalow near Merrickville` |
| 🔗 `url` | string | `https://www.kijiji.ca/v-house-for-sale/.../1728118991` |
| 🆔 `listingId` | string | `1728118991` |
| 💵 `price` | number | `656000` |
| 💱 `currency` | string | `CAD` |
| 🏷️ `priceType` | string | `FIXED` / `CONTACT` / `SWAP_TRADE` / `GIVE_AWAY` |
| 📂 `categoryId` | number | `35` |
| 📂 `categoryPath` | string | `Real Estate > For Sale > Houses for Sale` |
| 👤 `sellerType` | string | `private` / `dealer` |
| 👤 `sellerId` | string | `68379442` |
| 👤 `sellerName` | string | `Ceci Alexander` |
| ✅ `sellerVerified` | boolean | `false` |
| ☎️ `sellerPhone` | string | `780977xxxx` |
| 🌐 `sellerWebsite` | string | full URL or null |
| 🔗 `sellerProfileUrl` | string | `https://www.kijiji.ca/o-profile/68379442/1` |
| 🔢 `sellerListingsCount` | number | `1` |
| 🏙️ `city` | string | `Merrickville` |
| 🇨🇦 `province` | string | `ON` |
| 📍 `address` | string | `Merrickville, ON K0G 1N0` |
| 🌐 `latitude` | number | `44.88` |
| 🌐 `longitude` | number | `-75.79` |
| 📷 `imageCount` | number | `13` |
| 🖼️ `imageUrls` | string\[] | full gallery |
| 📃 `description` | string | full text |
| 🧩 `attributes` | object\[] | `[{name:"Bedrooms",value:"2 + Den"},...]` |
| 👁️ `viewCount` | number | `1507` |
| 🎬 `youtubeVideoId` | string | YouTube ID or null |
| 📊 `status` | string | `ACTIVE` |
| 📨 `listingType` | string | `OFFER` / `WANTED` |
| ⭐ `condition` | string | `New` / `Used` / null on real estate |
| 📅 `activationDate` | string (ISO) | `2025-11-03T12:35:09.000Z` |
| 📅 `endDate` | string (ISO) | `2026-07-08T00:47:09.000Z` |
| 🕒 `scrapedAt` | string (ISO) | `2026-05-09T00:59:32.422Z` |

#### 📦 Sample records

<details><summary>🏠 <b>Typical: bungalow for sale near Merrickville, ON</b></summary>

```json
{
  "imageUrl": "https://media.kijiji.ca/api/v1/ca-prod-dealer-ads/images/b6/b619cb87-341b-4b47-a6f5-29d3cb7816f1?rule=kijijica-640-webp",
  "title": "The Riverfront Bliss: A bungalow near Merrickville for 656 000!",
  "url": "https://www.kijiji.ca/v-house-for-sale/ottawa/the-riverfront-bliss:-a-bungalow-near-merrickville-for-656-000/1728118991",
  "listingId": "1728118991",
  "price": 656000,
  "currency": "CAD",
  "priceType": "FIXED",
  "categoryId": 35,
  "categoryPath": "Real Estate > For Sale > Houses for Sale",
  "sellerType": "private",
  "sellerName": "Kijiji User",
  "sellerVerified": false,
  "sellerListingsCount": 1,
  "city": "Merrickville",
  "province": "ON",
  "address": "Merrickville, ON K0G 1N0",
  "latitude": 44.88,
  "longitude": -75.79,
  "imageCount": 13,
  "attributes": [
    {"name": "Bedrooms", "value": "2 + Den", "canonicalName": "numberbedrooms", "canonicalValue": "9"},
    {"name": "Bathrooms", "value": "1", "canonicalName": "numberbathrooms", "canonicalValue": "10"},
    {"name": "Size (sqft)", "value": "1200", "canonicalName": "areainfeet", "canonicalValue": ""},
    {"name": "For Sale By", "value": "Owner", "canonicalName": "forsalebyhousing", "canonicalValue": "ownr"},
    {"name": "Video walkthrough", "value": "Yes", "canonicalName": "virtualtour", "canonicalValue": "true"},
    {"name": "Online Application", "value": "Yes", "canonicalName": "onlineapp", "canonicalValue": "true"}
  ],
  "viewCount": 1507,
  "status": "ACTIVE",
  "listingType": "OFFER",
  "activationDate": "2025-11-03T12:35:09.000Z",
  "scrapedAt": "2026-05-09T00:59:32.422Z"
}
```

</details>

<details><summary>🏘️ <b>Edge case: high-end duplex investment property in Yarmouth, NS</b></summary>

```json
{
  "imageUrl": "https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/57/5770b661-ed96-4fc4-ac6d-48461a887f0c?rule=kijijica-640-webp",
  "title": "High-End Duplex \"By the Lake\"",
  "url": "https://www.kijiji.ca/v-house-for-sale/yarmouth/high-end-duplex-by-the-lake/1737284465",
  "listingId": "1737284465",
  "price": 718000,
  "currency": "CAD",
  "priceType": "FIXED",
  "categoryId": 35,
  "categoryPath": "Real Estate > For Sale > Houses for Sale",
  "sellerType": "private",
  "sellerName": "Colette Cottreau",
  "city": "Yarmouth",
  "province": "NS",
  "address": "202 Mood Rd, Yarmouth, NS B5A 5J4",
  "latitude": 43.86263,
  "longitude": -66.0137,
  "imageCount": 10,
  "attributes": [
    {"name": "Bathrooms", "value": "3", "canonicalName": "numberbathrooms"},
    {"name": "Bedrooms", "value": "4", "canonicalName": "numberbedrooms"},
    {"name": "Size (sqft)", "value": "2720", "canonicalName": "areainfeet"},
    {"name": "For Sale By", "value": "Owner", "canonicalName": "forsalebyhousing"}
  ],
  "description": "Welcome to 202 Mood Road, Summerville, Nova Scotia... 2026 Assessment value $665,800.",
  "viewCount": 4,
  "status": "ACTIVE",
  "listingType": "OFFER",
  "activationDate": "2026-05-09T00:47:09.000Z",
  "endDate": "2026-07-08T00:47:09.000Z",
  "scrapedAt": "2026-05-09T00:59:32.422Z"
}
```

</details>

<details><summary>🛖 <b>Sparse: cabin for sale, no sqft, no description metadata</b></summary>

```json
{
  "imageUrl": "https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/e6/e6aeb055-96a3-4062-bb94-26b5ab66450c?rule=kijijica-640-webp",
  "title": "Cabin for sale",
  "url": "https://www.kijiji.ca/v-house-for-sale/st-albert/cabin-for-sale/1722037038",
  "listingId": "1722037038",
  "price": 369000,
  "currency": "CAD",
  "priceType": "FIXED",
  "categoryId": 35,
  "categoryPath": "Real Estate > For Sale > Houses for Sale",
  "sellerType": "private",
  "sellerName": "Ceci Alexander",
  "sellerPhone": "780977xxxx",
  "city": "Stony Plain",
  "province": "AB",
  "address": "Stony Plain, AB T7Z 0B4",
  "latitude": 53.54,
  "longitude": -114,
  "imageCount": 10,
  "attributes": [
    {"name": "Bedrooms", "value": "2", "canonicalName": "numberbedrooms"},
    {"name": "Bathrooms", "value": "1", "canonicalName": "numberbathrooms"},
    {"name": "For Sale By", "value": "Owner", "canonicalName": "forsalebyhousing"}
  ],
  "viewCount": 5023,
  "status": "ACTIVE",
  "listingType": "OFFER",
  "scrapedAt": "2026-05-09T00:59:32.422Z"
}
```

</details>

***

### ✨ Why choose this Actor

| 💎 | Capability |
|---|---|
| ⚡ | **Fast.** Pure HTTP, no headless browser, hundreds of listings per minute. |
| 🇨🇦 | **Canada-focused.** Built for Kijiji.ca specifically, with all 13 provinces and territories supported. |
| 🏘️ | **Real estate ready.** Houses, condos, rentals, rooms, commercial, land, all in one actor. |
| 🔍 | **Detail enrichment.** Optional second pass for views, full description, all photos, seller phone. |
| 🧱 | **Stable.** Reads Kijiji's own Apollo GraphQL state, not flaky CSS selectors. |
| 🧰 | **Filter-aware.** Apply any filter on Kijiji.ca, the actor follows whatever URL you paste. |
| 📊 | **35+ fields per record.** Title, price, bedrooms, bathrooms, sqft, lat / lng, images, attributes, views, status. |

> 📊 **244,360 real estate listings + 2.7M Buy & Sell listings live on source the day this README was written.** The actor reads them the same way Kijiji's own front-end does.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ Kijiji.ca Listings Scraper** *(this Actor)* | Pay-as-you-go, free 10-item preview | All Kijiji verticals, all of Canada | Live at run time | Category, location, keyword, price, seller type, sort | Paste URL, click run |
| Manual browsing | Time only | Whatever you click through | Live | Whatever you apply on the site | Free, but hours of clicking per day |
| Paid live APIs | Subscription, often $$$ | Varies by provider | Live | Provider-defined | Account, API keys, integration code |
| Legacy community dumps | Free or one-time | Stale snapshots | Days to months old | None | Manual download |
| DIY scraper | Engineering time | Whatever you build | Whatever you maintain | Whatever you build | Days of dev plus ongoing fixes |

A scheduled run on this actor replaces all four alternatives for monitoring Kijiji at any cadence.

***

### 🚀 How to use

1. 🔑 [**Create a free Apify account.**](https://console.apify.com/sign-up?fpr=vmoqkp) Takes 30 seconds, $5 starter credit included.
2. 🔍 **Find the URL.** Go to [kijiji.ca](https://www.kijiji.ca), pick your vertical (real estate or buy-sell), apply filters (province, category, keyword, price), and copy the URL from the address bar.
3. ▶️ **Paste and run.** Drop the URL into `startUrl`, set `maxItems`, hit Start. The actor figures out the rest.
4. 📥 **Download.** Export the dataset as JSON, CSV, or Excel from the Apify console.
5. 🔁 **Schedule.** Re-run on a cron to keep your dataset fresh. Kijiji listings rotate fast, especially rentals.

> ⏱️ **Total time to first dataset:** under 2 minutes.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 🏘️ Real estate and rentals

- Daily new rental listing alerts by neighbourhood
- Track asking rents and price drops over time
- Off-market lead discovery before MLS hits
- Build hyperlocal market reports for buyers and sellers

</td>
<td width="50%">

#### 🏠 Property management

- Monitor competitor rental supply and pricing
- Source roommate and short-term rental listings
- Track vacancy patterns and seasonal demand
- Auto-populate CRM with private-seller leads

</td>
</tr>
<tr>
<td width="50%">

#### 🛍️ Retail and resale

- Track competitor pricing on used electronics and furniture
- Identify undervalued items to resell on Amazon CA or eBay
- Monitor inventory turnover signals in your category
- Source supplier leads from business sellers

</td>
<td width="50%">

#### 🚗 Auto and dealer

- Benchmark private-seller vehicle prices vs your dealership
- Spot trade-in opportunities by make, model, year, region
- Track depreciation curves with longitudinal pulls
- Lead-gen on private sellers in your service area

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating the Kijiji Listings Scraper

Wire this into your stack with a few lines of code or no code at all.

- 📦 **Node.js SDK.** Trigger runs and stream results to your warehouse, see [Apify SDK docs](https://docs.apify.com/sdk/js/).
- 🐍 **Python SDK.** Same idea for Python pipelines, see [Apify Python SDK](https://docs.apify.com/sdk/python/).
- 📚 **Full API docs.** [docs.apify.com](https://docs.apify.com) covers schedules, webhooks, and integrations.

Schedules are the most common automation pattern here. Run hourly for fresh rental alerts, daily for new listings in your for-sale category, weekly for trend snapshots. Pair with the Apify webhook to push each new run's dataset into your warehouse, Slack, or CRM the moment it finishes.

***

### ❓ Frequently Asked Questions

<details><summary>🏘️ <b>Does it cover real estate and rentals?</b></summary>

Yes. The actor scrapes all 13 real estate sub-categories: houses for sale, condos for sale, land for sale, commercial / office for sale, apartments and condos for rent, short-term rentals, room rentals and roommates, storage and parking, commercial / office for rent, and real estate services. Real estate is the default vertical out of the box.

</details>

<details><summary>📅 <b>How fresh is the data?</b></summary>

Data is fetched live at run time. It reflects exactly what is on Kijiji.ca at that second. Schedule the actor to run as often as you want.

</details>

<details><summary>🔢 <b>How many listings can I get per run?</b></summary>

Up to 1,000,000 on paid plans. Free plans are capped at 10 listings per run as a preview.

</details>

<details><summary>💳 <b>Do I need a Kijiji account?</b></summary>

No. The actor uses public listing pages. No login, no API key.

</details>

<details><summary>🌎 <b>Does it cover all of Canada?</b></summary>

Yes. Pass any province or city URL from kijiji.ca and the actor follows it. The default URL covers all of Canada.

</details>

<details><summary>📷 <b>Are full-resolution images included?</b></summary>

Yes when `fetchListingDetails` is enabled (default). The detail page returns full-res webp URLs in `imageUrls`.

</details>

<details><summary>🛏️ <b>Are bedrooms, bathrooms, and sqft included for real estate?</b></summary>

Yes. Real-estate-specific fields land in the `attributes` array as canonical names: `numberbedrooms`, `numberbathrooms`, `areainfeet`, `forrentbyhousing` / `forsalebyhousing`, `furnished`, `petsallowed`, `parking`, and more depending on the sub-category.

</details>

<details><summary>👀 <b>How does view count work?</b></summary>

Kijiji exposes a `views` metric on the detail page. The actor surfaces it as `viewCount`. Available only when `fetchListingDetails` is on.

</details>

<details><summary>🛒 <b>Can I use the data commercially?</b></summary>

Yes. Common commercial uses include rental price tracking, off-market lead discovery, dealer benchmarking, market intelligence, and academic research.

</details>

<details><summary>💸 <b>Is there a paid plan?</b></summary>

Yes. The Apify platform has tiered usage plans. Free accounts get $5 in starter credit and the 10-item preview cap. Paid plans unlock the full 1,000,000-item ceiling.

</details>

<details><summary>⚖️ <b>Is it legal to scrape Kijiji?</b></summary>

Public listing data is generally fair game for research, market intelligence, and competitive analysis. You are responsible for respecting Kijiji's Terms of Service and applicable Canadian privacy law (PIPEDA). Do not scrape private contact details or republish copyrighted descriptions verbatim at scale.

</details>

<details><summary>🆘 <b>What if a run fails?</b></summary>

Open the contact form below. Most failures come from a stale start URL (Kijiji rotates segment IDs occasionally). Paste the URL and we will fix it.

</details>

***

### 🔌 Integrate with any app

- [**Make**](https://www.make.com) - run the actor on a schedule, route results to a sheet, Airtable, or CRM.
- [**Zapier**](https://zapier.com) - trigger Slack, email, or Notion when new listings match a filter.
- [**Slack**](https://slack.com) - drop a daily digest of new listings into a channel.
- [**Airtable**](https://airtable.com) - sync the dataset directly into a base.
- [**Google Sheets**](https://workspace.google.com/products/sheets/) - sheet-as-database for non-technical teams.
- [**HubSpot**](https://www.hubspot.com) - push private-seller leads into your CRM pipeline.

***

### 🔗 Recommended Actors

- [**🏠 Zillow Rentals Scraper**](https://apify.com/parseforge/zillow-rentals-scraper) - the US rental equivalent for cross-border rental tracking.
- [**🏡 Realtor.com Property Listings Scraper**](https://apify.com/parseforge/realtor-com-scraper) - US for-sale listings with the same record shape.
- [**🇬🇧 Rightmove Property Scraper**](https://apify.com/parseforge/rightmove-property-scraper) - the UK equivalent for the British market.
- [**🇦🇺 Domain Real Estate Scraper**](https://apify.com/parseforge/domain-com-au-scraper) - the Australian equivalent.
- [**🛏️ Airbnb Scraper**](https://apify.com/parseforge/airbnb-scraper) - short-term rental supply for vacation-market analysis.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more Canada-specific and global classifieds and real estate scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) and we will get back to you within one business day.

***

> ⚠️ **Disclaimer:** This actor scrapes only publicly available listing pages on Kijiji.ca. It does not bypass any access controls, does not collect private user data, and does not republish copyrighted content. Users are solely responsible for complying with Kijiji's Terms of Service and all applicable Canadian privacy and competition law (including PIPEDA). ParseForge is not affiliated with, endorsed by, or sponsored by Kijiji or its parent companies.

# Actor input Schema

## `query` (type: `string`):

Keyword to search for (e.g. 'laptop', 'iphone', 'sofa', 'bicycle')

## `location` (type: `string`):

Location to search in. Use 'Canada' for nationwide, or a province/city name (e.g. 'Ontario', 'Toronto', 'British Columbia')

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## Actor input object example

```json
{
  "query": "laptop",
  "location": "Canada",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (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 = {
    "query": "laptop",
    "location": "Canada",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/kijiji-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 = {
    "query": "laptop",
    "location": "Canada",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/kijiji-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "laptop",
  "location": "Canada",
  "maxItems": 10
}' |
apify call parseforge/kijiji-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/kijiji-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kijiji Scraper | Canadian Classified Listings",
        "description": "Scrape Kijiji classified ads across Canada for cars, real estate, jobs, and goods with title, price, location, seller, posted date, photos, and full description. Track Canadian marketplaces for resale arbitrage, real estate research, and competitive market intelligence.",
        "version": "0.1",
        "x-build-id": "CyTFGvGeu2d0B10Yy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~kijiji-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~kijiji-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~kijiji-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "query"
                ],
                "properties": {
                    "query": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Keyword to search for (e.g. 'laptop', 'iphone', 'sofa', 'bicycle')"
                    },
                    "location": {
                        "title": "Location (city or province)",
                        "type": "string",
                        "description": "Location to search in. Use 'Canada' for nationwide, or a province/city name (e.g. 'Ontario', 'Toronto', 'British Columbia')"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
