Kijiji Property Scraper avatar

Kijiji Property Scraper

Pricing

from $1.32 / 1,000 listing searches

Go to Apify Store
Kijiji Property Scraper

Kijiji Property Scraper

Scrape Kijiji real estate across Canada: apartments, basement suites, rooms, houses and land, for rent or for sale. Price, beds, baths, sqft, utilities, move-in date and whether an owner or an agent posted it.

Pricing

from $1.32 / 1,000 listing searches

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

Share

Kijiji Property Scraper — Canadian Rentals & Real Estate Data 🍁

Store SIÁN Agency Store Realtor.ca Property Scraper Store Centris.ca Property Scraper Store Craigslist Scraper

🍁 Around 22,000 of Kijiji's 48,000 long-term rentals are posted by the owner, not a management company

Every row tells you which is which — plus rent, bedrooms, bathrooms, square feet, move-in date and what the rent covers


🔎 What is the Kijiji Property Scraper — and when should you use it?

The Kijiji Property Scraper turns any Kijiji real-estate search in Canada into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

Use it when you need: Canadian rentals and homes for sale with rent or asking price, bedrooms (dens counted as a half), bathrooms, square feet and unit type. Rows also carry the lease term, move-in date, pet and smoking rules, which utilities the rent covers, amenities, accessibility features, city, neighbourhood, coordinates and photos. Every row states whether an owner or a professional posted the ad, which is the half of the Canadian rental market the brokerage portals never carry. A detail pass adds the untruncated ad text, the view counter and the poster's profile.

Use something else when: you need brokerage data rather than classifieds. Use Realtor.ca Property Scraper for Canadian MLS listings with brokerage detail and market KPIs. Use Centris.ca Property Scraper for Quebec brokerage listings and MLS data. This actor covers Kijiji's Canadian real-estate section only — no sold history and no listing-agent data.

🤖 Use with AI agents

Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/kijiji-property-scraper

Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want Canadian property listings from Kijiji, split by who posted them using the Apify Actor `sian.agency/kijiji-property-scraper`.
Use it when I need: Canadian rentals and homes for sale with rent or asking price, bedrooms (dens counted as a half), bathrooms, square feet and unit type. Rows also carry the lease term, move-in date, pet and smoking rules, which utilities the rent covers, amenities, accessibility features, city, neighbourhood, coordinates and photos. Every row states whether an owner or a professional posted the ad, which is the half of the Canadian rental market the brokerage portals never carry. A detail pass adds the untruncated ad text, the view counter and the poster's profile.
Don't use it when: you need brokerage data rather than classifieds — use realtor-ca-property-scraper or centris-ca-property-scraper instead.
How to call it: pick an `operation` — `search` sweeps a Kijiji search, `detail` reads named ads. For a search, either paste addresses into `searchUrls` or build one with `category` and `location`. Categories are 37 long-term rentals, 36 rooms, 35 houses for sale, 643 condos, 641 land, 42 short-term and 40 commercial; location 0 is all of Canada. Narrow with `keywords`, `listedBy` (`owner` or `professional`), `bedrooms`, `minPrice`/`maxPrice` and `sortBy`. Cap the run with `maxItems`, and switch on `enrichWithDetails` for the full ad text, the view count and the poster.
Start with this input:
{
"operation": "search",
"category": "37",
"location": "1700273",
"listedBy": "owner",
"maxItems": 100
}
Ask me which Canadian city or province, and whether you want rentals, rooms or property for sale, then run the Actor and summarise the results as a table.

Things you can ask your agent for:

  • Pull every two-bedroom rental in Toronto posted by an owner under $2,500 and rank them by price per square foot.
  • Watch Calgary rentals every morning and tell me which ads are new since yesterday.
  • Compare average asking rent for a one-bedroom across Vancouver, Montreal and Ottawa, split by owner-posted versus agency-posted.

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/kijiji-property-scraper.md.

📋 Overview

Kijiji is where Canadian landlords post when they do not want an agent. That is a large slice of the market and it does not appear on the brokerage portals. Twenty-four of the twenty-five Kijiji Actors on the Store scrape cars, sofas and apartments into one shapeless row.

What you get instead:

  • Owner or professional, stated on every row: Kijiji asks posters to declare it. Around 22,000 of 48,000 long-term rentals say owner. You get listedBy and a plain isPrivateLandlord flag, filterable before the run or after it.
  • 🏘️ 63 typed fields, not a raw attribute dump: bedrooms with dens split out, bathrooms at the half, square feet, unit type, lease term, move-in date, pet and smoking rules, utilities, amenities, accessibility.
  • 🇨🇦 Every branch of Kijiji real estate: long-term rentals, short-term rentals, rooms and roommates, storage and parking, commercial space, houses, condos, land. Roughly 243,000 live ads.
  • ⚜️ English and French: Québec is served under /b-immobilier/ addresses with the same ids and the same data. A Montréal sweep returns the same columns as a Toronto one.
  • 💰 $1.50 per 1,000 listings, dropping to $1.32 at the deepest volume tier. Four of the six priced rivals charge more, one of them more than four times as much.
  • 🔗 Paste the search you already built: set up any filter combination on kijiji.ca, copy the address, and the site resolves it — including facets added after this Actor shipped.

✨ Features

  • 🔍 Two ways in: paste Kijiji search addresses, or fill in category, place, keyword, price band and posted-by.
  • 👤 Private-landlord filter: narrow the run to owner-posted ads before a single row is billed.
  • 🛏️ Real bedroom and bathroom numbers: Kijiji sends bathrooms multiplied by ten and dens as halves. Both arrive fixed.
  • 🔌 Utilities and amenities as clean lists: which of hydro, heat, water, cable and internet the rent covers, and what the building has.
  • 📅 Move-in dates and lease terms: the two fields a renter search actually turns on.
  • 🌐 Coordinates and neighbourhood on every ad: map it, cluster it, or join it to your own geography.
  • 🔬 Optional depth pass: opens each ad for the untruncated text, the view counter and the poster's profile.
  • 📄 Read named ads directly: paste ad addresses or bare numeric ids to re-check listings you already track.
  • ⚜️ Bilingual addresses: /b-real-estate/ and /b-immobilier/ both work and return the same rows.
  • 📊 HTML run report: every run writes a summary with the listings, the failures and exactly what you were charged.

🎬 Quick Start

Pick a category and a place, press Start, and the first hundred listings land in your dataset about fifteen seconds later. Nothing to install and no key to configure. When you want a specific slice, build the search on kijiji.ca and paste the address instead.

curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kijiji-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","category":"37","location":"1700273","listedBy":"owner","maxItems":100}'

🚀 Getting Started (3 Simple Steps)

Step 1: Choose what to read

Pick a 🗂️ Property category and a 📍 Province or metro. Or open kijiji.ca, filter the search however you like, and paste that address into 🌐 Kijiji search URLs.

Step 2: Narrow it, or do not

👤 Posted by, 🛏️ Bedrooms, a price band and 🔢 Maximum results are all optional. Leave them alone and you get the section newest-first.

Step 3: Press Start

Results arrive in the dataset as they are found. Export to JSON, CSV or Excel, or read them over the API.

That's it! In under a minute, you'll have:

  • A structured table of live Canadian listings with prices and property attributes
  • The owner-versus-professional split for every one of them
  • Map coordinates, photos and a link back to each ad

📥 Input Configuration

FieldTypeRequiredDescription
operationstringNosearch (default) or detail
searchUrlsarrayNoKijiji search addresses, pasted as-is
keywordsstringNoWords that must appear in the ad
categorystringNoKijiji real-estate category id — 37 is long-term rentals
locationstringNoProvince or metro id — 0 is all of Canada
listedBystringNoany, owner or professional
bedroomsstringNoany, 0 for a bachelor, up to 5
minPrice / maxPriceintegerNoPrice band in Canadian dollars, 0 for no bound
sortBystringNodateDesc, dateAsc, priceAsc or priceDesc
maxItemsintegerNoCap per search address, up to 5000
enrichWithDetailsbooleanNoOpen each ad for the full record
listingUrlsarrayNoAd addresses or bare numeric ids, for detail

Example — owner-posted two-bedrooms in Toronto under $2,500:

{
"operation": "search",
"category": "37",
"location": "1700273",
"listedBy": "owner",
"bedrooms": "2",
"maxPrice": 2500,
"maxItems": 500
}

Example — paste the searches you already use:

{
"operation": "search",
"searchUrls": [
"https://www.kijiji.ca/b-apartments-condos/city-of-toronto/c37l1700273?for-rent-by=ownr",
"https://www.kijiji.ca/b-immobilier/grand-montreal/c37l80002"
],
"maxItems": 1000
}

Example — read specific ads:

{
"operation": "detail",
"listingUrls": ["1742889268", "https://www.kijiji.ca/v-apartments-condos/city-of-toronto/main-floor/1742579694"]
}

📤 Output

Every run writes flat rows to the Apify dataset — 63 fields, all nullable, ready for a spreadsheet or a database. The most useful ones:

FieldTypeDescription
listingTitlestringThe headline the poster wrote
pricenumberMonthly rent or asking price in Canadian dollars
dealTypestringrent or sale, from the ad's own category
listedBystringowner, professional or agent, as declared on the ad
isPrivateLandlordbooleantrue when an owner posted it
bedroomsnumberDens count as a half — 1.5 is one bedroom plus a den
bathroomsnumberWhole and half bathrooms
areaSqFtnumberFloor area in square feet
propertyTypestringApartment, Basement apartment, Condo, House, Townhouse, Duplex / triplex
availableFromstringThe move-in date the poster gave
utilitiesIncludedarrayWhich of Hydro, Heat, Water, Cable / TV, Internet the rent covers
amenitiesarrayLaundry, dishwasher, air conditioning, balcony, yard, gym, pool, elevator and more
petsAllowedstringyes, no or limited
city / neighbourhoodstringWhere Kijiji files the ad
latitude / longitudenumberMap coordinates
viewsnumberHow many times the ad has been opened (depth pass)
posterNamestringThe name on the account (depth pass)
imageUrlsarrayPhotos — thumbnails on a search row, full resolution on a depth row

Example row:

{
"itemId": "1742510102",
"listingTitle": "2Br 1 Bath, House for Rent, Parking & Laundry, Util Included",
"url": "https://www.kijiji.ca/v-apartments-condos/city-of-toronto/2br-1-bath-house-for-rent/1742510102",
"price": 2850,
"priceText": "$2,850",
"currency": "CAD",
"dealType": "rent",
"listedBy": "owner",
"isPrivateLandlord": true,
"propertyType": "House",
"bedrooms": 2,
"bathrooms": 1,
"areaSqFt": 972,
"petsAllowed": "yes",
"smokingPermitted": "no",
"parkingSpots": 1,
"agreementType": "1 year",
"availableFrom": "2026-10-01T00:00:00Z",
"utilitiesIncluded": ["Hydro", "Heat", "Water"],
"amenities": ["Yard", "Laundry in building", "Dishwasher", "Fridge / freezer", "Air conditioning"],
"city": "East York",
"neighbourhood": "O'Connor-Parkview",
"latitude": 43.70719,
"longitude": -79.31047,
"categoryName": "Long Term Rentals",
"postedAt": "2026-08-24T23:36:44.000Z",
"imageCount": 13
}

💼 Use Cases & Examples

1. Private-Landlord Rental Sourcing

Relocation services and tenant-placement agencies need the inventory that never reaches a brokerage portal.

Input: category 37, a metro, 👤 Posted by set to owner Output: owner-posted rentals with rent, rooms, move-in date and what the rent includes Use: build a shortlist for a client in one pass instead of refreshing the site all week

2. Rent Benchmarking by Bedroom Count

Property managers and analysts setting a price need the real spread, not a headline average.

Input: a city, no price bound, 🔢 Maximum results at 1,000 Output: asking rent against bedrooms, bathrooms, square feet and utilities on every row Use: price a unit against the market it actually competes in, and see how much of the gap is bundled utilities

3. New-Listing Monitoring

Agents and investors who want to be first need to know what appeared overnight.

Input: a saved search, ↕️ Order set to newest first, run on a schedule Output: the posted timestamp on every row, so a diff against yesterday is trivial Use: a daily watch on one neighbourhood costs pennies and lands before the market wakes up

4. Basement Suites, Rooms and Shared Housing

Student-housing operators and roommate platforms need a market that barely exists anywhere else.

Input: category 36 for rooms and roommates, or unit type filtering on basement-apartment Output: 11,000 room ads nationally, plus basement suites named as their own unit type Use: the only reliable read on the shared-housing end of the Canadian market

5. Investor Deal Screening

Buyers hunting owner-sold property want the ads where the negotiating room is.

Input: category 35 or 643, a region, a price band Output: asking price against floor area and lot size, with owner or brokerage stated Use: flag private sales in a target region without opening 200 tabs

6. Property-Manager and Agency Lead Lists

Suppliers selling into property management need to know who is actually active.

Input: commercial or long-term rentals in a region, 🔬 depth on Output: poster name, account type and how many ads they currently carry Use: rank a region's active managers by live inventory instead of guessing

7. Cross-Border and Bilingual Market Research

Analysts covering Canada need Québec on the same axes as everywhere else.

Input: /b-immobilier/ addresses, or location 9001 for Québec Output: the same 63 columns, because the fields are machine keys rather than display labels Use: one dataset that covers both official languages without a translation step


🔗 Integration Examples

JavaScript/Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('sian.agency/kijiji-property-scraper').call({
operation: 'search',
category: '37',
location: '1700273',
listedBy: 'owner',
maxItems: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.bedrooms >= 2).length, 'two-bed-plus owner rentals');

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('sian.agency/kijiji-property-scraper').call(
run_input={
'operation': 'search',
'category': '37',
'location': '1700199',
'maxPrice': 2000,
'maxItems': 500,
}
)
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item['price'], item['bedrooms'], item['city'], item['listedBy'])

cURL

curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kijiji-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","category":"36","location":"1700272","maxItems":300}'

Automation Workflows (N8N / Zapier / Make)

  1. Trigger: a daily schedule, or a webhook from your own system
  2. HTTP Request: call the Actor with your saved search
  3. Process: filter on isPrivateLandlord, bedrooms or price
  4. Action: append new ads to a sheet, post them to Slack, or alert on a price drop

📊 Performance & Pricing

FREE Tier (Try It Now)

  • 25 listings per run — every field, every mode, same data
  • No credit card required
  • Enough to see the columns and decide
  • Unlimited listings per run, up to Kijiji's own 5,000-per-search ceiling
  • 46 listings per page read, and a page read takes about a second
  • Pay per listing returned: a search that matched nothing, an ad that was taken down, and any address we could not read all cost you nothing

💰 $1.50 per 1,000 listings at the entry tier, falling to $1.32 at the deepest volume tier. Of the six priced Kijiji Actors on the Store, four charge more — one charges $6.50.

🔗 View current pricing


❓ Frequently Asked Questions

Q: How many listings can I get? A: FREE tier gives 25 per run. PAID is unlimited per run, and one search reaches about 5,000 listings before Kijiji stops paging. Past that, split the search by city or price band.

Q: Does it work on French Kijiji addresses? A: Yes. Québec is served under /b-immobilier/ with the same category and location ids, and the same listings come back. Paste either form.

Q: Can I get a landlord's phone number? A: Only what the ad itself shows. Kijiji routes contact through its own inbox and masks most digits, so a depth row returns the masked line when there is one. There is no email on the platform to return.

Q: Why is the price blank on some rows? A: The poster chose "Please Contact" instead of entering a number — about 7% of the board. Those rows carry the words in priceText and nothing in price, so a numeric filter drops them.

Q: Does it return sold or rented prices? A: No. Ads come down when they go and Kijiji publishes no archive, so you get live asking prices. Build history by running on a schedule and diffing your own snapshots.

Q: Do I need a proxy or an account? A: Neither. These are the pages any visitor sees, so there is no proxy line on your bill and nothing to log in to.

Q: What output formats are available? A: JSON, CSV, Excel and XML, straight from the Apify dataset or over the API.

Q: Is this legal? A: We read only what posters chose to publish. See the note below on personal data.


🐛 Troubleshooting

The run returned no listings

  • Check the address opens in a browser and shows ads. An empty search here is an empty search there.
  • A bedroom filter on the for-sale categories narrows things to almost nothing — sale ads rarely carry a bedroom count.
  • A price band drops every "Please Contact" ad, which is roughly 7% of the board.

I pasted an address and got "no usable search addresses"

  • A Kijiji search address ends in the category and location code, like .../c37l1700273. An ad address (/v-...) belongs in 📄 Ad addresses or IDs instead.

Fewer rows than I asked for

  • On the FREE tier every run stops at 25 rows.
  • Kijiji stops paging a single search at about 5,000 results, whatever tool is asking.

A specific ad came back as an error

  • It was taken down between the search and the read. Re-run the search to pick up what is live now.

The run is slower than expected

  • 🔬 depth opens every ad on its own page, so a 1,000-ad sweep becomes 1,001 page reads. Turn it off unless you need the full text or the poster.

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the legality of web scraping.

Kijiji is a trademark of its respective owner. This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Kijiji.


🤝 Support

Join our active support community


Built by SIÁN Agency | More Tools