Holland2Stay APIholland2stay.com ↗
Access Holland2Stay rental property listings via API. Filter by city and availability, retrieve pricing, building details, and direct booking URLs for properties across the Netherlands.
What is the Holland2Stay API?
The Holland2Stay API covers 4 endpoints that expose rental property listings from holland2stay.com, including pricing, availability status, city, building name, and direct URLs. The get_listings endpoint supports pagination, city filtering by ID, and sorting by price or contract start date. A companion get_filters endpoint returns all valid filter IDs needed to drive those queries.
curl -X GET 'https://api.parse.bot/scraper/8f5c9324-e3f0-44e2-b5b9-e0351eec1b50/get_listings?page=1&sort_by=name&sort_dir=ASC&page_size=10&availability=179' \ -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 holland2stay-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: Holland2Stay SDK — property rental listings in the Netherlands."""
from parse_apis.holland2stay_property_listings_api import Holland2Stay, Sort, SortDir, ListingNotFound
client = Holland2Stay()
# Browse available filter categories (cities, availability statuses, etc.)
for cat in client.filtercategories.list(limit=5):
print(cat.attribute_code, cat.label, cat.count)
# Search available listings sorted by price ascending
for listing in client.listings.search(sort_by=Sort.PRICE, sort_dir=SortDir.ASC, availability="179", limit=5):
print(listing.name, listing.city, listing.basic_rent, listing.currency)
# Drill into one listing's full detail (media gallery included)
first = client.listings.search(availability="179", limit=1).first()
if first:
detail = client.listings.get(url_key=first.url_key)
print(detail.name, detail.building_name, detail.total_rent, detail.energy_label)
if detail.media_gallery:
for img in detail.media_gallery[:2]:
print(img.url, img.position)
# Typed error handling for a non-existent listing
try:
client.listings.get(url_key="this-listing-does-not-exist-999")
except ListingNotFound as exc:
print(f"Not found: {exc.url_key}")
print("exercised: filtercategories.list / listings.search / listings.get / ListingNotFound")
Retrieve a paginated page of property listings from Holland2Stay. Returns listings with full location details, pricing, availability status, and direct booking URLs. Supports filtering by city and availability status, and sorting by price, name, basic rent, or next contract start date. Each page returns up to 100 items; use the pagination object to navigate through the full catalog of ~12,000 residences.
| Param | Type | Description |
|---|---|---|
| city | string | City filter ID (e.g., '24' for Amsterdam, '29' for Eindhoven, '6249' for Amersfoort). Get IDs from get_filters endpoint. |
| page | integer | Page number (1-indexed). |
| sort_by | string | Sort field. Accepted values: 'price', 'name', 'basic_rent', 'next_contract_startdate'. Omitting defaults to 'next_contract_startdate'. |
| sort_dir | string | Sort direction: 'ASC' or 'DESC'. |
| page_size | integer | Number of listings per page (max 100). |
| availability | string | Availability filter ID (e.g., '179' for Available to book, '336' for Available in lottery). Get IDs from get_filters endpoint. |
{
"type": "object",
"fields": {
"listings": "array of listing objects with name, sku, url, url_key, city, building_name, availability, pricing (basic_rent, total_rent, currency), bedrooms, finishing, living_area, floor, and more",
"pagination": "object with current_page, page_size, total_pages, total_count, items_on_page"
},
"sample": {
"data": {
"listings": [
{
"sku": "r-cpe-87",
"url": "https://www.holland2stay.com/residences/frederik-van-eedenplein-87.html",
"city": "Eindhoven",
"name": "Frederik van Eedenplein 87",
"floor": "4",
"url_key": "frederik-van-eedenplein-87",
"bedrooms": "2",
"currency": "EUR",
"finishing": "Furnished",
"inventory": 54,
"basic_rent": 2198,
"offer_text": null,
"total_rent": 2549,
"living_area": "123.97",
"availability": "Available to book",
"energy_label": "A++",
"minimum_stay": "12 months",
"building_name": "Cornelis Paradise",
"contract_type": "Indefinite",
"max_occupants": "Family (parents with children)",
"resident_type": "Apartment",
"offer_text_two": null,
"service_charge": 250,
"allowance_price": 0,
"caretaker_costs": 12,
"available_startdate": "2026-06-12 00:00:00",
"energy_common_areas": 15,
"price_analysis_text": "servicekosten, stoffering, meubilair, warmte, elektriciteit, internet & TV",
"cleaning_common_areas": 20,
"next_contract_startdate": "2026-06-12 00:00:00",
"current_lottery_subscribers": null
}
],
"pagination": {
"page_size": 3,
"total_count": 12398,
"total_pages": 4133,
"current_page": 1,
"items_on_page": 3
}
},
"status": "success"
}
}About the Holland2Stay API
Endpoints and Data Coverage
The API exposes four endpoints. get_listings returns a paginated array of listing objects, each containing fields like name, sku, url, city, building_name, availability, and pricing details. Pagination is controlled via page, page_size (up to 100), and the response includes a pagination object with current_page, total_pages, total_count, and items_on_page. Sorting is available on price, name, basic_rent, and next_contract_startdate in either ASC or DESC direction.
Filtering
City and availability filters accept numeric ID strings — for example, '24' for Amsterdam or '179' for "Available to book". These IDs come from get_filters, which returns all filterable dimensions: city, available_to_book, building_name, finishing, no_of_rooms, resident_type, floor, and others, each with item counts. Always call get_filters first to get current IDs before constructing a filtered query.
Bulk Retrieval and Detail
get_all_listings iterates all pages automatically and returns a flat listings array alongside a total_count and items_retrieved count. The source has roughly 12,000 listings total, so use the max_pages parameter to cap how many pages are fetched when you only need a subset. For full property details including image galleries, call get_listing_detail with the url_key slug (e.g., 'victoriapark-881') obtained from any listing in get_listings. This endpoint adds image_url and a media_gallery array not present in the list responses.
The Holland2Stay API is a managed, monitored endpoint for holland2stay.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when holland2stay.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 holland2stay.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?+
- Monitor newly available Amsterdam rentals by polling
get_listingsfiltered to city ID'24'and availability ID'179'. - Build a price comparison dashboard across Dutch cities using
basic_rentandcityfields fromget_all_listings. - Track lottery-eligible units by filtering
get_listingswith the availability ID for 'Available in lottery'. - Generate building-level availability reports by grouping listings on
building_nameusing data fromget_all_listings. - Populate a property detail page with photos using the
media_galleryarray fromget_listing_detail. - Sync a CRM or alerting system with current rental inventory using
total_countandpagination.total_pagesfor change detection.
| 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 Holland2Stay have an official developer API?+
How do I know which city or availability ID to pass as a filter?+
get_filters first. It returns all valid filter categories — including city and available_to_book — with their numeric ID strings and listing counts. Pass those IDs as the city or availability parameters in get_listings or get_all_listings.What does `get_listing_detail` return that `get_listings` does not?+
get_listing_detail adds image_url and a media_gallery array to the standard listing fields. The list endpoints return no image data, so if you need photos you must call get_listing_detail per listing using the url_key from the list response.Does the API expose tenant reviews, resident forum posts, or historical rent data?+
Are there any limitations when using `get_all_listings` to fetch all properties?+
max_pages will result in a large number of sequential page fetches. Use max_pages to limit the request scope when you only need a city or availability subset, and combine it with the city and availability filters to reduce the result set before iterating.