Kijiji Listings Scraper
Pricing
Pay per event
Kijiji Listings Scraper
Scrape Kijiji.ca listings by search term — title, price, location, image, and URL from Canada's #1 classifieds marketplace. No login needed. Export clean, deduped JSON rows for resale research or price tracking.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
🎯 What this scrapes
Kijiji is Canada's #1 classifieds marketplace, eBay-family, with no public API. This Actor runs a search-term search, walks every result page, and pulls each listing's title, price (CAD, or a placeholder for service ads with no fixed price), location, image, and URL out of the page's embedded Apollo/NEXT_DATA JSON payload — not scraped HTML tags. Search as many terms as you like in one run — results are merged and deduped by listing ID across pages and terms.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Resale arbitrage — track underpriced secondhand listings by search term across Canada.
- Market research — benchmark asking prices for a product category over time.
- Lead generation — build a directory of active listings for a keyword niche.
- Price-drop alerts — diff successive runs to catch reductions on watched searches.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchTerms | array | yes | ['laptop', 'bicycle'] | One or more search terms, e.g. ["laptop", "bicycle"]. The Actor runs one search per entry and merges the… |
maxItems | integer | no | 5 | Hard cap on dataset rows across all search terms combined. |
maxPagesPerTerm | integer | no | 3 | Safety cap on pages fetched per search term (40 listings/page on Kijiji), regardless of max results. |
proxyConfiguration | object | no | {'useApifyProxy': True, 'apifyProxyGroups': [], 'apifyProxyCountry': 'CA'} | Apify Proxy spec. No anti-bot signature has been observed on Kijiji's search pages, so a datacenter group works — but… |
Example input
{"searchTerms": ["laptop","bicycle"],"maxItems": 10,"maxPagesPerTerm": 2,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": [],"apifyProxyCountry": "CA"}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Kijiji StandardListing Apollo cache key, id part. |
title | string | Listing headline. |
price_amount | ['number', 'null'] | Parsed CAD amount. null for service ads with no fixed price — see price_raw. |
price_raw | string | Human-readable price text as rendered, or a fixed placeholder when no amount (always populated). |
currency | string | Always CAD. |
location | ['string', 'null'] | Listing location/area text. |
image_url | ['string', 'null'] | First image URL from the listing record, when present. |
url | string | Absolute URL to the listing detail page. |
search_term | string | The input search term that produced this row. |
scraped_at | string | ISO-8601 UTC timestamp when this row was recorded. |
Example output
{"listing_id": "1731050620","title": "Laptops, Gaming Laptop, Official Laptop","price_amount": 450.0,"price_raw": "$450.00","currency": "CAD","location": "City of Toronto","image_url": "https://i.ebayimg.com/...","url": "https://www.kijiji.ca/v-laptops/city-of-toronto/apple-macbook-air-m2-with-full-applecare-plus/1743623497","search_term": "laptop","scraped_at": "2026-09-20T12:00:00.000Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result | $0.0025 | Per dataset item |
Example: 1 000 results at the rates above ≈ $2.70. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- v1 supports the national /b-canada/ search-term browse only — province-scoped browse is not implemented.
- No category-ID browse — free-text search-term browse only.
- Only list-card fields are scraped — no item-detail-page enrichment (full description, seller profile, phone).
- Data comes from Kijiji's own embedded Apollo/NEXT_DATA JSON payload, not a published public API.
❓ FAQ
Do I need to log in or provide cookies?
No. Kijiji's search-term browse pages and listing cards are public — the Actor needs no account, cookies, or login.
What happens if a search term has no results?
The run finishes successfully with zero rows for that term and moves to the next one — an empty search is not an error.
Can I search multiple terms in one run?
Yes — add as many entries to searchTerms as you like; results are merged and deduped by listing ID across the whole run.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.