# Kijiji Scraper (`scrapesmith/kijiji-scraper`) Actor

Scrape Kijiji.ca listings with 48 data points. Price, location, seller contact, images, category, description. Search by URL, keyword, or category across all of Canada. JSON/CSV/Excel. API, MCP, webhook, AI-agent ready.

- **URL**: https://apify.com/scrapesmith/kijiji-scraper.md
- **Developed by:** [Scrape Smith](https://apify.com/scrapesmith) (community)
- **Categories:** Automation, Developer tools, Real estate
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## 📋 Kijiji Scraper

**Canada's largest classifieds marketplace — structured listing data in seconds, no code required.**

Extract structured listing data from Kijiji — Canada's largest classifieds marketplace — in seconds, no coding required. Built for developers, marketers, resellers, researchers, and AI agents who need clean, ready-to-use Kijiji data without touching a browser or writing a single line of scraping code.

### 🎯 Why Use This Scraper

✅ **No-code data extraction** — paste a search URL or keywords and get a structured dataset back, no scripts, no maintenance, no broken selectors to fix.

✅ **Covers all of Kijiji** — vehicles, real estate, furniture, electronics, jobs, services, and general merchandise, from a single unified scraper.

✅ **Built for automation** — plug straight into your existing stack via the API, webhooks, or an MCP server for AI agents like Claude and ChatGPT.

✅ **Reliable at any volume** — pull a single listing or thousands of listings from multiple searches in one run, with consistent, deduplicated results every time.

### 🚀 Features

✅ Scrape Kijiji search-result pages by URL, category, or keyword — nationwide or hyper-local

✅ Pull individual listing pages directly by URL for one-off lookups

✅ Full pricing data, including original price and price-drop detection

✅ Seller identity fields including seller type, verification status, and listing history

✅ Optional seller-detail enrichment mode to pull phone number and website per listing

✅ Rich location data with coordinates for mapping and geospatial analysis

✅ Category-specific item attributes (make/model, size, condition, and more) returned per listing

✅ Image galleries and YouTube video links captured for every listing

✅ Listing status flags — top ads, highlighted ads, showcase ads, and dealer-sourced listings

✅ Clean JSON output ready for JSON, CSV, Excel, or XML export

### 📊 Output Fields

Every listing returned by the scraper includes the following fields, grouped by category:

#### Listing Details

| Field | Description |
|---|---|
| `id` | Unique Kijiji listing ID |
| `title` | Listing title |
| `description` | Full listing description text |
| `url` | Direct link to the listing on Kijiji |
| `categoryId` | Kijiji category ID the listing belongs to |
| `type` | Listing type (e.g. sell, wanted) |
| `status` | Listing status (e.g. active) |
| `adSource` | Source of the ad posting |
| `mode` | Whether the record came from a search result or a listing detail page |
| `inputContext` | The search URL or keyword that produced this result |
| `scrapedAt` | Timestamp of when the listing was scraped |

#### 💰 Price

| Field | Description |
|---|---|
| `priceAmount` | Current listing price |
| `priceOriginalAmount` | Original price before any price drop |
| `priceType` | Price type (e.g. fixed, negotiable, free) |
| `priceCurrency` | Currency code (CAD) |
| `isPriceDrop` | Whether the price has been reduced |

#### 🏷️ Item / Category Specifics

| Field | Description |
|---|---|
| `attributes` | Array of category-specific specs (e.g. vehicle make/model/mileage, item condition, size), each with `name`, `canonicalName`, and `values` |

#### 👤 Seller Info

| Field | Description |
|---|---|
| `sellerId` | Unique seller/poster ID |
| `sellerName` | Seller display name |
| `sellerType` | Seller type (private or dealer) |
| `sellerVerified` | Whether the seller account is verified |
| `sellerRating` | Seller rating score |
| `sellerPhone` | Seller phone number (available with seller-detail enrichment) |
| `sellerWebsite` | Seller website (available with seller-detail enrichment) |
| `sellerProfilePath` | Path to the seller's public profile |
| `sellerNumberOfListings` | Total number of active listings from this seller |

#### 📍 Location

| Field | Description |
|---|---|
| `locationName` | City or neighbourhood name |
| `locationAddress` | Street-level address, when available |
| `latitude` | Listing latitude |
| `longitude` | Listing longitude |

#### 📸 Media

| Field | Description |
|---|---|
| `imageUrls` | Array of listing image URLs |
| `imageCount` | Total number of images on the listing |
| `youtubeVideoId` | YouTube video ID attached to the listing, if any |

#### 📊 Listing Flags & Metrics

| Field | Description |
|---|---|
| `activationDate` | Date the listing went live |
| `sortingDate` | Date used by Kijiji for sort order (e.g. bumped/renewed date) |
| `endDate` | Date the listing expires |
| `views` | Number of views the listing has received |
| `isTopAd` | Whether the listing is a featured "top ad" |
| `isHighlight` | Whether the listing is highlighted |
| `isShowcase` | Whether the listing is a showcase ad |
| `isFromDealer` | Whether the listing is posted by a dealer (common for autos) |

### 💼 Use Cases

✅ **Market research** — analyze pricing, supply, and demand trends across any Kijiji category or city.

✅ **Price monitoring** — track price drops, average asking prices, and price-per-category benchmarks over time.

✅ **Lead generation** — build prospect lists of private sellers and dealers for outreach in real estate, autos, or services.

✅ **Competitor analysis** — monitor what dealers and businesses are listing, at what price, and how often they refresh listings.

✅ **Arbitrage & resale research** — spot underpriced items and flip opportunities across categories and regions.

✅ **Real estate & rental analysis** — collect rental and property listings across Canadian cities for comparables and trend reports.

✅ **Data journalism** — surface local economic signals (used car prices, rental rates, job postings) for stories and reports.

✅ **Machine learning training data** — build labeled classifieds datasets for pricing models, recommendation engines, or NLP tasks.

### 📥 Input

Provide one or more Kijiji search-result URLs, individual listing URLs, or plain keywords. No login or account required:

```json
{
  "startUrls": [
    "https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273"
  ],
  "keywords": [
    "honda civic"
  ],
  "maxItems": 500,
  "pageSize": 40,
  "enrichSellerDetails": false
}
```

**Input fields:**

| Input | Description |
|---|---|
| `startUrls` | Kijiji search-result URLs (any category/location/keyword page) or direct individual listing URLs. Mix both in the same run. |
| `keywords` | Optional keywords applied to every search URL. If left with no `startUrls`, runs a nationwide Canada-wide search instead. |
| `maxItems` | Maximum total number of listings to return across all searches combined. |
| `pageSize` | Number of listings requested per search page. |
| `enrichSellerDetails` | When enabled, fetches each listing's detail page to add the seller's name, phone number, and website. |

### 📤 Output Example

```json
{
  "inputContext": "https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273",
  "mode": "search_result",
  "id": "1706654321",
  "title": "2019 Honda Civic LX - Low Mileage, One Owner",
  "description": "Well maintained 2019 Honda Civic LX, no accidents, clean title, recent oil change and new tires.",
  "url": "https://www.kijiji.ca/v-cars-trucks/city-of-toronto/2019-honda-civic-lx/1706654321",
  "categoryId": 174,
  "type": "OFFER",
  "status": "ACTIVE",
  "adSource": "WEB",
  "priceAmount": 18995.00,
  "priceOriginalAmount": 19995.00,
  "priceType": "FIXED",
  "priceCurrency": "CAD",
  "imageUrls": [
    "https://i.ebayimg.kijijistatic.ca/example1.jpg",
    "https://i.ebayimg.kijijistatic.ca/example2.jpg"
  ],
  "imageCount": 12,
  "youtubeVideoId": "",
  "locationName": "Toronto, ON",
  "locationAddress": "",
  "latitude": 43.6532,
  "longitude": -79.3832,
  "activationDate": "2026-07-10T14:22:00.000Z",
  "sortingDate": "2026-07-18T09:05:00.000Z",
  "endDate": "2026-09-10T14:22:00.000Z",
  "views": 843,
  "isTopAd": true,
  "isHighlight": false,
  "isPriceDrop": true,
  "isShowcase": false,
  "isFromDealer": false,
  "attributes": [
    { "name": "Make", "canonicalName": "make", "values": ["Honda"] },
    { "name": "Model", "canonicalName": "model", "values": ["Civic"] },
    { "name": "Mileage (km)", "canonicalName": "mileage", "values": ["62000"] },
    { "name": "Condition", "canonicalName": "condition", "values": ["Used"] }
  ],
  "sellerId": "9384712",
  "sellerName": "Mike T.",
  "sellerType": "PRIVATE",
  "sellerVerified": true,
  "sellerRating": 4.8,
  "sellerPhone": "",
  "sellerWebsite": "",
  "sellerProfilePath": "/o-mike-t/9384712",
  "sellerNumberOfListings": 3,
  "scrapedAt": "2026-07-20T08:15:42.000Z"
}
```

### 📁 Export Formats

Every run's results are available for instant download or programmatic access in **JSON**, **CSV**, **Excel (XLSX)**, and **XML** — pick the format that fits your workflow, no conversion needed.

### 🔗 Integrations

This scraper is built to slot straight into your existing tools and pipelines:

🔗 **API** — trigger runs and pull results programmatically via the Apify API from any language or stack.

🔗 **MCP server** — connect this actor as a tool for AI agents through Apify's MCP server, so Claude, ChatGPT, and other LLM agents can query live Kijiji data on demand.

🔗 **Webhooks** — get notified automatically the moment a run finishes, with results ready to fetch.

🔗 **Zapier, Make, and n8n** — build no-code automations that trigger scrapes and route the output anywhere.

🔗 **Google Sheets** — send results directly into a spreadsheet for instant sharing and analysis.

🔗 **AI agents & LLM workflows** — integrate with LangChain, custom GPTs, and other agent frameworks to give your AI assistant real-time Kijiji data.

### 💡 Tips for Best Results

💡 Use a specific category + city search URL rather than a broad keyword search for cleaner, more relevant results.

💡 Enable `enrichSellerDetails` only when you need seller phone/website — it adds an extra fetch per listing.

💡 Combine multiple `startUrls` in one run to cover several cities or categories at once instead of running the actor repeatedly.

💡 Re-run on a schedule (daily or weekly) to track price changes and new listings over time.

### ❓ FAQ

**Does this scraper require a Kijiji account or login?**
No. It only collects publicly available listing data — no login or credentials are needed.

**Can I scrape a specific category, city, or keyword?**
Yes. Provide a Kijiji search URL for any category/city combination, or supply keywords for a broader search.

**Can I get seller phone numbers and websites?**
Yes, enable the seller-detail enrichment option in the input to include phone number and website per listing where the seller has provided one.

**What categories does this cover?**
All of Kijiji — vehicles, real estate, furniture and household items, electronics, jobs, services, and general merchandise.

**How do I use this data with an AI agent?**
Connect the actor through Apify's MCP server so tools like Claude or ChatGPT can request fresh Kijiji data as part of an agent workflow, or pull results via the API/webhook into your own LLM pipeline.

### 💳 Pricing

Pay only for results — no subscription required. Try it free.

### 🔗 Related Scrapers

Looking for other classifieds and marketplace data? Check out our other listings scrapers to cover more marketplaces alongside Kijiji.

# Actor input Schema

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

Kijiji.ca search-result URLs (any category/location/keyword listing page) or direct individual listing (/v-...) URLs. Mix both freely in the same list.

## `keywords` (type: `array`):

Optional keywords applied to every search-result URL above. If Start URLs is left empty, a nationwide Canada search with these keywords is run instead.

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

Maximum total number of listings to return across all Start URLs combined.

## `pageSize` (type: `integer`):

Number of listings requested per search page (Kijiji's own maximum is 40).

## `enrichSellerDetails` (type: `boolean`):

For search-result URLs, additionally fetch each listing's own detail page to include the seller's name, phone number, and website. Slower and uses one extra request per listing.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273"
  ],
  "maxItems": 500,
  "pageSize": 40,
  "enrichSellerDetails": false
}
```

# 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 = {
    "startUrls": [
        "https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesmith/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 = { "startUrls": ["https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesmith/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 '{
  "startUrls": [
    "https://www.kijiji.ca/b-city-of-toronto/c30349001l1700273"
  ]
}' |
apify call scrapesmith/kijiji-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8P24EbxgbmTd164X9/builds/MtWG0XY3B8HkKreaz/openapi.json
