# Stellenanzeigen.de Scraper — German Job Listings (`studio-amba/stellenanzeigen-de-scraper`) Actor

Scrape job listings from Stellenanzeigen.de, a major German job board. Get titles, companies, locations, posting dates, and optional full descriptions with employment type and validity via JSON-LD. Fast, no login.

- **URL**: https://apify.com/studio-amba/stellenanzeigen-de-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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/platform/actors/running/actors-in-store#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

## Stellenanzeigen.de Scraper

Extract **job listings from [Stellenanzeigen.de](https://www.stellenanzeigen.de/)**, one of Germany's major second-tier job boards. It carries a broad mix of engineering, IT, skilled-trade, and administrative roles from direct employers across the country.

This Actor pulls **job titles, companies, locations, posting dates, and short teaser text** straight from the search results, and can optionally visit each job's detail page to add the **full job description, employment type, and posting validity** — all parsed from the page's structured `JobPosting` (schema.org) data, not scraped from raw HTML.

### What does Stellenanzeigen.de Scraper do?

Give it a German keyword (for example `Ingenieur`, `Softwareentwickler`, or `Pflegekraft`) and, optionally, a city or postal code. The Actor requests Stellenanzeigen.de's search pages, paginates through the results, and returns clean, structured records you can download as JSON, CSV, Excel, or HTML — or pull through the Apify API into your own systems.

By default it stays at the search-page level: one request per 25 jobs, fast and cheap. Turn on **Fetch Full Details** and it visits every job's detail page too, adding the full description text, employment type, and the date the posting expires.

Because it runs on the Apify platform, you also get scheduling, monitoring, proxy rotation, and integrations (webhooks, Make, Zapier, Google Sheets) out of the box.

### Why use Stellenanzeigen.de Scraper?

- **Cheap by default.** Without Fetch Full Details, the Actor makes one request per page of 25 jobs — no multiplier, no waiting.
- **Structured detail data.** Full descriptions come from the page's own JSON-LD `JobPosting` block, the same structured data Google for Jobs reads, so extraction is stable and clean.
- **Real teaser copy.** Each job includes the marketing blurb the site itself writes for the role, not just a truncated title.
- **Labour-market research.** Track hiring demand by role, region, or employer over time.
- **Recruitment and sourcing.** Build lead lists of companies actively hiring for a role.
- **Job aggregators.** Feed a niche job site or newsletter with fresh, structured listings.

### How to scrape Stellenanzeigen.de data

1. Open the Actor and go to the **Input** tab.
2. Enter a **Search Query** in German (e.g., `Ingenieur`, `Softwareentwickler`, `Pflegekraft`).
3. Optionally set a **Location** — a city name or German postal code (e.g., `Berlin`, `10115`) — to narrow the search to a roughly 30 km radius.
4. Optionally enable **Fetch Full Details** to get the full job description, employment type, and validity date for every listing.
5. Set **Max Results** to control how many listings you want.
6. Click **Start**. When the run finishes, open the **Output** tab and download your data as JSON, CSV, Excel, or HTML.

That's it. You can also schedule the Actor to run daily and feed new listings into your own pipeline.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `searchQuery` | string | German keyword to search for. Defaults to `Ingenieur`. |
| `location` | string | City name or German postal code (e.g., `Berlin`, `10115`). Leave empty to search all of Germany. |
| `fetchDetails` | boolean | Fetch each job's detail page for the full description, employment type, and expiry date. Default `false`. |
| `maxResults` | integer | Maximum number of listings to return (default 100). |
| `proxyConfiguration` | object | Proxy settings. Apify auto/datacenter proxies work well. |

#### Example input

```json
{
  "searchQuery": "Softwareentwickler",
  "location": "Berlin",
  "fetchDetails": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Output

Each job is returned as one dataset record. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output item

```json
{
  "jobId": "SDE-98590",
  "jobTitle": "Microsystem Engineer (w/m/d)",
  "company": "HOERBIGER Flow Control GmbH",
  "location": "Stuttgart, Altenstadt, Redwitz an der Rodach",
  "url": "https://www.stellenanzeigen.de/job/microsystem-engineer-w-m-d-stuttgart-altenstadt-redwitz-an-der-rodach-sde-98590/",
  "postedDate": "2026-07-12T00:00:00.000Z",
  "teaser": "Als Microsystem Engineer (w/m/d) gestaltest du innovative mikromechanische Produkte und Fertigungslösungen. Setze technologische Ideen in Serienprodukte um und trage aktiv zur Transformation in der Industrie bei.",
  "jobDescription": "Land: Deutschland\nEinsatzort: Altenstadt, Redwitz, Stuttgart\n...(full plain-text ad, only with Fetch Full Details)",
  "employmentType": "FULL_TIME",
  "validThrough": "2026-07-13T21:59:00.000Z",
  "scrapedAt": "2026-07-13T09:00:00.000Z"
}
```

#### Data fields

| Field | Description |
| --- | --- |
| `jobId` | Stellenanzeigen.de internal job reference number |
| `jobTitle` | Job posting title |
| `company` | Hiring company or organisation |
| `location` | City, region, or list of workplace locations as shown on the search page |
| `url` | Canonical Stellenanzeigen.de job detail page URL |
| `postedDate` | ISO 8601 date the posting was shown as live/refreshed on the search page |
| `teaser` | Short marketing blurb for the role, taken from the search page |
| `jobDescription` | Full plain-text job description (with Fetch Full Details, capped at 5,000 characters) |
| `employmentType` | Schema.org employment type, e.g. `FULL_TIME`, `PART_TIME` (with Fetch Full Details) |
| `validThrough` | ISO 8601 date the posting expires (with Fetch Full Details) |
| `scrapedAt` | ISO 8601 collection timestamp |

### How much does it cost to scrape Stellenanzeigen.de?

Without **Fetch Full Details**, the Actor makes one HTTP request per 25 jobs, so runs of a few hundred listings finish in well under a minute. With **Fetch Full Details** on, expect one extra request per job — for a few hundred jobs that's still quick; for thousands, budget more time. The Actor saves its progress as it goes, so a long run survives platform restarts without duplicating rows. Pricing follows this Actor's pay-per-result configuration on the Apify Store — check the pricing box on the Actor page for the current rate.

### Tips and advanced options

- **German keywords.** The board is German. Use German job titles (`Ingenieur`, not `engineer`) for the best coverage.
- **Location filtering.** Both city names and postal codes work (`Berlin` or `10115`); the site applies a roughly 30 km radius around the resolved location.
- **Details cost time.** `fetchDetails` adds one request per job. For a few hundred jobs that's fine; for thousands, expect a longer run — the Actor's progress is saved, so long runs survive platform migrations without re-scraping or duplicating rows.
- **Deduplication.** Results are de-duplicated by job ID within a run.
- **Teaser quality.** The `teaser` field pulls the site's own marketing blurb for the role when available, falling back to the job's badge tags (e.g. "Vollzeit, Homeoffice") if that text isn't present for a given listing.

### FAQ, disclaimers, and support

**Is scraping Stellenanzeigen.de legal?** This Actor reads the same publicly served search and job pages as any visitor's browser, including the structured `JobPosting` data the site itself publishes for search engines. Use the data responsibly and in line with applicable terms and data-protection law. You are responsible for how you use the extracted data.

**Do I need an account or API key?** No. No login or cookies are required.

**Why is a field missing on some jobs?** A small share of listings may not carry every field (for example, some cards don't have a marketing teaser, only badge tags). The Actor fills what's available and never blocks a run over a missing optional field.

**Something's not working.** Open an issue on the Actor's **Issues** tab with your input and the run link. Custom fields or a tailored version can also be arranged.

### Related scrapers

- [Jobware Scraper](https://apify.com/studio-amba/jobware-scraper) — German professional job board with salary data
- [Arbeitsagentur Scraper](https://apify.com/studio-amba/arbeitsagentur-scraper) — Germany's Federal Employment Agency job board
- [StepStone Scraper](https://apify.com/studio-amba/stepstone-scraper) — Germany's leading commercial job board
- [Meinestadt Scraper](https://apify.com/studio-amba/meinestadt-scraper) — German local classifieds and job listings

# Actor input Schema

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

Keyword to search for (German). Examples: 'Ingenieur' (engineer), 'Softwareentwickler' (software developer), 'Krankenpfleger' (nurse), 'Vertrieb' (sales).

## `location` (type: `string`):

Filter by city or German postal code (e.g., 'Berlin', 'München', '10115'). Leave empty to search all of Germany (default search radius is 30 km around the location).

## `fetchDetails` (type: `boolean`):

Visit every job's detail page to add the full job description, employment type, and posting validity from its JSON-LD data. Adds one extra request per job, so runs take longer.

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

Maximum number of job listings to return.

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

Proxy settings. Stellenanzeigen.de runs Cloudflare passively (no active challenge), so Apify datacenter/auto proxy works well.

## Actor input object example

```json
{
  "searchQuery": "Ingenieur",
  "fetchDetails": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "Ingenieur",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/stellenanzeigen-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 = {
    "searchQuery": "Ingenieur",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/stellenanzeigen-de-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 '{
  "searchQuery": "Ingenieur",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/stellenanzeigen-de-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7OfB40nuYrI4W4d8X/builds/WZIGUVStMkMRszZnu/openapi.json
