Zoocasa APIzoocasa.com ↗
Access Zoocasa property data via API: search active and sold listings, retrieve full property details, and fetch comparable properties across Canada and the US.
What is the Zoocasa API?
The Zoocasa API exposes 3 endpoints covering Canadian and US real estate listings, giving developers programmatic access to active listings, sold homes, and rental properties. Starting with search_listings, you can query by city and province slug, filter by property type and listing status, and paginate results — each page returning up to 20 listings with paths and slugs that feed directly into the detail and comparable-properties endpoints.
curl -X GET 'https://api.parse.bot/scraper/52fda4e5-f786-48ef-b404-6b8963b51f80/search_listings?page=1&location=toronto-on&listing_type=buy&property_type=houses&listing_status=available' \ -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 zoocasa-com-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: Zoocasa SDK — search listings, drill into details, find comparable properties."""
from parse_apis.Zoocasa_Real_Estate_API import Zoocasa, ListingType, ListingStatus, PropertyType, ListingNotFound
zoocasa = Zoocasa()
# Search available condos in Toronto — limit= caps total items fetched
for summary in zoocasa.listing_summaries.search(
location="toronto-on",
listing_type=ListingType.BUY,
listing_status=ListingStatus.AVAILABLE,
property_type=PropertyType.CONDOS,
limit=3,
):
print(summary.api_slug, summary.url)
# Drill down: get full details for the first listing found
summary = zoocasa.listing_summaries.search(
location="mississauga-on",
listing_type=ListingType.BUY,
limit=1,
).first()
if summary:
listing = summary.details()
print(listing.city, listing.province, listing.price, listing.bedrooms, listing.bathrooms)
print(listing.mls_num, listing.address_slug)
# Find similar/comparable properties for market analysis
for comp in listing.similar(limit=3):
print(comp.city, comp.price, comp.bedrooms, comp.bathrooms)
# Typed error handling
try:
bad = zoocasa.listing_summaries.search(location="toronto-on", limit=1).first()
if bad:
bad.details()
except ListingNotFound as exc:
print(f"Listing not found: {exc}")
print("exercised: listing_summaries.search / details / similar")
Search for real estate listings in a specific location (city and province). Supports active and sold listings, rental listings, and property type filtering. Returns listing paths and API slugs for use with get_listing_details. Paginates by page number; each page returns up to ~20 listings. The location slug follows the pattern city-province (e.g. 'toronto-on', 'mississauga-on').
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| locationrequired | string | City and province slug (e.g., 'toronto-on', 'mississauga-on', 'vancouver-bc') |
| listing_type | string | Transaction type |
| property_type | string | Filter by home type |
| listing_status | string | Listing status filter |
{
"type": "object",
"fields": {
"page": "integer current page number",
"listings": "array of listing summaries with path, api_slug, and url",
"location": "string location slug used in the request",
"total_on_page": "integer count of listings returned on this page"
},
"sample": {
"data": {
"page": 1,
"listings": [
{
"url": "https://www.zoocasa.com/toronto-on-real-estate/703-39-sherbourne-st",
"path": "toronto-on-real-estate/703-39-sherbourne-st",
"api_slug": "703-39-sherbourne-st-toronto-on"
}
],
"location": "toronto-on",
"total_on_page": 20
},
"status": "success"
}
}About the Zoocasa API
Search and Filter Listings
The search_listings endpoint accepts a required location parameter in slug format (e.g., toronto-on, vancouver-bc) and optional filters for listing_type, property_type, and listing_status. Responses include the current page number, a total_on_page count, and an array of listing summaries — each carrying a path, api_slug, and url. The api_slug values are the keys that unlock the other two endpoints.
Property Details
Pass any api_slug from a search result to get_listing_details and receive a full attribute set for that property: price, bedrooms, bathrooms, city, province, status, mls-num, sold-price, sold-at, and more. This endpoint covers both currently active listings and sold properties — the sold-at and sold-price fields return populated values for completed transactions and null otherwise, making it straightforward to distinguish active from sold inventory in your application logic.
Comparable Properties
The get_similar_listings endpoint takes the numeric listing_id from a get_listing_details response and returns a total count alongside an array of full listing objects for comparable properties. Each object in the array carries the same attribute set as a direct detail lookup, which makes this endpoint useful for building side-by-side market comparisons or automated valuation workflows without issuing individual detail requests per comparable.
Coverage and Pagination
Listings span Canadian provinces and select US locations. Pagination through search_listings is page-number based, with each page capped at approximately 20 results. The location slug format mirrors Zoocasa's own URL conventions — for example, mississauga-on for Mississauga, Ontario. Slugs that don't match a recognized location will return empty result sets rather than an error, so validating slugs against known city patterns before querying is advisable.
The Zoocasa API is a managed, monitored endpoint for zoocasa.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when zoocasa.com 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 zoocasa.com 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?+
- Building a cross-city price comparison dashboard using
price,bedrooms, andbathroomsfields fromget_listing_details - Tracking days-on-market and sold prices for a specific neighbourhood by combining
listing_statusfiltering withsold-atandsold-pricefields - Generating automated comparable market analyses by feeding a listing's
listing_idintoget_similar_listings - Aggregating active rental inventory in a target city using
listing_typeandlocationfilters insearch_listings - Alerting on new MLS numbers in a given city by storing
mls-numvalues from repeated paginated queries - Populating a property search portal with structured address, price, and bedroom data from paginated
search_listingsresults
| 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 Zoocasa offer an official developer API?+
What does `get_listing_details` return beyond price and bedroom count?+
id, city, province, status, mls-num, sold-at, sold-price, and additional property attributes such as maintenance fees, taxes, and a description field. For active listings, sold-at and sold-price are null; for sold properties, both fields are populated.How does pagination work in `search_listings`, and is there a total listing count available?+
page parameter. Each page returns up to approximately 20 listings. The response includes total_on_page for the current page count but does not expose a global total across all pages. To retrieve all listings for a location you need to iterate pages until total_on_page drops below the maximum.Does the API return listing photos or map coordinates?+
Can I filter `search_listings` results by price range or square footage?+
search_listings inputs support location, listing_type, property_type, listing_status, and page. Price-range and square-footage filters are not available parameters at this time. You can fork this API on Parse and revise it to add those filter parameters to the endpoint.