Kijiji Scraper & Tracker - Cars, Rentals, Price Drops & MCP
Pricing
from $0.70 / 1,000 listings
Kijiji Scraper & Tracker - Cars, Rentals, Price Drops & MCP
Kijiji scraper, tracker and API for cars, rentals and real estate by keyword, city, category or link: price, price drops, owner or dealer, photos, car details, rental amenities. Only changes returns new listings, price drops and gone listings, with Slack, Discord or Teams alerts and MCP.
Pricing
from $0.70 / 1,000 listings
Rating
0.0
(0)
Developer
Akhil rajesh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 minutes ago
Last modified
Categories
Share
Kijiji Scraper & Tracker
Scrape Kijiji listings (cars, rentals and real estate, and everything else) by keyword, city and category, or from Kijiji search links: title, price and the earlier price after a drop, price type, posted date, place with coordinates, owner or dealer, photos, and each category's details: for cars the make, model, year, kilometres, VIN and CARFAX link; for rentals the bedrooms, bathrooms, size, pets, parking, utilities, amenities and nearest intersection. Read listings' own pages too for the full description, views, status and the seller's profile.
One price, no extras: $1.00 per 1,000 listings, with platform usage included and no row cap on Apify's free plan. (Apify's Store page lists platform usage too, because the live API below adds its own; ordinary runs never do.)
It is also a Kijiji tracker. Schedule it with Only changes and each run returns only what moved since the last one: new listings, price drops, price increases and listings gone (sold or taken down), each with every price the tracker has seen for the listing, posted to Slack, Discord or Microsoft Teams if you like. It runs as a live API and MCP server for AI agents too.
Why this scraper
- It tracks changes, not just listings. Most Kijiji scrapers return the same listings every run, and you work out what changed. This one keeps a history per search and returns only new listings, price drops and rises, and listings that left, each one once.
- Gone means gone. A listing missing from a search is checked on its own page first: Kijiji's "this ad was removed" redirect or an expired status reports it gone at once, while a listing that only slipped between two pages isn't reported at all.
- Reposts aren't new listings. Kijiji sellers delete an ad and post it again to bring it back to the top: in a test on Toronto iPhone listings, 3 of 15 "new" listings in ten minutes were reposts. A new listing by the same seller under the same title as one that left is one
relistedchange, with the old listing's id and price, not a new listing plus a gone one. An older ad that only now shows up in the search (edited into it, or skipped by a page last time) is recorded quietly rather than reported new. - A price history of your own. Kijiji shows at most one earlier price. With Only changes, each change row carries
trackedPrices: every price your tracker saw for the listing, with the day it first saw it. - Filters Kijiji's own links can't keep. Price range, owner or dealer, posted within N days, only price drops, photos only, words to leave out, car year and kilometres, rental bedrooms: applied as the pages are read.
- No runaway bills. Every run stops at Max results (1,000 unless you set it) or at your maximum cost per run. Searches and listings Kijiji can't show are free.
- Clear about what it didn't read. Anything Kijiji didn't answer is named in the status message, and a run that read nothing fails without charging.
| Typical Kijiji scrapers | This Actor | |
|---|---|---|
| New listings, price drops, gone listings since the last run | You compare runs yourself (a few small trackers do new listings) | Built in (Only changes) |
| Alerts to Slack, Discord, Teams | Rare | Yes |
| Price history | Kijiji's one earlier price | That, plus your tracker's own, on every change row |
| Cars (make, model, year, km, VIN, CARFAX) and rentals (beds, baths, size) | Some | Yes, as their own fields and views |
| Full description, views, status, seller's profile | Some | Yes, from listing pages (up to 200 a run) |
| MCP server for AI agents | None | Its own (4 tools) |
| Rows on Apify's free plan | Some stop at 100 a run | No cap |
| Price per 1,000 listings | About $0.40 to $3.45, some plus a fee per run or paid add-ons | $1.00, less on paid plans, listing pages included |
Use cases
- Kijiji alerts: a schedule every few hours for "PS5" or "road bike" in your city that posts each new listing and price drop to Slack or Discord, before anyone else calls.
- Used car deals: cars by year and kilometres with Kijiji's price rating, dealer or private, and every price drop.
- Rental watch: new rentals in your city with bedrooms, bathrooms, size, pets and utilities, and rent drops over time.
- Resellers and flippers: underpriced items in a category, with how long they've been up and how many people viewed them.
- Market research: how many listings a search has, their median price and how many dropped their price (in the run summary).
- Dealer and competitor monitoring: a dealer's or a category's listings, and what changed since yesterday.
- AI agents: ask an assistant "which 2018+ Honda Civics under 120,000 km are for sale in Ottawa?" through the MCP server.
How to use it in 4 steps
- Add Searches: keywords such as
iphone 15orhonda civic, or Kijiji search links such ashttps://www.kijiji.ca/b-city-of-toronto/iphone/k0l1700273. - Set the Location (
Toronto (GTA),Ottawa,London, ON,Alberta, or empty for all of Canada) and, if you like, a Category (cars,apartments,Cell Phones). A category without a keyword reads the whole category. - Set Max results and any filters, and run it.
- To track changes, switch on Only changes since the last run, add an Alert webhook URL if you want chat alerts, and schedule it.
What you get
One row per listing (type: "listing"). Example (a real row from Cars & Trucks in Toronto (GTA), shortened):
{"type": "listing","id": "1742985646","search": "Cars & Trucks, Toronto (GTA)","title": "2018 Chevrolet Silverado 1500 Custom","price": 26998,"priceType": "fixed","currency": "CAD","originalPrice": 28510,"priceDrop": 1512,"priceRating": "GREAT","plusTaxes": true,"postedAt": "2026-10-22T13:26:23.000Z","location": "Oshawa / Durham Region","category": "Cars & Trucks","sellerType": "dealer","make": "chevrolet","model": "slvrd1500","year": 2018,"mileageKm": 80286,"kmPerYear": 10036,"trim": "Custom","drivetrain": "4x4","fuelType": "gas","vin": "1GCVKPEC0JZ124598","carfaxUrl": "https://vhr.carfax.ca/?id=DHdxRACN46l7Lo3RsCo4CBgsBOxoYOwH","summary": "2018 Chevrolet Silverado 1500 Custom (80,286 km; $26,998 plus taxes (was $28,510)), dealer, Oshawa / Durham Region, posted 2026-10-22.","url": "https://www.kijiji.ca/v-cars-trucks/oshawa-durham-region/2018-chevrolet-silverado-1500-custom/1742985646"}
Every row also has the address or area the seller gave, latitude and longitude, the category, photo links, the seller's Kijiji id and rating, attributes (every attribute Kijiji lists, by its name), isPromoted (a paid placement inside the results), and searchUrl. Rentals also have amenities (air conditioning, dishwasher, laundry in unit or building, balcony, gym, pool and more) and nearestIntersection. Car and rental fields use Kijiji's own values: a car's model is Kijiji's code for it (slvrd1500; the title names it), and a rental's bathrooms can be 1.5.
Prices: price is in Canadian dollars (monthly rent for rentals), 0 for free items, and empty for "please contact" and swap/trade listings (priceType says which). originalPrice and priceDrop come when Kijiji shows the seller lowered the price.
With Only changes, each row also has change; price changes have previousPrice, changeAmount and changePercent; and every change row has trackedPrices (the prices the tracker saw, [{"date", "price"}], the latest 6) and firstSeenDate:
| change | meaning |
|---|---|
newListing | a listing the tracker hadn't seen in the search, posted since the last run |
priceDrop / priceIncrease | the price moved since the last run |
removed | gone: Kijiji says it was removed, or its page says it expired, or it was missing two runs in a row |
relisted | its seller took it down and posted it again under a new id (relistOf is the old id, previousPrice its price) |
firstRun | the first run's baseline: the listings there now |
Listing pages (Listing pages to read, or the Listings input) add the full description (search pages carry its first 200 characters), views, status, end date, the seller's profile link and number of listings, and a business seller's name (a dealer, a property manager). Private sellers' names aren't collected, and neither are phone numbers.
The dataset has views for Listings, Changes, Cars and trucks, Rentals and real estate and Listing pages (a view picks columns: every view lists every row, so filter on type or change if you need to).
How to use it
Searches, location and category
A keyword is searched the way Kijiji's search box does, in the Location and Category you set. A location is a city (Ottawa, Montréal), a region (Toronto (GTA), Greater Vancouver Area), a city with its province (London, ON), a province (Alberta), or empty for all of Canada; a category is Kijiji's name (Cars & Trucks, Apartments & Condos, Cell Phones) or a plain word (cars, apartments, rentals, furniture, free stuff). A pasted Kijiji link carries its own place and category; its other filters (price, sort, radius) aren't read, because Kijiji's robots.txt doesn't allow them: use this Actor's filters.
Results come in Kijiji's own order, 40 a page: a category without a keyword is newest first, and a keyword search can come by relevance, as on the site. Kijiji shows at most about 4,000 listings per search; Max listings read per search (1,000 by default) sets how far each search is read.
Listings
Kijiji listing links or ids, each read from its own page. A listing that is gone gets a free notFound row.
Filters
Minimum and maximum price, seller types (owner, dealer, professional), posted within N days, only listings with a price drop, only listings with photos, words to leave out of titles (wanted, case, broken), and for cars the minimum year and maximum kilometres, for rentals the minimum bedrooms. Paid top ads are left out unless you include them, and Leave out promoted listings also drops the paid placements Kijiji puts inside the results (about a third of a Cars & Trucks page, mostly dealers).
Tracking changes on a schedule (Kijiji tracker)
- Switch on Only changes since the last run. Optionally pick the Changes to return.
- Run it once: the first run returns the listings there now as
firstRun(up to Max results) and saves them as the baseline. - Schedule it (Apify Console, Schedules). Each later run returns only the changes.
How it decides:
- Each search is read whole, up to Max listings read per search, and every listing is compared with the last run.
- A listing missing from a search read whole is checked on its own page (up to 50 a run): Kijiji's "removed" redirect or a status other than active reports it gone at once; a listing still active there is left alone. Without a page check it is reported gone when it is missing two runs in a row.
- A search read only in part (past Max listings read per search) can't tell a gone listing from one past the cut, so it reports no gone listings.
- A listing the tracker hasn't seen is reported new only if it was posted since the day before the last run; an older ad that shows up for the first time is recorded quietly. A new listing by the seller of a listing that left, under the same title, is reported once as
relisted. - Each listing's prices are kept as the tracker sees them (the latest 6).
- Histories are kept per search and filters (two trackers with different filters don't mix), in the key-value store
kijiji-scraper-history, or one you name in History name. - Only what a run returns moves the history: if Max results or your spending limit stops a run, the changes it didn't return come with the next run. The most important come first: price drops, new listings, gone listings, reposts, price increases.
Alerts in Slack, Discord or Microsoft Teams
Paste an incoming-webhook URL in Alert webhook URL (Slack, Discord, Microsoft Teams, or any HTTPS endpoint that takes JSON, such as Zapier, Make or n8n). It switches on Only changes. The first run posts one short "alerts are set up" message; each later run posts its changes (new listings and price drops by default, or those you pick in Alert on), up to 50 per run, most important first, each with the photo, price move, place and link. The URL is treated as a secret and masked in logs. If posting fails, the run still succeeds and its status says why.
Run summary for pipelines
Each run saves a RUN_SUMMARY record in its key-value store: per search, Kijiji's count, listings read, whether it was read whole, the median price and the listings with a price drop; plus the changes, what didn't load and why, and the filters used. Every listing row also has a one-sentence summary, ready for a report, an alert or an AI agent.
Kijiji API: use it from code or from an AI assistant
Start a run and get the rows in one call (replace <YOUR_TOKEN>; a call that waits gives up after 5 minutes, so start bigger runs without waiting and read the dataset afterwards):
curl -X POST "https://api.apify.com/v2/acts/akhil_rajesh~kijiji-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer <YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"searches": ["ps5"], "location": "Ottawa", "maxResults": 100, "maxPrice": 500}'
Or from Python with apify-client:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_TOKEN>")run = client.actor("akhil_rajesh/kijiji-scraper").call(run_input={"searches": ["honda civic"], "location": "Toronto (GTA)", "category": "cars", "maxResults": 300,"minYear": 2018, "maxMileageKm": 120000, "sellerTypes": ["owner"],})for row in client.dataset(run.default_dataset_id).iterate_items():print(row["summary"])
For AI agents: MCP server and live API
The Actor also runs as a live endpoint (Apify Standby): an MCP server that agents call directly, and plain HTTP endpoints. Once a Standby run is up, a request is answered in seconds; the first request starts one. Authenticate with your Apify API token in the Authorization: Bearer <token> header.
MCP server (Streamable HTTP): https://akhil-rajesh--kijiji-scraper.apify.actor/mcp
{"mcpServers": {"kijiji": {"type": "http", "url": "https://akhil-rajesh--kijiji-scraper.apify.actor/mcp","headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}
In Claude Code:
$claude mcp add --transport http kijiji https://akhil-rajesh--kijiji-scraper.apify.actor/mcp --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"
A client that can't send headers can use https://akhil-rajesh--kijiji-scraper.apify.actor/mcp?token=<YOUR_APIFY_TOKEN>; keep that URL private, as it carries your token. Through Apify's MCP server (https://mcp.apify.com, for Claude, ChatGPT, Cursor and other clients), add the tools with https://mcp.apify.com?tools=akhil_rajesh/kijiji-scraper (they appear as akhil_rajesh--kijiji-scraper--search_listings and so on), then ask in plain words, for example "find PS5 listings under $450 from private sellers in Toronto". Add them that way rather than through Apify's generic call-actor tool, which returns the rows only as text. Apify's MCP server doesn't offer Actors with a live endpoint to agents that pay per call with x402 or Skyfire: connect with an Apify account or API token.
| Tool | What it returns |
|---|---|
search_listings | Listings for up to 3 keywords or Kijiji links in a location and category, with price, earlier price, posted date, place, owner or dealer, car or rental details and a one-line summary; filters on price, seller, posted date, words, car year and km, bedrooms |
find_price_drops | Listings whose seller lowered the price, with the earlier price and the drop |
get_listings | Listings read from their own pages by link or id: full description, views, status, the seller's profile |
run_actor | The Actor's whole input in one call |
HTTP endpoints, such as GET https://akhil-rajesh--kijiji-scraper.apify.actor/listings?searches=ps5|xbox&location=Ottawa&max=100&maxPrice=500 (separate several searches or listings with |; defaults in brackets). The Actor's Endpoints tab in Apify Console lists them too, and lets you try them.
| Endpoint | Parameters |
|---|---|
GET /listings | searches, location, category, max (100), minPrice, maxPrice, sellers, postedWithinDays, exclude, priceDrops, photos, minYear, maxKm, minBeds, listingPages (0) |
GET /price-drops | searches, location, category, max (100), minPrice, maxPrice, sellers, postedWithinDays, exclude |
GET /listing | listings (links or ids) |
POST /run | The Actor's whole input as the JSON body |
Answers carry the rows, rowsByType, notFound (searches or listings Kijiji can't show: free), notLoaded (what Kijiji didn't answer), notRead (what a limit left out: not charged) and notes. A request that reads nothing gets an error and nothing is charged: HTTP 400 for an argument it can't read (a tool error over MCP), 503 when Kijiji didn't answer or the run was busy (send it again), 402 when your spending limit for the run is reached (it lifts when the run ends, after 2 minutes without requests). A 503 can also carry rows, when the platform stopped the run while a request was being read: those were stored and charged, and notRead names the rest.
Limits per request: an MCP tool call reads up to 3 searches, 200 listings and 10 listing pages, about 350 kB of rows, within 50 seconds, and asks for 50 listings unless told otherwise (MCP clients stop waiting at 60 seconds, and Apify's MCP server drops answers over about 1 MB); an HTTP request reads up to 10 searches, 2,000 listings, 40 listing pages and about 6 MB within 170 seconds. Kijiji serves 40 listings about every 2 seconds. What a limit leaves out is named in notRead and isn't charged. A request that has started runs to its end even if you stop waiting: Apify's Standby proxy keeps it open, so its rows are read and charged. Ask for what you need. Tracking (Only changes) and alerts belong to scheduled runs: the live endpoint answers each request on its own, so it ignores those fields.
How much does it cost?
You pay $1.00 per 1,000 listings, less on paid Apify plans, plus a start fee of $0.00005 per run. Platform usage is included in runs of the Actor: there is no compute charge on top, and no row cap on Apify's free plan. (The Store page's pricing box mentions platform usage because of the live endpoint, which charges its own; ordinary runs never do.) Listing pages are included in the listing's price. Not-found rows are free. With Only changes you pay only for the changes returned. The live endpoint (MCP server and HTTP API) charges listings at the same prices, plus the Standby run's platform usage while it serves you and until it has been idle for 2 minutes (a short session costs a fraction of a cent).
| Apify plan | Per 1,000 listings |
|---|---|
| Free | $1.00 |
| Starter | $0.90 |
| Scale | $0.80 |
| Business and above | $0.70 |
| Run | Listings | Cost (Free plan) |
|---|---|---|
| A keyword in one city (about 300 listings) | 300 | about $0.30 |
| A category's newest 1,000 listings | 1,000 | about $1.00 |
| A tracker of 3 searches every 6 hours, about 20 changes a run | 80 a day | about $0.08 a day |
| 50 listings read from their own pages | 50 | about $0.05 |
Apify's free plan ($5 of monthly credit) covers about 5,000 listings. To cap spending, lower Max results or set a maximum cost per run in the run options; the Actor stops cleanly at the limit (and with Only changes, the rest comes with the next run).
Good to know
- Speed: about 2 seconds per search page of 40 listings, and 2 seconds per listing page. A tracker of a 1,000-listing search reads it in under a minute.
- Kijiji's own limit: Kijiji shows at most about 4,000 listings per search. Narrow a bigger one with a category or a smaller place.
- Order: Kijiji's robots.txt doesn't allow its sort parameter, so results come in Kijiji's own order (newest first for a category, often by relevance for a keyword). With Only changes, the order doesn't matter: each search is read whole up to Max listings read per search.
- Refusals: a run that meets Kijiji's bot check asks again a few times, then fails without charging; listing pages refused once aren't asked again in that run.
- What isn't collected: phone numbers and private sellers' names. Business sellers' names come from listing pages.
FAQ
Can I get Kijiji alerts for new listings? Yes: switch on Only changes, paste a Slack, Discord or Teams webhook in Alert webhook URL, and schedule it (every few hours is typical). Each new listing and price drop is posted once.
Can it track price drops on Kijiji? Yes, two ways: Kijiji's own earlier price (originalPrice, and the Only listings with a price drop filter) in any run, and with Only changes every move your tracker sees, with trackedPrices.
Does it count reposted ads as new? No. A listing its seller deleted and posted again, under the same title, comes once as relisted (with the old id and price), and alerts leave reposts out unless you pick them in Alert on.
How do I know a listing sold? Kijiji doesn't say "sold"; it removes the ad. With Only changes, a listing that leaves the search is checked on its own page and reported removed once Kijiji says it was removed or expired.
Can it scrape Kijiji Autos (cars and trucks)? Yes: set Category to cars (Cars & Trucks). Rows have make, model code, year, kilometres, km per year, trim, body type, drivetrain, fuel, colour, condition, VIN, stock number, CARFAX link and Kijiji's price rating; filter by year, kilometres and seller.
Does it work for rentals? Yes: apartments (Long Term Rentals) or rentals, with bedrooms, bathrooms, size, furnished, pets, parking, lease type, availability and utilities.
Can I paste a Kijiji search link? Yes. Its place, category and keyword are read; its filters aren't (Kijiji's robots.txt doesn't allow them), so set them in this Actor's filters.
Does it get the seller's phone number? No, this Actor doesn't collect phone numbers. A business seller's name and every seller's profile link come from listing pages, and the listing's link leads to Kijiji's own contact button.
Do I need a proxy? No: Kijiji answers Apify's servers directly. You can use your own proxies; Apify's residential proxies aren't available in this Actor, as they're billed per GB on top of the result price.
Is it legal? The Actor reads public listing pages that Kijiji's robots.txt allows, at a modest pace, without logging in. Use the data in line with Kijiji's terms and the laws that apply to you, including privacy laws when you contact sellers.
Other Actors by this developer
- Zillow Price Tracker & Scraper: US homes for sale, sold and for rent, with price cuts, agents and change tracking
- Amazon.ca Product & Trending Tracker: Amazon Best Sellers, prices, search positions and reviews on 23 marketplaces, with change tracking
- Price Tracker Canada: one product's price at Best Buy, Walmart, Canada Computers and more
- AliExpress Price Tracker & Scraper: AliExpress search results with store prices, units sold and price history
Disclaimer
This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Kijiji or Adevinta. It reads publicly available listing pages at a modest pace. Use the data in line with Kijiji's terms and the laws that apply to you.