# StepStone Jobs Scraper (`khadinakbar/stepstone-jobs-scraper`) Actor

Scrape StepStone.de job postings by keyword and German city or region, with title, company, location, remote option, employment type, posting date, full description and apply link. Works with Apify MCP and the API.

- **URL**: https://apify.com/khadinakbar/stepstone-jobs-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Features:** Limited permissions
- **Stats:** 11 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job 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/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

### What is StepStone Jobs Scraper?

StepStone Jobs Scraper turns a keyword and a German city or region into one row per job from StepStone.de, Germany's large job board: title, company, location with coordinates, remote option, employment type, category, posting date, job link and apply link, plus the full job description when details are on. Recruiters, HR analysts, job seekers, labour market researchers and AI agents use it to track German job openings by role and region, with no StepStone account.

### Why recruiters use it

- **German jobs by role and place.** Search in German or English, such as `pflegefachkraft` or `data engineer`, in `Berlin` or `Bayern`.
- **Fresh postings only.** `postedWithin` keeps jobs from the last 1, 3, 7, 14 or 30 days.
- **Remote filter.** `workFromHomeOnly` returns home-office jobs.
- **Full descriptions.** `enrichDetails` adds the complete job text from each posting.
- **Pay per job.** One charge per job returned.

### How to use it

**Data engineer jobs in Germany from the last week:**

```json
{
  "keyword": "data engineer",
  "postedWithin": "7",
  "maxItems": 50
}
```

**Nursing jobs in Berlin with full descriptions:**

```json
{
  "keyword": "pflegefachkraft",
  "location": "Berlin",
  "enrichDetails": true,
  "maxItems": 25
}
```

| Input | What it controls |
|---|---|
| `keyword` | Job title or skill, in German or English |
| `location` | City or region in German spelling, such as `München` or `Nordrhein-Westfalen` |
| `startUrls` | StepStone search or job links to use as they are |
| `postedWithin` | `any`, `1`, `3`, `7`, `14` or `30` days |
| `workFromHomeOnly` | Only remote or home-office jobs (default off) |
| `maxItems` | Jobs to return (default 100) |
| `enrichDetails` | Add full description and details from each job page (default on) |
| `maxConcurrency`, `proxyConfiguration` | Speed and proxy settings |

Hiring across more countries too? Continue with **Jobs Scraper** linked below.

### Output: German job data you receive

A real nursing job in Berlin (description and links shortened):

```json
{
  "jobId": "10967426",
  "title": "Pflegefachkraft (w/m/d)",
  "company": "Korian Deutschland GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/en/korian-deutschland-gmbh-168064/work",
  "location": "Berlin",
  "latitude": 52.40416,
  "longitude": 13.51012,
  "workFromHome": false,
  "employmentType": "FULL_TIME",
  "category": "Gesundheit, Gesundheit-Pflegepersonal",
  "postedAt": "2026-10-01T22:52:15.000Z",
  "jobUrl": "https://www.stepstone.de/jobs--Pflegefachkraft-w-m-d-Berlin-Korian-Deutschland-GmbH--10967426-inline...",
  "description": "Einleitung Dein neuer Job, der Sinn stiftet. Hast Du Lust auf einen Job, der anders ist?...",
  "sponsored": false,
  "source": "stepstone.de"
}
```

| Field | What it contains |
|---|---|
| `jobId`, `title`, `jobUrl`, `applyUrl` | The job and how to apply |
| `company`, `companyUrl`, `companyLogo` | The employer |
| `location`, `latitude`, `longitude`, `workFromHome` | Where the job is |
| `employmentType`, `category` | Contract type and job category |
| `postedAt`, `sponsored` | When it was posted and whether it is promoted |
| `description` | Full job text, with `enrichDetails` |
| `searchUrl`, `scrapedAt` | The search that found it and collection time |

### Example workflow: weekly hiring signals for a staffing agency

A staffing agency in Munich tracks demand for electricians and mechatronics technicians. A weekly task runs both keywords for `München` with `postedWithin` set to `7`. They count postings by `company` to find employers hiring several people, and call those companies first. Then they check the same roles on the federal job board with [Bundesagentur Job Scraper](https://apify.com/khadinakbar/bundesagentur-job-scraper).

### Pricing

This Actor uses **Pay per event**. Apify platform usage is included in the event price. You pay one event per job returned, plus a start event per run. The live Pricing tab on this page shows the current price.

- 2 keywords × 50 jobs = 100 job events.
- Full descriptions come at no extra event charge.
- `maxItems` caps each run, so it doubles as a cost ceiling.

### Job research with AI agents (MCP)

Connect this Actor to an AI agent through [Apify MCP](https://mcp.apify.com) and ask in plain language:

> Find remote Python developer jobs in Germany posted in the last three days and list the companies.

Agent checklist:

1. Put the role in `keyword` and the place in `location` (German spelling).
2. Use `postedWithin` and `workFromHomeOnly` from the request.
3. Read rows with `get-dataset-items`; share `jobUrl` for each job.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~stepstone-jobs-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keyword": "python developer", "workFromHomeOnly": true, "postedWithin": "3", "maxItems": 20}'
```

### Related job tools from the same developer

| Your next step | Use | Why |
|---|---|---|
| When you then check Germany's federal job board | [Bundesagentur Job Scraper](https://apify.com/khadinakbar/bundesagentur-job-scraper) | Jobs from the Bundesagentur für Arbeit |
| When you look at XING | [XING Jobs Scraper](https://apify.com/khadinakbar/xing-jobs-scraper) | Jobs from XING |
| When you hire across countries | [Jobs Scraper](https://apify.com/khadinakbar/jobs-scraper) | Indeed, LinkedIn and Glassdoor jobs |
| When you focus on LinkedIn | [LinkedIn Jobs Scraper](https://apify.com/khadinakbar/linkedin-jobs-scraper) | LinkedIn jobs with salary and skills |

### Best results

| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| Tracking new demand | Schedule with `postedWithin: "7"` | Only last week's postings each run |
| Remote roles | Turn on `workFromHomeOnly` | Home-office jobs |
| Faster runs | Turn off `enrichDetails` | List data without full descriptions |
| A complex StepStone filter | Paste the search link into `startUrls` | The same results you see on StepStone |

### Builder's note

I found that recruiters mostly need to know who is hiring now, so each row keeps the posting date and company with a direct apply link. I learned that German job titles carry the details, such as "(m/w/d)" and seniority, so titles are kept exactly as posted.

### FAQ

#### Do I need a StepStone account?

No. The Actor reads public job listings.

#### Can I search in English?

Yes. StepStone matches English and German keywords; locations work best in German spelling.

#### Does it cover all of Germany?

Yes. Leave `location` empty for all of Germany, or set a city or state.

#### Is the full job description included?

Yes, with `enrichDetails` on, which is the default.

### Responsible use

This Actor collects public job listings from StepStone.de. Use them for recruiting and labour market research, and follow StepStone's terms. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) for more context. StepStone is a trademark of StepStone GmbH. This independent Actor is not affiliated with, associated with, or endorsed by StepStone. For questions or bugs, open a ticket in the Issues tab.

# Actor input Schema

## `keyword` (type: `string`):

Free-text job search run on StepStone.de (e.g. 'data engineer' or 'pflegefachkraft'). Builds the search URL /work/{keyword}/in-{location}. Defaults to 'data engineer' when empty and no Start URLs are given. This is NOT a StepStone job-detail URL — paste those into Start URLs instead.

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

City or region in German spelling (e.g. 'Berlin', 'München', 'Nordrhein-Westfalen'). Combined with Keyword to build /work/{keyword}/in-{location}. Defaults to all of Germany ('deutschland') when empty. Ignored when Start URLs is provided.

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

Optional list of StepStone.de search-result or job-detail URLs to scrape as-is. When set, Keyword, Location, and the filters below are ignored. Accepts /jobs/... and /work/... search pages and /stellenangebote--...-inline.html detail links. Example: https://www.stepstone.de/work/java/in-berlin.

## `postedWithin` (type: `string`):

Restrict results to jobs posted within the last N days, applied as StepStone's age facet. Allowed values: 'any', '1', '3', '7', '14', '30'. Defaults to 'any' (no date limit). Ignored when Start URLs is provided.

## `workFromHomeOnly` (type: `boolean`):

When enabled, returns only jobs that offer remote / work-from-home, using StepStone's wfh facet. Defaults to false (all jobs). Applies only to keyword/location searches, not to Start URLs.

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

Maximum number of job postings to return and bill for in this run (1 job = $0.003). Defaults to 100. The run stops once this many jobs are collected, even across multiple result pages. Increase for bulk exports.

## `enrichDetails` (type: `boolean`):

When enabled (default), each job's detail page is fetched to add the full description, employment type, and structured salary from StepStone's JobPosting data. Disable for a faster, leaner run returning only fields visible on the search page. Does not change the per-job price.

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

Proxy used to reach StepStone. Defaults to Apify Residential proxies in Germany, which are required — StepStone is protected by Akamai Bot Manager and blocks datacenter IPs. Leave as default unless you have a specific reason to change it.

## `maxConcurrency` (type: `integer`):

Maximum number of pages fetched in parallel. Defaults to 10. Lower it if you hit blocks; raise it for faster large runs on a healthy proxy pool. Most users should leave this at the default.

## `debugDumpHtml` (type: `boolean`):

Internal debugging flag. When enabled, raw HTML and parsed JSON candidates are saved to the key-value store for extraction troubleshooting. Leave off for normal runs.

## Actor input object example

```json
{
  "keyword": "java developer",
  "location": "Berlin",
  "postedWithin": "any",
  "workFromHomeOnly": false,
  "maxItems": 100,
  "enrichDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "maxConcurrency": 10,
  "debugDumpHtml": false
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped job postings as structured JSON records.

# 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 = {
    "keyword": "data engineer",
    "maxItems": 100,
    "enrichDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "keyword": "data engineer",
    "maxItems": 100,
    "enrichDetails": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/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 '{
  "keyword": "data engineer",
  "maxItems": 100,
  "enrichDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call khadinakbar/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

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