# nexxt-change Scraper – German Businesses for Sale (`outlandish_mainsail/nexxt-change-scraper`) Actor

Scrape Germany's official business succession exchange nexxt-change.org (KfW / Federal Ministry for Economic Affairs): businesses for sale and buyer requests with industry, region, employees, revenue and asking-price bands and full descriptions.

- **URL**: https://apify.com/outlandish_mainsail/nexxt-change-scraper.md
- **Developed by:** [Andreas v](https://apify.com/outlandish_mainsail) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/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

## nexxt-change Scraper – German Businesses for Sale

Scrape **[nexxt-change.org](https://www.nexxt-change.org)**, Germany's official business succession exchange (Unternehmensnachfolgebörse), run by the federal development bank **KfW** and the **Federal Ministry for Economic Affairs (BMWE)** with chambers of commerce and crafts as regional partners.

It holds thousands of German small and mid-sized businesses for sale (**Verkaufsangebote**, 6,424 on 9 Oct 2026) and buyer requests (**Kaufgesuche**, 2,235): owners retiring, craft businesses, restaurants, manufacturers, retailers, service companies.

### What you get

Title, reference number (Chiffre), publication date, listing type, advertiser type (owner or broker), short and full description, industries, locations (state > district), **employee band, last annual revenue band and asking-price band** (as text and as numeric min/max in EUR), international activity and image URLs.

### Use cases

- **Search funds, private equity, family offices and strategic buyers:** German SME deal flow (Mittelstand succession).
- **M\&A advisors and business brokers:** find sellers and buyers, monitor the market by region and industry.
- **Banks, chambers and researchers:** statistics on the succession market.
- **Daily alerts:** schedule it with *Only new listings* to receive each new listing once.

### Input

- **Listing type:** businesses for sale, buyer requests, or both.
- **Search terms, regions, industries:** e.g. `["Bäckerei"]`, `["Bayern", "Hamburg"]`, `["Handwerk"]`. Region and industry names are matched against the site's own lists. Each combination runs as a separate search, and duplicates are removed.
- **Bands:** asking price, revenue and employees use the site's own filters.
- **Include full details** (default on): opens each listing page. Off = fast mode, 10 listings per request, with title, date, industry, region and teaser.

```json
{ "listingType": "sale", "regions": ["Bayern"], "industries": ["Handwerk"], "revenueRange": "500k-2.5m", "maxItems": 200 }
```

### Output example (shortened)

```json
{
  "adId": "660031",
  "reference": "EX-A-1679-2026",
  "listingType": "business-for-sale",
  "url": "https://www.nexxt-change.org/DE/Verkaufsangebot/Detailseite/detailseite_jsp?adId=660031",
  "title": "Hausverwaltungs-GmbH mit 25 Mieteinheiten — vollvermietet, sofort ertragreich, M",
  "datePublished": "2026-10-08",
  "advertiserType": "Privatperson/Firma",
  "shortDescription": "Zur Übergabe steht eine vollständig operativ tätige Hausverwaltungs-GmbH mit 25 vermieteten Mieteinheiten (24 Wohn- + 1 Gewerbeeinheit) in Metzingen, Baden-Württemberg.",
  "description": "EINLEITUNG:\n\nZur Übergabe steht eine vollständig operativ tätige Hausverwaltungs-GmbH mit 25 vermieteten Mieteinheiten (24 Wohn- + 1 Gewerbeeinheit) in Metzingen, Baden-Württemberg. Die Übergabe erfolgt aus persönlichen …",
  "industries": [
    "Grundstücks- und Wohnungswesen"
  ],
  "locations": [
    "Baden-Württemberg > Tübingen > Reutlingen"
  ],
  "state": "Baden-Württemberg",
  "employeesRange": "Nicht veröffentlicht",
  "employeesMin": null,
  "employeesMax": null,
  "revenueRange": "über 50 - 250 Tsd. Euro",
  "revenueMinEur": 50000,
  "revenueMaxEur": 250000,
  "askingPriceRange": "über 2,5 Mio. Euro",
  "askingPriceMinEur": 2500000,
  "askingPriceMaxEur": null,
  "internationalActivity": null,
  "isNew": false,
  "hasImages": false,
  "hasExpose": false,
  "imageUrls": [],
  "source": "nexxt-change.org (KfW / BMWE)",
  "scrapedAt": "2026-10-09T17:21:09.821Z"
}
```

### Pricing

Pay per result: you only pay for listings saved to the dataset, plus a tiny start fee. The run respects your spending limit.

### Data source and reuse

nexxt-change's legal notice states that information created by the nexxt-change exchange may be passed on and reproduced **with the source named**. Every record therefore carries `source: "nexxt-change.org (KfW / BMWE)"`; please keep the attribution when you republish the data. This Actor is not affiliated with KfW or the ministry.

### Polite and transparent

One request at a time, at least 3 seconds apart, with an honest user agent. robots.txt is respected. No login.

### Data protection (GDPR)

Listings on nexxt-change are **anonymous** (contact only through the site's form), and the Actor collects **no names, e-mails or phone numbers**. Free-text descriptions are written by advertisers and could, rarely, contain personal details. Use the data lawfully and do not use it for unsolicited advertising.

# Actor input Schema

## `listingType` (type: `string`):

Which part of the exchange to scrape.

## `searchTerms` (type: `array`):

Optional full-text searches (German works best, e.g. "Bäckerei", "Metallbau", "GmbH"). Each term is a separate search.

## `regions` (type: `array`):

Optional German states, government districts or districts, e.g. "Bayern", "Hamburg", "München". Each region is a separate search.

## `industries` (type: `array`):

Optional industries as named on the site, e.g. "Handwerk", "Gastgewerbe", "Installateur und Heizungsbauer". Each is a separate search.

## `askingPriceRange` (type: `string`):

Site filter on the asking-price band.

## `revenueRange` (type: `string`):

Site filter on the revenue band.

## `employeesRange` (type: `string`):

Site filter on headcount band.

## `advertiserType` (type: `string`):

Who placed the listing.

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

Stop after this many listings in total. 0 = no limit.

## `includeDetails` (type: `boolean`):

Open each listing for the full description, all locations and industries, and the employee, revenue and price bands. Off = fast mode with title, date, industry, region and teaser only.

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

Optional: specific nexxt-change.org listing (detail page) URLs to scrape instead of searching.

## `maxPagesPerSearch` (type: `integer`):

Safety cap (10 listings per page). 0 = no cap.

## `skipPreviouslyScraped` (type: `boolean`):

Remember listing IDs between runs and skip them next time. Ideal for daily deal-flow alerts with a schedule.

## `seenListingsKey` (type: `string`):

Use different keys for separate monitoring tasks.

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

Not needed normally.

## `userAgent` (type: `string`):

HTTP User-Agent header. The default identifies this Actor honestly.

## Actor input object example

```json
{
  "listingType": "sale",
  "askingPriceRange": "any",
  "revenueRange": "any",
  "employeesRange": "any",
  "advertiserType": "any",
  "maxItems": 50,
  "includeDetails": true,
  "maxPagesPerSearch": 0,
  "skipPreviouslyScraped": false,
  "seenListingsKey": "SEEN_IDS",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "userAgent": "NexxtChangeListingsActor/1.0 (+https://apify.com)"
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped listings in the default dataset.

# 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 = {
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("outlandish_mainsail/nexxt-change-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 = { "maxItems": 50 }

# Run the Actor and wait for it to finish
run = client.actor("outlandish_mainsail/nexxt-change-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 '{
  "maxItems": 50
}' |
apify call outlandish_mainsail/nexxt-change-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,outlandish_mainsail/nexxt-change-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/gevViI89Syx2xcWUy/builds/PaQ0klz5WWiMedPcI/openapi.json
