Kijiji.ca Scraper at a glance
Kijiji.ca Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, price, currency and category type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Jobs, Ecommerce
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 19 options
Scrape Kijiji.ca listings across property, vehicles, jobs, electronics, furniture, services, and more. Search by keyword and location or use any Kijiji URL. Extract titles, descriptions, prices, photos, GPS coordinates, seller details, and category-specific attributes.
What Kijiji.ca Scraper can do
- Every category, one actor. The extractor adapts automatically to property, vehicles and general classifieds, so the same run handles an apartment search and a car search alike.
- Rich records from the search page alone. 20+ fields per listing straight off the results page, including a description preview, the search page's own photo thumbnails and GPS coordinates, no extra fetch required. Turn on Fetch listing details, or paste a single-listing URL, for the full description text and the complete photo set.
- Optional detail enrichment. Switch on view counts, seller phone and website, listing status, virtual tour or video, and dealer profile per run.
- Two ways in. Search by keyword and location across any Canadian city, region or province, or paste Kijiji search, category or single-listing links directly.
- Price and sort filters that actually narrow. Minimum and maximum price apply to a keyword search and a pasted URL alike, and a run walks the whole result set with no artificial page ceiling unless you set one.
- Built for recurring monitoring. Turn on Incremental mode to get only new, updated or reappeared listings on a schedule, or paste a previous run's id to collect just what's new since then.
Choose what to collect
These inputs let you configure Kijiji.ca Scraper - Listings, Prices & Seller Details. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search by keyword + location, or paste Kijiji URLs directly. |
keywordsarray | Search terms (Search mode). Each term runs as a separate all-category search. Leave empty to browse every listing in the location. |
locationstring | City, region, or province name (e.g. 'Toronto', 'Vancouver', 'Ontario'), a Kijiji location slug ('city-of-toronto'), or a numeric location id. Defaults to all of Canada. |
sortBystring | Result ordering. Note: Kijiji inserts a few promoted ads at the top regardless of sort. |
urlsarray | Kijiji links (URL mode): search pages (keyword, with or without a location), category and all-categories location pages, paginated /page-N/ links (the walk starts at that page), links with sort/price filters (kept and applied), single listing links (/v-.../ or the older v-view-details.html?adId=), the kijiji.ca host without www, and French-locale links. Multiple supported. Seller profile pages, the m.kijiji.ca host and other sites are skipped with a warning. Leaving this list at its default scrapes one example of each shape. Keywords, Location, and Sort by are search-only and have no effect here; Min/Max price still filters these results. |
minPriceinteger | Minimum price filter in Canadian dollars. Leave empty for no minimum. |
maxPriceinteger | Maximum price filter in Canadian dollars. Leave empty for no maximum. |
Show 12 more inputs
| Input | What it controls |
|---|---|
fetchDetailsboolean | Open each listing's detail page for view count, seller phone + website, listing status, virtual tour / video, and dealer profile. Slower but much richer. |
maxPagesinteger | Optional bound on result pages walked per search/URL (40 listings per page). Use 0 to walk the whole catalogue: the run stops on its own once Kijiji's reported total is reached, a page comes back empty, or a page returns no new listings. This does NOT cap the number of listings saved; use Max listings for that. |
maxListingsinteger | Maximum listings to save across the whole run. 0 = unlimited (paid plans only): collect every available listing, bounded only by Max pages and the natural end of results. |
resumeFromRunIdstring | ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings (a delta). Combine both runs' datasets for the full set. Max listings then counts only the new listings. For a recurring/scheduled search, use Incremental mode below instead: it remembers the previous run itself, without pasting an id every time. |
incrementalModeboolean | For a search/URL list you run on a schedule (daily, weekly): the actor remembers the listings it saw last time (in a dedicated key-value store, keyed by this search) and, by default, only returns listings that are NEW, UPDATED (price, description... changed) or REAPPEARED. Unlike Resume above, you never need to paste a run or dataset id; it tracks itself. Off by default: a normal run always returns every matching listing. |
stateKeystring | Optional label for the tracked search when Incremental mode is on, e.g. 'toronto-iphones'. Leave empty to let the actor derive one automatically from your search/URL filters (two different searches never share a baseline either way). Set this if you want a stable, human-readable name, or want to run the exact same search twice as two separate monitoring campaigns. |
emitUnchangedboolean | When Incremental mode is on, also return listings with no changes since last time (changeType 'UNCHANGED'), not just NEW/UPDATED/REAPPEARED. Off by default. Returning unchanged rows bills like any other listing, turn this on only if you need the full current snapshot every run, not just what changed. |
emitExpiredboolean | When Incremental mode is on AND this run scans the search to its natural end (no Max listings/Max pages cap reached, no Resume from a previous run), also return one row per previously-seen listing no longer found (changeType 'EXPIRED'), using its last-known data. Off by default. Returning expired rows bills like any other listing. |
ignoreFieldsForChangesarray | Incremental mode only: output fields that must never make a listing UPDATED or appear in changedFields, e.g. 'description' or a nested path like 'posterInfo.rating'. The fields stay in the output; they are only skipped when comparing with the last run. Always ignored regardless: views and sortingDate. Changing this list never causes a one-time wave of UPDATED rows. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)pricePrice (number)currencyCurrency (text)listingTypeCategory Type (text)locationNameLocation (text)addressAddress (text)sellerTypeSeller (text)viewsViews (number)activationDateListed (text)urlURL (link)changeTypeChange (Incremental mode) (text)Show 38 more fields
changedFieldsChanged fields (Incremental mode) (object)firstSeenAtFirst seen (Incremental mode) (date)lastSeenAtLast seen (Incremental mode) (date)posterIdPoster ID (text)phoneNumberPhone (text)sellerWebsiteUrlWebsite (link)posterRatingRating (number)posterVerifiedVerified (text)statusStatus (text)virtualTourUrlVirtual tour url (link)youtubeVideoIdYoutube video id (text)requestViewingUrlRequest viewing url (link)endDateEnd date (text)imageCountImage count (number)brandBrand (text)modelModel (text)modelYearModel year (number)milageMilage (number)fuelTypeFuel type (text)transmissionTransmission (text)bodyTypeBody type (text)colorColor (text)driveWheelConfigurationDrive wheel configuration (text)seatsSeats (number)numberOfDoorsNumber of doors (number)vinVin (text)conditionCondition (text)trimTrim (text)listingTypeOfferListing type offer (text)street_addressStreet address (text)localityLocality (text)regionRegion (text)postalCodePostal code (text)latitudeLatitude (number)longitudeLongitude (number)dateFromDate from (text)dateToDate to (text)mlsAdMls ad (boolean)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "1700000000",
"listingType": "AutosListing",
"title": "Sample listing title",
"description": "Full listing description appears here.",
"url": "https://www.kijiji.ca/v-cars-trucks/city-of-toronto/sample-listing/1700000000",
"price": 12500,
"priceRaw": 1250000,
"priceType": "FIXED",
"currency": "CAD",
"categoryId": 174,
"locationName": "Toronto",
"address": "1 Placeholder Crescent, Toronto, ON, M0M 0M0",
"latitude": 43.65,
"longitude": -79.4,
"nearestIntersection": [
"Sample Road",
"Example Avenue"
],
"imageUrls": [
"https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/00/00000000-0000-0000-0000-000000000000?rule=kijijica-200-jpg"
],
"imageCount": 8,
"posterId": "1700000001",
"sellerType": "PVT",
"posterRating": 4.5,
"posterVerified": false,
"activationDate": "2026-01-01T00:00:00.000Z",
"isTopAd": false,
"attr_carmake": "ford",
"attr_noofseats": "4",
"views": 342,
"status": "ACTIVE",
"phoneNumber": "4165550123",
"sellerWebsiteUrl": "https://example.com"
}Ways to use this data
- Marketplace resellers and pickers: track new and price-dropped listings across categories to source inventory worth flipping.
- Rental and real estate research: monitor new property listings in a neighbourhood, with price, layout attributes and photos, and get alerted only when something changes.
- Car shopping and dealer tracking: filter listings by price and body type, then watch a saved search for new inventory instead of refreshing the site by hand.
- Local services and gig marketplaces: pull job or services listings for a city to track posting volume and going rates.
- Market and pricing analysts: build a historical price dataset per category and region for trend analysis.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Kijiji.ca Scraper return?
The documented output for Kijiji.ca Scraper includes id, title, price, currency, category type, location, address and seller. Availability of each field depends on the source page and the selected mode.
How much does Kijiji.ca Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor and turn on Incremental mode. See "Resume, automatic recovery, and Incremental mode" above for exactly when REAPPEARED and EXPIRED can occur; a quiet run with nothing changed can legitimately return zero listings, which is not an error.
Why did my run return fewer listings than I expected?
Max listings and Max pages both cap a run; raise them, or set Max listings to 0, to collect more. A price filter also drops any listing with no numeric price (e.g. "Please Contact", "Free", "Swap") once either bound is set.
Why does a fully blocked run finish "succeeded" with zero listings instead of failing?
An empty result really can mean nothing matched, so a run that scans nothing still finishes successfully rather than exiting as an error; the run's status message explains what happened and recommends a Canadian residential connection. If you're automating this, check the returned listing count (or the status message) rather than only the run status.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
