# nexxt-change Company Sale Listings Scraper (`webdesigndetail/nexxt-change-company-extractor`) Actor

Unofficial nexxt-change scraper for public German business succession and company-sale listings. Apply industry, location, revenue, employee, price, advertiser, image, and exposé filters, then export normalized results to JSON, CSV, Excel, or the Apify API.

- **URL**: https://apify.com/webdesigndetail/nexxt-change-company-extractor.md
- **Developed by:** [Webdesign Detail](https://apify.com/webdesigndetail) (community)
- **Categories:** News, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / actor start

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Extract public company-sale listings from the German business succession marketplace [nexxt-change.org](https://www.nexxt-change.org/) with your own search criteria. The Actor mirrors the official sales-offer search form, visits matching detail pages sequentially, and saves normalized, export-ready records to the default Apify dataset. Run it from Apify Console without code, schedule recurring searches, call it through the API, or connect the dataset to other Apify integrations.

This is an unofficial Actor. It is not affiliated with, endorsed by, or operated by nexxt-change, the German Federal Ministry for Economic Affairs and Energy, KfW, or Apify.

### What this Actor extracts

Each dataset item can include the listing ID and Chiffre, title, publication date, advertiser type, short and long descriptions, location hierarchy, industries, employee range, last annual revenue range, asking-price range, international-activity flag, public image URLs, a public exposé URL, and the responsible regional-partner organization. Money and employee bands are also returned as deterministic numeric minimum and maximum values where the source publishes them.

The Actor intentionally does not use AI, download exposé PDFs, enrich people or companies, send notifications, or write to an external database. It only processes the public HTML needed for the requested run. Contact-person names shown on source pages are not included in the dataset.

### Search inputs

The input UI supports the current nexxt-change search criteria:

- Search words or a Chiffre number and excluded words
- Top-level industry sector
- Federal state, or a five-digit postcode with radius
- Annual revenue, employee-count, and asking-price bands
- International activity
- Only listings with an exposé or images
- Advertiser types and regional-partner association
- Advanced exact industry and district hierarchy codes
- Maximum listings, maximum result pages, request delay, and timeout

The top-level sector and state fields are user-friendly selectors. For a source taxonomy below that level, copy the bracketed value from the live form's `ad_nace` or `ad_nuts` option into `industryCode` or `locationCode`. An advanced code overrides its top-level selector. The source treats state/district and postcode searches as alternatives, so the Actor rejects an input that combines them.

### How to use

1. Open the Actor's **Input** tab in Apify Console.
2. Enter only the criteria you need. Leave search fields empty to browse the newest public listings, or start with the prefilled `Bäckerei` example.
3. Choose `maxItems` and `maxPages`; keep the one-second request delay unless the source explicitly permits another rate.
4. Select **Start**, then open the default dataset to inspect or export the results. For automation, save the input as an Apify Task and run it through schedules, API calls, or integrations.

#### Example input

```json
{
  "searchTerm": "Bäckerei",
  "industrySector": "[13]",
  "federalState": "[11]",
  "revenueRanges": ["2", "1"],
  "onlyWithImages": false,
  "maxItems": 10,
  "maxPages": 100,
  "requestDelaySecs": 1,
  "requestTimeoutSecs": 30
}
```

All search criteria are optional. An empty search extracts the newest public listings until `maxItems` is reached. The Console prefill uses “Bäckerei” and 10 items so a first run produces a small, useful sample. Public runs are capped at 1,000 successfully extracted listings and 100 result pages. Split broader research into multiple runs with narrower industry, location, or financial filters.

### Output

Results are written one company per item to the default dataset and are available as JSON, JSONL, CSV, Excel, XML, or RSS through Apify. A `RUN_SUMMARY` record in the default key-value store contains result counts, page counts, `detailFailures`, `searchPageFailures`, an `isPartial` flag, up to 20 typed errors, and timestamps.

```json
{
  "source": "nexxt-change.org",
  "adId": "810016",
  "url": "https://www.nexxt-change.org/DE/Verkaufsangebot/Detailseite/detailseite_jsp?adId=810016",
  "title": "Existenz zu verkaufen",
  "publicationDate": "2026-08-24",
  "federalState": "Rheinland-Pfalz",
  "industries": ["Handwerk > Lebensmittelgewerbe > Bäcker"],
  "employeesMin": 0,
  "employeesMax": 5,
  "annualRevenueMinEur": 250000,
  "annualRevenueMaxEur": 500000,
  "internationalActivity": false,
  "imageUrls": [],
  "exposeUrl": null,
  "scrapedAt": "2026-08-24T19:00:00+00:00"
}
```

### Reliable pagination

nexxt-change result links contain a dynamic `gtp` token and use one-based page values. The earlier reusable crawler calculated the second request with a zero-based loop index, which requested list page 1 again. The source also emits the `&gtp=` separator without HTML-escaping its ampersand, so standard parsers can expose it incorrectly as `>p=`. This Actor restores that separator and follows the exact server-provided token and page value; it does not reconstruct them. It also deduplicates listing IDs, detects repeated page URLs, and stops at the end of results or the configured limits.

Every transient network failure, incomplete response body, HTTP 408/429 response, and HTTP 500–504 response is attempted up to five times with logged exponential backoff. If the first search page remains unavailable, the run fails because no valid result set exists. If a later search page remains unavailable after at least one page was processed, the run succeeds with the records already written and marks `RUN_SUMMARY.isPartial` as `true`. A failed detail page is skipped and reported the same way, so users can distinguish complete output from an intentionally preserved partial result.

### Pricing

The recommended public launch setting is **pay per usage**. There is no separate Publisher fee: users pay only the Apify platform resources consumed by their run. A default 10-item run normally makes one search-page request plus one detail-page request per discovered listing. Cost grows mainly with the requested page and listing limits, network retries, and run duration. The Actor uses 256 MB by default and does not use a browser, residential proxy, AI service, or other paid third-party API. Check the estimated and final usage on the run page in Apify Console.

### Responsible operation

Requests are sequential. The default delay is one second after every request attempt, transient failures are retried with backoff, and the Actor stops as soon as `maxItems` is reached. Do not use it to overload the source, bypass access controls, build spam lists, contact advertisers in bulk, or use data outside purposes permitted by the source website and applicable law. Keep each record's `source` and canonical `url` when sharing results: the source site's current [imprint](https://www.nexxt-change.org/DE/Service/Impressum/inhalt) requires source attribution for dissemination or reproduction of information created by the exchange. It also reserves rights in site text and images, so obtain any permission or legal review your intended reuse requires.

By running the Actor, you accept the [Terms of Service](https://github.com/Rchristo/nexxt-change-apify-actor/blob/main/TERMS.md). Data handling is described in the [Privacy Notice](https://github.com/Rchristo/nexxt-change-apify-actor/blob/main/PRIVACY.md).

### Local development

Python 3.12 and the Apify CLI are recommended.

```bash
python3.12 -m venv .venv
source .venv/bin/activate
pip install --require-hashes --requirement requirements.lock
python -m unittest discover -s tests -v
apify run --purge
```

The production image uses the non-browser `apify/actor-python:3.12` base image and runs as its non-root `myuser`. Dependencies are installed from the hash-locked `requirements.lock` before source code is copied so Docker can reuse the dependency layer. When `requirements.txt` changes, regenerate the lock with `uv pip compile requirements.txt --python-version 3.12 --generate-hashes --no-emit-index-url --output-file requirements.lock`.

### Deployment and Store release

Pushes to `main` run validation and deploy the accepted commit to the existing Actor's `beta` build tag through GitHub Actions. Run the cloud acceptance checks against that exact beta build. To release the same `main` commit, manually dispatch **Validate Actor** with `release_latest: true`; the workflow validates again, refreshes `beta`, waits at the `apify-production` environment gate, and then builds the `latest` tag. Keep Actor permissions set to **Limited**, select a successful and complete (`isPartial: false`) production run as sample output, and complete the Store publication form. Copy-ready display, SEO, category, pricing, and legal values are in the [Store listing guide](https://github.com/Rchristo/nexxt-change-apify-actor/blob/main/STORE_LISTING.md); the [release checklist](https://github.com/Rchristo/nexxt-change-apify-actor/blob/main/RELEASE.md) covers the owner-only gates.

### Support and changes

Source markup and third-party terms can change without notice. If extraction stops, include the Actor run ID and failing public URL in an [Apify issue](https://console.apify.com/) or [GitHub issue](https://github.com/Rchristo/nexxt-change-apify-actor/issues). Do not post personal data, tokens, or confidential listings in a public issue. Version history is recorded in the [changelog](https://github.com/Rchristo/nexxt-change-apify-actor/blob/main/CHANGELOG.md).

### FAQ

**Can one run export every listing?** A public run is limited to 1,000 listings and 100 result pages. Split broader exports by industry, state, postcode, price, or another source filter.

**Does the Actor return seller contact details?** No. It omits named contact people. Each record keeps the public source URL so you can use nexxt-change's official contact workflow.

**Why can results differ between runs?** Listings, source taxonomy, availability, and page markup can change at any time. The Actor records `scrapedAt` and always links back to the live listing for verification.

# Actor input Schema

## `searchTerm` (type: `string`):

Keywords or a nexxt-change Chiffre number. Leave empty to search all listings.

## `excludeTerms` (type: `string`):

Exclude results containing these words.

## `industrySector` (type: `string`):

Choose a top-level sector. Use Advanced industry code below for a specific sub-sector.

## `federalState` (type: `string`):

Choose a German federal state or listings outside Germany. Do not combine this with a postcode.

## `postalCode` (type: `string`):

A five-digit German postcode. This cannot be combined with a federal state or detailed location code.

## `radiusKm` (type: `integer`):

Search radius used only when a postcode is supplied.

## `revenueRanges` (type: `array`):

Select one or more source-site revenue bands.

## `employeeRanges` (type: `array`):

Select one or more source-site employee bands.

## `priceRanges` (type: `array`):

Select one or more source-site asking-price bands.

## `internationalActivity` (type: `string`):

Filter companies by whether international activity is stated.

## `onlyWithExpose` (type: `boolean`):

Return only companies for which the source page links an exposé PDF. The Actor returns the PDF URL but does not download the document.

## `onlyWithImages` (type: `boolean`):

Return only companies with images on the source site.

## `advertiserTypes` (type: `array`):

Select one or more advertiser types.

## `association` (type: `string`):

Filter by the regional-partner umbrella association shown in the source form.

## `industryCode` (type: `string`):

Optional exact hierarchy code from the live ad\_nace field, for example \[1,14,205]. It overrides Industry sector.

## `locationCode` (type: `string`):

Optional exact hierarchy code from the live ad\_nuts field, for example \[1,1,93]. It overrides Federal state and cannot be combined with a postcode.

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

Maximum number of successfully extracted company listings. Split broader exports into separate filtered runs.

## `maxPages` (type: `integer`):

Safety cap for result pages. Pagination stops earlier when maxItems is reached or no next page exists.

## `requestDelaySecs` (type: `integer`):

Minimum delay after each response. Keep this at 1 second or higher to reduce load on the source site.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each HTTP request.

## Actor input object example

```json
{
  "searchTerm": "Bäckerei",
  "industrySector": "",
  "federalState": "",
  "radiusKm": 15,
  "revenueRanges": [],
  "employeeRanges": [],
  "priceRanges": [],
  "internationalActivity": "",
  "onlyWithExpose": false,
  "onlyWithImages": false,
  "advertiserTypes": [],
  "association": "",
  "maxItems": 10,
  "maxPages": 100,
  "requestDelaySecs": 1,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

## `companies` (type: `string`):

Flat, export-ready company-sale listing records in the default dataset.

## `runSummary` (type: `string`):

Counts, timing, completion state, and typed source-request errors for this run.

# 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 = {
    "searchTerm": "Bäckerei"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdesigndetail/nexxt-change-company-extractor").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 = { "searchTerm": "Bäckerei" }

# Run the Actor and wait for it to finish
run = client.actor("webdesigndetail/nexxt-change-company-extractor").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 '{
  "searchTerm": "Bäckerei"
}' |
apify call webdesigndetail/nexxt-change-company-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webdesigndetail/nexxt-change-company-extractor"
        }
    }
}
```

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/E5ok4TxwPxT6wXJkw/builds/76a1A47BOM5yf71wq/openapi.json
