# StepStone Scraper — Jobs, Salaries & Hiring Companies (`logiover/stepstone-scraper`) Actor

StepStone jobs scraper for stepstone.de, .at, .be: export job ads with salary estimates, full descriptions, contract type, home office, benefits, address and company size, industry and rating. Search by keyword, location and filters or export whole regions. No login. Not affiliated with StepStone.

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

## Pricing

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

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

## StepStone Scraper

**Export StepStone jobs from stepstone.de, stepstone.at and stepstone.be — with salary estimates, full descriptions, contract type, home office, address and hiring-company data — as clean JSON, CSV or Excel, without a login.**

> Independent tool. Not affiliated with, endorsed by, or sponsored by StepStone or The Stepstone Group. "StepStone" is a trademark of its owner and is used here only to describe the website this Actor reads.

**StepStone Scraper** is a StepStone jobs scraper for Germany's largest job board and its Austrian and Belgian sites. It turns any StepStone search — a job title or keyword, a city, a federal state or the whole country, plus StepStone's own filters — into structured StepStone jobs data: title, employer, location, postal code and coordinates, posting and expiry date, **StepStone's salary estimate (min / max / period / currency)**, home-office flag, contract and work type, Easy Apply flag, benefits and the **full job description split into introduction, responsibilities, requirements and benefits**. Use it to **scrape stepstone.de** by keyword and location, as a **StepStone API alternative** (StepStone offers no public jobs API), or to **export StepStone jobs to CSV, Excel or JSON** for your ATS, CRM, BI tool or data warehouse. No StepStone account, no login, no cookies, no browser.

Recruiters, staffing agencies, HR analysts and job-market researchers use it for **salary data in Germany** (Gehaltsdaten), lead lists of companies that are hiring, competitor monitoring and labour-market statistics. In German: mit diesem Tool können Sie **StepStone Stellenanzeigen exportieren**, **Jobs scrapen** nach Stichwort, Ort, Bundesland, Vertragsart, Homeoffice oder Gehalt, und **Stellenmarkt-Daten** für ganz Deutschland, Österreich oder Belgien als Excel- oder CSV-Datei herunterladen — inklusive vollständiger Stellenbeschreibung, Gehaltsschätzung, Postleitzahl und Unternehmensdaten (Größe, Branche, Bewertung). Every number on this page was measured on the Apify platform on **2026-10-18**.

***

### Table of contents

- [At a glance](#at-a-glance)
- [What you get](#what-you-get)
- [Who uses it — 14 workflows](#who-uses-it--14-workflows)
- [Cookbook — 16 ready-to-run inputs](#cookbook--16-ready-to-run-inputs)
- [Tutorial: your first run in the Apify Console](#tutorial-your-first-run-in-the-apify-console)
- [Tutorial: run it from the API](#tutorial-run-it-from-the-api)
- [Input reference](#input-reference)
- [Output data dictionary](#output-data-dictionary)
- [Real output sample](#real-output-sample)
- [Scale and speed (measured)](#scale-and-speed-measured)
- [What you pay](#what-you-pay)
- [Integrations](#integrations)
- [Performance tips](#performance-tips)
- [Troubleshooting: every status message explained](#troubleshooting-every-status-message-explained)
- [Honest limits](#honest-limits)
- [How it compares](#how-it-compares)
- [FAQ](#faq)
- [Glossary](#glossary)
- [Is it legal to scrape StepStone?](#is-it-legal-to-scrape-stepstone)
- [Changelog](#changelog)
- [Support](#support)

***

### At a glance

| | |
|---|---|
| **Sites** | stepstone.de (Germany), stepstone.at (Austria), stepstone.be (Belgium) |
| **Jobs available** | stepstone.de ~205,000 · stepstone.at ~9,600 · stepstone.be ~10,100 (counted 2026-10-18) |
| **Search by** | keywords / job titles × cities, regions or the whole country, plus pasted StepStone URLs (search pages, company pages, job pages) |
| **Filters** | posting date (24 h / 7 days), full-time / part-time, 14 contract types, experience level, home office (partial / full), minimum salary (stepstone.de), Easy Apply, language of the ad, radius, sort order |
| **Per job** | 48 columns: listing, StepStone salary estimate, home office, contract and work type, employment type, discipline, address with postal code and coordinates, full description and its sections, benefits, company size / industries / rating |
| **Depth** | Every page of a search to its end — StepStone has no page cap (page 8,000 of a Germany-wide search returns real, distinct jobs) |
| **Speed** | 50 jobs with full details in 6.6 s · 1,000 jobs with full details in 90 s · search data alone ~130 jobs per second |
| **Output** | JSON, CSV, Excel, XML, RSS, HTML table; API, webhooks, Make, Zapier, n8n, Google Sheets, MCP |
| **Login / cookies / proxy** | None needed — direct connection at a pace StepStone accepts |
| **Price** | $1.50 → $1.00 per 1,000 jobs depending on your Apify plan; everything included |

***

### What you get

Every row is one job ad. Values StepStone does not publish are `null` — never an empty string or an invented 0. Example values below are real values from a run on 2026-10-18.

#### The job

| Field | Example |
|---|---|
| `id` | `14571015` — StepStone's listing id (unique per row) |
| `harmonisedId` | `cc6c37ad-7802-4598-97f2-afc5b81262dd` — StepStone's global job id |
| `url` | `https://www.stepstone.de/jobs--Team-Member-Marketing-…--14571015-inline.html` |
| `title` | `Team Member Marketing and Business Development – Automotive & Mobility / Aerospace & Defense (m/f/d)` |
| `datePosted`, `validThrough` | `2026-10-17T16:03:07.790Z`, `2026-11-01T16:40:33.263Z` |
| `textSnippet` | StepStone's short summary of the ad |
| `labels` | `Easy Apply \| No cover letter required \| Be an early applicant` |
| `easyApply`, `noCoverLetter` | `true` / `false` |
| `resultType` | `match` (or `similar` / `nearby` when you include those) |

#### Pay

| Field | Example |
|---|---|
| `salaryMin`, `salaryMax` | `58000`, `65000` |
| `salaryCurrency` | `EUR` |
| `salaryPeriod` | `YEAR` (also `MONTH`, `HOUR`) |
| `salaryType` | `StepStone estimate` — StepStone's own salary prediction for the ad; `Employer` when the employer states the pay |

#### Work arrangement

| Field | Example |
|---|---|
| `workFromHome` | `Partially remote` / `Fully remote` / `null` (not stated) |
| `contractType` | `Permanent contract`, `Temporary contract`, `Internship`, `Student job, Industrial placement student` … |
| `workType` | `Full Time, Home office possible` |
| `employmentType` | `FULL_TIME`, `PART_TIME` (schema.org values) |
| `discipline`, `subDiscipline` | `IT`, `Softwareentwicklung` (StepStone's own job taxonomy) |

#### Where

| Field | Example |
|---|---|
| `location` | `München` — as shown on StepStone |
| `city`, `postalCode`, `streetAddress` | `München`, `80539`, `Karl-Scharnagl-Ring 5` |
| `country` | `DE`, `AT` or `BE` |
| `latitude`, `longitude` | `48.13985`, `11.583821` |

#### The ad text

| Field | What it holds |
|---|---|
| `description` | The complete job ad as plain text with paragraphs and bullet points |
| `introduction` | The employer's introduction ("About us") |
| `responsibilities` | Tasks — "Ihre Aufgaben", "Your tasks" |
| `requirements` | Profile — "Ihr Profil", "Qualifications" |
| `benefits` | What the employer offers — "Wir bieten", "Benefits" |
| `additionalInformation` | Contact, application notes, start date |
| `descriptionHtml` | Optional: the description with its original HTML (switch on `includeDescriptionHtml`) |

#### The hiring company

| Field | Example |
|---|---|
| `companyName`, `companyId` | `Hogan Lovells Cadwalader International LLP`, `83998` |
| `companyUrl` | The company's job list on StepStone |
| `companyLogoUrl` | Logo image URL |
| `companySize` | `10000+`, `1000+`, `251-1000`, `51-250`, `11-50`, `1-10` |
| `companyIndustries` | `Medizintechnik \| IT & Tech` |
| `companyRating`, `companyReviewCount` | `3.87`, `81` — StepStone's employer rating and the number of reviews behind it |
| `companyOpenJobs` | `40` — open jobs of the company on StepStone |

#### Bookkeeping

`searchTerm`, `searchLocation` (which search found the job), `site` (`stepstone.de` / `.at` / `.be`), `scrapedAt`.

***

### Who uses it — 14 workflows

#### 1. Recruiters sourcing for open roles

Search the job titles you recruit for in the cities you cover, keep `postedWithin: "7"`, and read `requirements` and `benefits` side by side to see what competing employers ask for and offer. The `salaryMin` / `salaryMax` range tells you whether your client's offer is competitive before you call candidates.

#### 2. Staffing and recruitment agencies — business development

Every job ad is a buying signal: the company has an open position today. Export all jobs of a region or discipline, group by `companyName`, and sort by `companyOpenJobs` and `companySize` — the companies with many open roles and 251–10,000 employees are your best prospects. `companyIndustries` lets you target the industries you place in.

#### 3. Temporary-work agencies (Arbeitnehmerüberlassung)

Filter `contractTypes: ["temp_agency"]` to see which competitors post where, or exclude agency ads from your lead list by filtering them out of a full export. The `labels` field also shows which ads accept applications without a cover letter.

#### 4. HR analytics and compensation teams

Pull every ad for a job family across Germany and compute salary bands from `salaryMin` / `salaryMax` by `city`, `companySize` and `discipline`. StepStone publishes an estimate for 68–76 % of jobs (68 % in a 1,000-job München run, 76 % of 25,094 Berlin and München jobs) — enough for solid medians per role and city.

#### 5. Salary benchmarking for candidates and employers

Answer "what does a software engineer earn in Munich?" from live ads instead of surveys: search the title, set the city, export, and take the median of the estimated range. Repeat monthly to track movement.

#### 6. Job aggregators and niche job boards

Feed your board with fresh StepStone jobs in your niche (e.g. nursing, engineering, English-speaking jobs via `jobLanguages: ["en"]`). Schedule a daily run with `postedWithin: "1"` and push the new rows to your database through a webhook. `url` always points to the original ad.

#### 7. Labour-market researchers and economists

Count vacancies by region, discipline, contract type and home-office share. A whole federal state ("Bayern", ~38,000 jobs) or the whole country can be exported in one run, and `datePosted` gives the time dimension for weekly snapshots.

#### 8. Employer branding and talent-acquisition teams

Benchmark your ads against competitors: what do they promise in `benefits`, how often do they offer home office (`workFromHome`), do they drop the cover letter (`noCoverLetter`), how are they rated (`companyRating`, `companyReviewCount`)?

#### 9. Competitor and market intelligence

Paste a competitor's StepStone company page into `startUrls` and run it weekly: new ads reveal expansion (new cities), new teams (new disciplines) and seniority mix long before a press release.

#### 10. Sales teams selling to HR (HR tech, job-ad services, relocation, benefits providers)

Companies with many open ads are buying HR products. Export a region, keep companies with `companyOpenJobs` ≥ 10, and hand the list with company size and industry to your SDRs.

#### 11. Career coaches and outplacement providers

Give clients a curated, filtered list — e.g. `experienceLevels: ["management"]` in their city with salary estimates — instead of pointing them to a website.

#### 12. Universities, career services and student job portals

Collect `internship`, `student_job`, `thesis` and `entry_level` jobs for your region every week and publish them to students.

#### 13. Relocation, immigration and international-hiring services

`jobLanguages: ["en"]` returns the English-language ads in Germany, Austria or Belgium — the jobs open to people who do not speak German, Dutch or French.

#### 14. AI, RAG and LLM pipelines

Feed structured, sectioned job ads (`responsibilities`, `requirements`, `benefits` as separate fields) to a vector index, a matching model or an agent through the API or the Apify MCP server, and let an LLM answer questions about the German job market from fresh data.

***

### Cookbook — 16 ready-to-run inputs

Paste any of these into the Input tab (JSON view) or send it as the body of an API call.

#### 1. Keyword + city

```json
{
  "searchTerms": ["software engineer"],
  "locations": ["Berlin"],
  "maxItems": 500
}
```

Measured: 489 matching jobs for this search on 2026-10-18 (StepStone also lists 138 "similar" and 59 "nearby" jobs, which are skipped unless you switch on `includeSimilarJobs`).

#### 2. Several job titles × several cities

```json
{
  "searchTerms": ["Pflegefachkraft", "Gesundheits- und Krankenpfleger"],
  "locations": ["Hamburg", "Bremen", "Hannover"],
  "maxItems": 3000
}
```

Every term is combined with every location (6 searches). Each search first gets a fair share of `maxItems`; unused shares are redistributed.

#### 3. Every job in a whole region

```json
{
  "locations": ["Bayern"],
  "maxItems": 0,
  "includeDetails": false
}
```

A federal state, a city or a country works as a location. Bavaria had 38,035 matching jobs on 2026-10-18. `maxItems: 0` = no limit. With `includeDetails: false` the run uses search pages only (25 jobs per request) and is very fast; switch details on for descriptions and addresses.

#### 4. Every job on stepstone.de

```json
{
  "maxItems": 0,
  "includeDetails": false
}
```

Leave terms and locations empty: the Actor searches "Deutschland" (about 205,000 jobs). Make sure your **Maximum cost per run** covers the number of results (see [What you pay](#what-you-pay)).

#### 5. Remote-only jobs

```json
{
  "searchTerms": ["data analyst"],
  "workFromHome": ["full"],
  "maxItems": 1000
}
```

`["partial"]` = hybrid, `["partial", "full"]` = any home office.

#### 6. Only well-paid jobs (stepstone.de)

```json
{
  "searchTerms": ["project manager"],
  "locations": ["Frankfurt am Main"],
  "minSalary": 70000,
  "maxItems": 1000
}
```

StepStone filters by its salary information (the estimate where the employer gives none) in steps of 10,000 EUR per year.

#### 7. Jobs posted in the last 24 hours (daily monitoring)

```json
{
  "searchTerms": ["SAP"],
  "locations": ["Deutschland"],
  "postedWithin": "1",
  "sortBy": "date",
  "maxItems": 0
}
```

Schedule this every morning (Schedules → Create new) and connect a webhook or Google Sheets — see [Integrations](#integrations).

#### 8. One company's jobs

```json
{
  "startUrls": [
    { "url": "https://www.stepstone.de/cmp/de/goldbeck-technologies-gmbh-180101/jobs" }
  ]
}
```

Open the company on StepStone, click its jobs list and paste that URL. Several company pages can go in one run.

#### 9. A StepStone search URL with any filter combination

```json
{
  "startUrls": [
    { "url": "https://www.stepstone.de/jobs/software-engineer/in-berlin?radius=30&ct=222&wfh=2" }
  ]
}
```

Set up the search on stepstone.de with every filter you like (categories, sectors, cities, skills …), copy the address bar, paste it. The Actor reads all pages of that exact search.

#### 10. Specific job ads by URL

```json
{
  "startUrls": [
    { "url": "https://www.stepstone.de/stellenangebote--AI-native-Software-Engineer-m-w-d-Bielefeld-GOLDBECK-Technologies-GmbH--14603736-inline.html" }
  ]
}
```

Each job page becomes one full row (description, address, company card).

#### 11. Austria (stepstone.at)

```json
{
  "country": "at",
  "searchTerms": ["Projektmanager"],
  "locations": ["Wien"],
  "maxItems": 500
}
```

stepstone.at had 9,606 jobs on 2026-10-18 (Vienna: 2,911 matching).

#### 12. Belgium (stepstone.be), French labels

```json
{
  "country": "be",
  "language": "fr",
  "locations": ["Brussel"],
  "maxItems": 1000
}
```

stepstone.be had 10,145 jobs on 2026-10-18. Labels can be English, Dutch (`nl`) or French (`fr`); the job ads stay in their own language.

#### 13. Internships and working-student jobs

```json
{
  "locations": ["München", "Stuttgart"],
  "contractTypes": ["internship", "student_job", "thesis"],
  "maxItems": 2000
}
```

#### 14. Entry-level jobs in English

```json
{
  "experienceLevels": ["none"],
  "jobLanguages": ["en"],
  "locations": ["Deutschland"],
  "maxItems": 2000
}
```

#### 15. Part-time jobs with Easy Apply

```json
{
  "locations": ["Köln"],
  "workType": "part",
  "easyApplyOnly": true,
  "maxItems": 1000
}
```

#### 16. Fastest bulk export of a city (search data only)

```json
{
  "locations": ["Berlin", "München"],
  "includeDetails": false,
  "maxItems": 0
}
```

Search pages carry title, company, location, dates, salary estimate, home office, labels, snippet and benefits; switch details on for everything else.

***

### Tutorial: your first run in the Apify Console

1. **Open the Actor** and click **Try for free** (or **Start** if you already use it).
2. In **Search terms**, type one or more job titles or keywords — e.g. `software engineer`. Press Enter after each.
3. In **Locations**, add a city, a region or `Deutschland` — e.g. `Berlin`. Leave empty for the whole country.
4. Pick the **StepStone site** (Germany, Austria or Belgium).
5. Optional: open **Filters** and choose posting date, full-time / part-time, contract type, experience, home office, minimum salary, Easy Apply or ad language.
6. Set **Max results** (start with 100 to see the data; `0` means no limit).
7. Keep **Include full job details** on for descriptions, contract type, address and company data.
8. Click **Start**. Rows appear in the **Output** tab within seconds; the status line shows progress.
9. When the run finishes, click **Export** and choose **CSV**, **Excel** or **JSON**. The Output tab has three views: **Overview**, **Pay & contract** and **Company & location**.
10. To repeat the search automatically, click **Schedule** and pick a time (e.g. every morning at 7:00).

***

### Tutorial: run it from the API

#### 1. Get your token

Apify Console → **Settings → API & Integrations** → copy your personal API token.

#### 2. Run and get the data in one call (small runs)

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~stepstone-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN&format=json" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["data engineer"],"locations":["Hamburg"],"maxItems":200}'
```

`run-sync-…` waits up to 5 minutes; use it for runs up to a few thousand jobs.

#### 3. Start a run and fetch the data later (big runs)

```bash
## start
curl -X POST "https://api.apify.com/v2/acts/logiover~stepstone-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations":["Bayern"],"maxItems":0,"includeDetails":false}'
## poll: GET https://api.apify.com/v2/actor-runs/RUN_ID?token=YOUR_TOKEN  (status SUCCEEDED)
## data: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN
```

#### 4. Node.js (apify-client)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/stepstone-scraper').call({
    searchTerms: ['Vertrieb', 'Account Manager'],
    locations: ['München'],
    postedWithin: '7',
    maxItems: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const job of items) console.log(job.title, job.companyName, job.salaryMin, job.salaryMax, job.workFromHome);
```

#### 5. Python (apify-client)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/stepstone-scraper").call(run_input={
    "searchTerms": ["Elektroniker"],
    "locations": ["Nordrhein-Westfalen"],
    "contractTypes": ["permanent"],
    "maxItems": 2000,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job["postalCode"], job["salaryMin"], job["companySize"])
```

#### 6. Read the run summary

Every run writes a `SUMMARY` record to its key-value store: outcome, jobs per search, how many StepStone listed, pages read, job pages read, skipped similar/nearby jobs, and why the run stopped. Fetch it with `GET https://api.apify.com/v2/key-value-stores/STORE_ID/records/SUMMARY?token=YOUR_TOKEN`.

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | array of strings | `[]` | Job titles, keywords or skills. Each term is one StepStone search. Empty = all jobs in the locations. |
| `locations` | array of strings | `[]` | Cities, regions (federal states such as `Bayern`, `Nordrhein-Westfalen`), or the country (`Deutschland`, `Österreich`, `Belgie`). Every term × every location. Empty = whole country. |
| `country` | `de` / `at` / `be` | `de` | Which StepStone site to search. Pasted URLs always use their own site. |
| `radiusKm` | integer 0–200 | StepStone's 30 | Search radius around a city. |
| `postedWithin` | `any` / `1` / `7` | `any` | Last 24 hours or last 7 days (StepStone's filter). |
| `workType` | `any` / `full` / `part` | `any` | Full-time or part-time only. |
| `contractTypes` | array | `[]` | `permanent`, `temporary`, `temp_agency`, `temp_to_perm` (BE), `freelance`, `franchise`, `entry_level`, `apprenticeship`, `internship`, `student_job`, `thesis`, `doctorate`, `traineeship`, `trade_representative`. Types a site does not have are reported and ignored. |
| `experienceLevels` | array | `[]` | `none` (first job), `experienced`, `management`. |
| `workFromHome` | array | `[]` | `partial` (hybrid), `full` (remote). |
| `minSalary` | integer | `0` | Minimum yearly salary in EUR, stepstone.de only, steps of 10,000 (rounded down). |
| `easyApplyOnly` | boolean | `false` | Only ads with StepStone's quick application. |
| `jobLanguages` | array | `[]` | Language of the ad: `de`, `en`, `nl`, `fr`. |
| `startUrls` | array of URLs | `[]` | StepStone search pages (any filters), company job lists (`/cmp/…`) and job pages (`…-inline.html`) from .de, .at or .be. Only URLs → only the URLs are read. |
| `maxItems` | integer | `1000` | Maximum unique jobs per run. `0` = no limit. |
| `includeDetails` | boolean | `true` | Read every job page: full description and its sections, contract / work / employment type, discipline, postal code, street, coordinates, company size, industries, rating, open jobs. Off = search data only, much faster. |
| `includeSimilarJobs` | boolean | `false` | Also keep StepStone's "similar jobs" (shown after keyword matches) and "nearby jobs" (shown after a city's jobs). |
| `sortBy` | `date` / `relevance` | `date` | Newest first, or StepStone's relevance ranking. |
| `language` | `en` / `de` / `nl` / `fr` | `en` | Language of StepStone's labels (contract type, work type, badges). German for .de/.at, Dutch and French for .be. |
| `includeDescriptionHtml` | boolean | `false` | Add `descriptionHtml` with the original formatting. |
| `maxRequestsPerSecond` | integer 1–16 | `12` | Upper limit for the request pace. The Actor slows down by itself when StepStone refuses requests. |
| `proxyConfiguration` | object | no proxy | Optional. Direct connection by default; during a StepStone hold up to 80 requests go through residential IPs automatically. Set Apify RESIDENTIAL here for long runs through a hold. |

Filters are validated: values a site does not offer are named in the log instead of silently returning nothing. StepStone ignores its own region filter inside URLs (`fre=`), so regions are searched as locations — the Actor tells you if a pasted URL contains one.

***

### Output data dictionary

Fill rates were measured on a 1,000-job run (all jobs in München, job details on, 2026-10-18). "100 %" fields are always present; lower rates mean StepStone does not publish the value for every ad.

| Field | Type | Fill | Meaning | Example |
|---|---|---|---|---|
| `id` | number | 100 % | StepStone listing id, unique per row | `14571015` |
| `harmonisedId` | string | 100 % | StepStone's global job id | `cc6c37ad-…` |
| `url` | string | 100 % | Job ad on StepStone (tracking parameters removed) | `https://www.stepstone.de/jobs--…-inline.html` |
| `title` | string | 100 % | Job title | `Software Engineer – R&D Orthopedic Surgery` |
| `companyName` | string | 100 % | Employer as shown | `Brainlab` |
| `companyId` | number | 100 % | StepStone company id | `58265` |
| `companyUrl` | string | 100 % | Company's job list on StepStone | `https://www.stepstone.de/cmp/en/brainlab-58265/work` |
| `companyLogoUrl` | string | 99.8 % | Logo | `https://www.stepstone.de/upload_DE/logo/…gif` |
| `location` | string | 99.9 % | Location as listed | `München` |
| `postalCode` | string | 50.6 % | Validated postal code (5 digits DE, 4 digits AT/BE) | `80539` |
| `city` | string | 98.5 % | City of the job | `München` |
| `streetAddress` | string | 28.9 % | Street and number when the employer gives one | `Karl-Scharnagl-Ring 5` |
| `country` | string | 100 % | ISO country code | `DE` |
| `latitude`, `longitude` | number | 64.2 % | Coordinates of the workplace | `48.13985`, `11.583821` |
| `datePosted` | string (ISO 8601) | 100 % | Publication time | `2026-10-17T16:03:07.790Z` |
| `validThrough` | string (ISO 8601) | 100 % | Planned end of the ad | `2026-11-01T16:40:33.263Z` |
| `salaryMin`, `salaryMax` | number | 68.3 % | Salary range | `58000`, `65000` |
| `salaryCurrency` | string | 68.3 % | Currency | `EUR` |
| `salaryPeriod` | string | 68.3 % | `YEAR`, `MONTH` or `HOUR` | `YEAR` |
| `salaryType` | string | 68.3 % | `StepStone estimate` or `Employer` | `StepStone estimate` |
| `workFromHome` | string | 48.1 % | `Partially remote` / `Fully remote`; null = not offered or not stated | `Partially remote` |
| `contractType` | string | 94.1 % | Contract type label | `Permanent contract` |
| `workType` | string | 91.6 % | Work type label | `Full Time, Home office possible` |
| `employmentType` | string | 100 % | schema.org employment type | `FULL_TIME` |
| `easyApply` | boolean | 100 % | StepStone quick application | `true` |
| `noCoverLetter` | boolean | 100 % | "No cover letter required" | `false` |
| `labels` | string | 64.2 % | All labels and badges, pipe-separated | `Easy Apply \| Be an early applicant` |
| `discipline` | string | 95.0 % | StepStone job discipline | `IT` |
| `subDiscipline` | string | 75.7 % | Sub-discipline | `Softwareentwicklung` |
| `textSnippet` | string | 100 % | StepStone's short summary | `Brainlab ist ein Münchner Medizintechnik-Unternehmen …` |
| `benefits` | string | 96.4 % | What the employer offers | `• 30 vacation days …` |
| `description` | string | 100 % | Full ad text | `About Hogan Lovells …` |
| `introduction` | string | 95.7 % | Employer introduction | `At the forefront of health technology …` |
| `responsibilities` | string | 98.4 % | Tasks | `As a highly motivated Software Engineer …` |
| `requirements` | string | 98.4 % | Candidate profile | `• A degree in Computer Science …` |
| `additionalInformation` | string | 75.8 % | Contact / application notes | `We look forward to receiving your application …` |
| `companySize` | string | 81.3 % | Employee band | `1000+` |
| `companyIndustries` | string | 81.7 % | Company industries, pipe-separated | `Medizintechnik \| IT & Tech` |
| `companyRating` | number | 39.8 % | StepStone employer rating (1–5) | `3.87` |
| `companyReviewCount` | number | 39.8 % | Reviews behind the rating | `81` |
| `companyOpenJobs` | number | 85.9 % | Company's open jobs on StepStone | `40` |
| `resultType` | string | 100 % | `match`, `similar` or `nearby` | `match` |
| `searchTerm` | string | when a term was searched | The search term that found the job | `software engineer` |
| `searchLocation` | string | when a location was searched | The location that found the job | `München` |
| `site` | string | 100 % | `stepstone.de`, `stepstone.at` or `stepstone.be` | `stepstone.de` |
| `scrapedAt` | string (ISO 8601) | 100 % | Collection time | `2026-10-18T21:14:38.000Z` |
| `descriptionHtml` | string | optional | Original HTML of the ad (`includeDescriptionHtml: true`) | `<h4>Über GOLDBECK</h4>…` |

With `includeDetails: false` the job-page fields (`postalCode`, `city`, `streetAddress`, coordinates, `contractType`, `workType`, `employmentType`, `discipline`, `description` and its sections, company size / industries / rating / open jobs) stay `null`; everything else is filled exactly as above.

**CSV / Excel columns** (in this order): `id, harmonisedId, url, title, companyName, companyId, companyUrl, companyLogoUrl, location, postalCode, city, streetAddress, country, latitude, longitude, datePosted, validThrough, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryType, workFromHome, contractType, workType, employmentType, easyApply, noCoverLetter, labels, discipline, subDiscipline, textSnippet, benefits, description, introduction, responsibilities, requirements, additionalInformation, companySize, companyIndustries, companyRating, companyReviewCount, companyOpenJobs, resultType, searchTerm, searchLocation, site, scrapedAt`.

***

### Real output sample

A real row from the 1,000-job run on 2026-10-18 (all jobs in München, default settings; the long texts are shortened here):

```json
{
  "id": 14571015,
  "harmonisedId": "cc6c37ad-7802-4598-97f2-afc5b81262dd",
  "url": "https://www.stepstone.de/jobs--Team-Member-Marketing-and-Business-Development-Automotive-Mobility-Aerospace-Defense-m-f-d-Muenchen-Hogan-Lovells-Cadwalader-International-LLP--14571015-inline.html",
  "title": "Team Member Marketing and Business Development – Automotive & Mobility / Aerospace & Defense (m/f/d)",
  "companyName": "Hogan Lovells Cadwalader International LLP",
  "companyId": 83998,
  "companyUrl": "https://www.stepstone.de/cmp/en/hogan-lovells-cadwalader-international-llp-83998/work",
  "companyLogoUrl": "https://www.stepstone.de/upload_DE/logo/0/logoHogan-Lovells-International-LLP-83998DE-2607011601.gif",
  "location": "München",
  "postalCode": "80539",
  "city": "München",
  "streetAddress": "Karl-Scharnagl-Ring 5",
  "country": "DE",
  "latitude": 48.13985,
  "longitude": 11.583821,
  "datePosted": "2026-10-17T16:03:07.790Z",
  "validThrough": "2026-11-01T16:40:33.263Z",
  "salaryMin": 58000,
  "salaryMax": 65000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "YEAR",
  "salaryType": "StepStone estimate",
  "workFromHome": null,
  "contractType": "Permanent contract",
  "workType": "Full Time",
  "employmentType": "FULL_TIME",
  "easyApply": false,
  "noCoverLetter": false,
  "labels": null,
  "textSnippet": "Hogan Lovells Cadwalader is a global law firm with 3,100+ lawyers across 36 offices. They're looking for a team member to join Marketing and Business Development …",
  "benefits": "• Varied and challenging work in a collegial, highly motivated team\n• A modern, attractive, and future-proof workplace with excellent public transport connections\n• Comprehensive onboarding …",
  "description": "About Hogan Lovells Cadwalader\n\nHogan Lovells Cadwalader brings together more than 3,100 lawyers across 36 worldwide offices …",
  "resultType": "match",
  "searchLocation": "München",
  "site": "stepstone.de"
}
```

A second real row (same run) with company data, a sub-discipline and home office:

```json
{
  "id": 14624658,
  "title": "Software Engineer – R&D Orthopedic Surgery",
  "companyName": "Brainlab",
  "location": "München",
  "latitude": 48.143295,
  "longitude": 11.564068,
  "salaryMin": 54000,
  "salaryMax": 76000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "YEAR",
  "salaryType": "StepStone estimate",
  "workFromHome": "Partially remote",
  "contractType": "Permanent contract",
  "workType": "Full Time, Home office possible",
  "employmentType": "FULL_TIME",
  "easyApply": true,
  "discipline": "IT",
  "subDiscipline": "Softwareentwicklung",
  "requirements": "• A degree in Computer Science, Mathematics, Physics, Engineering, or a related field …",
  "companySize": "1000+",
  "companyIndustries": "Medizintechnik | IT & Tech",
  "companyRating": 3.87,
  "companyReviewCount": 81,
  "companyOpenJobs": 40
}
```

***

### Scale and speed (measured)

All runs on the Apify platform, default memory (2 GB), 2026-10-18.

| Run | Result | Time |
|---|---|---|
| Prefill / first run (50 jobs, "software engineer" in Berlin, full job details) | 50 jobs, first row after 1.7 s | **6.6 s** |
| 1,000 jobs, default settings (all jobs in München, full job details) | 1,000 jobs, 1,000 job pages read, 0 duplicates, 0 refused requests | **90 s** |
| Every job in Berlin + München, search data only (`includeDetails: false`, `maxItems: 0`) | **25,081 unique jobs, 0 duplicates** — 99.7 % (Berlin) and 99.8 % (München) of the jobs StepStone counted | **197 s** |
| Every job in Berlin, search data only, with completion pass | 15,129 of 15,151 listed jobs (99.9 %): first pass 15,002, completion pass +127 | 243 s |

#### How big searches are read completely

- **No page cap.** StepStone paginates every search to its end. We checked the deepest pages of a Germany-wide search: page 2,000, 5,000 and 8,000 (offset 199,975) all returned 25 real, distinct jobs, and none of them repeated page 1. So a region or the whole country is read page by page — no splitting tricks are needed, and nothing is silently left out.
- **No fake pagination — but a moving order.** Pages 1, 2 and 3 of the same search are disjoint and identical on repeat. Over a long search, however, StepStone's order shifts slightly while you read it: one date-ordered pass over all Berlin jobs saw 15,002 of the 15,151 listed (99.0 %), because a few jobs slipped between pages while they were read. The Actor measures this per search (`jobsSeen` and `coveragePercent` in the `SUMMARY`) and, when a search ends below 99.5 % of StepStone's count, reads it once more in the other order (**completion pass**). Jobs already saved are skipped for free. Berlin then reached **15,129 of 15,151 listed jobs (99.9 %)**.
- **Multi-location ads are saved once.** An ad that lists several cities appears in each of those city searches — Berlin and München shared 1,078 such ads in one run. Every job is de-duplicated by its StepStone id, so you pay for it once.
- **Matches first, extras last.** StepStone lists the real matches first and then appends "similar jobs" (for keywords) and "nearby jobs" (for cities). By default the Actor reads exactly the pages holding the matches and stops — e.g. "SAP ABAP" has 128 matches but 7,627 similar jobs, which you only get with `includeSimilarJobs`.
- **Pace StepStone accepts.** StepStone limits how fast one address may send requests. Measured: 3, 6, 10 and 16 requests per second stayed clean for 300–600 requests each; 30 per second got the connection blocked after about 180 requests. The Actor therefore paces itself (default 12 per second, search pages and job pages together), halves the pace as soon as StepStone refuses something and speeds up again after 20 quiet seconds.
- **Search data vs. job pages.** One search page carries 25 jobs; each job page is one more request. Search data alone (~130 jobs per second) is therefore more than ten times faster than full details (~11 jobs per second).

***

### What you pay

**A fixed price per job in the dataset — compute, connection and job-page requests are included.** No monthly rental, no charge for duplicates, similar/nearby jobs you did not ask for, or jobs that were filtered out.

| Apify plan | Price per 1,000 jobs | 1,000 jobs | 10,000 jobs | 100,000 jobs |
|---|---|---|---|---|
| Free | $1.50 | $1.50 | $15.00 | $150.00 |
| Bronze | $1.33 | $1.33 | $13.33 | $133.33 |
| Silver | $1.17 | $1.17 | $11.67 | $116.67 |
| Gold, Platinum, Diamond | $1.00 | $1.00 | $10.00 | $100.00 |

The price is the same with or without job details.

#### Maximum cost per run

Apify stops every pay-per-result run at its **Maximum cost per run** (you set it in the run options; the platform also applies a default). The Actor reads that limit when it starts, collects only what it covers, stops cleanly and says so in the status: *"Saved 37 jobs — this run's maximum cost ($0.05) covers 37 results at the current price. Raise "Maximum cost per run" to get more."* (real message of a test run on 2026-10-18; the number depends on your plan's price) The run still ends as **Succeeded**, and you pay only for the jobs in the dataset. For a full-country export (200,000+ jobs) raise the limit accordingly.

***

### Integrations

#### API, apify-client and webhooks

See [Tutorial: run it from the API](#tutorial-run-it-from-the-api). Add a webhook (Actor → Integrations → Webhooks) on **Run succeeded** to POST the dataset id to your own endpoint, a CRM middleware or a queue — the cleanest way to load new jobs into HubSpot, Salesforce, Pipedrive or an ATS.

#### Make (Integromat)

Use the **Apify** app: module "Run an Actor" with `logiover/stepstone-scraper` and your JSON input, then "Get Dataset Items" and map fields into Google Sheets, Airtable, Slack, email or your CRM.

#### Zapier

Trigger "Finished Actor Run" (or action "Run Actor") in the Apify Zapier app, then "Find Dataset Items" to send every new job to a sheet, a channel or a CRM record.

#### n8n

The Apify node runs the Actor and returns the items; continue with any n8n node — Postgres, Google Sheets, HTTP Request, OpenAI.

#### Google Sheets

Export the dataset as CSV/Excel, or use the Apify Google Sheets integration to append the rows of every scheduled run to a sheet.

#### Airtable

Use Make, Zapier or n8n with the Airtable module, or import the CSV export; `id` makes a good primary field for de-duplication.

#### Scheduling

Actor → **Schedules**: run daily with `postedWithin: "1"` (or weekly with `"7"`) to collect only new jobs. Keep the dataset per run or merge into one sheet.

#### Data warehouses (BigQuery, Snowflake, Postgres, S3)

Fetch `GET /v2/datasets/{id}/items?format=json` (or `csv`, `xlsx`, `xml`) from your ETL tool, or use a webhook to trigger the load. All dates are ISO 8601, all numbers are numbers.

#### MCP and AI agents

The Actor works with the Apify MCP server, so Claude, ChatGPT or your own agent can call it as a tool — "find remote data-engineering jobs in Germany posted this week with a salary above 70k" — and receive structured rows.

***

### Performance tips

- **Search data first, details for a shortlist.** For tens of thousands of jobs, run with `includeDetails: false` (25 jobs per request), filter in your spreadsheet, then paste the interesting job URLs into `startUrls` for full details.
- **Use StepStone's filters instead of post-filtering** — `postedWithin`, `contractTypes`, `workFromHome`, `minSalary` and `easyApplyOnly` shrink the search before anything is downloaded.
- **Keep `maxRequestsPerSecond` at the default.** Higher values do not help: StepStone refuses bursts, and the Actor would only spend time backing off.
- **Daily monitoring:** `postedWithin: "1"` with `sortBy: "date"` reads only the newest jobs.
- **Many cities:** list them in `locations` in one run — each gets a fair share of `maxItems`, and duplicates across overlapping cities are removed automatically.
- **Leave `includeSimilarJobs` off** unless you really want StepStone's loosely related suggestions.

***

### Troubleshooting: every status message explained

| Status / outcome | What it means | What to do |
|---|---|---|
| `Saved N jobs (max results reached) in X s.` | You got what you asked for. | Raise `maxItems` for more. |
| `Saved N of M listed jobs (every matching job read) in X s.` | Every page of every search was read. N can be a little below M: jobs that appear twice across searches are kept once, and StepStone's counts change while you read. `coveragePercent` per search is in the SUMMARY. | — |
| Log: `Completion pass for N search(es) that ended below 99.5 % of StepStone's count …` | StepStone's order shifted during a long search; the search is read once more in the other order to pick up the jobs that slipped between pages. | Nothing — it is automatic and only adds new jobs. |
| `Saved N jobs — this run's maximum cost ($X) covers N results …` | The run reached your **Maximum cost per run** (outcome COMPLETED, `stoppedBy: MAX_COST`). | Raise the limit in the run options. |
| `Saved 0 jobs — this run's maximum cost … does not cover a single result.` | The limit is below the price of one job. | Raise the limit. |
| `StepStone has no jobs for "…" in X. If the place is spelled differently …` (EMPTY_RESULT) | StepStone answered, but the location is unknown to it or has no jobs. | Try the local spelling ("München", "Wien", "Brussel") or a bigger area. |
| `No jobs matched on StepStone — the search ran fine but returned 0 results.` (EMPTY_RESULT) | The search and filters exclude everything. | Use broader terms or fewer filters. |
| `PARTIAL: …` in the log, `outcome: "PARTIAL"` in SUMMARY | Rows were saved, but some pages could not be read after all retries. | Re-run later; the SUMMARY lists which search was affected. |
| Run **failed**: `No jobs collected: no page could be fetched (…)` (BLOCKED / FETCH_FAILED) | StepStone refused every request — no empty "success" is reported in this case. | Re-run later, or set `proxyConfiguration` to Apify RESIDENTIAL as a fallback. |
| Run **failed**: `None of the start URLs is a StepStone search page …` (BAD_INPUT) | The pasted URLs are not StepStone search, company or job pages. | Paste URLs from stepstone.de/.at/.be. |
| Log: `StepStone is refusing this connection (HTTP 403 Access Denied) — pausing 30 s …` | StepStone has put the connection on hold (measured: about 10 minutes after heavy traffic). The Actor pauses and resumes by itself; `pausesForRefusals` in the SUMMARY counts the pauses. | Wait, re-run later, or add Apify RESIDENTIAL as fallback proxy. |
| Log: `StepStone ignores the region filter in URLs (fre=…)` | Your pasted URL contains StepStone's region facet, which StepStone itself ignores. | Use the region as a location (`"locations": ["Bayern"]`). |
| Log: `Contract type "…" does not exist on stepstone.be — ignored.` | That filter value does not exist on the chosen site. | Pick a type the site offers. |
| Job-page fields empty for a few rows | The ad was taken offline between the search and the job page (counted as `jobPagesOffline` in SUMMARY). | — |

***

### Honest limits

- **Salary is StepStone's estimate.** In all 25,094 Berlin and München jobs we checked on 2026-10-18, every salary range was StepStone's own prediction (`salaryType: "StepStone estimate"`); 76 % of those jobs carried one (68 % in the 1,000-job München run with details). stepstone.at and stepstone.be publish no salary ranges. Pay written only inside the ad text stays in `description`.
- **No skills list per job.** StepStone shows skill filters on search pages but publishes no skill list per ad, so there is no `skills` column — read `requirements` instead.
- **Addresses are as complete as the employer made them.** Postal code ~51 %, coordinates ~64 %, street ~29 % (1,000-job sample); remote and multi-location ads often have none.
- **Company rating** exists for about 40 % of jobs (employers with reviews on StepStone).
- **Discipline names are StepStone's German taxonomy** (e.g. `Softwareentwicklung`) even when labels are English.
- **Pace.** StepStone limits requests per address; the Actor keeps to ~12 per second. Search data alone is fast (25 jobs per request); with job pages expect roughly 11 jobs per second.
- **Temporary holds.** If one network address sends StepStone a lot of traffic, StepStone may refuse it for a while. In our testing on 2026-10-18 this happened once, right after several thousand requests of back-to-back test runs: StepStone answered "Access Denied" for about 10 minutes and then served normally again. The Actor pauses (30 s, 60 s, 120 s) instead of hammering, keeps the rows it has, and reports the run as PARTIAL if pages stayed unreadable. Rows whose job page could not be read keep their search data (job-page fields `null`). For guaranteed continuity, set `proxyConfiguration` to Apify RESIDENTIAL: the Actor then switches to it only while the direct connection is refused. Since build 1.0.13 a run that starts inside such a hold automatically sends up to 80 requests through residential IPs, so small runs (like the 50-job example) still finish; longer runs pause until the hold ends, or keep going through your own RESIDENTIAL proxy setting.
- **Counts move.** StepStone adds and removes ads all the time, so totals differ slightly between runs and between StepStone's headline number and the rows you receive.
- **stepstone.nl does not exist**; totaljobs.com (StepStone UK) is not covered.

***

### How it compares

| | This Actor | Copying from stepstone.de by hand | StepStone's own job alerts |
|---|---|---|---|
| Jobs per run | Up to the whole country (~205,000) | A few dozen per hour | Notification emails |
| Structured fields | 48 columns, typed | Manual | No export |
| Salary range as numbers | Yes | Manual | No |
| Full description split into sections | Yes | Manual | No |
| Company size, industries, rating | Yes | Manual | No |
| Export CSV / Excel / JSON / API | Yes | No | No |
| Automation (schedule, webhooks, Make, Zapier, n8n) | Yes | No | Email only |
| Login needed | No | No | Yes |
| Honest failure when StepStone is unreachable | Yes (run fails with the reason) | — | — |

***

### FAQ

#### What is StepStone Scraper?

An Apify Actor that exports job ads from stepstone.de, stepstone.at and stepstone.be — title, company, location, salary estimate, home office, contract type, full description, address and company data — as JSON, CSV or Excel, for any search, region or the whole country.

#### Is there an official StepStone API for job data?

StepStone offers APIs to employers for posting ads, not a public API to read job listings. This Actor reads the public job pages any visitor sees and returns them as structured data, so it works as a StepStone API alternative for job data.

#### How do I scrape StepStone jobs to Excel or CSV?

Run the Actor with your search, open the Output tab and click **Export → Excel** (or CSV). Through the API add `format=xlsx` or `format=csv` to the dataset-items URL.

#### Do I need a StepStone account, login or cookies?

No. Everything is public; no account, cookies or API key of yours are needed.

#### Do I need proxies?

No. The Actor uses a direct connection at a pace StepStone accepts. Only while StepStone holds that connection does it send a limited number of requests (at most 80 per run) through residential IPs — included in the price.

#### How many jobs can I scrape from StepStone?

As many as StepStone lists: about 205,000 on stepstone.de, 9,600 on stepstone.at and 10,100 on stepstone.be (2026-10-18). StepStone has no page limit, so whole regions and the whole country can be exported.

#### How fast is it?

50 jobs with full details in 6.6 s, 1,000 jobs with full details in 90 seconds; search data alone runs more than ten times faster (see [Scale and speed](#scale-and-speed-measured)).

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

$1.00–$1.50 per 1,000 jobs depending on your Apify plan, everything included — e.g. 10,000 jobs cost $10–$15.

#### Does it get salaries from StepStone?

Yes — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` and `salaryType`. On stepstone.de 68–76 % of ads carry StepStone's salary estimate (measured 2026-10-18); `salaryType` says whether a range is StepStone's estimate or stated by the employer.

#### What does "StepStone estimate" mean in salaryType?

StepStone calculates an expected salary range for ads without a published salary ("Gehaltsschätzung"). It is StepStone's prediction, not the employer's offer — use it for benchmarks, not as a promise.

#### Can I scrape only remote or home-office jobs?

Yes: `"workFromHome": ["full"]` for fully remote, `["partial"]` for hybrid, or both.

#### Can I filter by salary?

On stepstone.de: `"minSalary": 60000` keeps jobs with at least 60,000 EUR per year (StepStone's filter works in 10,000 steps). Every row also has the numbers, so you can filter further in your spreadsheet.

#### Can I get all jobs in one city or one federal state?

Yes — put the city or state into `locations` and set `maxItems` to `0`. Berlin had 15,022 matching jobs, München 11,037 and Bayern 38,035 on 2026-10-18.

#### Can I export every job on stepstone.de?

Yes: leave search terms and locations empty and set `maxItems: 0`. Raise your Maximum cost per run to cover ~205,000 results.

#### How do I get the jobs of one company?

Paste the company's StepStone job list (`https://www.stepstone.de/cmp/de/<company>-<id>/jobs`) into `startUrls`.

#### Can I paste a StepStone search URL with my filters?

Yes. Any search page from stepstone.de, .at or .be works, including categories, sectors, cities and skills you selected on the site.

#### Does it work for StepStone Austria and Belgium?

Yes — set `country` to `at` or `be`, or paste URLs from those sites. Belgian labels can be English, Dutch or French.

#### What are "similar jobs" and "nearby jobs"?

After the real matches StepStone appends loosely related jobs ("similar") for keyword searches and jobs from the wider region ("nearby") for city searches. They are skipped by default and included with `includeSimilarJobs: true`; `resultType` says which kind each row is.

#### Why did I get fewer jobs than StepStone's headline number?

StepStone's headline often includes the similar jobs, which are skipped by default. Also, jobs found by two of your searches are saved once, and StepStone's numbers change while the run reads.

#### How do I monitor new StepStone jobs every day?

Schedule a run with `"postedWithin": "1"` and `"sortBy": "date"` and connect a webhook, Google Sheets or Slack.

#### Are duplicates removed?

Yes. Every job is de-duplicated by its StepStone id within a run, also across several searches and pages.

#### What is in the description fields?

`description` is the complete ad text; `introduction`, `responsibilities`, `requirements`, `benefits` and `additionalInformation` are the same ad split into StepStone's sections, so you can analyse requirements or benefits on their own.

#### Are the job ads in English?

Ads stay in the language the employer wrote them in (mostly German on stepstone.de). StepStone's labels (contract type, work type, badges) are English by default and can be German, Dutch or French. Use `jobLanguages: ["en"]` to get only English-language ads.

#### Does it include the employer's contact person or email?

Only when the employer wrote it into the ad text (`additionalInformation` / `description`). The Actor does not collect data about candidates.

#### Why is the postal code empty for some jobs?

Some ads give only a region ("deutschlandweit") or several locations; StepStone then publishes no postal code. Invalid placeholders such as `00000` are removed rather than passed on.

#### What happens if StepStone blocks or changes something?

The Actor slows down when StepStone refuses requests, retries, and — if nothing works — fails with the reason in the log and in the SUMMARY record. It never reports an empty dataset as a successful search.

#### Can I use the data with AI or an LLM?

Yes — through the API, webhooks or the Apify MCP server. The sectioned description fields are well suited for embeddings, matching and summarisation.

#### Can I get the original HTML of the job ad?

Yes: `"includeDescriptionHtml": true` adds `descriptionHtml`.

#### Wie kann ich StepStone Stellenanzeigen exportieren?

Suchbegriffe und Orte eintragen (z. B. "Vertrieb" und "Hamburg"), starten und das Ergebnis im Output-Tab als Excel, CSV oder JSON exportieren — ohne Login.

#### Kann ich alle Jobs in einem Bundesland herunterladen?

Ja: das Bundesland als Ort eintragen (z. B. "Bayern", "Nordrhein-Westfalen") und `maxItems` auf `0` setzen.

#### Gibt es Gehaltsdaten?

Ja — die Gehaltsschätzung von StepStone als Min-/Max-Betrag mit Zeitraum (Jahr/Monat/Stunde) für 68–76 % der Anzeigen auf stepstone.de (gemessen am 2026-10-18).

#### Kann ich nur Homeoffice- oder Remote-Jobs scrapen?

Ja: `workFromHome` auf `["full"]` (nur Homeoffice) oder `["partial"]` (teilweise Homeoffice) setzen.

#### I need a field or filter that is missing. Can you add it?

Yes — open an issue on the Actor's Issues tab and describe what you need.

***

### Glossary

| Term | Meaning |
|---|---|
| **Predicted salary / Gehaltsschätzung** | StepStone's own estimate of the salary range for an ad without a published salary (`salaryType: "StepStone estimate"`). |
| **Homeoffice / Teilweise Home-Office / Nur Home-Office** | Home office possible / partially remote (hybrid) / fully remote (`workFromHome`). |
| **Vollzeit / Teilzeit** | Full-time / part-time (`workType`, filter `workType`). |
| **Feste Anstellung** | Permanent contract (`contractTypes: ["permanent"]`). |
| **Befristeter Vertrag** | Fixed-term contract (`temporary`). |
| **Arbeitnehmerüberlassung** | Temporary agency work / staffing (`temp_agency`). |
| **Werkstudent / Studentenjob** | Working student / student job (`student_job`). |
| **Praktikum** | Internship (`internship`). |
| **Ausbildung / duales Studium** | Apprenticeship / dual study (`apprenticeship`). |
| **Berufseinstieg / Trainee** | Entry level / graduate programme (`entry_level`). |
| **Referendariat** | Legal / teaching traineeship (`traineeship`). |
| **Schnelle Bewerbung / Easy Apply** | Quick application through StepStone (`easyApply`). |
| **Anschreiben nicht erforderlich** | No cover letter required (`noCoverLetter`). |
| **Disziplin** | StepStone's job category (`discipline`, `subDiscipline`). |
| **Similar / nearby jobs** | Suggestions StepStone appends after the real matches (`resultType`). |
| **Maximum cost per run** | The spending limit Apify applies to a pay-per-result run. |

***

### Is it legal to scrape StepStone?

This Actor reads only publicly available job ads — the same pages any visitor sees on StepStone without logging in — and collects business information that employers publish to be seen. It does not log in, does not bypass access controls, and does not collect data about job seekers. Some ads contain the name of a contact person or an application email written by the employer; if you store or process such personal data, the GDPR (DSGVO) applies to you: have a legitimate purpose, keep only what you need, and delete it when it is no longer needed. You are responsible for using the data in line with StepStone's terms, applicable law and your own policies; if in doubt, ask a lawyer.

**Legal and trademark disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by StepStone, The Stepstone Group or any of their subsidiaries. All trademarks are the property of their respective owners.

***

### Changelog

- **1.0 (2026-10-18)** — First release: stepstone.de, stepstone.at and stepstone.be; keyword × location searches with StepStone's filters (posting date, full-/part-time, 14 contract types, experience, home office, minimum salary, Easy Apply, ad language, radius, sort); pasted search, company and job URLs; every page of a search to its end (no page cap on StepStone); matches only by default, similar/nearby jobs optional; job pages with full description split into sections, contract / work / employment type, discipline, postal code, street, coordinates and company size / industries / rating / open jobs; StepStone salary estimate as numbers; English / German / Dutch / French labels; self-pacing connection; pay-per-result budget handled cleanly.

***

### Support

Questions, a bug, or a field you need? Open an issue on the **Issues** tab — we reply **within 24 hours**. If a run did something unexpected, include the run link so we can look at its log and SUMMARY.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/stepstone-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, keywords or skills, e.g. "software engineer", "Pflegefachkraft", "SAP ABAP", "Vertrieb". Each term is one StepStone search. Leave empty to export every job in the locations below (or in the whole country).

## `locations` (type: `array`):

Cities, regions or the country as StepStone knows them, e.g. "Berlin", "München", "Hamburg", "Bayern", "Nordrhein-Westfalen", "Wien", "Brussel", "Deutschland". Every search term is combined with every location. Empty = the whole country.

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

Which StepStone site to search: Germany (stepstone.de, ~205,000 jobs), Austria (stepstone.at, ~9,600) or Belgium (stepstone.be, ~10,100). Pasted URLs below always use their own site.

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

Optional. StepStone's search radius around a city (StepStone's default is 30 km). Ignored without a location.

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

Only jobs published in the last 24 hours or the last 7 days (StepStone's own filter).

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

Only full-time or only part-time jobs.

## `contractTypes` (type: `array`):

Any of these contract types (empty = all). Some types exist only on one site: StepStone Belgium has no entry-level, thesis or doctorate types; temp-to-perm is Belgium only.

## `experienceLevels` (type: `array`):

Any of these experience levels (empty = all).

## `workFromHome` (type: `array`):

Only jobs with partial and/or full home office (empty = all jobs).

## `minSalary` (type: `integer`):

Only jobs whose salary — StepStone's estimate when the employer gives none — is at least this much per year. StepStone filters in steps of 10,000 (10,000–100,000); the value is rounded down. 0 = no filter.

## `easyApplyOnly` (type: `boolean`):

Only jobs you can apply to on StepStone in a few clicks ("Schnelle Bewerbung").

## `jobLanguages` (type: `array`):

Only ads written in these languages (StepStone detects the language of each ad). Empty = all.

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

Optional. Paste StepStone search pages with any filters (https://www.stepstone.de/jobs/...), company job pages (https://www.stepstone.de/cmp/de/...-123/jobs) or job pages (...-inline.html) from stepstone.de, .at or .be. If you give only URLs, only the URLs are scraped.

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

Stop after this many unique jobs across all searches. 0 = no limit (every matching job — the whole of stepstone.de is ~205,000 jobs).

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

Reads each job page: full description plus its sections (introduction, responsibilities, requirements, benefits, contact), contract and work type, employment type, discipline, postal code, street and coordinates, and the company's size, industries and rating. Turn off for the fastest bulk export (search data only).

## `includeSimilarJobs` (type: `boolean`):

After the jobs that match a keyword StepStone appends "similar jobs" (e.g. 128 matches for "SAP ABAP" plus 7,600 similar ones), and after a city's jobs it appends jobs from the wider region. Off = only real matches. Every row says which kind it is in resultType.

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

Newest first (best for monitoring and big exports) or StepStone's relevance ranking.

## `language` (type: `string`):

Language of StepStone's labels in the output (contract type, work type, badges). Job ads stay in the language they were written in. German exists on .de/.at, Dutch and French on .be.

## `includeDescriptionHtml` (type: `boolean`):

Also keep the job description with its original HTML formatting (descriptionHtml). Off keeps rows small.

## `maxRequestsPerSecond` (type: `integer`):

Upper limit for the request pace (search pages and job pages together). Measured on 2026-10-18: up to 16 per second is accepted, 30 per second gets the connection blocked after ~180 requests. The scraper slows down by itself when StepStone refuses requests and speeds up again afterwards. Default 12.

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

Optional. The scraper reads StepStone over a direct connection (no proxy cost) at a pace StepStone accepts. If StepStone puts that connection on hold, up to 80 requests automatically go through residential IPs so small runs still finish. For long runs through a hold, set Apify RESIDENTIAL here — datacenter proxies are refused by StepStone (measured).

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "locations": [
    "Berlin"
  ],
  "country": "de",
  "postedWithin": "any",
  "workType": "any",
  "contractTypes": [],
  "experienceLevels": [],
  "workFromHome": [],
  "minSalary": 0,
  "easyApplyOnly": false,
  "jobLanguages": [],
  "startUrls": [],
  "maxItems": 50,
  "includeDetails": true,
  "includeSimilarJobs": false,
  "sortBy": "date",
  "language": "en",
  "includeDescriptionHtml": false,
  "maxRequestsPerSecond": 12,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All jobs collected in 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 = {
    "searchTerms": [
        "software engineer"
    ],
    "locations": [
        "Berlin"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "searchTerms": ["software engineer"],
    "locations": ["Berlin"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "searchTerms": [
    "software engineer"
  ],
  "locations": [
    "Berlin"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call logiover/stepstone-scraper --silent --output-dataset

```

## MCP server setup

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