# AutoScout24 Price Monitor: Price Drop & New Listing Alerts (`bostomate/autoscout-price-monitor`) Actor

Monitor your AutoScout24 car searches across 7 European markets and get only PRICE DROPS and NEW listings: the stateful alternative to one-shot car scrapers. Built for dealers, flippers and patient buyers.

- **URL**: https://apify.com/bostomate/autoscout-price-monitor.md
- **Developed by:** [Tommy Bos](https://apify.com/bostomate) (community)
- **Categories:** E-commerce, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 price drops

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 Price Monitor — Price Drop & New Listing Alerts

### What is AutoScout24 Price Monitor?

AutoScout24 Price Monitor watches your car searches on **AutoScout24** — Europe's largest car marketplace — and returns **only what changed**: price drops and brand-new listings. No duplicates, no re-scraping the same 20 cars every run.

Cars aren't sniped in minutes like phones — they're won by **catching the price cut**. A dealer who drops a Golf from €12.500 to €11.750 wants it gone; the buyer who calls that afternoon gets the deal. This monitor runs on an Apify Schedule (e.g. hourly), remembers every car and its price per search, and alerts you the moment a price moves down or new stock appears.

Unlike one-shot car scrapers, this is a **stateful monitor**: it keeps a seen-state per watch in a key-value store on your Apify account and stays quiet when nothing changed. You pay per alert — a quiet run costs you nothing in events.

Works on all seven AutoScout24 markets: **autoscout24.nl, .de, .be, .at, .it, .fr, .es** — monitor several countries side by side for cross-border import arbitrage.

### What can you do with it?

- **Buy your next car below market**: watch exactly the model/year/km/budget you want and act on every price cut before other buyers notice.
- **Dealer stock intelligence**: track competitors' listings and price moves in your region, automatically.
- **Cross-border arbitrage**: run the same model watch on autoscout24.de and autoscout24.nl and see where it's cheaper — the alert includes country, seller type and AutoScout24's own price rating (`fair-price` / `good-price` / `top-price`).
- **Flip hunting**: `minDropPercent: 5` surfaces only motivated sellers.
- **Feed your own automations**: connect the dataset to Telegram, Slack, e-mail or webhooks with Apify integrations.

### How to use it

1. Go to any AutoScout24 site and filter a search exactly how you want it (make, model, price, year, mileage, fuel, region...).
2. **Copy the URL from your browser** and paste it into `watchUrls`. That's the whole setup — every filter the site supports works, because the monitor uses your URL as-is.
3. Run once — you get the current matches and the monitor starts remembering.
4. Create an **Apify Schedule** (hourly is plenty for cars). Every scheduled run now emits only price drops and new listings.
5. Optionally add an Apify **integration** (webhook/Slack/email) on new dataset items.

Example input:

```json
{
    "watchUrls": [
        "https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000&kmto=120000",
        "https://www.autoscout24.de/lst/bmw/320?fregfrom=2018&priceto=20000"
    ],
    "minDropPercent": 2
}
````

The monitor forces newest-first ordering on your URL so new listings always surface, and checks `pagesPerWatch` × 20 cars per run.

### Output

One dataset item per alert:

```json
{
    "alertType": "price_drop",
    "id": "d61f956a-49a5-4b2c-843f-8ee3dddeda65",
    "title": "Volkswagen Golf 1.4 TSI Highline",
    "price": 11250,
    "previousPrice": 11990,
    "priceDropPercent": 6.2,
    "priceLabel": "fair-price",
    "make": "Volkswagen",
    "model": "Golf",
    "fuel": "Benzine",
    "transmission": "Handgeschakeld",
    "mileageKm": 146874,
    "firstRegistration": "11-2014",
    "city": "Uden",
    "countryCode": "NL",
    "sellerType": "Dealer",
    "listingUrl": "https://www.autoscout24.nl/aanbod/volkswagen-golf-1-4-tsi-...",
    "imageUrl": "https://prod.pictures.autoscout24.net/listing-images/...",
    "watchUrl": "https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000&sort=age&desc=1",
    "firstSeen": "2026-07-05T14:12:03Z"
}
```

`alertType` is `price_drop` or `new`. `priceLabel` is AutoScout24's own price rating. `superDealOldPrice` carries the site's strike-through price when a listing wears the site's own deal badge. Promoted placements arrive flagged `isPromoted: true` (or drop them entirely with `organicOnly`).

### Pricing

You pay **per alert**, not per run or per page. Price drops are the premium signal (a motivated seller); new listings are the volume signal. A typical 3-watch setup polled hourly produces a few alerts per day — a fraction of what one missed price cut is worth.

### FAQ

**What does the first run return?** The current matching cars for each watch, so you see the market immediately and the monitor has a baseline. Every run after that returns only price drops and new listings. Set `emitOnFirstRun` to false for a silent baseline instead.

**Why do I need to paste a URL instead of picking filters here?** Because AutoScout24's own search UI is better than any form we could build — every filter it supports (equipment, colour, seller type, leasing...) works automatically. Your URL *is* the configuration.

**How fast are alerts?** As fast as your Schedule. Hourly is a good default for cars; 15–30 minutes for hot searches.

**Which countries work?** autoscout24.nl, .de, .be (nl/fr), .at, .it, .fr and .es — all verified. Mix them freely in one monitor.

**Does it get blocked?** The monitor is deliberately polite (5-second spacing, automatic back-off) and reads only server-rendered public pages. For heavy watchlists on tight schedules, add a proxy in the input.

**Can I run multiple watchlists?** Yes — give each its own `monitorId`. Each keeps an independent seen-history. Two watches on the same model with different filters never share state either.

**Is this legal?** The monitor reads only publicly visible listings — no login, no personal data beyond what any visitor sees on the search page.

**Do you have this for other marketplaces?** Same product, different market: [Marktplaats Monitor](https://apify.com/bostomate/marktplaats-monitor) (NL/BE classifieds) and [Kleinanzeigen Monitor](https://apify.com/bostomate/kleinanzeigen-monitor) (German classifieds). For industrial auctions: [European Auction Scraper](https://apify.com/bostomate/european-auction-scraper).

### Disclaimer

This is an independent tool, not affiliated with or endorsed by AutoScout24. All trademarks belong to their owners. The actor reads only publicly accessible listing data, respects a polite request rate, and stores no personal data beyond the public listing fields you receive.

# Actor input Schema

## `watchUrls` (type: `array`):

Filter your search on autoscout24.nl / .de / .be / .at / .it / .fr / .es exactly how you want it (make, model, price, year, mileage, fuel...), then copy the URL from your browser and paste it here. Each URL is monitored independently.

## `minDropPercent` (type: `integer`):

Only alert on price drops of at least this percentage. Filters out cosmetic €10 cuts; 1-2% works well for cars. 0 = alert on every drop.

## `pagesPerWatch` (type: `integer`):

How many result pages (20 cars each, newest first) to check per watch per run. 1 page covers a specific make+model watch; raise it for broad searches or slow schedules.

## `organicOnly` (type: `boolean`):

Skip promoted/boosted placements and alert only on organic search results. Off by default (promoted listings are real cars too - they arrive flagged with isPromoted).

## `emitOnFirstRun` (type: `boolean`):

On the first run of a new watch, return the current matching cars (so you immediately see the market and start monitoring from a known set). Turn this OFF if you want a silent baseline and alerts only for changes AFTER the first run.

## `monitorId` (type: `string`):

Name of this watchlist's memory. Use different IDs to run independent monitors without their seen-histories mixing.

## `proxyConfiguration` (type: `object`):

Optional. The monitor is polite by design (5s between page fetches); add a proxy only if your runs get blocked.

## Actor input object example

```json
{
  "watchUrls": [
    "https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000"
  ],
  "minDropPercent": 1,
  "pagesPerWatch": 1,
  "organicOnly": false,
  "emitOnFirstRun": true,
  "monitorId": "default"
}
```

# 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 = {
    "watchUrls": [
        "https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bostomate/autoscout-price-monitor").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 = { "watchUrls": ["https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000"] }

# Run the Actor and wait for it to finish
run = client.actor("bostomate/autoscout-price-monitor").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 '{
  "watchUrls": [
    "https://www.autoscout24.nl/lst/volkswagen/golf?priceto=15000"
  ]
}' |
apify call bostomate/autoscout-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=bostomate/autoscout-price-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AutoScout24 Price Monitor: Price Drop & New Listing Alerts",
        "description": "Monitor your AutoScout24 car searches across 7 European markets and get only PRICE DROPS and NEW listings: the stateful alternative to one-shot car scrapers. Built for dealers, flippers and patient buyers.",
        "version": "0.1",
        "x-build-id": "Fqr88EJdqepO96RCn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bostomate~autoscout-price-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bostomate-autoscout-price-monitor",
                "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/bostomate~autoscout-price-monitor/runs": {
            "post": {
                "operationId": "runs-sync-bostomate-autoscout-price-monitor",
                "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/bostomate~autoscout-price-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-bostomate-autoscout-price-monitor",
                "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": [
                    "watchUrls"
                ],
                "properties": {
                    "watchUrls": {
                        "title": "AutoScout24 search URLs to watch",
                        "type": "array",
                        "description": "Filter your search on autoscout24.nl / .de / .be / .at / .it / .fr / .es exactly how you want it (make, model, price, year, mileage, fuel...), then copy the URL from your browser and paste it here. Each URL is monitored independently.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minDropPercent": {
                        "title": "Minimum price drop (%)",
                        "minimum": 0,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Only alert on price drops of at least this percentage. Filters out cosmetic €10 cuts; 1-2% works well for cars. 0 = alert on every drop.",
                        "default": 1
                    },
                    "pagesPerWatch": {
                        "title": "Pages checked per watch",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many result pages (20 cars each, newest first) to check per watch per run. 1 page covers a specific make+model watch; raise it for broad searches or slow schedules.",
                        "default": 1
                    },
                    "organicOnly": {
                        "title": "Organic results only",
                        "type": "boolean",
                        "description": "Skip promoted/boosted placements and alert only on organic search results. Off by default (promoted listings are real cars too - they arrive flagged with isPromoted).",
                        "default": false
                    },
                    "emitOnFirstRun": {
                        "title": "Emit results on the first run",
                        "type": "boolean",
                        "description": "On the first run of a new watch, return the current matching cars (so you immediately see the market and start monitoring from a known set). Turn this OFF if you want a silent baseline and alerts only for changes AFTER the first run.",
                        "default": true
                    },
                    "monitorId": {
                        "title": "Monitor ID",
                        "type": "string",
                        "description": "Name of this watchlist's memory. Use different IDs to run independent monitors without their seen-histories mixing.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. The monitor is polite by design (5s between page fetches); add a proxy only if your runs get blocked."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
