Piloterr Immoscout24ch API
The Immoscout24ch API from Piloterr — 1 operation(s) for immoscout24ch.
The Immoscout24ch API from Piloterr — 1 operation(s) for immoscout24ch.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/piloterr-com:piloterr-com-immoscout24ch-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Piloterr API Reference Immoscout24ch API
description: Complete API reference documentation.
version: 1.0.0
servers:
- url: https://api.piloterr.com
description: API Server
tags:
- name: Immoscout24ch
paths:
/v2/immoscout24ch/search:
get:
summary: ImmoScout24 Switzerland Search
description: 'Search ImmoScout24.ch listings by city or search URL and retrieve the CHF price, rooms, living area, and address. Property pages are not available.
**Credit cost:** 2 credits per call'
operationId: get-immoscout24ch-search
security:
- ApiKeyAuth: []
parameters:
- name: query
in: query
required: true
description: "Swiss city or a full ImmoScout24.ch search URL.\n\n**Example (city):**\n\n zurich\n\n**Example (search URL):**\n\n https://www.immoscout24.ch/de/wohnung/mieten/ort-zuerich\n\n**JSON:** a city opens apartments for rent unless offer_type or property_type is set. results[].offer_type is rent and results[].price is the monthly gross rent in CHF. A listing URL such as /mieten/{id} returns 400. Property pages are not available."
schema:
type: string
description: "Swiss city or a full ImmoScout24.ch search URL.\n\n**Example (city):**\n\n zurich\n\n**Example (search URL):**\n\n https://www.immoscout24.ch/de/wohnung/mieten/ort-zuerich\n\n**JSON:** a city opens apartments for rent unless offer_type or property_type is set. results[].offer_type is rent and results[].price is the monthly gross rent in CHF. A listing URL such as /mieten/{id} returns 400. Property pages are not available."
- name: offer_type
in: query
required: false
description: 'rent or buy.
**Default:** rent when query is a city. A search URL keeps its path unless this is set.
**Aliases:** mieten, kaufen, sale (sale means buy).
**JSON:** rent sets results[].offer_type to rent and price to the monthly gross rent. buy sets offer_type to buy and price to the sale price.'
schema:
type: string
description: 'rent or buy.
**Default:** rent when query is a city. A search URL keeps its path unless this is set.
**Aliases:** mieten, kaufen, sale (sale means buy).
**JSON:** rent sets results[].offer_type to rent and price to the monthly gross rent. buy sets offer_type to buy and price to the sale price.'
- name: property_type
in: query
required: false
description: 'apartment, house, or all.
**Default:** apartment when query is a city. A search URL keeps its category unless this is set.
**Aliases:** flat and wohnung mean apartment. haus means house. immobilien means all.
**JSON:** apartment requests wohnung. house requests haus. all requests immobilien. results[].categories reflects that category.'
schema:
type: string
description: 'apartment, house, or all.
**Default:** apartment when query is a city. A search URL keeps its category unless this is set.
**Aliases:** flat and wohnung mean apartment. haus means house. immobilien means all.
**JSON:** apartment requests wohnung. house requests haus. all requests immobilien. results[].categories reflects that category.'
- name: page
in: query
required: false
description: 'Page from 1.
**Default:** 1. Page 1 omits pn. Page 2 sends pn=2.
**JSON:** pagination.page is the page you asked for. pagination.next is the next search URL, or null on the last page.'
schema:
type: number
default: '1'
description: 'Page from 1.
**Default:** 1. Page 1 omits pn. Page 2 sends pn=2.
**JSON:** pagination.page is the page you asked for. pagination.next is the next search URL, or null on the last page.'
- name: return_page_source
in: query
required: false
description: 'Optional. Default false.
false returns the parsed JSON described below.
true returns {"result": "<page source>"} and omits results, pagination, and listing fields.'
schema:
type: boolean
description: 'Optional. Default false.
false returns the parsed JSON described below.
true returns {"result": "<page source>"} and omits results, pagination, and listing fields.'
default: false
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
properties:
id:
type: string
url:
type: string
floor:
nullable: true
price:
type: integer
rooms:
type: number
title:
type: string
canton:
type: string
street:
type: string
currency:
type: string
features:
type: array
items:
type: string
latitude:
type: number
locality:
type: string
bathrooms:
type: integer
image_url:
type: string
longitude:
type: number
price_net:
nullable: true
categories:
type: array
items:
type: string
created_at:
type: string
offer_type:
type: string
year_built:
type: integer
description:
type: string
extra_costs:
nullable: true
postal_code:
type: string
living_space:
type: integer
price_display:
type: string
ceiling_height:
nullable: true
price_interval:
type: string
year_renovated:
type: integer
pagination:
type: object
properties:
next:
type: string
page:
type: integer
per_page:
type: integer
total_pages:
type: integer
total_results:
type: integer
examples:
Apartments for rent in Zurich:
value:
results:
- id: '4002086198'
url: https://www.immoscout24.ch/mieten/4002086198
floor: null
price: 2257
rooms: 1.5
title: City Pop - Cosy Studio Apartments just next to HB Zürich
canton: ZH
street: Militärstrasse 106
currency: CHF
features:
- has_cable_tv
- has_dishwasher
- has_elevator
- has_garage
- has_nice_view
- has_parking
- is_ground_floor_raised
- is_quiet
latitude: 47.375904371673
locality: Zürich
bathrooms: 1
image_url: https://cdn.immoscout24.ch/listings/v2/e335city/4002086198/image/92c334cb2a581eeda57f107e6b2d3fd3.jpg
longitude: 8.518085354726
price_net: null
categories:
- apartment
- flat
created_at: '2025-04-07T14:53:38.768Z'
offer_type: rent
year_built: 2025
description: Wir bieten zentral gelegene Apartments im Gebäude City Pop Zurich City an der Militarstrasse 106, 8004 Zürich an, die zwischen 19 und 46 Quadratmeter gross sind.
extra_costs: null
postal_code: '8004'
living_space: 24
price_display: CHF 2'257
ceiling_height: null
price_interval: month
year_renovated: 2025
pagination:
next: https://www.immoscout24.ch/de/wohnung/mieten/ort-zuerich?pn=2
page: 1
per_page: 20
total_pages: 50
total_results: 1222
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Immoscout24ch
post:
summary: ImmoScout24 Switzerland Search
description: 'Search ImmoScout24.ch listings by city or search URL and retrieve the CHF price, rooms, living area, and address. Property pages are not available.
**Credit cost:** 2 credits per call'
operationId: post-immoscout24ch-search
security:
- ApiKeyAuth: []
parameters:
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
query:
type: string
description: "Swiss city or a full ImmoScout24.ch search URL.\n\n**Example (city):**\n\n zurich\n\n**Example (search URL):**\n\n https://www.immoscout24.ch/de/wohnung/mieten/ort-zuerich\n\n**JSON:** a city opens apartments for rent unless offer_type or property_type is set. results[].offer_type is rent and results[].price is the monthly gross rent in CHF. A listing URL such as /mieten/{id} returns 400. Property pages are not available."
offer_type:
type: string
description: 'rent or buy.
**Default:** rent when query is a city. A search URL keeps its path unless this is set.
**Aliases:** mieten, kaufen, sale (sale means buy).
**JSON:** rent sets results[].offer_type to rent and price to the monthly gross rent. buy sets offer_type to buy and price to the sale price.'
property_type:
type: string
description: 'apartment, house, or all.
**Default:** apartment when query is a city. A search URL keeps its category unless this is set.
**Aliases:** flat and wohnung mean apartment. haus means house. immobilien means all.
**JSON:** apartment requests wohnung. house requests haus. all requests immobilien. results[].categories reflects that category.'
page:
type: number
default: '1'
description: 'Page from 1.
**Default:** 1. Page 1 omits pn. Page 2 sends pn=2.
**JSON:** pagination.page is the page you asked for. pagination.next is the next search URL, or null on the last page.'
return_page_source:
type: boolean
description: 'Optional. Default false.
false returns the parsed JSON described below.
true returns {"result": "<page source>"} and omits results, pagination, and listing fields.'
default: false
required:
- query
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
properties:
id:
type: string
url:
type: string
floor:
nullable: true
price:
type: integer
rooms:
type: number
title:
type: string
canton:
type: string
street:
type: string
currency:
type: string
features:
type: array
items:
type: string
latitude:
type: number
locality:
type: string
bathrooms:
type: integer
image_url:
type: string
longitude:
type: number
price_net:
nullable: true
categories:
type: array
items:
type: string
created_at:
type: string
offer_type:
type: string
year_built:
type: integer
description:
type: string
extra_costs:
nullable: true
postal_code:
type: string
living_space:
type: integer
price_display:
type: string
ceiling_height:
nullable: true
price_interval:
type: string
year_renovated:
type: integer
pagination:
type: object
properties:
next:
type: string
page:
type: integer
per_page:
type: integer
total_pages:
type: integer
total_results:
type: integer
examples:
Apartments for rent in Zurich:
value:
results:
- id: '4002086198'
url: https://www.immoscout24.ch/mieten/4002086198
floor: null
price: 2257
rooms: 1.5
title: City Pop - Cosy Studio Apartments just next to HB Zürich
canton: ZH
street: Militärstrasse 106
currency: CHF
features:
- has_cable_tv
- has_dishwasher
- has_elevator
- has_garage
- has_nice_view
- has_parking
- is_ground_floor_raised
- is_quiet
latitude: 47.375904371673
locality: Zürich
bathrooms: 1
image_url: https://cdn.immoscout24.ch/listings/v2/e335city/4002086198/image/92c334cb2a581eeda57f107e6b2d3fd3.jpg
longitude: 8.518085354726
price_net: null
categories:
- apartment
- flat
created_at: '2025-04-07T14:53:38.768Z'
offer_type: rent
year_built: 2025
description: Wir bieten zentral gelegene Apartments im Gebäude City Pop Zurich City an der Militarstrasse 106, 8004 Zürich an, die zwischen 19 und 46 Quadratmeter gross sind.
extra_costs: null
postal_code: '8004'
living_space: 24
price_display: CHF 2'257
ceiling_height: null
price_interval: month
year_renovated: 2025
pagination:
next: https://www.immoscout24.ch/de/wohnung/mieten/ort-zuerich?pn=2
page: 1
per_page: 20
total_pages: 50
total_results: 1222
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Immoscout24ch
components:
parameters:
fields:
name: fields
in: query
required: false
description: Comma-separated list of response fields to return, with dot notation for nested fields (e.g. `name,location.city`).
schema:
type: string
is_async:
name: is_async
in: query
required: false
description: 'Run the request as a background job: the API answers `202` with a `job_id` to poll on `GET /v1/jobs/{id}`.'
schema:
type: boolean
default: false
soft_fail:
name: soft_fail
in: query
required: false
description: Return HTTP 200 even when the request fails; the error is in the `error` field of the body.
schema:
type: boolean
default: false
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Human-readable error message.
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: Your API key. Include it in the x-api-key header for every request.