# Kleinanzeigen Scraper: German Classifieds, Prices & Listings (`bogdiehard/kleinanzeigen-scraper`) Actor

Extracts German classified ads from kleinanzeigen.de with title, numeric price, negotiable flag, city, posting date and top-ad flag. Public listing data only.

- **URL**: https://apify.com/bogdiehard/kleinanzeigen-scraper.md
- **Developed by:** [Demetrius Greses Jr](https://apify.com/bogdiehard) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.98 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Kleinanzeigen Scraper: German Classifieds, Prices & Listings

Extracts German classified ads from kleinanzeigen.de category and keyword search pages, with title, numeric price, negotiable flag, city, posting date and image, for resellers and price researchers who need structured listing data.

### Use cases

- **Resellers and dealers** track asking prices for a model, such as an iPhone or an e-bike, across Germany and spot underpriced listings.
- **Price-research analysts** build used-goods price series by category, city or postal code.
- **Car and bike dealers** check a region's new listings for a keyword on a schedule.
- **Market analysts** count how many ads are listed per category over time to measure supply.
- **Private sellers and shops** compare their own asking prices with live listings in the same category.

### Sample output

Three results from a real run on the bikes category (the daily-test input, 20 results; `priceText` is the price as shown on the listing):

| id | title | priceText | city | postedAt |
| --- | --- | --- | --- | --- |
| 3537162041 | Bafang Hinterradnabenmotor | 150 € VB | Senden | 2026-10-11T01:18:00.000Z |
| 3537162012 | City Fahrrad | 20 € | Iserlohn | 2026-10-11T01:17:00.000Z |
| 3537161720 | 28"HYDE PARK Simplex,7 Gang, Neuwertig,Hollandrad | 250 € | Gütersloh | 2026-10-11T01:09:00.000Z |

One item as JSON:

```json
{
    "id": "3537162041",
    "title": "Bafang Hinterradnabenmotor",
    "price": 150,
    "priceText": "150 € VB",
    "negotiable": true,
    "isFree": false,
    "currency": "EUR",
    "postalCode": "89250",
    "city": "Senden",
    "postedAt": "2026-10-11T01:18:00.000Z",
    "isTopAd": false,
    "shippingAvailable": true,
    "descriptionSnippet": "Ich biete diesen Bafang Hinterradnabenmotor zum Verkauf an, da er nicht mehr benötigt wird. Er ist...",
    "imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/93/933f9ee4-737d-453a-aa1a-70c67e324946?rule=$_59.AUTO",
    "categoryUrl": "https://www.kleinanzeigen.de/s-fahrraeder/c217",
    "url": "https://www.kleinanzeigen.de/s-anzeige/bafang-hinterradnabenmotor/3537162041-217-6688",
    "sourceUrl": "https://www.kleinanzeigen.de/s-anzeige/bafang-hinterradnabenmotor/3537162041-217-6688",
    "scrapedAt": "2026-10-11T01:20:23.059Z"
}
```

### Pricing

**$1.40 per 1,000 results.** A 500-result run costs about $0.70. You pay only for results saved to your dataset, plus Apify's standard start fee of $0.00005 per run. Apify Silver and Gold plan users get lower per-result prices automatically.

Set **Max results** to cap what a run can cost. The Actor stops cleanly when it reaches your spending limit.

### Input

See the input tab for full configuration options.

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array | Category or search result pages on kleinanzeigen.de, for example https://www.kleinanzeigen.de/s-fahrraeder/c217. URLs on other sites, ad detail pages and pages that robots.txt disallows are ignored. |
| `searchQueries` | array | Keywords to search across Germany, one per entry, for example `iphone` or `e-bike`. |
| `maxPagesPerStart` | integer | Result pages to read per start URL or keyword, 1 to 5, default 5. robots.txt disallows pages 6 and up. |
| `maxItems` | integer | Maximum number of results to return. Default 100, maximum 50,000. You are charged per result. |
| `proxyConfiguration` | object | Apify datacenter proxy by default. |

Example input, a category:

```json
{
    "startUrls": [{ "url": "https://www.kleinanzeigen.de/s-fahrraeder/c217" }],
    "maxItems": 20
}
```

Example input, keyword searches:

```json
{
    "searchQueries": ["iphone 16", "e-bike"],
    "maxPagesPerStart": 5,
    "maxItems": 250
}
```

### Integrations

- **API:** run the Actor and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients.
- **AI agents:** call it as a tool through the [Apify MCP server](https://mcp.apify.com).
- **No-code:** connect it to Make, Zapier or n8n, or export results straight to Google Sheets.
- **Scheduling:** run it daily or hourly with Apify Schedules and get fresh listings on each run.

### FAQ

**What are the limits?** Each start URL or keyword reads at most 5 result pages, about 25 ads per page, so one search returns up to about 135 results. robots.txt disallows pages 6 and up, and the Actor never requests them. To collect more, add more categories or keywords to one run. The Actor does not open ad detail pages, so the description is the short text shown on the results card. Top ads repeat across pages and are returned once. Ads that show no date return `postedAt` as null. Relative dates such as "Heute, 03:18" are converted to ISO time in Europe/Berlin. Requests are rate limited to 60 per minute, with at most three running at once.

**Is this legal?** The Actor collects public listing data only, with no login, and crawls at a polite rate. It follows robots.txt and skips disallowed paths. The output has no seller names, user IDs, profile links or contact details. E-mail addresses, phone numbers, links and street addresses (street + house number) are removed from titles and description snippets; postal code and city stay as listing location fields. Results can still contain personal data, so do not scrape personal data unless you have a legitimate reason to do so. It is not affiliated with, endorsed by or connected to Kleinanzeigen or Adevinta. You are responsible for how you use the data.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. We answer within one business day and usually ship a fix within 48 hours.

### Related Actors

- [More Husena Actors](https://apify.com/bogdiehard) — other public-data scrapers from Husena LLC.

### Changelog

- **0.1** (2026-10-10) — First release: category and keyword search pages, parsed prices, negotiable and top-ad flags, Berlin-time posting dates.

# Actor input Schema

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

Category or search result pages on kleinanzeigen.de, for example https://www.kleinanzeigen.de/s-fahrraeder/c217. URLs on other sites, ad detail pages and pages that robots.txt disallows are ignored.

## `searchQueries` (type: `array`):

Keywords to search across Germany, one per entry, for example iphone or e-bike. Each keyword becomes a search page on kleinanzeigen.de.

## `maxPagesPerStart` (type: `integer`):

Result pages to read for each start URL or keyword, about 25 ads per page. Capped at 5 because robots.txt disallows pages 6 and up.

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

Maximum number of results to return. You are charged per result.

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

Apify datacenter proxy is used by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.kleinanzeigen.de/s-fahrraeder/c217"
    }
  ],
  "searchQueries": [],
  "maxPagesPerStart": 5,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `stats` (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.kleinanzeigen.de/s-fahrraeder/c217"
        }
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bogdiehard/kleinanzeigen-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.kleinanzeigen.de/s-fahrraeder/c217" }],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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.kleinanzeigen.de/s-fahrraeder/c217"
    }
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call bogdiehard/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bogdiehard/kleinanzeigen-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HBZFtibOE7N37gh5L/builds/3GFoHCU93kHEvYUPB/openapi.json
