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

Collect StepStone job listings as structured data from search URLs or keyword and location queries. Extract title, company, location, salary range, posting date, and work-from-home status. Covers Germany, Austria, Belgium, and the Netherlands.

- **URL**: https://apify.com/scraptivo/stepstone-jobs-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:** Jobs, MCP servers, Integrations
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 jobs

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** collects job listings from StepStone across Germany, Austria, Belgium, and the Netherlands and turns them into structured data for recruitment, salary benchmarking, and job-market research. Provide a keyword and location — or paste a StepStone search URL — run the Actor, and export job title, company, location, salary range, remote-work label, and posting date to JSON, CSV, or Excel. Use it to build lead lists, monitor new vacancies, and track compensation trends. Pricing starts from **$0.001 per job listing**.

### What can you automate with StepStone Jobs Scraper?

- **Build targeted job lead lists** — Pull open roles by keyword, location, and radius across four StepStone markets into a single clean dataset.
- **Benchmark salaries** — Capture salary ranges and currency where employers publish them, and compare compensation by role and city.
- **Track remote-work trends** — Collect work-from-home labels and employment-type tags to measure how hybrid and remote hiring is shifting.
- **Monitor new vacancies** — Schedule recurring runs to detect fresh postings for specific titles, companies, or regions.
- **Feed an existing pipeline** — Deliver structured listings straight to a CRM, Google Sheets, or a database for analysis and outreach.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Recruitment and staffing agencies | Build candidate-facing lists of open roles and track hiring demand across DACH and Benelux markets. |
| Market and HR researchers | Measure salary ranges, job-title volume, and remote-work share by region over time. |
| Sales and lead-generation teams | Find companies actively hiring for skills that signal budget and need, then enrich accounts. |
| Data analysts | Export consistent JSON or CSV for trend analysis in Python, R, or a BI tool. |

### What data can you collect from StepStone?

| Data group | Example fields | How it helps |
|---|---|---|
| Job identity | `title`, `url`, `id`, `harmonisedId`, `datePosted`, `textSnippet` | Identify each listing, link back to the source, and deduplicate across runs. |
| Company and location | `companyName`, `companyUrl`, `companyLogoUrl`, `location` | Associate each role with an employer and geography. |
| Commercial signals | `salaryMin`, `salaryMax`, `salaryCurrency` | Benchmark compensation where the employer has published a range. |
| Search context | `workFromHomeLabel`, `labels`, `searchUrl`, `page` | Track remote-work status and remember which query and page produced the record. |

Salary and remote-work fields are only present when the employer publishes them, so some records will have empty values.

### How to use StepStone Jobs Scraper

1. Open the **StepStone Jobs Scraper** in Apify Console.
2. Enter a keyword and a location, or paste a StepStone search URL.
3. Set the maximum number of results and any optional filters such as radius and country.
4. Run the Actor and wait for the run to finish.
5. Export the dataset as JSON, CSV, Excel, or connect it to your integration.

```json
{
  "searchQueries": ["python"],
  "searchLocations": ["Berlin"],
  "maxItems": 25
}
```

### Example workflow

#### Build a weekly DACH salary benchmark

1. Every Monday, run one keyword and location search, for example "data engineer" in München with radius 30.
2. Export the results to Google Sheets or a CRM.
3. Keep only rows where `salaryMin` and `salaryMax` are populated to compare compensation across companies.
4. Deduplicate against previous weeks using the stable `harmonisedId`.

### Automate and integrate your results

Schedule the Actor to run daily, weekly, or monthly so you always have a fresh snapshot. After a successful run you can trigger a webhook, then push records to Google Sheets, Make, Zapier, Slack, a CRM, or cloud storage. For recurring pipelines, call the Actor through the Apify API and read the default dataset; use the `harmonisedId` field as your stable key for deduplication.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---:|---|---|---|
| `startUrls` | array | No | — | Direct StepStone job search URLs to collect. |
| `searchQueries` | array | No | — | Job keywords or titles, e.g. `python`, `data engineer`. |
| `searchLocations` | array | No | — | City or region names, e.g. `Berlin`, `München`. |
| `radius` | integer | No | 30 | Radius in km around each location (0–200). |
| `searchFilters` | object | No | `{}` | Extra query params such as `sort`, `employmentType`, `workFromHome`, `whatType`. |
| `baseUrl` | string | No | `https://www.stepstone.de` | StepStone site origin: `stepstone.de`, `.at`, `.be`, or `.nl`. |
| `maxItems` | integer | No | 0 (unlimited) | Maximum number of job records to collect. |
| `proxyConfiguration` | object | No | residential | Proxy settings; StepStone blocks datacenter IPs. |

Use `startUrls` **or** the `searchQueries` / `searchLocations` combination — you do not need both. `radius` and `searchFilters` only apply when building URLs from keywords.

### Output example

```json
{
  "title": "Senior Python Developer",
  "companyName": "Acme GmbH",
  "location": "Berlin",
  "datePosted": "2026-08-01",
  "salaryMin": "65000",
  "salaryMax": "85000",
  "salaryCurrency": "EUR",
  "workFromHomeLabel": "Homeoffice",
  "labels": ["Full-time", "Permanent"],
  "url": "https://www.stepstone.de/stellenanzeige/senior-python-developer-12345678",
  "companyUrl": "https://www.acme-gmbh.de",
  "textSnippet": "We are looking for a Senior Python Developer to join our Berlin team.",
  "id": 12345678,
  "harmonisedId": "stepstone-12345678",
  "companyLogoUrl": "https://www.stepstone.de/logo/98765",
  "searchUrl": "https://www.stepstone.de/jobs/python/in-berlin?radius=30",
  "page": 1
}
```

### How much does it cost to scrape StepStone?

StepStone Jobs Scraper bills per result using pay-per-event pricing. The primary event is a `job`, charged at **$0.001 per job listing** on the free tier, dropping to $0.0007 per job on higher plans. There is also a one-time Actor Start event of $0.00005 per run.

A small run of 100 listings costs about $0.10, while a larger run of 1,000 listings costs roughly $1.00 before plan discounts. No separate compute fee applies beyond these events.

### Reliability and responsible use

StepStone Jobs Scraper runs with a residential proxy by default because StepStone blocks datacenter IPs. Salary fields (`salaryMin`, `salaryMax`, `salaryCurrency`) and remote-work labels are conditional and appear only when the employer has published them, so some listings will return empty values. The Actor collects publicly listed job data only, and you are responsible for using it lawfully and in line with StepStone's terms of service.

### Frequently asked questions

#### Can I scrape specific job titles and locations from StepStone?

Yes. Enter one or more keywords in `searchQueries` and one or more cities in `searchLocations`, then set a `radius` in kilometers. You can also paste a prepared StepStone search URL into `startUrls` to replicate an exact search.

#### Can I schedule StepStone Jobs Scraper to run automatically?

Yes. Use Apify Schedules to run the Actor daily, weekly, or at a custom interval, and combine it with a webhook to push new results into your workflow automatically.

#### What counts as one result?

One result is one collected job listing, billed as a single `job` event. Set `maxItems` to cap how many listings a run collects; `0` means unlimited.

#### Why are some salary fields empty?

StepStone only exposes a salary range when the employer chooses to publish one. When `salaryMin`, `salaryMax`, or `salaryCurrency` are missing, the listing simply has no salary data available.

#### How do I avoid duplicate records?

Use the stable `harmonisedId` field as your deduplication key. The same job posting keeps the same identifier across runs, while the posting `url` is a useful secondary key.

#### Do I need a proxy?

A residential proxy is configured by default and recommended, because StepStone blocks datacenter IP addresses. The Actor includes this out of the box.

### Related Scraptivo automations

- **[Upwork Jobs Scraper](https://apify.com/scraptivo/upwork-jobs-scraper)** — Collect freelance job postings from Upwork with budget and skills data.
- **[Glassdoor Jobs Scraper](https://apify.com/scraptivo/glassdoor-jobs-scraper)** — Pull job listings, salaries, and employer reviews from Glassdoor.
- **[ZipRecruiter Scraper](https://apify.com/scraptivo/ziprecruiter-scraper)** — Extract job listings by query, location, and radius from ZipRecruiter.
- **[LinkedIn Job Scraper](https://apify.com/scraptivo/linkedin-job-scraper)** — Collect LinkedIn job postings and hiring signals at scale.
- **[LinkedIn Profile Scraper](https://apify.com/scraptivo/linkedin-profile-scraper)** — Extract public LinkedIn profile data for lead generation and enrichment.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, a sample URL, the required fields, and your expected volume so we can assess the request.

# Actor input Schema

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

Direct StepStone job search URLs to scrape. Use this OR searchQueries/searchLocations below — not both required.

## `searchQueries` (type: `array`):

Job keywords or titles to search for (e.g. python, data engineer). Combined with OR when multiple values are provided.

## `searchLocations` (type: `array`):

City or region names to filter results (e.g. Berlin, München). Optional — omit to search nationwide.

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

Radius around each location in kilometers. Only used when building URLs from searchQueries/searchLocations.

## `searchFilters` (type: `object`):

Additional StepStone query parameters appended to built search URLs (e.g. sort, employmentType, workFromHome, whatType). Ignored when using startUrls.

## `baseUrl` (type: `string`):

StepStone site origin used when building search URLs from keywords.

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

Maximum number of job records to scrape (0 = unlimited).

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

Apify residential proxy is strongly recommended — StepStone blocks datacenter IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/python/in-berlin?radius=30"
    }
  ],
  "searchQueries": [
    "python"
  ],
  "searchLocations": [
    "Berlin"
  ],
  "radius": 30,
  "searchFilters": {},
  "baseUrl": "https://www.stepstone.de",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing scraped StepStone job listings

## `runStats` (type: `string`):

Aggregate scrape statistics for this run

# 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 = {
    "startUrls": [
        {
            "url": "https://www.stepstone.de/jobs/python/in-berlin?radius=30"
        }
    ],
    "searchQueries": [
        "python"
    ],
    "searchLocations": [
        "Berlin"
    ],
    "searchFilters": {},
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/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 = {
    "startUrls": [{ "url": "https://www.stepstone.de/jobs/python/in-berlin?radius=30" }],
    "searchQueries": ["python"],
    "searchLocations": ["Berlin"],
    "searchFilters": {},
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/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 '{
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/python/in-berlin?radius=30"
    }
  ],
  "searchQueries": [
    "python"
  ],
  "searchLocations": [
    "Berlin"
  ],
  "searchFilters": {},
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

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