Kijiji.ca Scraper — Canadian Classified Listings avatar

Kijiji.ca Scraper — Canadian Classified Listings

Pricing

from $4.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 $4.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

11 days ago

Last modified

Share

Free plan limit: Free-plan users can receive up to 5 result records per run. Paid-plan and local/unknown runs retain the Actor's existing limits.

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

This Actor uses pay-per-event pricing with all-in tiered rates. Apify platform usage for this Actor run is covered by the event prices below; no separate platform-usage fee is billed to users.

EventTierPrice (USD)DiscountWhen it is charged
listing-returned (Primary)FREE$0.0050010%Charged once for each valid Kijiji listing record returned in the dataset.
BRONZE$0.0048752.5%
SILVER$0.0047505%
GOLD$0.00400020%
apify-actor-start (Synthetic)FREE$0.0078070%Charged once per Actor run scaled by allocated memory (minimum one event).
BRONZE$0.0076112.5%
SILVER$0.0074165%
GOLD$0.00624520%

Representative Run Totals

  • 1 listing sample (quick canary): ~$0.010 to $0.013 total (start fee + 1 listing).
  • 25 listings (standard page): ~$0.106 to $0.133 total.
  • 50 listings (default run): ~$0.206 to $0.258 total.
  • 100 listings (multi-page batch): ~$0.406 to $0.508 total.

Reliability and limits

The actor uses high-performance direct Cheerio extraction with Canadian proxy routing, automatic retries, and bounded pagination. Kijiji search pages provide structured Next.js hydration JSON and JSON-LD payloads, with automated fallback to visible listing cards. Search-page results are validated, pushed, and billed as they are processed.

The actor allocates 512 MB memory for optimal speed and cost efficiency, completing typical single-page queries in under 5 seconds. If every request fails before any page completes, the run fails honestly with actionable diagnostics.

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.