Kijiji Listings Scraper avatar

Kijiji Listings Scraper

Pricing

Pay per event

Go to Apify Store
Kijiji Listings Scraper

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

DevilScrapes

Maintained by Community

Actor 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 rotationcurl-cffi impersonates 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-After honoured.
  • 🧱 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

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
searchTermsarrayyes['laptop', 'bicycle']One or more search terms, e.g. ["laptop", "bicycle"]. The Actor runs one search per entry and merges the…
maxItemsintegerno5Hard cap on dataset rows across all search terms combined.
maxPagesPerTermintegerno3Safety cap on pages fetched per search term (40 listings/page on Kijiji), regardless of max results.
proxyConfigurationobjectno{'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.

FieldTypeNotes
listing_idstringKijiji StandardListing Apollo cache key, id part.
titlestringListing headline.
price_amount['number', 'null']Parsed CAD amount. null for service ads with no fixed price — see price_raw.
price_rawstringHuman-readable price text as rendered, or a fixed placeholder when no amount (always populated).
currencystringAlways CAD.
location['string', 'null']Listing location/area text.
image_url['string', 'null']First image URL from the listing record, when present.
urlstringAbsolute URL to the listing detail page.
search_termstringThe input search term that produced this row.
scraped_atstringISO-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:

EventUSDWhat it is
actor-start$0.2One-off warm-up charge per run
result$0.0025Per 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.