# Kijiji Scraper — Canada Classifieds, Cheap & Fast (`fabrikit/kijiji-scraper`) Actor

Scrape Kijiji Canada classifieds: buy & sell, cars, real estate, rentals, jobs and services. Filter by keyword, category, city or radius, price and owner vs business. Optional full details. No login. From US$0.60 per 1,000 listings.

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

## Pricing

from $0.60 / 1,000 listing scrapeds

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

## Kijiji Scraper — Canada Classifieds, Cheap & Fast

Scrape **Kijiji Canada** (kijiji.ca) listings without a login: buy & sell, cars and trucks, houses and apartments for sale or rent, jobs, services, pets and more. Search by keyword, category, city or province, price range, private owner vs business, radius, or paste any Kijiji search URL. Turn on **full details** to get the whole description, every photo, labelled specs, views, expiry date and the dealer / agency name and website.

No browser, no account. Fast: about 40 listings per request.

### What you can do with it

- Track used-car, motorcycle or equipment prices across Canada and spot under-priced listings.
- Monitor rental and for-sale real estate by city, price and landlord type.
- Build lead lists of Canadian dealers, agencies and shops (business name, website, listing count).
- Resale and flipping research: find new ads the minute they are posted (sort by newest, run on a schedule).
- Market research on categories, price drops and seller mix by province.

### Input

| Field | What it does |
|---|---|
| `searchUrls` | Optional. Any kijiji.ca search/category URL with filters already applied. |
| `keywords` | One search per entry. Empty = everything in the category/location. |
| `category` | Category name (`Cars & Trucks`, `Apartments & Condos`, `Computers`...) or numeric id. |
| `locations` | Cities, provinces, `Canada` or numeric ids. One search per entry. |
| `postedBy` | `any`, `owner` (private) or `business` (dealers, agencies, shops). |
| `priceMin` / `priceMax` | Price range in CAD. |
| `sortBy` | `newest` (default), `oldest`, `price_low`, `price_high`, `distance`, `relevance`. |
| `adType` | `offer` (default) or `wanted`. |
| `latitude`, `longitude`, `radiusKm` | Radius search around a point. |
| `extraFilters` | Any category filter as URL parameter, e.g. `{"carmake": "honda", "caryear": "2015__2020"}`. |
| `includeDetails` | Open each listing for full description, all photos, specs, views, expiry, business profile. |
| `maxItems` | Total cap across all searches (default 50). |
| `proxyConfiguration` | Apify proxy (default). Falls back to residential Canadian IPs automatically if Kijiji rate-limits. |

#### Example: used Honda Civics in Ontario from dealers

```json
{
  "keywords": ["civic"],
  "category": "Cars & Trucks",
  "locations": ["Ontario"],
  "postedBy": "business",
  "priceMin": 5000,
  "priceMax": 20000,
  "extraFilters": { "carmake": "honda", "caryear": "2015__2022" },
  "maxItems": 500
}
```

#### Example: newest rentals in Toronto with full details

```json
{
  "category": "Long Term Rentals",
  "locations": ["Toronto"],
  "sortBy": "newest",
  "includeDetails": true,
  "maxItems": 200
}
```

### Output

One dataset item per listing (fields are always present, `null` when Kijiji does not provide them):

```json
{
  "id": "1744740584",
  "url": "https://www.kijiji.ca/v-laptops/calgary/dell-laptop/1744740584",
  "title": "Dell Laptop",
  "description": "This Dell laptop features an AMD A8 processor ...",
  "price": 100,
  "currency": "CAD",
  "priceType": "FIXED",
  "categoryId": 773,
  "categoryName": "Laptops",
  "categoryPath": "Buy & Sell > Computers > Laptops",
  "city": "Calgary",
  "latitude": 51.03,
  "longitude": -114.1,
  "postedAt": "2026-10-12T23:54:40.000Z",
  "sellerType": "private",
  "businessName": null,
  "imageCount": 2,
  "imageUrls": ["https://media.kijiji.ca/api/v1/..."],
  "attributes": { "laptopbrand": "laptopdell", "condition": "usedlikenew", "forsaleby": "ownr" },
  "detailsFetched": false,
  "scrapedAt": "2026-10-13T14:00:00.000Z"
}
```

With `includeDetails` you also get the full `description`, all `imageUrls`, labelled `specs` (`{"Brand": "Dell", "Condition": "Used - Like new"}`), `views`, `expiresAt`, `status`, and for businesses `businessName`, `businessWebsite`, `businessProfileUrl`, `businessListingCount`.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Listing scraped | **US$0.60 per 1,000** |
| Listing details (add-on, only when `includeDetails` is on) | **US$0.40 per 1,000** |

Set a maximum cost per run in Apify and the actor stops exactly at your limit.

### FAQ

**Is a login needed?** No. Only public listing data is collected.

**What about phone numbers and names?** Kijiji masks phone numbers and the actor never outputs the names of private sellers. Descriptions of private sellers are scrubbed of phone numbers and e-mail addresses. Business names, websites and profile links of dealers and agencies are included.

**How many results can I get for one search?** Kijiji lists thousands of results per search; the actor pages through all of them up to `maxItems`. Use several cities, categories or price bands to cover very large markets.

**Why do some listings have `price: null`?** Seller chose "Please contact", swap/trade or free; see `priceType`.

**How do I filter by make, year, bedrooms...?** Apply the filter on kijiji.ca, copy the `name=value` pairs from the address bar into `extraFilters` (or paste the whole URL into `searchUrls`).

### En español

Extrae anuncios de **Kijiji Canadá** (autos, inmuebles, arriendos, empleos, compra-venta) sin login: filtra por palabra clave, categoría, ciudad o radio, precio y vendedor particular o empresa. Con `includeDetails` obtienes descripción completa, todas las fotos, especificaciones, vistas y datos del concesionario/agencia (nombre y sitio web). Nunca se publican nombres ni teléfonos de particulares. Desde US$0.60 por 1.000 anuncios (+ US$0.40 por 1.000 con detalles).

# Actor input Schema

## `searchUrls` (type: `array`):

Paste any kijiji.ca search or category URL with filters already applied (for example https://www.kijiji.ca/b-cars-trucks/canada/honda/k0c174l0). Used together with the fields below.

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

Search words, one search per entry (for example: iphone, road bike, 2 bedroom). Leave empty to list everything in the category and location.

## `category` (type: `string`):

Kijiji category name or numeric id, for example Cars & Trucks, Apartments & Condos, Houses for Sale, Computers, Jobs, 174. Leave empty for all categories.

## `locations` (type: `array`):

Cities, provinces or Canada, one search per entry (for example: Toronto, Calgary, Ontario, Canada) or a numeric Kijiji location id. Leave empty for all of Canada.

## `postedBy` (type: `string`):

Only private owners, only businesses (dealers, agencies, shops), or both.

## `priceMin` (type: `integer`):

Lowest asking price in dollars.

## `priceMax` (type: `integer`):

Highest asking price in dollars.

## `sortBy` (type: `string`):

Newest first is the default; relevance applies when keywords are given. Distance needs latitude, longitude and radius.

## `adType` (type: `string`):

Regular ads for sale/rent, or 'wanted' ads where people look for something.

## `latitude` (type: `string`):

Centre of a radius search in decimal degrees (for example 43.6532). Use together with longitude and radius.

## `longitude` (type: `string`):

Centre of a radius search in decimal degrees (for example -79.3832).

## `radiusKm` (type: `integer`):

Only listings within this many kilometres of the latitude/longitude above.

## `extraFilters` (type: `object`):

Any other filter Kijiji offers for the category, as URL parameter name and value. Apply the filter on kijiji.ca and copy the name=value from the address bar. Examples: {"carmake": "honda", "caryear": "2015__2020", "cartransmission": "2"}. Ranges use two underscores.

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

Open every listing page to add the full description, all photos, labelled specs, views, expiry date and the business name and website. Billed as an extra event.

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

Stop after this many listings in total (all searches together).

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

Datacenter proxy by default; the Actor automatically falls back to residential Canadian IPs if Kijiji rate-limits or blocks the requests.

## Actor input object example

```json
{
  "searchUrls": [],
  "keywords": [
    "road bike"
  ],
  "locations": [
    "Toronto"
  ],
  "postedBy": "any",
  "sortBy": "newest",
  "adType": "offer",
  "extraFilters": {},
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All listings collected during the 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 = {
    "searchUrls": [],
    "keywords": [
        "road bike"
    ],
    "category": "",
    "locations": [
        "Toronto"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 = {
    "searchUrls": [],
    "keywords": ["road bike"],
    "category": "",
    "locations": ["Toronto"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/kijiji-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 '{
  "searchUrls": [],
  "keywords": [
    "road bike"
  ],
  "category": "",
  "locations": [
    "Toronto"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/kijiji-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fabrikit/kijiji-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/B2N2HWFVXYcCtRUbm/builds/bD5adHn0DQjMkpmD7/openapi.json
