# Kijiji.ca Scraper (`parsebird/kijiji-scraper`) Actor

Scrape Kijiji.ca listings by keyword, category and location: cars, apartments, jobs and buy & sell ads with price, photos, seller, coordinates and vehicle or rental details. Export JSON, CSV or Excel.

- **URL**: https://apify.com/parsebird/kijiji-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.39 / 1,000 listings

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/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.ca Scraper

Kijiji.ca Scraper extracts listings from [Kijiji.ca](https://www.kijiji.ca), the Canadian classifieds site, by keyword, category and location: cars and vehicles, apartments and houses, jobs, services, pets and Buy & Sell ads, with prices, photos, sellers and coordinates.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any of 208 Canadian provinces, regions and cities, or paste Kijiji search, listing and dealer URLs. Get 87 fields per listing, including make, model, year, km, VIN and CARFAX link for vehicles, and bedrooms, bathrooms, size, utilities and pet policy for rentals. Read past Kijiji's 4,000-results-per-search limit, in English or French.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor or any other LLM to start using this Actor.

```
Use the Apify Actor "parsebird/kijiji-scraper" (Kijiji.ca Scraper) to get classified listings from kijiji.ca (Canada). Call it with the apify-client package: Python `ApifyClient("<APIFY_TOKEN>").actor("parsebird/kijiji-scraper").call(run_input={...})`, or JavaScript `new ApifyClient({ token }).actor('parsebird/kijiji-scraper').call({...})`, then read items from the run's default dataset. Inputs (all optional, but give keywords, startUrls, category or location): keywords (array of search terms, e.g. ["honda civic"]), category (string Kijiji category ID: "174" Cars & Trucks, "27" Cars & Vehicles, "37" Long Term Rentals, "35" Houses for Sale, "10" Buy & Sell, "45" Jobs, "72" Services, "112" Pets; default "" all), location (string Kijiji location ID: "0" Canada default, "9004" Ontario, "9001" Quebec, "9007" British Columbia, "9003" Alberta, "1700272" Toronto (GTA), "1700273" City of Toronto, "1700281" City of Montreal, "1700287" Vancouver, "1700199" Calgary, "1700185" Ottawa), startUrls (array of {url}: Kijiji search result URLs /b-..., listing URLs /v-..., seller profile URLs /o-...), minPrice and maxPrice (int CAD), sellerType ("" any, "private", "business"), sortBy ("newest" default, "oldest", "price_asc", "price_desc", "relevance"), maxItems (int, default 100, total across all inputs; Kijiji shows max 4,000 per search and the Actor splits bigger searches by price), scrapeDetails (bool, default false: full description, all photos, seller name and profile, status, expiry, market average price, mileage rating), includeTopAds (bool, default false), language ("en" default or "fr"), proxyConfiguration (object, default no proxy). Each item has listingId, url, title, description, fullDescription, vertical, categoryId, categoryName, categoryPath, price (CAD number), currency, priceType (FIXED, CONTACT, GIVE_AWAY, SWAP_TRADE), originalPrice, priceDropped, priceRating, marketAveragePrice, locationName, locationId, province, address, nearestIntersection, latitude, longitude, postedAt, sortingDate, expiresAt, status, adSource, isTopAd, isShowcase, isHighlighted, views, sellerId, sellerType, sellerName, sellerAccountType, sellerProfileUrl, sellerWebsite, sellerListingCount, sellerRating, sellerVerified, hasPhoneNumber, imageCount, thumbnailUrl, imageUrls, youtubeUrl, virtualTourUrl, vehicle fields (make, model, trim, year, mileageKm, transmission, fuelType, drivetrain, bodyType, color, interiorColor, condition, seats, doors, vin, stockNumber, carfaxUrl, mileageRating, vehicleFeatures), real estate fields (unitType, bedrooms, bathrooms, sizeSqft, furnished, petsAllowed, smokingPermitted, parkingSpots, leaseTerm, availableDate, utilitiesIncluded, amenities), company, jobType, fulfillment, paymentOptions, breed, attributes (object of every Kijiji attribute), searchUrl, searchKeyword, scrapedAt. Pricing: pay per listing saved. API docs: https://apify.com/parsebird/kijiji-scraper/api. Get a token at https://console.apify.com/settings/integrations.
```

### What is Kijiji.ca Scraper?

**Kijiji.ca Scraper** turns [Kijiji](https://www.kijiji.ca) search results into clean JSON, CSV or Excel. Type a keyword such as `honda civic`, `2 bedroom apartment` or `sectional sofa`, pick a category and a province or city, and the Actor returns **every matching listing** with its **price, location and coordinates, seller type, photos, posting date, view count and category-specific details**.

It works as a **Kijiji API alternative**. Kijiji has no public API for its listings, so Kijiji.ca Scraper collects the same data the website shows to visitors and hands it to you as a dataset. You can also paste any Kijiji URL: a search with the filters you set on the site, a single listing, or a dealer or seller profile.

To try it, open the Input tab and click **Start**. The prefilled search returns 50 Honda Civic listings from the Toronto (GTA) Cars & Trucks category.

### What can Kijiji.ca Scraper do?

- 🔎 **Search by keyword, category and location**: combine keywords with one of 129 Kijiji categories and one of 208 provinces, regions and cities, from all of Canada down to City of Toronto or Ville de Montréal.
- 🔗 **Scrape any Kijiji URL**: paste search result pages (with every filter Kijiji offers, such as make, model, year, km, bedrooms or pet policy), single listing pages, or seller and dealer profiles to get a whole dealer inventory.
- 🚗 **Vehicle data**: make, model, trim, year, kilometres, transmission, fuel type, drivetrain, body type, colours, seats, doors, VIN, stock number, CARFAX report link, Kijiji's price rating and a list of features such as Bluetooth or sunroof.
- 🏠 **Rental and real estate data**: unit type, bedrooms, bathrooms, size in square feet, furnished, pets, smoking, parking, lease term, move-in date, utilities included, amenities, nearest intersection, video and virtual tour links.
- 💼 **Jobs, Buy & Sell, services and pets**: company and job type, item condition, pickup and delivery options, accepted payments and dog or cat breed.
- 💶 **Filter and sort**: price range in Canadian dollars, private sellers or businesses only, and sorting by newest, oldest, price or relevance.
- 📈 **Go past the 4,000-result limit**: Kijiji shows at most 100 pages of 40 listings for one search. When you ask for more, the Actor splits the search into price ranges and keeps going.
- 📄 **Listing details**: turn on **Scrape listing details** to add the full description, every photo, the seller's name, profile, website and listing count, the listing's status and expiry date, the market average price for vehicles, a mileage rating and whether a phone number is listed.
- 🇫🇷 **English or French**: get Kijiji's labels (categories, locations, condition, transmission) and listing URLs in English or French.
- ⚙️ **Built for automation**: [schedule runs](https://docs.apify.com/platform/schedules) to catch new listings or price drops, call the Actor through the [Apify API](https://apify.com/parsebird/kijiji-scraper/api), send results to [Make, Zapier, n8n, Google Sheets, Slack and more](https://apify.com/integrations), and export as JSON, CSV, Excel or HTML.

### What data can you extract from Kijiji?

| Field | Description |
|-------|-------------|
| `listingId`, `url`, `title` | Kijiji ad ID, link to the listing and its title |
| `description`, `fullDescription` | Description. Search results give an excerpt of about 200 characters; with listing details it's the full text (`fullDescription: true`) |
| `vertical`, `categoryId`, `categoryName`, `categoryPath` | Kijiji section (`cars-vehicles`, `real-estate`, `buy-sell`, `jobs`, `services`, `pets`, `community`, `vacation-rentals`), category ID, name and full path such as `Real Estate > For Rent > Long Term Rentals` |
| `price`, `currency`, `priceType` | Price in Canadian dollars, `CAD`, and Kijiji's price type: `FIXED`, `CONTACT` (please contact), `GIVE_AWAY` (free) or `SWAP_TRADE` |
| `originalPrice`, `priceDropped` | Price before a reduction and Kijiji's reduced-price flag |
| `priceRating`, `marketAveragePrice` | Kijiji's price badge for vehicles (`GREAT`, `GOOD`, `FAIR`, `POOR`) and the market average price it compares against (details only) |
| `locationName`, `province`, `address`, `nearestIntersection`, `latitude`, `longitude` | Kijiji location, two-letter province code, address as posted, nearest intersection for rentals, and coordinates |
| `postedAt`, `sortingDate`, `expiresAt`, `status` | When the ad was posted, when it was last bumped to the top, when it expires, and `ACTIVE` (expiry and status need details) |
| `adSource`, `isTopAd`, `isShowcase`, `isHighlighted` | `ORGANIC`, `TOP_AD`, `PROV_TOP_AD` or `ZIP` (ZipRecruiter partner job ads), and Kijiji's paid placement flags |
| `views` | Number of times the ad was viewed |
| `sellerType`, `sellerId`, `sellerRating`, `sellerVerified` | `private` or `business`, seller ID, star rating and verified flag |
| `sellerName`, `sellerAccountType`, `sellerProfileUrl`, `sellerWebsite`, `sellerListingCount` | Seller or dealer name, account type (`FSBO`, `PV_DEALER`, `RE_PROFESSIONAL`, `JOBS_PROFESSIONAL`…), profile link, website and number of live ads (details or profile URLs) |
| `hasPhoneNumber` | Whether the seller listed a phone number (details only; Kijiji hides the number itself) |
| `imageCount`, `thumbnailUrl`, `imageUrls` | Photo count and photo URLs in 1600 px size. Search results include the first photos; listing details give all of them |
| `youtubeUrl`, `virtualTourUrl` | Video and virtual tour links (details only) |
| `make`, `model`, `trim`, `year`, `mileageKm`, `transmission`, `fuelType`, `drivetrain`, `bodyType`, `color`, `interiorColor`, `condition`, `seats`, `doors` | Vehicle specs as entered by the seller |
| `vin`, `stockNumber`, `carfaxUrl`, `mileageRating`, `vehicleFeatures` | VIN, dealer stock number, CARFAX Canada report link, Kijiji's mileage rating (`LOW`, `AVERAGE`, `HIGH`, details only) and features |
| `unitType`, `bedrooms`, `bathrooms`, `sizeSqft`, `furnished`, `petsAllowed`, `smokingPermitted`, `parkingSpots`, `leaseTerm`, `availableDate` | Rental and property details |
| `utilitiesIncluded`, `amenities` | Utilities in the rent (heat, hydro, water, internet, cable / TV) and amenities such as in-unit laundry, dishwasher, balcony or gym |
| `company`, `jobType`, `fulfillment`, `paymentOptions`, `breed` | Job company and type, Buy & Sell pickup or delivery and payment options, pet breed |
| `attributes` | Every attribute Kijiji has for the listing, as an object (for example `carmake`, `numberbedrooms`, `forsaleby`) |
| `searchUrl`, `searchKeyword`, `scrapedAt` | The Kijiji search the listing came from, your keyword and the time it was collected |

Fields a listing doesn't have come back as `null` or an empty list. A rental has no `make`, a car has no `bedrooms`, and sellers often skip optional fields such as VIN or square footage.

### How to scrape Kijiji.ca

1. Open [Kijiji.ca Scraper](https://apify.com/parsebird/kijiji-scraper) on Apify Store and go to the Input tab.
2. Type one or more **Search keywords**, or leave them empty to browse a whole category.
3. Pick a **Category** and a **Location**, or paste Kijiji URLs into **Kijiji URLs**.
4. Optionally set **Min price** and **Max price**, **Posted by** (owners or dealers) and **Sort by**.
5. Set **Max listings** for the whole run. Turn on **Scrape listing details** if you need full descriptions, all photos or seller names.
6. Click **Start**. When the run finishes, download the dataset as JSON, CSV, Excel or HTML, or read it with the [dataset API](https://docs.apify.com/api/v2/dataset-items-get).

To scrape a search with filters the input form doesn't have, such as car make, year range or number of bedrooms, set them on kijiji.ca, copy the URL from your browser and paste it into **Kijiji URLs**.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `keywords` | array of strings | No | — | Search terms. Each keyword runs as its own search with the category, location and filters below |
| `category` | string | No | `""` (all) | Kijiji category ID, for example `174` Cars & Trucks, `37` Long Term Rentals, `35` Houses for Sale, `10` Buy & Sell, `45` Jobs |
| `location` | string | No | `0` (Canada) | Kijiji location ID, for example `9004` Ontario, `1700272` Toronto (GTA), `1700281` City of Montréal, `1700287` Vancouver |
| `startUrls` | array | No | — | Kijiji search result (`/b-…`), listing (`/v-…`) or seller profile (`/o-…`) URLs |
| `minPrice` | integer | No | — | Minimum price in CAD (keyword searches) |
| `maxPrice` | integer | No | — | Maximum price in CAD (keyword searches) |
| `sellerType` | string | No | `""` | `private` (owners) or `business` (dealers, agents, employers) |
| `sortBy` | string | No | `newest` | `newest`, `oldest`, `price_asc`, `price_desc` or `relevance` (keyword searches) |
| `maxItems` | integer | No | `100` | Maximum listings to save in total, across all keywords and URLs |
| `scrapeDetails` | boolean | No | `false` | Add full description, all photos, seller details, status, expiry, market price and mileage rating |
| `includeTopAds` | boolean | No | `false` | Also save the paid Top Ads shown above the results |
| `language` | string | No | `en` | `en` or `fr`: language of Kijiji's labels and listing URLs |
| `proxyConfiguration` | object | No | no proxy | Proxy settings. Kijiji works without one |

At least one of `keywords`, `startUrls`, `category` or `location` is needed. Example input:

```json
{
    "keywords": ["toyota rav4"],
    "category": "174",
    "location": "9004",
    "sellerType": "private",
    "maxPrice": 25000,
    "sortBy": "newest",
    "maxItems": 200,
    "scrapeDetails": true
}
```

### Output example

A dealer car listing and a rental, both with **Scrape listing details** on. Fields that don't apply to the listing are `null` and are left out here to keep the example short.

```json
[
    {
        "listingId": "1745500886",
        "url": "https://www.kijiji.ca/v-cars-trucks/mississauga-peel-region/2025-honda-civic-hybrid-sport-touring-ecvt-sedan/1745500886",
        "title": "2025 Honda Civic Hybrid Sport Touring eCVT Sedan",
        "description": "PRICING DISCLAIMER: The advertised price is for finance purchases only. A $2000.00 surcharge applies to cash deals. Prices are subject to change without notice…",
        "fullDescription": true,
        "vertical": "cars-vehicles",
        "categoryId": 174,
        "categoryName": "Cars & Trucks",
        "categoryPath": "Cars & Vehicles > Cars & Trucks",
        "price": 29932,
        "currency": "CAD",
        "priceType": "FIXED",
        "priceDropped": false,
        "priceRating": "FAIR",
        "marketAveragePrice": 28099,
        "locationName": "Mississauga / Peel Region",
        "locationId": 1700276,
        "province": "ON",
        "address": "4 Maritime Ontario Boulevard, Brampton, ON, L6S 0C2",
        "latitude": 43.7455678,
        "longitude": -79.6947773,
        "postedAt": "2026-10-30T07:52:37.000Z",
        "sortingDate": "2026-10-30T07:52:37.000Z",
        "status": "ACTIVE",
        "adSource": "ORGANIC",
        "isTopAd": false,
        "isShowcase": true,
        "views": 27,
        "sellerId": "COMMERCIAL_497",
        "sellerType": "business",
        "sellerName": "Open Road Honda",
        "sellerAccountType": "PV_DEALER",
        "sellerProfileUrl": "https://www.kijiji.ca/o-open-road-honda/497/listings/1",
        "sellerWebsite": "https://www.openroadhondabrampton.ca/?utm_source=kijiji.ca&utm_medium=referral",
        "sellerListingCount": 40,
        "sellerRating": 4.2,
        "hasPhoneNumber": true,
        "imageCount": 1,
        "thumbnailUrl": "https://media.kijiji.ca/api/v1/ca-prod-dealer-ads/images/81/81e6a286-2d81-4b7a-b2ec-382ac9d638c7?rule=kijijica-1600-jpg",
        "make": "Honda",
        "model": "Civic",
        "trim": "Sport Touring eCVT Sedan",
        "year": 2025,
        "mileageKm": 94347,
        "transmission": "Automatic",
        "fuelType": "Hybrid-Electric",
        "drivetrain": "Other",
        "bodyType": "Sedan",
        "color": "Black",
        "condition": "Used",
        "seats": 5,
        "doors": 4,
        "vin": "2HGFE4F80SH008535",
        "stockNumber": "34UTNA08535",
        "carfaxUrl": "https://vhr.carfax.ca/?id=W8dJ6pPUlgMEz4d1BftUdHmnvwAEFKuH",
        "mileageRating": "HIGH",
        "vehicleFeatures": ["Alloy wheels", "Bluetooth", "Navigation system", "Parking assistant", "Push button start", "Sunroof"],
        "attributes": {"carmake": "Honda", "carmodel": "Civic", "caryear": "2025", "carmileageinkms": "94347", "forsaleby": "Dealer", "sunroof": "true", "vin": "2HGFE4F80SH008535"},
        "searchUrl": "https://www.kijiji.ca/b-cars-trucks/gta-greater-toronto-area/honda-civic/k0c174l1700272?for-sale-by=delr&sort=dateDesc",
        "searchKeyword": "honda civic",
        "scrapedAt": "2026-10-30T11:38:47.522Z"
    },
    {
        "listingId": "1742826435",
        "url": "https://www.kijiji.ca/v-apartments-condos/ottawa/apartment-for-rent-at-forest-ridge-centrepointe/1742826435",
        "title": "Apartment for Rent at Forest Ridge, Centrepointe",
        "fullDescription": true,
        "vertical": "real-estate",
        "categoryId": 37,
        "categoryName": "Long Term Rentals",
        "categoryPath": "Real Estate > For Rent > Long Term Rentals",
        "price": 1850,
        "currency": "CAD",
        "priceType": "FIXED",
        "locationName": "Ottawa",
        "province": "ON",
        "address": "2380 Baseline, Ottawa, ON, K2C 3J4",
        "nearestIntersection": "Baseline Road & Southwood Drive",
        "latitude": 45.34383,
        "longitude": -75.77968,
        "postedAt": "2026-08-31T20:17:21.000Z",
        "sortingDate": "2026-10-30T00:25:55.000Z",
        "status": "ACTIVE",
        "views": 356,
        "sellerType": "business",
        "sellerName": "Forest Ridge",
        "sellerAccountType": "RE_PROFESSIONAL",
        "sellerWebsite": "https://www.irent.com/communities/forest-ridge",
        "sellerListingCount": 17,
        "imageCount": 17,
        "youtubeUrl": "https://www.youtube.com/watch?v=bEUUXzNn_oE",
        "virtualTourUrl": "https://my.matterport.com/show/?m=HRHNqGpxhdg",
        "unitType": "Apartment",
        "bedrooms": "1",
        "bathrooms": "1",
        "sizeSqft": 625,
        "furnished": "No",
        "petsAllowed": "Yes",
        "smokingPermitted": "No",
        "leaseTerm": "1 Year",
        "availableDate": "2026-12-01",
        "utilitiesIncluded": ["Heat", "Water"],
        "amenities": ["Laundry (In Building)"]
    }
]
```

### Use Kijiji.ca Scraper from Python or JavaScript

Install the client with `pip install apify-client` or `npm install apify-client`, and get your API token from [Apify Console](https://console.apify.com/settings/integrations).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/kijiji-scraper").call(run_input={
    "keywords": ["toyota rav4"],
    "category": "174",       # Cars & Trucks
    "location": "9004",      # Ontario
    "sellerType": "private",
    "maxPrice": 25000,
    "maxItems": 200,
})

for car in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(car["price"], car["year"], car["mileageKm"], car["locationName"], car["url"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/kijiji-scraper').call({
    startUrls: [{ url: 'https://www.kijiji.ca/b-apartments-condos/city-of-toronto/c37l1700273' }],
    scrapeDetails: true,
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((l) => console.log(l.price, l.bedrooms, l.bathrooms, l.address, l.utilitiesIncluded));
```

### Use cases

- **Used car pricing**: collect year, kilometres, trim and price for a make and model across provinces, and compare them with Kijiji's own price rating and market average.
- **Dealer inventory tracking**: paste a dealer's profile URL and monitor its stock, prices and price drops over time.
- **Rental market research**: track rents by bedroom count, size, utilities and pet policy in Toronto, Montréal, Vancouver or any other city.
- **Deal alerts**: [schedule](https://docs.apify.com/platform/schedules) a search sorted by newest with a price cap, and get new listings by email or Slack through [webhooks and integrations](https://docs.apify.com/platform/integrations).
- **Reseller sourcing**: find free items (`priceType: GIVE_AWAY`) and underpriced Buy & Sell listings from private sellers near you.
- **Lead generation and market data**: list businesses that advertise in a category, or feed listing data into dashboards, spreadsheets and models.

### How it works

1. The Actor turns your keyword, category, location, price, seller and sort settings into a Kijiji search, or uses the URLs you paste.
2. It reads the results 40 listings per page, several pages at a time, until it reaches **Max listings** or the end of the results.
3. Kijiji shows no more than 100 pages (4,000 listings) for one search. When you ask for more, the Actor splits the search into price ranges that each fit under that limit.
4. With **Scrape listing details** on, it looks up the full listing and seller profile for 20 listings per request, so details add very little run time.
5. Listings are de-duplicated across keywords and URLs and saved to the dataset as they come in. If Apify moves the run to another server, it continues without saving the same listing twice.

In our tests a 4,400-listing Toronto car search finished in about 80 seconds, and 1,000 Ontario rentals with full details in about a minute.

### How much does it cost to scrape Kijiji?

Kijiji.ca Scraper uses pay-per-event pricing: you pay for each listing saved to the dataset. Compute and proxy costs are included in the event price, so they aren't billed separately.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Listing scraped | $2.99 / 1,000 | $2.79 / 1,000 | $2.59 / 1,000 | **$2.39 / 1,000** |

One saved listing is one charge, with or without listing details. At Free plan prices, 100 listings cost about $0.30 and 10,000 listings cost $29.90. To control spending, set **Max listings**. The run also stops when it reaches the maximum cost per run you set in Apify Console.

### Is it legal to scrape Kijiji?

Kijiji.ca Scraper only collects listing information that Kijiji shows publicly to visitors who aren't logged in. It doesn't log in, doesn't send messages and doesn't access private account data or hidden phone numbers. Listings can contain personal information, such as a private seller's display name or a phone number written in the description. If you store or use that data, you're responsible for complying with Canadian privacy law (PIPEDA and provincial laws) and Kijiji's terms of use. Consult a lawyer if you're unsure. For more background, read Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other Canadian and marketplace scrapers from ParseBird

| Actor | What it does |
|-------|--------------|
| [AutoTrader Canada Scraper](https://apify.com/parsebird/autotrader-ca-scraper) | New and used car listings from AutoTrader.ca |
| [Realtor.ca Property Scraper](https://apify.com/parsebird/realtor-ca-scraper) | Canadian homes for sale and rent from Realtor.ca |
| [Job Bank Canada Scraper](https://apify.com/parsebird/jobbank-canada-scraper) | Job postings from the Government of Canada's Job Bank |
| [Facebook Marketplace Scraper](https://apify.com/parsebird/facebook-marketplace-scraper) | Facebook Marketplace listings by keyword and location |
| [Craigslist Scraper](https://apify.com/parsebird/craigslist-scraper) | Craigslist listings with contact details |
| [OfferUp Scraper](https://apify.com/parsebird/offerup-scraper) | Local marketplace listings from OfferUp |
| [Marktplaats Scraper](https://apify.com/parsebird/marktplaats-scraper) | Classifieds from Marktplaats.nl, 2dehands.be and 2ememain.be |

### FAQ

**Do I need a Kijiji account or API key?**
No. The Actor reads the same public listings the website shows to logged-out visitors.

**Do I need a proxy?**
No. Kijiji.ca Scraper runs without a proxy by default. If Kijiji starts refusing requests, it switches to Apify datacenter proxy and then Canadian residential proxy by itself.

**Can I get more than 4,000 listings from one search?**
Yes. Kijiji stops at page 100 of any search, which is 4,000 listings. When **Max listings** is higher, the Actor first reads those 4,000 and then splits the search into price ranges. Listings without a price (Please contact, Swap/Trade) are only reachable in the first 4,000, because a price range leaves them out.

**How do I use filters such as make, model, year or bedrooms?**
Set them on kijiji.ca, copy the URL from the address bar and paste it into **Kijiji URLs**. The Actor keeps every filter and the sort order in the URL. It always starts from page 1, even if the URL is for a later page.

**Why do some listings have no VIN, size or available date?**
Kijiji doesn't require these fields, so many sellers leave them empty. The Actor returns what the seller entered and `null` for the rest.

**Why are `sellerName`, `status` and `expiresAt` empty?**
They come from the listing page. Turn on **Scrape listing details**, or paste a seller profile URL, which fills in the seller fields for every listing of that seller.

**Can I get the seller's phone number?**
No. Kijiji doesn't include sellers' phone numbers in the listing data it shows to visitors. With listing details on, `hasPhoneNumber` tells you whether the seller listed one. Numbers that sellers type into the description are part of `description`.

**What are listings with `adSource: ZIP`?**
They're ZipRecruiter job ads that Kijiji mixes into its Jobs results. Their URL points to ziprecruiter.com and they have no Kijiji listing page, so listing details don't apply to them.

**What does French mode change?**
Kijiji's own labels (categories, locations, condition, transmission, job type, pet policy) and listing URLs come back in French. Titles and descriptions stay in the language the seller wrote them in.

**Can I run it on a schedule or from my own code?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) for daily or hourly runs, the [Apify API](https://apify.com/parsebird/kijiji-scraper/api) or the Python and JavaScript clients shown above, and [integrations](https://apify.com/integrations) to push results to Google Sheets, Slack, Make, Zapier or n8n.

**Something doesn't work or a field is missing. What should I do?**
Open an issue on the Actor's [Issues tab](https://apify.com/parsebird/kijiji-scraper/issues) with your input and run ID, and we'll look into it.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/kijiji-scraper/changelog.md

# Actor input Schema

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

Enter one or more search terms, the same as typing in the Kijiji search box (e.g. honda civic, 2 bedroom apartment, sectional sofa). Each keyword is a separate search that uses the Category, Location and filters below. Leave empty to browse a whole category.

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

Limit keyword searches to one Kijiji category. Pick a category without a keyword to scrape everything in it.

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

Province, region or city to search in. Kijiji includes the smaller towns of a region in its results.

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

Paste Kijiji.ca URLs: search or category result pages (with any filters you set on the site), single listing pages (/v-...), or seller and dealer profiles (/o-...). Search URLs keep their own filters and sort order.

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

Only listings priced at or above this amount in Canadian dollars. Listings without a price (Please contact, Swap/Trade) are left out when a price filter is set. Applies to keyword searches; for pasted URLs, set the price filter on Kijiji before copying the URL.

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

Only listings priced at or below this amount in Canadian dollars. Applies to keyword searches.

## `sellerType` (type: `string`):

Keep only listings from private sellers (owners) or from businesses (dealers, agents, professional employers). Kijiji filters this itself in Buy & Sell, Cars & Vehicles, rentals and Jobs; for other searches and pasted URLs the Actor keeps only listings whose seller type it can identify as a match.

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

Order of the results for keyword searches. Pasted URLs keep their own sort order. Relevance needs a keyword.

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

Maximum number of listings to save in total, shared across all keywords and URLs. Kijiji shows at most 4,000 listings per search; ask for more and the Actor splits the search into price ranges to go past that limit.

## `scrapeDetails` (type: `boolean`):

Add each listing's full description, all photos, seller name and profile, dealer website, listing status and expiry date, market average price and mileage rating for vehicles. Uses one extra request per 20 listings.

## `includeTopAds` (type: `boolean`):

Also save the paid Top Ads Kijiji shows above the regular results. They repeat on every page and do not always match your filters.

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

Language of Kijiji's labels in the output (category, location, condition, transmission and similar values) and of listing URLs. Listing titles and descriptions stay in the language the seller wrote them.

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

Kijiji works without a proxy. If requests get refused, the Actor moves to Apify datacenter and then Canadian residential proxy on its own.

## Actor input object example

```json
{
  "keywords": [
    "honda civic"
  ],
  "category": "174",
  "location": "1700272",
  "sellerType": "",
  "sortBy": "newest",
  "maxItems": 50,
  "scrapeDetails": false,
  "includeTopAds": false,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "keywords": [
        "honda civic"
    ],
    "category": "174",
    "location": "1700272",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "keywords": ["honda civic"],
    "category": "174",
    "location": "1700272",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "keywords": [
    "honda civic"
  ],
  "category": "174",
  "location": "1700272",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/kijiji-scraper --silent --output-dataset

```

## MCP server setup

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