Homegate APIHomegate.ch ↗
Search Swiss rental listings on homegate.ch by location, price, rooms, and facilities. Resolve place names, paginate results, and fetch full listing details.
What is the Homegate API?
The Homegate.ch API gives developers access to Swiss rental listings across 3 endpoints. Use search_locations to resolve any Swiss city, canton, postcode, or region to a location ID, then pass that ID to search_rentals to retrieve paginated summaries with price, rooms, surface area, floor type, and facility filters. A third endpoint, get_listing, returns the full detail record for any individual listing.
curl -X GET 'https://api.parse.bot/scraper/dcd067ab-25e2-4de9-870c-71a1790a679c/search_locations?query=zurich' \ -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 homegate-ch-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: Homegate.ch rental search — bounded, re-runnable."""
from parse_apis.homegate_ch_api import Homegate, SortOrder, FloorType, ListingNotFound
client = Homegate()
# Resolve a city name to a typed Location.
result = client.locations.search(query="zurich")
print(f"Found {result.total} locations for '{result.query}'")
location = result.locations[0]
print(f"Using: {location.name} ({location.location_id})")
# Search rentals in that location — filters narrow results, limit= caps total items.
for summary in location.rentals.search(
sort=SortOrder.PRICE_ASC,
min_rooms=2,
max_price=2500,
floor_type=FloorType.NOT_GROUND_FLOOR,
limit=5,
):
print(f" {summary.title} — {summary.rooms} rooms, CHF {summary.rent_gross_monthly}/mo")
# Drill down: take the first hit and fetch full listing details.
hit = location.rentals.search(sort=SortOrder.NEWEST, limit=1).first()
if hit is not None:
try:
detail = hit.details()
except ListingNotFound:
print(f"Listing {hit.listing_id} was removed before we could fetch it")
else:
print(f"\n{detail.title}")
print(f" Address: {detail.street}, {detail.postal_code} {detail.locality}")
print(f" Rent: CHF {detail.rent_gross_monthly}/mo")
print(f" Available from: {detail.available_from}")
print(f" Images: {len(detail.images)}")
if detail.description:
print(f" Description: {detail.description[:120]}…")
# Direct point lookup by a known listing id from the search.
if hit is not None:
full = client.listings.get(listing_id=hit.listing_id)
print(f"\nDirect lookup: {full.title} (lister: {full.lister_type})")
print("\nexercised: locations.search / rentals.search / details / listings.get")
Resolves a free-text place name (city, canton, region, postcode) to homegate location ids. Returns up to 10 matching locations ordered by the site's relevance, each with its location_id (the value search_rentals accepts), type (place, canton, zip, ...), multilingual names and center coordinates. A single round trip; an unknown name returns an empty locations array.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Place name or postcode to look up, e.g. a city name. |
{
"type": "object",
"fields": {
"query": "the query as received",
"total": "integer total matches known to the site (only the first 10 are returned)",
"locations": "array of location objects: location_id, type, name (English), names (per language de/fr/it/en), url_name, latitude, longitude, parent_ids (containing locations, nearest first)"
},
"sample": {
"data": {
"query": "bern",
"total": 83,
"locations": [
{
"name": "Bern",
"type": "place",
"names": {
"de": "Bern",
"en": "Bern",
"fr": "Berne",
"it": "Berna"
},
"latitude": 46.94343483557952,
"url_name": "city-bern",
"longitude": 7.401645692722384,
"parent_ids": [
"geo-region-bern-mittelland",
"geo-canton-bern",
"geo-country-switzerland"
],
"location_id": "geo-city-bern"
},
{
"name": "3004",
"type": "zip",
"names": {
"de": "3004",
"en": "3004",
"fr": "3004",
"it": "3004"
},
"latitude": 46.969472892561974,
"url_name": "zip-3004",
"longitude": 7.4448944214876,
"parent_ids": [
"geo-city-bern",
"geo-region-bern-mittelland",
"geo-canton-bern",
"geo-country-switzerland"
],
"location_id": "geo-zipcode-3004"
}
]
},
"status": "success"
}
}About the Homegate API
Location Resolution and Search
Before querying rentals, use search_locations with a free-text query parameter (city name, postcode, canton, etc.) to get up to 10 matching location objects. Each result includes a location_id (the value accepted by search_rentals), a type field (place, canton, zip, and others), multilingual names in German, French, Italian, and English, plus latitude and longitude. The total field tells you how many matches the site knows about beyond the first 10.
Rental Search Filters and Response Fields
search_rentals accepts one or more location IDs and returns one page of 20 listing summaries. Filter parameters include min_price / max_price (gross monthly CHF), min_rooms / max_rooms, facilities (comma-separated values: balcony, elevator, parking), and floor_type (ground-floor or non-ground-floor). The response carries total_results, page_count, and has_next_page for pagination control. Each listing summary exposes listing_id, url, listing_type (PREMIUM or STANDARD placement), title, net rent, charges, gross monthly rent in CHF, rooms, living space in m², balcony, view, floor, and elevator presence. The applied_filters object echoes exactly which filters the site honoured, and unresolved_location_ids flags any IDs that were not recognised.
Full Listing Detail
get_listing takes a listing_id from search results and returns every summary field plus: an HTML description in English (machine-translated by the site from German, French, or Italian where needed), available_from as an ISO date or null, lister_type (private, semi_professional, or professional), lister_phone or null, a characteristics object containing all structured amenities the lister filled in, an images array of image URLs, and a platforms array listing which portals the listing is published on.
The Homegate API is a managed, monitored endpoint for Homegate.ch — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when Homegate.ch 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 Homegate.ch 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 Swiss apartment search tool filtered by city and gross monthly rent range using
search_rentals. - Alert users when new listings in a specific postcode fall within a room-count range by polling
search_rentalswith location IDs fromsearch_locations. - Compare private-lister versus agency listings by segmenting on the
lister_typefield fromget_listing. - Display listing photos and availability dates in a relocation guide by consuming
imagesandavailable_fromfromget_listing. - Analyse median rents by canton or municipality by aggregating
gross_rentvalues across paginatedsearch_rentalsresults. - Filter listings by elevator and balcony requirements using the
facilitiesparameter insearch_rentalsfor accessibility-focused searches. - Resolve ambiguous Swiss place names to canonical location IDs via
search_locationsbefore storing user-defined search preferences.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Homegate.ch have an official developer API?+
What does `search_rentals` return for each listing, and how do I paginate results?+
listing_id, url, listing_type (PREMIUM or STANDARD), net rent, monthly charges, gross rent in CHF, rooms, living area in m², and key amenity flags. The response also contains total_results, page_count, and has_next_page. To get the next page, increment the page parameter (1-based); each page holds 20 listings.Does the API cover properties for sale, or commercial real estate?+
What is the `lister_type` field in `get_listing`, and what values does it take?+
lister_type classifies who published the listing based on the listing's public metadata. It returns one of four values: private (individual landlord), semi_professional, professional (agency or property manager), or null when the site does not provide enough information to classify the lister.Are listing descriptions always in English?+
description field in get_listing is in English. When the original listing text is in German, French, or Italian — as is typical for Swiss listings — the site itself machine-translates it to English before the field is populated. The quality of that translation reflects the site's own translation layer, not a separate translation step.