# Stellenanzeigen Jobs Search Scraper (`alexist/stellenanzeigen-jobs-search-scraper`) Actor

Scrape comprehensive job data from Stellenanzeigen.de with advanced search filters. Collect 30+ fields including positions, salaries, company details, locations, and application info — perfect for recruitment analytics and job market research.

- **URL**: https://apify.com/alexist/stellenanzeigen-jobs-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## Stellenanzeigen.de Job Search Scraper: Extract German Job Listings at Scale

***

### What Is Stellenanzeigen.de?

Stellenanzeigen.de is Germany's leading job search platform, hosting hundreds of thousands of active job postings across industries and regions. It serves as a primary recruitment channel for both employers and job seekers in the German-speaking market. Collecting and analyzing this data manually is impractical — the **Stellenanzeigen.de Job Search Scraper** automates the extraction of search results, delivering structured datasets that power market intelligence and hiring strategies.

***

### Overview

The **Stellenanzeigen Job Search Scraper** extracts job search results from Stellenanzeigen.de, converting keyword and filter-based searches into clean, structured records. It is purpose-built for:

- **HR professionals** tracking salary trends and talent availability in Germany
- **Recruitment agencies** monitoring competitor listings and market dynamics
- **Data analysts** building job market datasets for economic research
- **Job aggregator platforms** feeding content into multi-source job boards
- **Career counselors** analyzing skills demand by region and industry

The scraper handles multiple search URLs simultaneously, supports error recovery, and delivers comprehensive job details across 30+ dimensions.

***

### Input Format

The scraper accepts a JSON configuration object:

```json
{
  "urls": [
    "https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

| Field | Type | Description |
|---|---|---|
| `urls` | Array | Stellenanzeigen.de search result URLs with filters. Supports keyword searches, location filters, and category refinements. Example: `?fulltext=design` or `?location=Berlin` |
| `ignore_url_failures` | Boolean | If `true`, the scraper skips failed URLs and continues with others. Useful for large-scale runs. Default: `true` |
| `max_items_per_url` | Integer | Maximum job records extracted per URL (e.g., `20`, `50`, `100`). Controls data volume and run duration. Default: `20` |

> **Tip:** Use specific search URLs from Stellenanzeigen.de's filters (keyword, location, contract type) to target relevant job listings and reduce noise.

***

### Output Format

**Sample output**

```json
{
  "application_types": [
    {
      "application_target": "https://career.bego.com/o/zahntechniker-mwd-design-service-4",
      "application_type": "AMS",
      "prio": 1
    }
  ],
  "company_name": "BEGO Medical GmbH",
  "company_name_url_format": "bego-medical-gmbh",
  "departments": [
    {
      "department_id": 41,
      "prio": false
    },
    {
      "department_id": 23,
      "prio": true
    }
  ],
  "email": "https://career.bego.com/o/zahntechniker-mwd-design-service-4",
  "expiration_date": "2026-09-12T21:59:00+00:00",
  "from_portal": true,
  "geo": [
    {
      "lat": 53.10116,
      "lng": 8.88248
    }
  ],
  "id": "SDE-109169",
  "link": "https://www.stellenanzeigen.de/job/zahntechniker-m-w-d-design-service-bremen-sde-109169/",
  "link_internal": "https://dxl6houvklhzf.cloudfront.net/public/jobs/SDE-109169/index.html?ts=1784036739",
  "location_ids": [
    "P-DE-DE-6852"
  ],
  "logo_url": "https://dxl6houvklhzf.cloudfront.net/public/jobs/SDE-109169/company_logo/22951-160x80.gif",
  "mobile_version": "Standard",
  "original_start_date": "2026-07-13T00:00:01+00:00",
  "portal": "stanz",
  "portal_link": "https://www.stellenanzeigen.de/job/zahntechniker-m-w-d-design-service-bremen-sde-109169/",
  "position_title": "Zahntechniker (m/w/d) Design Service",
  "position_addition": "Werde Teil von BEGO als Zahntechniker (m/w/d) Design Service in Bremen! Gestalte innovative Lösungen in der Dentaltechnik und profitiere von flexiblen Arbeitszeiten und einer wertschätzenden Unternehmenskultur.",
  "product_type": "Paid",
  "region": "Bremen",
  "region_alternative": "Bremen",
  "regions": [
    {
      "id_location": "P-DE-DE-6852",
      "latitude": 53.10116,
      "longitude": 8.88248,
      "region": "Bremen",
      "state": "Bundesland Bremen",
      "country": "Deutschland",
      "zip": "28359",
      "municipal_district": "Horn"
    }
  ],
  "start_date": "2026-07-11T00:00:00+00:00",
  "subdepartments": [
    {
      "subdepartment_id": 46,
      "prio": true
    }
  ],
  "salary_currency": "",
  "salary_max": 0,
  "salary_min": 0,
  "salary_unit": "",
  "from_url": "https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"
}
```

Each scraped job returns a detailed record with 30+ fields covering identification, company info, position details, salary data, and application methods.

#### Job Identification & Links

| Field | Meaning |
|---|---|
| `ID` | Unique Stellenanzeigen.de job identifier |
| `Link` | Direct URL to the job posting |
| `Link Internal` | Internal reference link for tracking |
| `Portal` | Source portal name (e.g., "Stellenanzeigen.de") |
| `Portal Link` | Link to the job listing on the original portal |
| `From Portal` | Indicator of where the job originated |

#### Company Information

| Field | Meaning |
|---|---|
| `Company Name` | Official name of the hiring organization |
| `Company Name URL Format` | Company name formatted for URL/web use |
| `Logo URL` | Link to the company logo image |
| `Email` | Contact email address for applications or inquiries |

#### Position Details

| Field | Meaning |
|---|---|
| `Position Title` | Job title as advertised on the platform |
| `Position Addition` | Additional role descriptors or specializations (e.g., "Senior", "Remote") |
| `Departments` | Primary department categories (e.g., "Sales", "Engineering", "HR") |
| `Subdepartments` | Specialized sub-categories within departments |
| `Application Types` | How candidates apply (e.g., direct application, email, external link) |
| `Product Type` | Type of listing (e.g., job, apprenticeship, contract work) |

#### Geographic & Regional Data

| Field | Meaning |
|---|---|
| `Geo` | Geographic location data for the position |
| `Region` | Primary work region in Germany (e.g., "North Rhine-Westphalia") |
| `Region Alternative` | Alternative or secondary region if applicable |
| `Regions` | Array of all regions associated with the role |
| `Location IDs` | Internal location identifiers for the position |

#### Dates & Timing

| Field | Meaning |
|---|---|
| `Start Date` | Proposed job start date (often flexible or immediate) |
| `Original Start Date` | Initial start date as posted (useful for tracking changes) |
| `Expiration Date` | Date when the job listing expires or closes |

#### Salary Information

| Field | Meaning |
|---|---|
| `Salary Min` | Minimum annual or monthly salary (numeric value) |
| `Salary Max` | Maximum annual or monthly salary (numeric value) |
| `Salary Currency` | Currency code (e.g., EUR) |
| `Salary Unit` | Time period (e.g., per month, per year, per hour) |

> **Note:** Not all listings include salary data; fields may be null if not provided by the employer.

#### Technical & Platform Flags

| Field | Meaning |
|---|---|
| `Mobile Version` | Whether the job has a mobile-optimized version |

***

### How to Use

1. **Build search URLs** — Visit Stellenanzeigen.de and apply filters (keyword, location, salary range, contract type). Copy the resulting search URL.
   - Example: `https://www.stellenanzeigen.de/suche/?fulltext=java&location=Munich`

2. **Configure input** — Paste one or more search URLs into the `urls` array. Set `max_items_per_url` based on your data needs.

3. **Set error handling** — Keep `ignore_url_failures: true` for production runs to prevent interruptions from temporary outages.

4. **Run the scraper** — Start the actor. Monitor the run log for progress and data quality.

5. **Export results** — Download output as JSON, CSV, or Excel for analysis, database import, or integration into BI tools.

**Best practices:**

- Use narrow, focused search URLs to improve result relevance
- Increase `max_items_per_url` incrementally (start with 20, scale to 50-100)
- Run at off-peak hours to minimize server load and rate-limiting risks
- Validate salary data — some listings omit or misformat salary ranges

***

### Use Cases & Business Value

- **Talent market analysis:** Track salary levels, skill demand, and hiring volume across German regions
- **Competitive intelligence:** Monitor competitor job postings, benefits, and hiring pace
- **Salary benchmarking:** Build compensation datasets by role, region, and industry
- **Job board aggregation:** Feed search results into multi-source job aggregators
- **Skills gap research:** Identify in-demand technical and soft skills across the German job market
- **Migration trend tracking:** Analyze geographic distribution of opportunities for relocation planning

The scraper delivers analysis-ready data, eliminating manual copy-paste work and enabling large-scale workforce insights.

***

### Conclusion

The **Stellenanzeigen.de Job Search Scraper** provides reliable, large-scale access to Germany's most comprehensive job database. With 30+ data fields spanning company details, positions, salaries, and locations, it transforms recruitment research and market intelligence workflows. Whether benchmarking salaries, tracking talent trends, or building data products, this scraper accelerates decision-making and strategic planning.
\\

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/stellenanzeigen-jobs-search-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 = {
    "urls": ["https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/stellenanzeigen-jobs-search-scraper").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 '{
  "urls": [
    "https://www.stellenanzeigen.de/suche/?fulltext=design&jobId=SDE-103367"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call alexist/stellenanzeigen-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alexist/stellenanzeigen-jobs-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/5LAWAxrMej4lA9Y9z/builds/Auyjw1X8jz10zV7gS/openapi.json
