# AutoScout24 \[Only $1.25] Scraper · CH -> SWISS (`memo23/autoscout24-ch-scraper`) Actor

\[Only $1.25] Scrape vehicle listings from AutoScout24.ch (Switzerland) via the public REST API. Supports filter-based search and direct detail page URLs. ℹ️ For custom solutions or support, contact : muhameddidovic@gmail.com

- **URL**: https://apify.com/memo23/autoscout24-ch-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Automation, Agents, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## AutoScout24 Scraper · CH

### Overview

This scraper extracts vehicle listings from **AutoScout24 Switzerland**
(`autoscout24.ch`) — a separate product operated by *Auto Scout 24 Schweiz AG* (part of
Swiss Marketplace Group). It is **not** the same backend as `.de` / `.com` and other
AutoScout24 EU markets — those are operated by a different company and need a different
scraper.

> **Looking for listings from any other AutoScout24 market** (`.de` / `.com` / `.it` /
> `.es` / `.fr` / `.be` / `.nl` / `.at` / `.lu`)? Use the sibling actor:
> **[AutoScout24 Scraper · DE · AT · IT · ES · FR · BE · NL · LU · .com](https://apify.com/memo23/autoscout24-scraper)**.

The scraper talks to the public **`api.autoscout24.ch`** REST API:

| Endpoint | Method | Purpose |
|---|---|---|
| `POST /v1/listings/search?language={de\|fr\|it\|en}` | POST | Paginated vehicle search (max page size **20**) |
| `GET /v1/listings/{id}?language={...}` | GET | Full structured detail JSON for one listing |

No authentication needed. The API host is **not** behind Cloudflare (unlike the public
`www.autoscout24.ch` HTML pages), so a proxy is not strictly required.

### Features

- **Filter mode** — paginate through the entire car catalog and pull matching listings.
- **Detail-URL mode** — paste one or more `https://www.autoscout24.ch/{lang}/d/{id}` URLs.
- **Optional detail enrichment** — fetches the JSON detail endpoint for each match (extra fields like cylinders, doors, drive type, full consumption breakdown).
- **All four UI languages**: `de`, `fr`, `it`, `en`.
- **Five vehicle categories**: `car`, `camper`, `truck`, `motorcycle`, `trailer`.

### Server-side filtering

The `POST /v1/listings/search` endpoint honours all the major filters server-side, using
the same shape the website's own SSR uses (extracted from `initialSearchState` in a
Wayback Machine snapshot):

| Filter | Field in request body | Notes |
|---|---|---|
| Make / model | `makeModelVersions: [{ makeKey, modelKey }]` | Nested — *not* top-level `makeKey` |
| Fuel | `fuelTypes: [string]` | Plural array; singular `fuelType` is silently ignored |
| Body | `bodyTypes: [string]` | Plural array |
| Condition | `conditionTypes: [string]` | Plural array |
| Price (CHF) | `priceFrom`, `priceTo` | Int |
| Year | `firstRegistrationYearFrom`, `firstRegistrationYearTo` | Int |
| Mileage (km) | `mileageFrom`, `mileageTo` | Int |
| Power (HP) | `horsePowerFrom`, `horsePowerTo` | Int — not `powerFrom`/`powerTo` |
| Vehicle category | `vehicleCategories: [string]` | Plural array |
| Sort | `sort: [{ type, order, variant: 'v1' }]` | Server-side |

Result: a query that matches **341** listings on the website also returns **341** from
the API (no over-fetching). A `matchesClientSideFilters` pass still runs as a
defense-in-depth safety net but is normally a no-op.

#### Still client-side only (server-side shape not yet confirmed)

- **ZIP code + radius** (`zipCode` / `radiusKm`) — sent but silently ignored
- **Warranty / accident** (`hasWarranty` / `hasAccidentHistory`) — sent but ignored

If you set these, the actor pages through results and applies them client-side. Send
an example URL that uses one of these filters and we can extend support.

### Input

Provide **either** `startUrls` (detail URLs) **or** filter fields. URLs always win when
both are set.

#### Filter-mode example

```json
{
  "filterLanguage": "de",
  "filterVehicleCategory": "car",
  "filterMake": "bmw",
  "filterModel": "x1",
  "filterPriceFromCHF": 20000,
  "filterPriceToCHF": 50000,
  "filterYearFrom": 2020,
  "filterFuelType": "hybrid",
  "sortType": "RELEVANCE",
  "sortOrder": "DESC",
  "enrichDetails": false,
  "maxItems": 100,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
````

#### Detail-URL example

You can paste full URLs **or** bare numeric ids — both are accepted in the same `startUrls` array.

```json
{
  "filterLanguage": "de",
  "startUrls": [
    { "url": "https://www.autoscout24.ch/de/d/20458677" },
    { "url": "https://www.autoscout24.ch/fr/d/20462882" },
    { "url": "20464837" }
  ],
  "maxItems": 100
}
```

For bare ids the language defaults to `filterLanguage` (which itself defaults to `de`).

#### Input field reference

| Field | Type | Description |
|---|---|---|
| `startUrls` | `[{ url }]` | Detail-page URLs (`/de/d/{id}`, `/fr/d/{id}`, …) **or** bare numeric ids (`"12345678"`). Search/list URLs are not parsed — use filters instead. |
| `filterLanguage` | `de\|fr\|it\|en` | Response locale & detail-page URL prefix. Default `de`. |
| `filterVehicleCategory` | `car\|camper\|truck\|motorcycle\|trailer` | **Works server-side.** Default `car`. |
| `filterMake` / `filterModel` | string | Make/model key (lowercase, hyphen-separated; e.g. `bmw`, `mercedes-benz`, `x1`). **Applied client-side.** |
| `filterConditionType` | `new\|pre-registered\|demonstration\|used` | Client-side. |
| `filterFuelType` | `electric\|petrol\|diesel\|hybrid\|mhev-petrol\|mhev-diesel\|plugin-hybrid` | Client-side. |
| `filterBodyType` | `suv\|saloon\|estate\|coupe\|cabriolet\|small-car\|pickup\|minivan\|bus` | Client-side. |
| `filterPriceFromCHF` / `filterPriceToCHF` | int | CHF, inclusive. Client-side. |
| `filterYearFrom` / `filterYearTo` | int | First-registration year, inclusive. Client-side. |
| `filterMileageFrom` / `filterMileageTo` | int | km, inclusive. Client-side. |
| `filterPowerFromHP` / `filterPowerToHP` | int | HP, inclusive. Client-side. |
| `filterZipCode` / `filterRadiusKm` | string + int | Sent to the API; **not** verified client-side (no geo lookup). |
| `sortType` | `RELEVANCE\|PRICE\|MILEAGE\|YEAR\|POWER` | **Works server-side.** Default `RELEVANCE`. |
| `sortOrder` | `DESC\|ASC` | Default `DESC`. |
| `enrichDetails` | bool | When true, fetch `/v1/listings/{id}` per result for extra fields. Doubles request count. |
| `maxItems` | int | Hard cap on output rows. Default 1000. Non-paying users are capped at 60. |
| `maxConcurrency` / `minConcurrency` / `maxRequestRetries` | int | Crawlee tuning knobs. |
| `proxy` | object | Apify proxy config. Residential recommended only for very heavy runs. |

### Output

Each pushed dataset row has this shape (selected fields shown):

```jsonc
{
  "id": 20458677,
  "url": "https://www.autoscout24.ch/de/d/20458677",
  "language": "de",
  "title": "M2 Coupé",
  "price": 63890,
  "priceCurrency": "CHF",
  "make": "BMW", "makeKey": "bmw", "makeId": 9,
  "model": "M2", "modelKey": "m2", "modelId": 999,
  "firstRegistrationDate": "2024-…",
  "firstRegistrationYear": 2024,
  "mileage": 28900,
  "fuelType": "petrol",
  "transmissionType": "automatic",
  "bodyType": "coupe",
  "conditionType": "used",
  "powerHp": 460,
  "powerKw": 338,
  "consumptionCombined": 9.6,
  "drive": "rear",
  "hadAccident": false,
  "hasWarranty": true,
  "warrantyType": "from-delivery",
  "sellerId": 123456, "sellerName": "…", "sellerType": "professional",
  "sellerCity": "Zürich", "sellerZipCode": "8001",
  "imageCount": 17,
  "images": ["https://listing-images.autoscout24.ch/listing/…", "…"],
  "source": "list",         // or "detail" when enrichDetails=true
  "raw": { "...": "full listing object as returned by the API" }
}
```

### Architecture

- **`src/main.ts`** — input validation, dual-mode resolution, crawler setup. Free-user clamp + `ACTOR_MAX_PAID_DATASET_ITEMS` respected.
- **`src/routes.ts`** — two handlers:
  - `LIST` — POSTs to `/v1/listings/search`, applies `matchesClientSideFilters`, pushes rows, enqueues next page until `maxItems` or end.
  - `DETAILS` — GETs `/v1/listings/{id}`, merges with `basicInfo` from the list pass.
- **`src/lib/buildSearchQuery.ts`** — payload builder + client-side filter predicate.
- **`src/lib/utils.ts`** — URL classification (`isDetailPageUrl`, `extractListingId`, `extractLanguageFromUrl`, …).

### Tests

```bash
npm test         ## 61 unit tests, fully offline (sub-second)
npm run test:live  ## 2 integration tests against the real CDN (~1 s, requires internet)
```

The offline suite covers URL classification, language extraction, filter matching,
payload construction, start-URL/bare-id normalisation, and image-URL construction.

The live suite checks that the image-CDN host we construct (`listing-images.autoscout24.ch`)
still resolves to real images. Run it after any AutoScout24-side change to catch
silent breakage early. Not invoked by default so flaky networks don't break local dev.

### Out of scope

- Pasting search/list URLs (`/de/s/...`) is **not** supported — the URL → API mapping
  isn't published and parsing the query-string syntax (`mk-bmw`, `mo-320`, …) is fragile.
  Use the filter fields instead.
- The Swiss site has a separate iOS app (App Store ID `295835058`, Android package
  `ch.autoscout24.autoscout24`). The actor does not currently use any iOS-app-specific
  endpoints — those would need a mitmproxy capture to discover.

### Support

For custom solutions, schema changes, or to report a broken endpoint:
<muhameddidovic@gmail.com>

# Actor input Schema

## `startUrls` (type: `array`):

Accepts: (1) a full detail URL <code>/de/d/{id}</code> / <code>/fr/d/{id}</code> / <code>/it/d/{id}</code> / <code>/en/d/{id}</code>, (2) a bare numeric id like <code>12345678</code>, or (3) a search URL <code>/{lang}/s/...</code>. Search URLs parse: <code>mk-{key}</code> (make), <code>mo-{key}</code> (model), <code>?priceFrom/priceTo</code>, <code>?firstRegistrationYearFrom/To</code>, <code>?mileageFrom/To</code>, and <code>?sort\[0]\[type]/\[order]</code>. Other URL filters (fuel/body/condition/radius) are listed in the run log and ignored — set those via the form fields below.

## `filterLanguage` (type: `string`):

Response locale (affects translated fields and detail-page URL slug).

## `filterVehicleCategory` (type: `string`):

Filter by vehicle type. The <em>car</em> category covers the bulk of the site.

## `filterMake` (type: `string`):

Manufacturer slug, e.g. <strong>bmw</strong>, <strong>audi</strong>, <strong>mercedes-benz</strong>. Applied client-side after each page of results.

## `filterModel` (type: `string`):

Model slug, e.g. <strong>x1</strong>, <strong>a3</strong>, <strong>c-class</strong>. Only applies when Make is set. Applied client-side.

## `filterConditionType` (type: `string`):

Vehicle condition filter. Applied client-side.

## `filterFuelType` (type: `string`):

Fuel/powertrain filter. Applied client-side.

## `filterBodyType` (type: `string`):

Body type filter. Applied client-side.

## `filterPriceFromCHF` (type: `integer`):

Minimum price in Swiss francs. Leave blank for no lower bound.

## `filterPriceToCHF` (type: `integer`):

Maximum price in Swiss francs. Leave blank for no upper bound.

## `filterYearFrom` (type: `integer`):

Earliest first-registration year (e.g. <strong>2018</strong>). Leave blank to include older cars.

## `filterYearTo` (type: `integer`):

Latest first-registration year (e.g. <strong>2025</strong>). Leave blank for no upper bound.

## `filterMileageFrom` (type: `integer`):

Minimum mileage in kilometres. Leave blank for no lower bound.

## `filterMileageTo` (type: `integer`):

Maximum mileage in kilometres. Leave blank for no upper bound.

## `filterPowerFromHP` (type: `integer`):

Minimum engine power in horsepower. Leave blank for no lower bound.

## `filterPowerToHP` (type: `integer`):

Maximum engine power in horsepower. Leave blank for no upper bound.

## `filterZipCode` (type: `string`):

Swiss postal code for radius search (e.g. <strong>8001</strong>). Pair with <em>Radius</em> below. Sent to the API but not enforced client-side (no geo lookup).

## `filterRadiusKm` (type: `integer`):

Search radius around the ZIP code. Requires <em>ZIP code</em> to be set.

## `sortType` (type: `string`):

Sorting field. Applied server-side by the AutoScout24.ch API.

## `sortOrder` (type: `string`):

Sort direction. <em>DESC</em> with <em>RELEVANCE</em> puts the most-featured listings first.

## `enrichDetails` (type: `boolean`):

When enabled, each listing is enriched by a second call to the JSON detail endpoint (<code>GET api.autoscout24.ch/v1/listings/{id}</code>) — adds fields like cylinders, doors, drive type, and a fuller consumption breakdown. Doubles the number of requests. The detail endpoint is on the same Cloudflare-free API host, so no proxy is required.

## `maxItems` (type: `integer`):

Maximum number of listings to collect. Non-paying users are capped at 60.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel HTTP requests.

## `minConcurrency` (type: `integer`):

Minimum number of parallel HTTP requests (auto-scales up to <em>Max concurrency</em>).

## `maxRequestRetries` (type: `integer`):

Number of retry attempts per failed request before giving up.

## `proxy` (type: `object`):

Proxy servers used to reach AutoScout24.ch. Apify proxy or custom URLs both supported.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autoscout24.ch/de/s/mk-bmw"
    },
    {
      "url": "https://www.autoscout24.ch/de/d/20458677"
    }
  ],
  "filterLanguage": "de",
  "filterVehicleCategory": "car",
  "filterMake": "bmw",
  "filterModel": "x1",
  "filterConditionType": "",
  "filterFuelType": "",
  "filterBodyType": "",
  "filterPriceFromCHF": 15000,
  "filterPriceToCHF": 50000,
  "filterYearFrom": 2018,
  "sortType": "RELEVANCE",
  "sortOrder": "DESC",
  "enrichDetails": false,
  "maxItems": 1000,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 6,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `all_fields` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.autoscout24.ch/de/s/mk-bmw"
        },
        {
            "url": "https://www.autoscout24.ch/de/d/20458677"
        }
    ],
    "filterMake": "bmw",
    "filterModel": "x1",
    "filterPriceFromCHF": 15000,
    "filterPriceToCHF": 50000,
    "filterYearFrom": 2018,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/autoscout24-ch-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://www.autoscout24.ch/de/s/mk-bmw" },
        { "url": "https://www.autoscout24.ch/de/d/20458677" },
    ],
    "filterMake": "bmw",
    "filterModel": "x1",
    "filterPriceFromCHF": 15000,
    "filterPriceToCHF": 50000,
    "filterYearFrom": 2018,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/autoscout24-ch-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.autoscout24.ch/de/s/mk-bmw"
    },
    {
      "url": "https://www.autoscout24.ch/de/d/20458677"
    }
  ],
  "filterMake": "bmw",
  "filterModel": "x1",
  "filterPriceFromCHF": 15000,
  "filterPriceToCHF": 50000,
  "filterYearFrom": 2018,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/autoscout24-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/autoscout24-ch-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AutoScout24 [Only $1.25] Scraper · CH -> SWISS",
        "description": "[Only $1.25] Scrape vehicle listings from AutoScout24.ch (Switzerland) via the public REST API. Supports filter-based search and direct detail page URLs. ℹ️ For custom solutions or support, contact : muhameddidovic@gmail.com",
        "version": "0.0",
        "x-build-id": "LgZoA2xa9p6DTNinQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~autoscout24-ch-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-autoscout24-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~autoscout24-ch-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-autoscout24-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~autoscout24-ch-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-autoscout24-ch-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxItems"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs (detail or search)",
                        "type": "array",
                        "description": "Accepts: (1) a full detail URL <code>/de/d/{id}</code> / <code>/fr/d/{id}</code> / <code>/it/d/{id}</code> / <code>/en/d/{id}</code>, (2) a bare numeric id like <code>12345678</code>, or (3) a search URL <code>/{lang}/s/...</code>. Search URLs parse: <code>mk-{key}</code> (make), <code>mo-{key}</code> (model), <code>?priceFrom/priceTo</code>, <code>?firstRegistrationYearFrom/To</code>, <code>?mileageFrom/To</code>, and <code>?sort[0][type]/[order]</code>. Other URL filters (fuel/body/condition/radius) are listed in the run log and ignored — set those via the form fields below.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "filterLanguage": {
                        "title": "Language",
                        "enum": [
                            "de",
                            "fr",
                            "it",
                            "en"
                        ],
                        "type": "string",
                        "description": "Response locale (affects translated fields and detail-page URL slug).",
                        "default": "de"
                    },
                    "filterVehicleCategory": {
                        "title": "Vehicle category",
                        "enum": [
                            "car",
                            "camper",
                            "truck",
                            "motorcycle",
                            "trailer"
                        ],
                        "type": "string",
                        "description": "Filter by vehicle type. The <em>car</em> category covers the bulk of the site.",
                        "default": "car"
                    },
                    "filterMake": {
                        "title": "Make",
                        "type": "string",
                        "description": "Manufacturer slug, e.g. <strong>bmw</strong>, <strong>audi</strong>, <strong>mercedes-benz</strong>. Applied client-side after each page of results."
                    },
                    "filterModel": {
                        "title": "Model",
                        "type": "string",
                        "description": "Model slug, e.g. <strong>x1</strong>, <strong>a3</strong>, <strong>c-class</strong>. Only applies when Make is set. Applied client-side."
                    },
                    "filterConditionType": {
                        "title": "Condition",
                        "enum": [
                            "",
                            "new",
                            "pre-registered",
                            "demonstration",
                            "used"
                        ],
                        "type": "string",
                        "description": "Vehicle condition filter. Applied client-side.",
                        "default": ""
                    },
                    "filterFuelType": {
                        "title": "Fuel type",
                        "enum": [
                            "",
                            "electric",
                            "petrol",
                            "diesel",
                            "hybrid",
                            "mhev-petrol",
                            "mhev-diesel",
                            "plugin-hybrid"
                        ],
                        "type": "string",
                        "description": "Fuel/powertrain filter. Applied client-side.",
                        "default": ""
                    },
                    "filterBodyType": {
                        "title": "Body type",
                        "enum": [
                            "",
                            "suv",
                            "saloon",
                            "estate",
                            "coupe",
                            "cabriolet",
                            "small-car",
                            "pickup",
                            "minivan",
                            "bus"
                        ],
                        "type": "string",
                        "description": "Body type filter. Applied client-side.",
                        "default": ""
                    },
                    "filterPriceFromCHF": {
                        "title": "Minimum price (CHF)",
                        "type": "integer",
                        "description": "Minimum price in Swiss francs. Leave blank for no lower bound."
                    },
                    "filterPriceToCHF": {
                        "title": "Maximum price (CHF)",
                        "type": "integer",
                        "description": "Maximum price in Swiss francs. Leave blank for no upper bound."
                    },
                    "filterYearFrom": {
                        "title": "First registration year — from",
                        "type": "integer",
                        "description": "Earliest first-registration year (e.g. <strong>2018</strong>). Leave blank to include older cars."
                    },
                    "filterYearTo": {
                        "title": "First registration year — to",
                        "type": "integer",
                        "description": "Latest first-registration year (e.g. <strong>2025</strong>). Leave blank for no upper bound."
                    },
                    "filterMileageFrom": {
                        "title": "Mileage from (km)",
                        "type": "integer",
                        "description": "Minimum mileage in kilometres. Leave blank for no lower bound."
                    },
                    "filterMileageTo": {
                        "title": "Mileage to (km)",
                        "type": "integer",
                        "description": "Maximum mileage in kilometres. Leave blank for no upper bound."
                    },
                    "filterPowerFromHP": {
                        "title": "Power from (HP)",
                        "type": "integer",
                        "description": "Minimum engine power in horsepower. Leave blank for no lower bound."
                    },
                    "filterPowerToHP": {
                        "title": "Power to (HP)",
                        "type": "integer",
                        "description": "Maximum engine power in horsepower. Leave blank for no upper bound."
                    },
                    "filterZipCode": {
                        "title": "ZIP code",
                        "type": "string",
                        "description": "Swiss postal code for radius search (e.g. <strong>8001</strong>). Pair with <em>Radius</em> below. Sent to the API but not enforced client-side (no geo lookup)."
                    },
                    "filterRadiusKm": {
                        "title": "Radius (km)",
                        "type": "integer",
                        "description": "Search radius around the ZIP code. Requires <em>ZIP code</em> to be set."
                    },
                    "sortType": {
                        "title": "Sort by",
                        "enum": [
                            "RELEVANCE",
                            "PRICE",
                            "MILEAGE",
                            "YEAR",
                            "POWER"
                        ],
                        "type": "string",
                        "description": "Sorting field. Applied server-side by the AutoScout24.ch API.",
                        "default": "RELEVANCE"
                    },
                    "sortOrder": {
                        "title": "Sort order",
                        "enum": [
                            "DESC",
                            "ASC"
                        ],
                        "type": "string",
                        "description": "Sort direction. <em>DESC</em> with <em>RELEVANCE</em> puts the most-featured listings first.",
                        "default": "DESC"
                    },
                    "enrichDetails": {
                        "title": "Fetch full detail pages",
                        "type": "boolean",
                        "description": "When enabled, each listing is enriched by a second call to the JSON detail endpoint (<code>GET api.autoscout24.ch/v1/listings/{id}</code>) — adds fields like cylinders, doors, drive type, and a fuller consumption breakdown. Doubles the number of requests. The detail endpoint is on the same Cloudflare-free API host, so no proxy is required.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max results",
                        "type": "integer",
                        "description": "Maximum number of listings to collect. Non-paying users are capped at 60.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "type": "integer",
                        "description": "Maximum number of parallel HTTP requests.",
                        "default": 5
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "type": "integer",
                        "description": "Minimum number of parallel HTTP requests (auto-scales up to <em>Max concurrency</em>).",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "type": "integer",
                        "description": "Number of retry attempts per failed request before giving up.",
                        "default": 6
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy servers used to reach AutoScout24.ch. Apify proxy or custom URLs both supported.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
