Rentals APIrentals.ca ↗
Search and retrieve Canadian rental listings from Rentals.ca. Filter by city, bedrooms, bathrooms, and price. Get full property details including floor plans and amenities.
What is the Rentals API?
The Rentals.ca API provides access to Canadian rental listings across 3 endpoints, covering cities like Toronto, Vancouver, Montreal, Calgary, and Ottawa. Use search_listings to query listings with filters for bedrooms, bathrooms, and price range, get_listing_details to retrieve full property information by listing ID, or get_listings_by_city to browse all active rentals in a given city with pagination support.
curl -X GET 'https://api.parse.bot/scraper/049153a1-4159-4897-8351-c96ef08f1c37/search_listings?city=toronto&page=1&limit=5&bedrooms=2&bathrooms=1&max_price=5000&min_price=1000' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace rentals-ca-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Rentals.ca SDK — search listings, drill into details, browse by city."""
from parse_apis.rentals_ca_api import Rentals, ListingSummary, Listing, ListingNotFound
client = Rentals()
# Search for 2-bedroom rentals in Toronto under $3000/month
for listing in client.listingsummaries.search(city="toronto", bedrooms=2, max_price=3000, limit=3):
print(listing.title, listing.rent_range, listing.beds_range)
# Drill into the first result for full property details
summary = client.listingsummaries.search(city="vancouver", limit=1).first()
if summary:
detail = summary.details()
print(detail.name, detail.type, detail.verified)
print(detail.address.street, detail.address.postal_code)
for plan in detail.floor_plans[:3]:
print(plan.beds, plan.baths, plan.rent, plan.size)
# Fetch a listing directly by ID
try:
full = client.listings.get(id="cmVudGFsbGlzdGluZzoyNTcxNjk=")
print(full.name, full.listing_type)
print(full.building.stories, full.building.year_built)
except ListingNotFound as exc:
print(f"Listing not found: {exc.listing_id}")
# Browse all Montreal listings
for item in client.listingsummaries.by_city(city="montreal", limit=3):
print(item.title, item.url, item.property_type)
print("exercised: listingsummaries.search / summary.details / listings.get / listingsummaries.by_city")
Search for rental listings in a specific Canadian city with optional filters for bedrooms, bathrooms, and price range. Returns paginated results with listing summaries including rent range, bed/bath counts, and location coordinates. The city parameter accepts slugs like 'toronto', 'montreal', 'vancouver'. Pagination advances via the page parameter; total_count in the response gives the full result set size.
| Param | Type | Description |
|---|---|---|
| city | string | City slug for the search area (e.g., 'toronto', 'montreal', 'vancouver', 'calgary', 'ottawa'). |
| page | integer | Page number for pagination. |
| limit | integer | Number of results per page. |
| bedrooms | integer | Filter by number of bedrooms. |
| bathrooms | number | Filter by minimum number of bathrooms. |
| max_price | number | Maximum rent price filter. |
| min_price | number | Minimum rent price filter. |
{
"type": "object",
"fields": {
"city": "string, the city slug used for the search",
"page": "integer, current page number",
"limit": "integer, number of results per page",
"listings": "array of listing summary objects with id, title, path, url, rent_range, beds_range, baths_range, location, verified, and property_type",
"total_count": "integer, total number of matching listings",
"total_floor_plans": "integer, total number of floor plans across all matching listings"
},
"sample": {
"data": {
"city": "toronto",
"page": 1,
"limit": 5,
"listings": [
{
"id": "cmVudGFsbGlzdGluZzoyNTcxNjk=",
"url": "https://rentals.ca/york/the-heathview",
"path": "york/the-heathview",
"title": "The Heathview",
"location": [
-79.414559,
43.685894
],
"verified": true,
"beds_range": [
1,
2
],
"rent_range": [
2495,
5895
],
"baths_range": [
1,
2.5
],
"property_type": "apartment"
}
],
"total_count": 8588,
"total_floor_plans": 12334
},
"status": "success"
}
}About the Rentals API
Search and Filter Listings
The search_listings endpoint accepts a city slug along with optional filters: bedrooms, bathrooms, min_price, max_price, page, and limit. Results include an array of listing summary objects, each carrying id, title, url, rent_range, beds_range, baths_range, location coordinates, and a verified flag. The response also includes total_count (total matching listings) and total_floor_plans (aggregate floor plan count across results), which are useful for building pagination UI or estimating inventory depth.
Listing Details
The get_listing_details endpoint takes a base64-encoded listing_id — the same id field returned by search results — and returns the full property record. This includes a structured address object with street, postalCode, city, and neighbourhood; a contact object with name, phoneNumber, and email; parking details covering parkingTypes and parkingSpotsPerRental; and building metadata such as totalUnits, stories, and yearBuilt. Geographic coordinates are returned as a [longitude, latitude] array in the location field.
City-Level Browsing
The get_listings_by_city endpoint mirrors the structure of search_listings but requires a city slug and omits bedroom, bathroom, and price filters. It is suitable for building city-level inventory views or computing aggregate statistics across a market. The total_count and total_floor_plans fields in the response give a snapshot of supply in each city without needing to iterate all pages.
The Rentals API is a managed, monitored endpoint for rentals.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when rentals.ca changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official rentals.ca API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a rental market tracker comparing
total_countandrent_rangeacross Canadian cities over time. - Create a listing alert tool that monitors new entries via
search_listingswithmin_price/max_pricefilters. - Populate a neighbourhood-level map using
locationcoordinates andaddress.neighbourhoodfrom listing details. - Generate landlord contact lists for a given city using
contact.phoneNumberandcontact.emailfromget_listing_details. - Filter listings by
bedroomsandbathroomsto match specific tenant profiles in apartment-finding tools. - Enrich real estate datasets with
building.yearBuilt,building.stories, andbuilding.totalUnitsfor property analysis. - Display verified-only listings by filtering on the
verifiedboolean in search result summaries.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Rentals.ca have an official developer API?+
What does `get_listing_details` return beyond what appears in search results?+
search_listings and get_listings_by_city return summary fields: title, rent_range, beds_range, baths_range, location, and verified. get_listing_details adds structured address (including neighbourhood and postalCode), contact (name, phone, email), parking (types and spots), building (units, stories, year built), and the property type. You need the base64 id from a summary result to call this endpoint.Can I filter listings by neighbourhood or property type?+
search_listings endpoint supports filtering by city, bedrooms, bathrooms, min_price, and max_price. Neighbourhood and property-type filters are not available as inputs, though address.neighbourhood and type are present in detail responses. You can fork this API on Parse and revise it to add those filter parameters.Does the API cover all Canadian provinces, or only major cities?+
city parameter currently accepts slugs for major Canadian cities including Toronto, Montreal, Vancouver, Calgary, and Ottawa. Smaller cities and rural areas are not confirmed to be covered. You can fork this API on Parse and revise it to test or add additional city slugs for broader geographic coverage.How does pagination work across the search endpoints?+
page and limit parameters. The response includes total_count so you can calculate the number of pages needed. There is no cursor-based pagination; page numbers are integer-indexed starting from 1.