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

Scrape German job postings from StepStone.de - titles, employers, locations, salary bands, work mode. No applicant or recruiter data, ever.

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

## Pricing

from $1.85 / 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?

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 Jobs Scraper — German job postings as clean JSON

Extract job postings from StepStone.de — titles, employers, locations, posting dates, salary bands when published, work mode and skills — as flat JSON rows for recruiting pipelines, market research and job boards. Search any role in any German city; turn on details for the full description.

**Live health record:** [lowlanddata.com/status/stepstone-scraper](https://lowlanddata.com/status/stepstone-scraper/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/stepstone-scraper/).

**No personal data, ever.** Employers appear as what they are — companies, with their public company page and logo. Recruiter contact persons, hiring-manager names and applicant anything are never extracted: there is no field for them and there never will be. The output passes a compliance review as-is.

### Quick start (30 seconds)

1. Type a role into **what** (`data engineer`, `pflegekraft`, `vertrieb`) and optionally a **city**.
2. Click **Start**.
3. Open the dataset's **Overview** tab, or **Export** as CSV/Excel/JSON.

Optional: a search **radius**, **posted-since** date, and **scrapeDetails** for full descriptions, employment type, industry and expiry. Everything works on a daily Schedule.

### What you can build with it

- **A recruiting radar.** Schedule daily with `dateFrom` set to yesterday — every new posting for your role and city lands each morning. Who's hiring, before everyone knows.
- **Competitor hiring watch.** Filter rows by `companyName` — a competitor posting five data roles is telling you their roadmap.
- **Salary research.** `salaryMin`/`salaryMax` where employers publish bands; with details, employment types and industries for slicing.
- **Job boards and newsletters.** Clean rows with employer, location, work mode and links — ready to republish as your niche board.

### What you get

One JSON object per posting:

```json
{
  "jobId": "11713465",
  "title": "Data Engineer* / Machine Learning Engineer*",
  "url": "https://www.stepstone.de/stellenangebote--Data-Engineer-Machine-Learning-Engineer--11713465-inline.html",
  "companyName": "inovex GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/de/inovex-gmbh-24494/jobs",
  "datePosted": "2026-08-25T04:03:49+02:00",
  "location": "Karlsruhe, Köln, München, Hamburg, Stuttgart, Berlin, Erlangen",
  "workMode": "hybrid",
  "isSponsored": false,
  "isTopJob": false,
  "skills": [],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null
}
```

With `scrapeDetails: true`, rows additionally carry the full `description` (markup stripped), `employmentType`, `industry` and `validThrough`.

### How much does it cost?

Pay per job row plus a small start fee — no subscription. A daily 100-job radar costs cents per day. Free-plan users can try it capped at 25 jobs. Platform usage (a few cents per run) is billed by Apify.

### Not technical? Let your AI assistant set it up

```
I want to use the StepStone Jobs Scraper (lowlanddata/stepstone-scraper) on Apify.

What I want: [E.G. "all new nursing jobs in Hamburg since yesterday"]

Guide me to:
1. Propose input values: what (German terms match best), city, radiusKm,
   dateFrom (YYYY-MM-DD), scrapeDetails true if I need full descriptions,
   and maxItems.
2. Explain how to run it in the Apify Console and export CSV.
3. Suggest a daily Schedule setup for a morning job radar.
```

### Input reference

| Field                | Type    | Default             | Notes                                                             |
| -------------------- | ------- | ------------------- | ----------------------------------------------------------------- |
| `what`               | string  | `software engineer` | Role or keyword; German terms match best.                         |
| `city`               | string  | —                   | German city; empty = all of Germany.                              |
| `radiusKm`           | integer | —                   | Radius around the city (1-100).                                   |
| `dateFrom`           | string  | —                   | Keep jobs posted on or after this date (YYYY-MM-DD).              |
| `scrapeDetails`      | boolean | `false`             | Full description + employment facts; one extra request per job.   |
| `maxItems`           | integer | `500`               | Stop after this many jobs.                                        |
| `proxyConfiguration` | object  | residential         | Job boards reject datacenter IPs — keep the residential group on. |

### Scheduling and API use

```bash
curl -X POST "https://api.apify.com/v2/acts/lowlanddata~stepstone-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"what": "data engineer", "city": "Berlin", "dateFrom": "2026-09-07", "maxItems": 100}'
```

### Use it with AI agents (MCP)

Run it directly from Claude, Cursor and other MCP clients: [apify.com/lowlanddata/stepstone-scraper/api/mcp](https://apify.com/lowlanddata/stepstone-scraper/api/mcp).

### Is it legal to scrape job postings?

Job postings are published to be found — employers pay the board to distribute them. This actor reads only public listing pages, takes no applicant or recruiter personal data, and identifies employers only by their public business identity. Factual posting data (role, employer, location, dates, salary bands) is exactly what the postings exist to communicate. How you use it downstream is yours to assess.

### FAQ

**Why German terms?** StepStone.de is the German market; `pflegekraft` finds what `nurse` won't. English tech titles work fine.

**Where are the salaries?** `salaryMin`/`salaryMax` appear when the employer publishes a band. Many don't — that's the market, not a bug.

**Only Germany?** v1 covers stepstone.de. The .at/.be/.nl siblings are on the roadmap.

**Sponsored rows?** `isSponsored`/`isTopJob` flag paid placements so you can filter them.

### Troubleshooting

- **"challenge or interstitial page"** — temporary edge protection; the actor retries with fresh routes. Re-run in a few minutes if a whole run fails.
- **"page without its result-list state"** — StepStone changed markup. Report it on the **Issues tab**; breaks get fixed and regression-tested.

If this saves you an afternoon, a **rating on this page** takes ten seconds and helps other buyers find the compliance-clean option.

# Actor input Schema

## `what` (type: `string`):

Job title or keyword, like the StepStone search box. German terms match best.

## `city` (type: `string`):

City, e.g. <code>Berlin</code>, <code>München</code>, <code>Köln</code>. Leave empty for all of Germany.

## `radiusKm` (type: `integer`):

Search radius around the city.

## `dateFrom` (type: `string`):

Keep jobs posted on or after this date (YYYY-MM-DD).

## `scrapeDetails` (type: `boolean`):

Fetch each job page for the full description, employment type, industry and expiry. One extra request per job.

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

Stop after this many jobs.

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

Keep the residential group on - job boards often reject datacenter IPs.

## Actor input object example

```json
{
  "what": "software engineer",
  "scrapeDetails": false,
  "maxItems": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `jobs` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/stepstone-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 = {}

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

```

## MCP server setup

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