Kijiji.ca Scraper — Canadian Classified Listings
Pricing
from $5.00 / 1,000 listing returneds
Kijiji.ca Scraper — Canadian Classified Listings
Scrape permitted Kijiji.ca search-result pages for listing titles, prices, descriptions, locations, sellers, images, dates, and attributes. Supports pagination and optional detail-page enrichment.
Pricing
from $5.00 / 1,000 listing returneds
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape Kijiji.ca search-result pages that you are authorized to access and return stable, agent-friendly listing records. The actor supports multiple search URLs, Kijiji’s page-N pagination format, Canadian English/French browser headers, and residential proxy routing.
What it extracts
Each dataset item represents one public Kijiji listing:
| Field | Description |
|---|---|
title | Public listing title |
listingUrl / listingId | Canonical public URL and ID when available |
priceAmount / priceText / currency | Numeric and human-readable price |
description | Public description when exposed |
location | Public city, region, or area |
sellerName / sellerType | Public seller label/classification when available |
postedAt | Public creation/publication time when available |
imageUrls | Public listing image URLs |
attributes | Flat fields such as mileage, bedrooms, condition, or employment type |
sourceSearchUrl | Search URL that produced the item |
detailsFetched / _warnings | Stable schema flag and non-fatal extraction notes; detail pages are not crawled |
The output is intentionally generic across Kijiji cars, real estate, jobs, services, and Buy & Sell categories. Vertical-specific values are preserved in attributes when Kijiji exposes them; the actor does not invent missing fields.
When to use it
Use this actor for permitted market research, resale research, price monitoring, inventory checks, rental research, and AI workflows that need structured Canadian classified listings. It is designed for a narrow outcome: search-result listing extraction from Kijiji.ca.
Do not use it for private messages, watchlists, login-only information, hidden phone/email discovery, account automation, CAPTCHA solving, or bypassing access controls. For a single known listing, pass a search URL that contains the listing or use a dedicated detail-page workflow; this actor’s primary input is a search-results page.
Important compliance notice
Kijiji’s current Terms of Use state that users may not use a robot, spider, scraper, or other automated means to access Kijiji and collect content without Kijiji’s express written permission. Only run this actor where you have that permission or another lawful, contractually valid basis. You are responsible for complying with Kijiji’s terms, applicable privacy/data-protection law, robots instructions, proxy-provider rules, and any restrictions attached to the data you collect. The actor does not provide permission to scrape and does not bypass authentication, CAPTCHAs, or technical access controls.
Input
searchUrls
An array of full Kijiji search-result URLs. The default is a small Canada-wide cars search:
{"searchUrls": ["https://www.kijiji.ca/b-cars-trucks/gta-greater-toronto-area/c174l1700272","https://www.kijiji.ca/b-apartments-condos/city-of-toronto/c37l1700273"],"maxResults": 50,"maxPages": 2}
The actor follows Kijiji’s path-style pagination, for example /page-2/, and counts maxResults across all supplied URLs. It removes duplicate listing URLs within a run.
maxResults
Maximum total listing records to return, from 1 to 500. Each returned listing is one billable listing-returned event. The actor prints the maximum listing-event cost at run start and stops at the configured cap.
maxPages
Maximum pages to visit per search URL, from 1 to 20. Keep this at 1 for quick health checks and raise it only when you need deeper pagination.
language
Controls the browser’s Accept-Language header: all, en, or fr. It does not translate listing content.
Proxy settings
Apify residential proxy routing is enabled by default and uses Canada (CA). You can set useApifyProxy to false only when direct access is compliant and appropriate. proxyCountry changes network geography; it does not change the Kijiji location encoded in your search URL.
Output example
{"listingId": "1701234567","title": "2019 Honda Civic EX","description": "One-owner vehicle with winter tires.","priceAmount": 18500,"priceText": "$18,500","currency": "CAD","location": "Toronto, ON","sellerName": "Maple Auto Sales","sellerType": "professional","postedAt": "2026-07-30T16:00:00Z","listingUrl": "https://www.kijiji.ca/v-cars-trucks/toronto/2019-honda-civic/1701234567","imageUrls": ["https://media.kijiji.ca/api/v1/ca-prod-dealer-ads/images/example.jpg"],"attributes": { "mileage": 85000, "condition": "Used" },"sourceSearchUrl": "https://www.kijiji.ca/b-cars-trucks/canada/c174l0","scrapedAt": "2026-08-01T10:30:00.000Z","detailsFetched": false,"_warnings": []}
API usage
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('USERNAME/kijiji-ca-scraper').call({searchUrls: ['https://www.kijiji.ca/b-buy-sell/city-of-vancouver/c10l1700287'],maxResults: 100,maxPages: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map(({ title, priceAmount, listingUrl }) => ({ title, priceAmount, listingUrl })));
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("USERNAME/kijiji-ca-scraper").call(run_input={"searchUrls": ["https://www.kijiji.ca/b-apartments-condos/city-of-montreal/c37l1700281"],"maxResults": 50,"maxPages": 2,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["priceText"], item["listingUrl"])
Pricing
The actor uses Pay-Per-Event pricing:
| Event | Price |
|---|---|
| Actor start | $0.00005 per run, scaled by memory |
| Listing returned | $0.005 per listing |
Example: a 100-listing run has an estimated listing-event charge of $0.50 plus the actor-start event and normal Apify compute/proxy usage. A run capped at 25 listings cannot incur more than 25 listing-returned events. Pay-Per-Usage is also available through Apify’s standard usage billing for users who prefer compute/proxy pass-through.
Reliability and limits
The actor uses a real browser with Crawlee sessions, conservative concurrency, retries, and Canadian residential proxy defaults. Kijiji may return a challenge page, a temporary block, no results, or a changed page structure. Search-page results are pushed as they are processed. If every request fails before any page completes, the run fails honestly with a retry suggestion.
The parser prefers structured page data such as Next.js hydration JSON and JSON-LD, then falls back to visible listing-card anchors. It uses multiple field-name fallbacks rather than depending on one CSS class. attributes is best-effort and may differ by Kijiji category.
FAQ
Does this include seller phone numbers or emails? No. It returns only public fields exposed in permitted page content and does not search for hidden contact information.
Can it scrape all of Canada? Yes, if the supplied Kijiji URL represents that scope and your authorized collection workflow permits it. Set a suitable maxResults and maxPages cap.
Why is my dataset empty? A valid search can have no matching listings, or Kijiji may have served a challenge/blocked response. Check the run log and RUN_SUMMARY; the actor distinguishes a valid empty result from total request failure.
Why are some fields null? Kijiji does not expose every field on every search card. The actor preserves explicit nulls and records only non-fatal extraction notes in _warnings.
How should I report a parser issue? Include the run ID, exact search URL, actor input, and a sanitized example of the missing field. Do not include account credentials, private messages, or personal contact data.