# StepStone Jobs Scraper & API: Salary Estimates, Germany (`s_actors/stepstone-jobs-scraper`) Actor

Scrape StepStone.de and StepStone.at jobs with salaries for most office and IT jobs (StepStone's own estimate, hidden in search), exact-match filter, English jobs, all site filters, min salary, address, company size, job alerts. Excel, CSV, JSON.

- **URL**: https://apify.com/s\_actors/stepstone-jobs-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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 Jobs Scraper & API: Salary Estimates, Germany and Austria

Scrape **StepStone.de and StepStone.at jobs** to Excel, CSV or JSON **without login**, with a **salary for most jobs**. What sets it apart:

- **StepStone's own salary estimate on every job that has one.** StepStone hides pay in search results behind a login ("Gehalt anzeigen") and most German employers post none, so other scrapers return salary for under 10% of jobs. This Actor reads the estimate StepStone shows on the job page: in our test **88 of 100 jobs** in Germany came with a salary range, converted to a year (`salaryYearlyMin`, `salaryYearlyMax`). stepstone.at ads state the pay by law: it is read from the ad text.
- **Minimum salary filter.** "Only jobs paying at least €70,000 a year": jobs below or without salary are dropped for free.
- **Exact matches only, if you want.** StepStone pads every search with "similar" job titles and jobs from other regions: "data analyst" in Berlin shows 1 018 results, only **44** are data analyst jobs in Berlin. Every row has `matchType` (exact / similar / nearby) and you can keep only exact matches.
- **English-speaking jobs in Germany**, fully or partly remote, working student, internship, quick apply: all StepStone filters.
- **Full job details**: tasks, requirements and offer as separate fields, street address with coordinates, contract type (permanent, fixed-term, Werkstudent…), company size, industries and benefits.
- **Job alerts, no reposts.** Schedule it and get only the jobs you have not seen.

```json
{ "keywords": ["data analyst"], "locations": ["Berlin"], "minYearlySalary": 60000, "matchType": "exactOnly" }
```

No StepStone account, no cookies. Use it as a **StepStone jobs API**: one call returns clean JSON with the fields above.

#### What you get

**One row per job.** Real example, September 2026 (Germany):

| job | company | city | salary per year | remote | contract |
|---|---|---|---|---|---|
| Data Analyst (all genders) | BNP Paribas S.A. | München | €56,000 - €77,000 (StepStone estimate) | hybrid | Permanent |
| Data Analyst (m/w/d) Power BI | G\&N Holding GmbH | Langenfeld | €48,000 - €69,000 (StepStone estimate) | hybrid | Permanent |
| Softwareentwickler (m/w/d) | DAT Deutsche Automobil Treuhand | Ostfildern | €52,000 - €71,000 (StepStone estimate) | | Permanent |
| Buchhalter/in (m/w/d) | Muehlhan Holding GmbH | Hamburg | €36,000 - €50,000 (StepStone estimate) | hybrid | Permanent |
| Projektmanager Wärmenetze (m/w/d) | Stadtwerke Emden GmbH | Emden | €46,000 - €72,000 (StepStone estimate) | hybrid | Permanent |

In our test of 100 jobs (data analyst, Softwareentwickler, Buchhalter, Projektmanager in Germany, September 2026) 88 had a salary, 74 an exact street address with coordinates, 59 the company size and 62 were partly remote. The share of salaries depends on the job: office and IT jobs 80-100%, nursing and trades jobs rarely have an estimate.

| Field | Description |
|---|---|
| `jobId`, `jobUrl`, `title` | The job and its StepStone page |
| `companyName`, `companyId`, `companyUrl`, `companyLogo` | The employer and its StepStone profile |
| `location`, `workplaceType`, `workplaceTypeEvidence` | Where; `remote` or `hybrid` from StepStone's home office flag |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryYearlyMin`, `salaryYearlyMax` | Pay as shown and per year |
| `salarySource`, `salaryIsEstimate` | `stepstone-estimate` (StepStone's estimate for full-time), `employer` or `description` (stated in the ad) |
| `matchType` | `exact`, `similar` (a title StepStone added as similar) or `nearby` (outside your place or radius) |
| `postedDate`, `postedAt`, `validThrough` | When the job was published and until when it runs |
| `employmentType`, `workSchedule` | Permanent, fixed-term, working student, internship, freelance…; full-time, part-time, home office possible |
| `easyApply`, `noCoverLetter`, `isSponsored`, `isTopJob` | StepStone quick apply, "no cover letter needed", sponsored |
| `streetAddress`, `postalCode`, `city`, `region`, `country`, `latitude`, `longitude` | Exact address of the workplace (commute, maps) |
| `companySize`, `companyIndustries`, `companyBenefits`, `companyJobsCount` | Employees ("251-1000"), industries, benefits (company pension, company car, home office…), open jobs |
| `tasks`, `requirements`, `offer`, `description`, `descriptionHtml` | The ad split into its sections, and in full |
| `industries`, `skills` | StepStone's categories for the job |
| `searchKeyword`, `searchLocation`, `searchUrl`, `isNew`, `scrapedAt` | Which search found the job; job alerts |

Five table views: **Jobs**, **Salaries**, **Companies**, **Addresses & map** and **Tasks & requirements**.

#### How it works

| Step | What happens |
|---|---|
| 1. Search | Each keyword in each location (or your pasted StepStone links), 25 jobs a page, as deep as StepStone goes (up to page 400) |
| 2. Filters | StepStone's own filters (date, home office, language, contract type, experience, hours, quick apply, radius), then ours: match type, title words, companies, sponsored. Jobs removed here are not charged |
| 3. Job pages | By default only for jobs StepStone has a salary for: salary, full description, address, company. Or for every job, or none |
| 4. Salary filter | Minimum salary per year and "only with salary" apply after the job page; jobs that fail are not charged |
| 5. Clean-up | The same job found by several searches appears once; reposts (same title, company and place) are skipped |
| 6. Job alerts | With **Only new jobs** on, jobs from earlier runs are skipped and not charged |

#### Why this Actor

| | This Actor | Typical StepStone scraper |
|---|---|---|
| Salary | ✅ StepStone estimate + stated pay, **88 of 100 jobs** in our test, per year | ⚠️ Only when the employer posts it (under 10%) |
| Minimum salary filter | ✅ | ❌ |
| Only exact matches (no padding with similar titles) | ✅ `matchType` + filter | ❌ Everything StepStone returns |
| English jobs, home office, contract type, experience, quick apply | ✅ | ✅ |
| Street address with coordinates, company size and benefits | ✅ With job pages | ⚠️ Some |
| Tasks / requirements / offer as separate fields | ✅ | ❌ Only full text |
| stepstone.de and stepstone.at | ✅ | ⚠️ Some |
| Job alerts (only new jobs) | ✅ Seen jobs not charged | ⚠️ Some |
| Filtered-out jobs and reposts | ✅ Free | ❌ Charged, or not filtered |
| Price per 1 000 jobs | **$1.00** with salary and details, $0.50 without | $1-$2.50, mostly without salary |

#### Pricing

Pay per event, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Job (search data: title, company, place, date, match type, labels) | $0.0005 | $0.00045 | $0.0004 |
| Job page (salary, full description, address, company), by default only for jobs with a salary | $0.0005 | $0.00045 | $0.0004 |

**1 000 jobs with salary and details = $1.00**, search data only $0.50. Free: jobs removed by your filters, reposts, jobs already seen by a job alert. Platform usage and proxy are included. Set a maximum cost per run in the run options: the Actor stops there.

#### Ready-made tasks

| Task | What it does |
|---|---|
| [StepStone Salary Data: Jobs in Germany With Salaries](https://apify.com/s_actors/stepstone-jobs-scraper/examples/stepstone-jobs-with-salary) | Data analyst jobs in Germany with StepStone's salary estimate per year |
| [English-Speaking Jobs in Germany From StepStone](https://apify.com/s_actors/stepstone-jobs-scraper/examples/english-speaking-jobs-germany) | Jobs in Germany posted in English, for expats and English speakers |
| [StepStone Austria Jobs in Vienna With Salaries](https://apify.com/s_actors/stepstone-jobs-scraper/examples/stepstone-austria-jobs-vienna) | stepstone.at jobs in Vienna with the salary stated in the ad |

#### Job alerts

1. Set your keywords, locations and filters, turn on **Only new jobs**, give the alert a **Monitor name**.
2. Save it as a task and add a **schedule** (every morning, with "Posted within: Past 24 hours").
3. Send the results by email, Slack, Google Sheets, Make, Zapier or **n8n** with Apify integrations.

The first run returns the current jobs; next runs return only jobs not seen before.

#### FAQ

**Where does the salary come from?** StepStone calculates a salary range for most jobs and shows it on the job page as "geschätzt für Vollzeit" (estimated for full-time); in search results it is hidden behind a login. `salarySource` tells which one you got: `stepstone-estimate`, `employer` (the employer's own number) or `description` (found in the ad text). For part-time jobs the estimate is still for full-time.

**Why does StepStone show so many results that do not match?** For most searches StepStone adds jobs with "similar" titles and jobs outside your place (1 018 results for "data analyst" in Berlin, 44 exact). Choose **Match type: Exact matches only** or filter by `matchType`.

**Which keywords and locations work?** Anything you type into StepStone: job titles in German or English ("Softwareentwickler", "data analyst"), skills ("SAP", "Python"), company names; cities, postal codes, states ("Bayern") or "Deutschland". Or paste a StepStone search link with any filters.

**Does it work for stepstone.at?** Yes: choose **StepStone site: Austria**. Austrian ads must state the minimum pay (Kollektivvertrag), so salary comes from the ad text (€ per month or year, converted to a year).

**How many jobs per search?** As many as StepStone lists: 25 a page, up to page 400.

**Do I need a StepStone account?** No. Only pages any visitor can open are read.

#### Use with the API and AI agents

Run it from the Apify API, the JavaScript or Python client, **n8n**, Make or Zapier, or from AI agents through the [Apify MCP server](https://mcp.apify.com) (Claude, ChatGPT, Cursor). One call: `POST https://api.apify.com/v2/acts/s_actors~stepstone-jobs-scraper/run-sync-get-dataset-items` with the input above returns the jobs as JSON. Set **Job description** to "None" for smaller answers.

#### Is it legal?

The Actor reads public StepStone job listings that anyone can open without an account, as a visitor does. It does not log in or collect personal profiles. Use the data according to the laws that apply to you (GDPR and similar) and StepStone's terms.

# Actor input Schema

## `keywords` (type: `array`):

Job title, skill or company, one per line, in German or English: "data analyst", "Softwareentwickler", "Pflegefachkraft", "SAP", "Werkstudent". Each keyword is searched in each location.

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

City, postal code, state or country as on StepStone: "Berlin", "München", "10115", "Bayern", "Deutschland", "Wien". Empty = the whole country.

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

stepstone.de has StepStone salary estimates; stepstone.at ads state the pay by law, it is read from the ad text.

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

Around the location, as on the site (5, 10, 20, 30, 40, 50, 75, 100). Empty = StepStone default (30 km).

## `maxJobsPerSearch` (type: `integer`):

Per keyword and location (and per search link). StepStone serves 25 jobs a page and goes up to page 400.

## `matchType` (type: `string`):

StepStone pads a search with "similar" job titles and jobs outside the place: "data analyst" in Berlin = 1 018 results, only 44 exact. Every row has matchType = exact / similar / nearby. Removed jobs are free.

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

Only jobs published in this period.

## `remote` (type: `string`):

StepStone's home office filter.

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

English = jobs in Germany written in English (for English speakers and expats).

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

Any of the selected. Empty = all.

## `experience` (type: `array`):

Any of the selected. Empty = all.

## `workTypes` (type: `array`):

Empty = both.

## `quickApplyOnly` (type: `boolean`):

Only jobs with StepStone "Schnelle Bewerbung" (apply with the StepStone profile).

## `minYearlySalary` (type: `integer`):

Only jobs whose salary (StepStone estimate or stated in the ad), converted to a year, reaches this amount at the top of the range. Jobs without salary are left out (free).

## `onlyWithSalary` (type: `boolean`):

Skip jobs without a salary (free).

## `jobPages` (type: `string`):

StepStone hides the salary in search results; the job page shows StepStone's own estimate. A job page also adds the full description split into tasks / requirements / offer, street address with coordinates, contract type, company size, industries and benefits. Charged per job page.

## `titleInclude` (type: `array`):

Keep only jobs whose title contains one of these words (case-insensitive).

## `titleExclude` (type: `array`):

Drop jobs whose title contains any of these words: "Senior", "Praktikum", "Werkstudent".

## `companyExclude` (type: `array`):

Drop jobs of companies whose name contains any of these words (e.g. staffing agencies: "Hays", "Randstad", "Personal").

## `skipSponsored` (type: `boolean`):

Drop jobs StepStone marks as sponsored.

## `skipDuplicates` (type: `boolean`):

The same title + company + location only once (companies post one job many times).

## `onlyNewJobs` (type: `boolean`):

Return only jobs not seen in earlier runs with the same monitor name. Schedule the Actor daily to get new jobs only (seen jobs are free).

## `monitorName` (type: `string`):

Separate memory for each alert: "berlin-data", "wien-sap".

## `searchUrls` (type: `array`):

Search pages copied from the browser with any filters: stepstone.de/jobs/data-analyst/in-berlin?fdl=en\&wfh=2. Also /work/... links and stepstone.at.

## `jobUrls` (type: `array`):

Full data of specific jobs: stepstone.de/stellenangebote--...--<id>-inline.html links or job IDs (stepstone.de).

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

Order of StepStone results. With a 3-day, 2-week or month window newest first is used automatically.

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

Full description from the job page (tasks, requirements and offer are also separate fields). Without a job page a short snippet is returned.

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

How many StepStone pages load at once.

## `debugLog` (type: `boolean`):

Log every failed attempt.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "locations": [
    "Berlin"
  ],
  "country": "de",
  "maxJobsPerSearch": 100,
  "matchType": "all",
  "postedWithin": "anyTime",
  "remote": "any",
  "language": "any",
  "quickApplyOnly": false,
  "onlyWithSalary": false,
  "jobPages": "withSalary",
  "skipSponsored": false,
  "skipDuplicates": true,
  "onlyNewJobs": false,
  "sortBy": "relevance",
  "descriptionFormat": "text",
  "maxConcurrency": 10,
  "debugLog": false
}
```

# Actor output Schema

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

The main job fields.

## `salaries` (type: `string`):

Salary per year and its source.

## `companies` (type: `string`):

Company size, industries, benefits, open jobs.

## `addresses` (type: `string`):

Street address and coordinates.

## `description` (type: `string`):

The job description split into tasks, requirements and offer.

## `all` (type: `string`):

Every field of every job.

# 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 = {
    "keywords": [
        "data analyst"
    ],
    "locations": [
        "Berlin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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 = {
    "keywords": ["data analyst"],
    "locations": ["Berlin"],
}

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

```

## MCP server setup

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