# StepStone Job Scraper (DE+AT) | Filters, Descriptions & Alerts (`corvuslab/stepstone-jobs-scraper`) Actor

Scrape StepStone jobs from Germany (stepstone.de) and Austria (stepstone.at): title, company, location, employment type, industry and full job descriptions (text, HTML, Markdown). Filter by contract type, hours, experience, industry or federal state. Tag jobs NEW/UPDATED/EXPIRED and send alerts.

- **URL**: https://apify.com/corvuslab/stepstone-jobs-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Lead generation, Automation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.

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

## StepStone Job Scraper (DE+AT) | Filters, Descriptions & Alerts

### What does the StepStone Job Scraper do?

> **Turn any StepStone search into clean, structured job data — and get pinged the moment a listing appears, changes, or disappears.**

Scrape job listings from **StepStone Germany (stepstone.de)** and **Austria (stepstone.at)** by keyword and location — narrowed by **contract type, working hours, experience, industry or federal state** — or paste ready-made search and job URLs. Every record comes back as clean, typed JSON — **title, company profile, geo-coordinates, employment type, industry, and the full job description in plain text, HTML and Markdown** — with no code required. The standout: turn on **incremental mode** and each run tags every job **NEW / UPDATED / UNCHANGED / EXPIRED** and pushes only what changed to **Telegram, Slack, Discord, WhatsApp or a webhook** — the cheap, reliable way to watch a saved search on a schedule. Export to JSON, CSV, Excel, or pull from the API.

**Why this scraper**

- ⚡ **Fast & low-cost** — a lightweight, highly optimized engine keeps even large runs quick and cheap.
- 🧾 **Rich, typed records** — 45+ structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord, WhatsApp or any webhook (n8n / Make / Zapier).
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### ✨ Key features

- 🔎 **Search or URL scraping** — run a keyword + location search, or paste StepStone search-result and job URLs (any filter you applied in your browser is respected).
- 🇩🇪🇦🇹 **Germany & Austria editions** — search `stepstone.de` or `stepstone.at` from a single dropdown.
- 🧾 **Structured records** — title, company (name, logo, profile URL), location with **latitude/longitude**, post code, employment type, industry and more.
- 🧠 **Full job descriptions** — every listing's complete description in **plain text, HTML and Markdown** — pick one format or get all three.
- 🎚️ **Rich filters** — contract type, working hours, experience level, industry, federal state (Bundesland), date posted, job language, home-office, quick-apply, search radius (km) and sort — all applied by StepStone itself.
- ♻️ **Incremental change tracking** — schedule it and each run tags every job **NEW / UPDATED / UNCHANGED / EXPIRED** (with repost detection you can suppress); unchanged jobs are skipped before their page is even fetched.
- 🔔 **Notifications** — push only the changed jobs to Telegram, Slack, Discord, WhatsApp or any webhook (n8n / Make / Zapier), with an option to alert only when something actually changed.
- 🤖 **AI-ready** — compact mode, drop-empty-fields and description-length truncation keep payloads small for LLMs and MCP clients.
- ⚡ **Fast & cheap** — engineered for speed and low cost, with sensible defaults that run out of the box.

***

### 📤 Example output

```json
{
  "id": "14289424",
  "title": "Software Engineer (Go) (m/w/d)",
  "url": "https://www.stepstone.de/stellenangebote--Software-Engineer-Go-m-w-d-Muenchen-Fonds-Finanz-Maklerservice-GmbH--14289424-inline.html",
  "companyId": "64019",
  "companyName": "Fonds Finanz Maklerservice GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/de/fonds-finanz-maklerservice-gmbh-64019/jobs",
  "companyLogoUrl": "https://www.stepstone.de/upload_DE/logo/4/logoFonds-Finanz-Maklerservice-GmbH-64019DE.gif",
  "location": "München",
  "postCode": "80992",
  "country": "DE",
  "streetAddress": "Riesstraße 25",
  "latitude": 48.18024,
  "longitude": 11.5353,
  "datePosted": "2026-07-31T14:01:06.89Z",
  "validThrough": "2026-08-15T13:23:05.63Z",
  "workFromHome": "2",
  "remoteType": "hybrid",
  "employmentType": "FULL_TIME",
  "industry": "IT, IT-Softwareentwicklung",
  "directApply": true,
  "textSnippet": "Komm zur Fonds Finanz, Deutschlands führendem Allfinanz-Maklerpool …",
  "skills": [],
  "labels": [{ "label": "Schnelle Bewerbung", "type": "QUICK_APPLY" }],
  "isAnonymous": false,
  "isHighlighted": false,
  "isSponsored": false,
  "isTopJob": false,
  "source": "stepstone",
  "searchKeyword": "software engineer",
  "scrapedAt": "2026-08-11T13:21:15.494767+00:00",
  "detailFetched": true,
  "description": "#### Software Engineer (Go) (m/w/d)\n\nKomm zur Fonds Finanz … #### Deine Aufgaben …",
  "descriptionHtml": "<h4>Software Engineer (Go) (m/w/d)</h4>\n<p>Komm zur Fonds Finanz …</p>",
  "descriptionMarkdown": "#### Software Engineer (Go) (m/w/d)\n\nKomm zur Fonds Finanz …"
}
```

The `description`, `descriptionHtml` and `descriptionMarkdown` fields hold the complete job posting — trimmed above for readability.

### 📥 Example input

A few ready-to-run configurations — set these in the visual editor or pass them as JSON via the API:

```json
{ "query": "data analyst", "location": "Berlin", "country": "de", "maxResults": 100 }
```

```json
{ "query": "software engineer", "location": "Berlin", "contractType": "permanent", "workType": "full_time", "datePosted": "7", "jobLanguage": "en" }
```

```json
{ "query": "product manager", "country": "at", "incrementalMode": true, "skipReposts": true, "notifyOnlyChanges": true, "telegramChatId": "@my_jobs_channel" }
```

***

### 📚 What data can you extract?

- **Core** — `id`, `title`, `url`, `companyName`, `companyId`, `companyLogoUrl`, `companyUrl`, `location`, `datePosted`, `textSnippet`, `source`, `searchKeyword`, `scrapedAt`, plus `salary` / `salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod` (populated on the minority of listings where StepStone publishes pay).
- **Location & geo** — `postCode`, `country`, `region`, `streetAddress`, `latitude`, `longitude`, `travelTime`.
- **Job details** (with **Fetch full details**) — `description`, `descriptionHtml`, `descriptionMarkdown`, `employmentType`, `industry`, `validThrough`, `workFromHome`, `remoteType`, `directApply`, `skills`, `labels`, `topLabels`, and flags (`isAnonymous`, `isHighlighted`, `isSponsored`, `isTopJob`).
- **Change tracking** (with **Incremental mode**) — `changeType` (NEW / UPDATED / UNCHANGED / EXPIRED), `isRepost`, `repostOfId`, `repostDetectedAt`, `contentHash`.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads.

***

### ⚙️ Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search — job title, skill or company (comma-separate for multiple searches). |
| `location` | City or region, e.g. `Berlin` or `München`. |
| `country` | StepStone edition: `de` (Germany) or `at` (Austria). |
| `startUrls` | Scrape specific StepStone search or job URLs (any browser-applied filter is kept). |
| `contractType` | Employment type: permanent, fixed-term, working-student, trainee, apprenticeship, internship, freelance, and more. |
| `workType` | Full-time or part-time. |
| `experience` | Experience level: none (entry-level), with experience, or management. |
| `datePosted` | Only jobs posted in the last 1 / 3 / 7 / 14 days. |
| `industry` | Industry sector (IT, construction, health, finance, and more). |
| `bundesland` | German federal state (Germany edition); overrides Location. |
| `jobLanguage` | Language the ad is written in (German or English). |
| `applicationMethod` | Quick apply (on StepStone) or external (company website). |
| `workFromHome` | Return only home-office / remote jobs. |
| `onlyQuickApply` | Shortcut for `applicationMethod` = quick apply. |
| `excludeSponsored` | Skip promoted / sponsored listings. |
| `radius` | Widen the search around the location, in km. |
| `sortBy` | `relevance` or `date` (newest first). |
| `includeDetails` | Fetch each job's page for the full description and detail fields. |
| `descriptionFormat` | `text`, `html`, `markdown` or all three. |
| `descriptionMaxLength` | Truncate each description to N characters — keeps AI-agent payloads small. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of records (0 = unlimited). |
| `maxPages` | Optional hard cap on result pages per search (25 jobs/page). |

…and **40+ inputs** in total — the table shows the essentials; the rest cover compact/drop-empty output modes, incremental state, unchanged/expired and repost-skipping toggles, notification channels (Telegram, Slack, Discord, WhatsApp, webhook) with a notify-only-on-changes switch, and advanced tuning, all in the visual editor.

***

### 💡 Use cases

- **Job-board monitoring** — schedule a saved search and get a live feed of only the new and changed vacancies, straight to your chat.
- **Recruitment & sourcing** — pull structured company, location and role data across Germany and Austria, filtered by contract type, experience or industry.
- **Market & hiring research** — aggregate employment types, industries, locations and posting volumes to benchmark demand for a role or region.
- **Aggregators & job boards** — feed clean, de-duplicated StepStone listings into your own site, app or warehouse.
- **Geo & mapping** — every job carries latitude/longitude, post code and street address for map views and radius analysis.
- **AI agents & pipelines** — compact output plugs straight into LLM/MCP workflows.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and tags every job **NEW / UPDATED / UNCHANGED / EXPIRED** — unchanged jobs are skipped *before* their detail page is fetched, so a daily watch costs a fraction of a full re-scrape. It even detects reposts of the same vacancy, which you can suppress with **skip reposts**. Pair it with a notification channel and **notify-only-on-changes**, and only the new and updated jobs land in your inbox.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta — a genuinely low-cost way to keep a saved search fresh on a schedule.

***

### 🚀 How to run it

1. Open the actor, enter a **search keyword** (e.g. `data analyst`) and a **location**, and pick the **country edition** — or paste a StepStone URL.
2. (Optional) Narrow with filters — **contract type**, **working hours**, **experience**, **industry**, **federal state**, **date posted**, **home-office**, **radius** or **sort** — then set **Max results** and whether to **fetch full details**.
3. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
4. Click **Start**.
5. Download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, sends alerts to **Telegram, Slack, Discord, WhatsApp** or any **webhook** (Make, Zapier, n8n), connects to **Google Sheets**, and works as an **MCP tool** for AI agents — compact mode and description truncation keep token usage small.

***

### ❓ FAQ

**Do I need a proxy or login?** No login and no setup — it runs out of the box with sensible defaults; you can adjust proxy settings under Advanced for very high-volume runs.

**Which countries are supported?** StepStone Germany (`stepstone.de`) and Austria (`stepstone.at`), chosen from a dropdown.

**Can I get only new items on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify Telegram, Slack, Discord, WhatsApp or a webhook, with a notify-only-on-changes option.

**Can I get the full job description?** Yes — enable **Fetch full details** to get the complete description in plain text, HTML and Markdown, plus employment type, industry, geo-coordinates and validity date. You can also truncate it to a set length for smaller payloads.

**Does it include salary?** The salary fields (`salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod`) are always in the schema and are filled whenever StepStone publishes pay — but most German and Austrian listings don't disclose it, so expect these to be empty on the majority of jobs. This actor reports only real, StepStone-provided figures; it does not invent salary estimates.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode and cap the description length; the output is MCP-friendly and small.

**How many records can I get?** As many as the search returns — set `maxResults` (0 = unlimited).

**Is scraping this legal?** The actor collects only **publicly available** data. You are responsible for how you use it, including any personal data and GDPR-style obligations.

***

### ⚖️ Disclaimer

This actor accesses only publicly available data on StepStone. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by StepStone.

***

**Keywords:** StepStone scraper · StepStone job scraper · stepstone.de scraper · stepstone.at scraper · StepStone API · Germany job scraper · Austria job scraper · DACH job market data · job listings scraper · jobs by contract type · job monitoring · job alerts · home office jobs · remote jobs scraper · recruitment data · job market research · export jobs to CSV Excel JSON · no-code job scraper · MCP tool for AI agents · schedule job scraping

# Actor input Schema

## `query` (type: `string`):

Job title, skill, or company to search for (e.g. "data analyst"). Separate multiple searches with commas — each runs on its own and results are merged and de-duplicated.

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

City or region to search in, e.g. "Berlin" or "München". Leave empty to search the whole country.

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

Which StepStone site to search.

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

Paste StepStone search-result URLs (with any filters already applied in your browser) or individual job URLs. Both are scraped directly.

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

Maximum number of records to return. Set 0 for unlimited (bounded by how many the search has).

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

Optional hard cap on how many result pages to fetch per search (25 jobs per page). Leave empty to page until Max results is reached.

## `ignoreUrlFailures` (type: `boolean`):

Skip URLs that cannot be interpreted instead of failing the whole run.

## `workFromHome` (type: `boolean`):

Return only jobs that offer remote / home-office work.

## `contractType` (type: `string`):

Filter by employment / contract type.

## `workType` (type: `string`):

Filter by full-time or part-time.

## `experience` (type: `string`):

Filter by required experience level.

## `datePosted` (type: `string`):

Only return jobs posted within this many days.

## `industry` (type: `string`):

Filter by industry sector.

## `bundesland` (type: `string`):

Filter by German federal state (Bundesland). Overrides Location. Germany edition only.

## `jobLanguage` (type: `string`):

Only return job ads written in this language.

## `applicationMethod` (type: `string`):

Filter by how you apply. Quick apply = apply directly on StepStone; external = apply on the company's own site.

## `onlyQuickApply` (type: `boolean`):

Shortcut for Application method = Quick apply. Return only jobs you can apply to directly on StepStone.

## `excludeSponsored` (type: `boolean`):

Skip promoted / sponsored jobs (where isSponsored is true).

## `radius` (type: `integer`):

Widen the search around the chosen location, in kilometres. Only applies when a location is set.

## `sortBy` (type: `string`):

Order of the results.

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

Fetch each item's detail page for the richer fields. Turn off for the fastest, cheapest runs.

## `descriptionFormat` (type: `string`):

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Truncate each description to at most this many characters. Leave empty (or 0) for the full text — handy for keeping AI-agent payloads small.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit records that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for jobs present last run but gone now.

## `skipReposts` (type: `boolean`):

In incremental mode, suppress jobs detected as reposts of a previously seen listing (same title + company reappearing under a new id).

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `whatsappPhoneNumberId` (type: `string`):

WhatsApp Cloud API phone-number ID (from Meta). Required with the access token and recipient below to send WhatsApp alerts.

## `whatsappAccessToken` (type: `string`):

WhatsApp Cloud API access token.

## `whatsappTo` (type: `string`):

Recipient phone number in international format, e.g. "491701234567".

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

## `notifyOnlyChanges` (type: `boolean`):

In incremental mode, only send notifications for NEW / UPDATED / REAPPEARED jobs (skip alerts when nothing relevant changed).

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

Residential proxies by default — required for full job descriptions and reliable access. Advanced users can switch groups, but residential is recommended for this site.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "query": "data analyst",
  "country": "de",
  "maxResults": 25,
  "ignoreUrlFailures": true,
  "workFromHome": false,
  "contractType": "",
  "workType": "",
  "experience": "",
  "datePosted": "",
  "industry": "",
  "bundesland": "",
  "jobLanguage": "",
  "applicationMethod": "",
  "onlyQuickApply": false,
  "excludeSponsored": false,
  "sortBy": "relevance",
  "includeDetails": true,
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": "data analyst",
    "location": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/stepstone-jobs-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 = {
    "query": "data analyst",
    "location": "",
}

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/stepstone-jobs-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 '{
  "query": "data analyst",
  "location": ""
}' |
apify call corvuslab/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/stepstone-jobs-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/Di9K9vR9epa6heMfq/builds/Kl5KiHj4J8P251J6f/openapi.json
