Kijiji.ca Scraper — Canadian Classified Listings avatar

Kijiji.ca Scraper — Canadian Classified Listings

Pricing

from $5.00 / 1,000 listing returneds

Go to Apify Store
Kijiji.ca Scraper — Canadian Classified Listings

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

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:

FieldDescription
titlePublic listing title
listingUrl / listingIdCanonical public URL and ID when available
priceAmount / priceText / currencyNumeric and human-readable price
descriptionPublic description when exposed
locationPublic city, region, or area
sellerName / sellerTypePublic seller label/classification when available
postedAtPublic creation/publication time when available
imageUrlsPublic listing image URLs
attributesFlat fields such as mileage, bedrooms, condition, or employment type
sourceSearchUrlSearch URL that produced the item
detailsFetched / _warningsStable 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 ApifyClient
client = 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:

EventPrice
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.