# WLW.de Scraper (`solidcode/wlw-de-scraper`) Actor

\[💰 $2.5 / 1K] Extract B2B supplier listings from WLW.de (Wer Liefert Was) — company name, address, phone, email, website, certifications, product categories, employee count, founding year, and coordinates. Search by keyword, browse by category, or scope to Germany, Austria, or Switzerland.

- **URL**: https://apify.com/solidcode/wlw-de-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 31 total users, 6 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## WLW.de Scraper

Pull B2B supplier listings from WLW.de (Wer Liefert Was) at scale — company name, full mailing address, phone, email, fax, website, VAT ID, founding year, employee count, certifications, named contacts, geo coordinates, and multi-language product categories for every active supplier across Germany, Austria, and Switzerland. Built for DACH procurement teams, B2B sales reps, supply-chain analysts, and industrial market researchers who need a fresh, structured WLW.de dataset without manually clicking through thousands of supplier profiles.

### Why This Scraper?

- **All three DACH markets in one run** — toggle a single dropdown to search Germany, Austria, Switzerland, or "All DACH" (fan-out across DE, AT, and CH with automatic deduplication by company ID).
- **Manufacturer-only lead lists in one click** — filter to Hersteller, custom manufacturers, distributors, wholesalers or service providers, and stack an employee-size bracket on top (9 brackets from 1-4 up to 1000+) to get, say, only producers with 10 to 49 staff.
- **Genuine producers, not resellers wearing the label** — most companies filed under "manufacturer" on WLW.de also file themselves as distributor or wholesaler. One tick drops everyone who resells other people's goods, leaving firms that actually make what they sell.
- **On-topic results, not just search results** — WLW.de's own lists drift as you go deeper: search for dietary supplements and by page 20 you are reading about label printers, packaging lines and ERP vendors. The keyword-match setting keeps only companies whose own catalogue backs up your keyword.
- **33 top-level WLW.de industry categories** — from Maschinenbau and Elektrotechnik to IT-Dienstleistungen and Beratung, each pickable by name from a dropdown (no slug hunting).
- **Optional detail-page enrichment** — flip one switch to pull business email, fax, VAT ID, full description, named contact people (first name, last name, role, email, phone), payment terms, incoterms, and full certificate names.
- **Latitude + longitude on most suppliers** — map suppliers geographically straight from the dataset, no extra geocoding step (included whenever the supplier publishes a location).
- **URL-paste mode** — paste any WLW.de search URL, category URL, or supplier detail URL directly; the actor reverse-engineers the filters so you skip rebuilding queries.
- **~2,500 suppliers per keyword and country** — the full depth WLW.de exposes for a search; run all three DACH markets to triple that in a single pass.
- **English keywords against German listings** — search "dietary supplement" and you still get the Nahrungsergänzungsmittel producers, because the actor learns what your keyword means in the directory's own vocabulary before it filters.
- **Single flat row per supplier** — 35 fields per row covering identity, address, contact, business profile, certifications, and operational metrics — ready for direct CSV import.

### Use Cases

**Procurement & Sourcing**

- Build short-lists of certified DACH suppliers for tender evaluations
- Filter manufacturers by city, postal code, or distribution area
- Compare supplier counts per industry category to gauge sourcing depth
- Extract payment terms and incoterms for vendor onboarding

**Sales & Lead Generation**

- Build outbound prospect lists for industrial machinery, plastics, metal, or chemicals verticals
- Capture named contact people (managing directors, sales leads) with email and phone
- Segment by employee count and founding year for ICP targeting
- Pull every supplier in a postal-code radius for territory planning

**Market Research & Competitive Intelligence**

- Map the DACH supplier landscape per industry — count of producers vs. wholesalers vs. distributors
- Identify newcomers by founding year and established players by certification breadth
- Compare WLW category coverage across Germany, Austria, and Switzerland
- Track distribution areas to understand each supplier's geographic reach

**Supply Chain Mapping & Risk**

- Index alternative suppliers per product category in case of disruption
- Geo-plot suppliers via latitude/longitude to model logistics distance
- Detect single-source dependencies by spotting categories with only one or two listed suppliers
- Capture VAT IDs and certificates for compliance and KYC workflows

### Getting Started

#### Search by German Keyword

```json
{
    "searchQuery": "CNC Fräsen",
    "country": "de",
    "maxResults": 100
}
```

#### Small Manufacturers Only

```json
{
  "searchQuery": "Aluminiumprofile",
  "country": "de",
  "supplierTypes": ["manufacturer"],
  "excludeResellers": true,
  "employeeCounts": ["10-19", "20-49"],
  "relevance": "strict",
  "maxResults": 500
}
```

#### Browse a Category in All DACH

```json
{
    "searchQuery": "Verpackungsmaschinen",
    "category": "100007",
    "country": "all",
    "maxResults": 500
}
```

#### Full Enrichment Run

```json
{
    "searchQuery": "Logistikdienstleister",
    "country": "de",
    "includeDetails": true,
    "maxResults": 200
}
```

#### Paste WLW.de URLs Directly

```json
{
    "searchUrls": [
        "https://www.wlw.de/de/suche/cnc-fraesen",
        "https://www.wlw.de/de/produkte/maschinenbau-anlagenbau-100007",
        "https://www.wlw.at/de/firma/example-gmbh-12345"
    ],
    "includeDetails": true,
    "maxResults": 1000
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | string\[] | `[]` | Paste one or more WLW.de URLs — search pages, category pages, or supplier detail pages. Mix and match. Overrides the guided fields below when set. |
| `searchQuery` | string | `"CNC Fräsen"` | Free-text product or service keyword (German recommended). Ignored when `searchUrls` is populated. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `category` | select | `All Categories` | One of 33 top-level WLW industry categories — Maschinenbau, Elektrotechnik, IT-Dienstleistungen, Beratung, and 29 others. Pick by German name from the dropdown. |
| `country` | select | `Germany` | `Germany`, `Austria`, `Switzerland`, or `All DACH` (runs the search across all three and dedupes). |
| `supplierTypes` | multi-select | all types | Keep only manufacturers, custom manufacturers, distributors, wholesalers, or service providers. Pick several to combine them. |
| `excludeResellers` | boolean | `false` | Drop companies that also list themselves as distributor or wholesaler, leaving only firms that make what they sell. |
| `employeeCounts` | multi-select | any size | Keep only companies in the employee brackets you pick: `1-4`, `5-9`, `10-19`, `20-49`, `50-99`, `100-199`, `200-499`, `500-999`, `1000+`. |
| `relevance` | select | `Balanced` | How closely a company must match your keyword. `Balanced` keeps companies whose own listing backs up the keyword, `Strict` requires a matching product in their catalogue, `Off` returns everything WLW.de returns. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeDetails` | boolean | `false` | Visit each supplier's profile page to enrich the row with business email, fax, VAT ID, full description, certificates, named contacts, payment terms, and incoterms. Slower (one extra request per supplier) but much richer data. |
| `maxResults` | integer | `200` | Cap on total suppliers per run. `0` means unlimited (internally capped at 50,000 for safety). Final pages are kept in full even if they slightly overshoot the cap. |

### Output

Here's a representative supplier row with `includeDetails` enabled:

```json
{
    "companyName": "Beispiel Maschinenbau GmbH",
    "wlwId": "1234567",
    "slug": "beispiel-maschinenbau-gmbh-1234567",
    "detailUrl": "https://www.wlw.de/de/firma/beispiel-maschinenbau-gmbh-1234567",
    "supplierType": "manufacturer",
    "supplierTypes": ["production", "service"],
    "description": "Familienbetrieb mit über 40 Jahren Erfahrung in der CNC-Zerspanung...",
    "street": "Industriestraße 42",
    "zip": "70565",
    "city": "Stuttgart",
    "country": "DE",
    "addressFormatted": "Industriestraße 42, 70565 Stuttgart",
    "phone": "+49 711 1234567",
    "fax": "+49 711 1234568",
    "email": "info@beispiel-maschinenbau.de",
    "website": "https://www.beispiel-maschinenbau.de",
    "logoUrl": "https://cdn.wlw.de/logos/1234567.png",
    "latitude": 48.7758,
    "longitude": 9.1829,
    "employeeCount": "50-99",
    "foundingYear": 1982,
    "distributionArea": "Deutschland, Österreich, Schweiz",
    "vatId": "DE123456789",
    "certifications": ["ISO 9001:2015", "ISO 14001:2015"],
    "productCategories": [
        "CNC-Fräsen",
        "CNC-Drehen",
        "Zerspanungstechnik"
    ],
    "mainBusinessArea": {
        "id": "100020",
        "title": "Zerspanung & Umformung",
        "slug": "zerspanung-umformung"
    },
    "contacts": [
        {
            "firstName": "Klaus",
            "lastName": "Müller",
            "title": "Geschäftsführer",
            "email": "k.mueller@beispiel-maschinenbau.de",
            "phone": "+49 711 1234560",
            "executiveType": "ceo"
        }
    ],
    "paymentMethods": ["invoice", "advance_payment"],
    "paymentTerms": ["net_30"],
    "incoterms": ["EXW", "FCA"],
    "averageResponseTime": "Within 24 hours",
    "responseRate": 0.92,
    "sourceUrl": "https://www.wlw.de/de/suche/cnc-fraesen",
    "searchQuery": "CNC Fräsen",
    "scrapedAt": "2026-05-15T14:30:00Z"
}
```

#### Core Identity

| Field | Type | Description |
|-------|------|-------------|
| `companyName` | string | Legal company name |
| `wlwId` | string | Stable WLW supplier identifier (shared across .de/.at/.ch) |
| `slug` | string | URL-safe company slug used on the supplier detail page |
| `detailUrl` | string | Direct link to the supplier's WLW.de profile |
| `supplierType` | string | Primary tag — one of `manufacturer`, `service_provider`, `wholesaler`, `distributor`, `custom_manufacturer` |
| `supplierTypes` | string\[] | All raw classification tags the supplier carries |
| `description` | string | Company description (longer text when `includeDetails` is on) |
| `logoUrl` | string | Direct URL to the company logo image |

#### Address & Geo

| Field | Type | Description |
|-------|------|-------------|
| `street` | string | Street and house number |
| `zip` | string | Postal code |
| `city` | string | City |
| `country` | string | Two-letter country code (DE / AT / CH) |
| `addressFormatted` | string | Single-line formatted mailing address |
| `latitude` | number | WGS84 latitude |
| `longitude` | number | WGS84 longitude |

#### Contact

| Field | Type | Description |
|-------|------|-------------|
| `phone` | string | Main business phone number |
| `fax` | string | Fax number (detail-page only) |
| `email` | string | Business email (detail-page only) |
| `website` | string | Company homepage URL |
| `contacts` | object\[] | Named contact people: `firstName`, `lastName`, `title`, `email`, `phone`, `executiveType` (detail-page only) |

#### Business Profile

| Field | Type | Description |
|-------|------|-------------|
| `employeeCount` | string | Headcount band (e.g. `1-9`, `10-49`, `50-99`, `100-249`, `250+`) |
| `foundingYear` | integer | Year the company was founded |
| `distributionArea` | string | Geographic distribution area as published by the supplier |
| `vatId` | string | VAT identification number (detail-page only) |
| `mainBusinessArea` | object | Primary WLW category — `{ id, title, slug }` (detail-page only) |
| `averageResponseTime` | string | Self-reported response time bucket |
| `responseRate` | number | Self-reported inquiry response rate (0.0–1.0, where 0.92 means 92%) |

#### Categories & Commercial

| Field | Type | Description |
|-------|------|-------------|
| `productCategories` | string\[] | Top product / service categories the supplier is listed under |
| `certifications` | string\[] | ISO and industry certificate names (detail-page only) |
| `paymentMethods` | string\[] | Accepted payment methods (detail-page only) |
| `paymentTerms` | string\[] | Standard payment terms (detail-page only) |
| `incoterms` | string\[] | Supported Incoterms (detail-page only) |

#### Meta

| Field | Type | Description |
|-------|------|-------------|
| `sourceUrl` | string | Search or detail URL that produced this row |
| `searchQuery` | string | Keyword used (when applicable) |
| `scrapedAt` | string | ISO timestamp of data extraction |

### Tips for Best Results

- **Use German keywords for precision** — WLW's AI text search bridges English and German, but German terms (`Verpackungsmaschinen`, `Zerspanungstechnik`, `Logistikdienstleister`) match more accurately than English equivalents.
- **Filter to manufacturers before you filter by size** — company type is applied by WLW itself, so it keeps the results deep, while the size bracket is applied to what comes back. Combining both is the fastest way to a clean list of small producers.
- **Use a keyword or a category, not both** — a keyword like `Aluminiumprofile` is the sharper tool and takes priority. Leave it empty when you want to sweep an entire industry category instead.
- **Hit "All DACH" once instead of three runs** — the actor fans out across Germany, Austria, and Switzerland in a single run and deduplicates by `wlwId`, so you never pay for the same supplier twice.
- **Turn on `includeDetails` for outreach lists** — listing-tier rows already include phone and website, but only the detail tier carries business email, fax, VAT ID, and named contact people with their personal email and phone.
- **Expect roughly 2,500 rows per keyword and country before filtering** — that's the full depth WLW.de publishes for a search. Keyword matching typically keeps a third to a half of that, because the rest of the list is companies serving your industry rather than supplying it. For bigger pulls, run several related keywords, or set the country to All DACH.
- **Reach for `Strict` when you are building an outreach list** — it requires a matching product in the company's own catalogue, which cuts the "we also do a bit of that" entries. Start on `Balanced`, and if the list still feels broad, switch to `Strict` and rerun. Set it to `Off` only when you want a full market map including adjacent suppliers.
- **Paste URLs you already filtered in the WLW UI** — the URL mode replays the exact filters, so refining a search in your browser and pasting the URL is faster than rebuilding it in the input form.
- **Set `maxResults` to 10–50 first** — sanity-check the data shape and field coverage on a small run before scaling up to thousands of rows.

### Pricing

**From $2.50 per 1,000 results** — pay only for the supplier rows you receive, with no compute charges. Bronze, Silver, and Gold subscribers pay progressively less. These discount-tier prices take effect on October 25, 2026; until then every plan pays the Gold rate of $2.50 per 1,000 results.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.30 | $0.28 | $0.27 | $0.25 |
| 1,000 | $3.00 | $2.80 | $2.65 | $2.50 |
| 10,000 | $30.00 | $28.00 | $26.50 | $25.00 |
| 100,000 | $300.00 | $280.00 | $265.00 | $250.00 |

A "result" is any supplier row pushed to the dataset. Platform fees (storage, data transfer) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate B2B research, procurement, market analysis, and lead generation. Users are responsible for complying with applicable laws (including GDPR and the German UWG), WLW.de's Terms of Service, and any cookie or data-protection notices on the source site. Do not use extracted contact data for spam, unsolicited marketing, harassment, or any unlawful purpose. Personal contact information must be processed under a lawful basis under GDPR Art. 6.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste one or more WLW.de search-result URLs (e.g. https://www.wlw.de/de/suche/cnc-fraesen). When provided, these override the guided search fields below.

## `searchQuery` (type: `string`):

Free-text product or service keyword to search (e.g. "CNC Fräsen", "Verpackungsmaschinen", "Logistikdienstleister"). Ignored when URLs are provided above.

## `category` (type: `string`):

Top-level WLW.de product category to browse. Use "All Categories" combined with a search keyword for keyword-driven search. Ignored when URLs are provided.

## `country` (type: `string`):

Country / regional WLW.de subdomain. Choose "All DACH" to run the query across Germany, Austria, and Switzerland and merge the results.

## `supplierTypes` (type: `array`):

Only return companies of these types. Leave empty for all types. Picking more than one runs the search once per type and merges the results, so each extra type adds to the run time.

## `excludeResellers` (type: `boolean`):

Companies on WLW.de list every role they play, so a shop that also assembles products shows up under "Manufacturer" alongside "Distributor" and "Wholesaler". Tick this to keep only companies that do not also sell on other people's goods. Useful when you are sourcing from actual producers.

## `employeeCounts` (type: `array`):

Only return companies in these employee brackets. Leave empty for any size. For example, pick "10-19" and "20-49" to get companies with 10 to 49 employees. A small number of companies do not publish their size and are left out when this filter is used.

## `relevance` (type: `string`):

WLW.de's own search casts a wide net: deep in a result list you get companies that merely serve your industry — packaging firms, label printers, software vendors — rather than supply what you searched for. "Balanced" keeps only companies whose own listing backs up your keyword. "Strict" goes further and requires a matching product in their catalogue, not just a mention in their company profile.

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

Visit each supplier's detail page to enrich the row with business email, fax, full description, certifications, full product taxonomy, named contacts, VAT ID, payment terms, and main business area. Best-effort: if a detail page fails on a given run, the actor still returns full listing-tier data (name, address, phone, website, geo, logo). Slower (one extra request per supplier).

## `maxResults` (type: `integer`):

Maximum number of suppliers to fetch across all sources. Default 200 — increase for bigger runs, or set to 0 for unlimited (capped at 50,000 per run as a safety limit). The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots. WLW.de's search API returns up to 3,000 results per filter combination — for larger result sets, narrow your filters (category, country, or keyword).

## Actor input object example

```json
{
  "searchUrls": [],
  "searchQuery": "CNC Fräsen",
  "category": "all",
  "country": "de",
  "supplierTypes": [],
  "excludeResellers": false,
  "employeeCounts": [],
  "relevance": "balanced",
  "includeDetails": false,
  "maxResults": 200
}
```

# Actor output Schema

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

Table of scraped suppliers with the most useful columns at a glance.

# 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 = {
    "searchUrls": [],
    "searchQuery": "CNC Fräsen",
    "category": "all",
    "country": "de",
    "supplierTypes": [],
    "excludeResellers": false,
    "employeeCounts": [],
    "relevance": "balanced",
    "includeDetails": false,
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/wlw-de-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 = {
    "searchUrls": [],
    "searchQuery": "CNC Fräsen",
    "category": "all",
    "country": "de",
    "supplierTypes": [],
    "excludeResellers": False,
    "employeeCounts": [],
    "relevance": "balanced",
    "includeDetails": False,
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/wlw-de-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 '{
  "searchUrls": [],
  "searchQuery": "CNC Fräsen",
  "category": "all",
  "country": "de",
  "supplierTypes": [],
  "excludeResellers": false,
  "employeeCounts": [],
  "relevance": "balanced",
  "includeDetails": false,
  "maxResults": 200
}' |
apify call solidcode/wlw-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/wlw-de-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/hnQ2uAiajLsWasLNu/builds/Nd9f9FiukAGvgo2Op/openapi.json
