# Stepstone Jobs Scraper: Germany, Austria & Belgium (`quarra/stepstone-jobs-scraper`) Actor

Scrape job postings from Stepstone (stepstone.de, .at, .be): search by keyword and city, or paste search links. Title, company, location, home office, salary (Stepstone's estimate flagged as such), snippet, benefits, dates. Only new jobs mode for daily runs.

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

## Pricing

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

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: Germany, Austria & Belgium

Get job postings from **Stepstone** (stepstone.de, stepstone.at, stepstone.be) by keyword and city, or by pasting the
search pages you already use in your browser, filters included. Each job comes with its title, company, location,
home office status, salary, publication and expiry dates, a short description and the benefits the employer lists.
Export as JSON, CSV or Excel, or read it through the Apify API.

**$0.70 per 1,000 jobs**, plus $0.005 per run. Jobs removed by your filters, duplicates and failed searches are not
charged.

### Why this one

- **Estimated salaries are flagged.** Stepstone adds its own salary estimate to most German jobs. We never pass it off
  as pay: `salaryIsEstimated` is `true` for Stepstone's estimate and `false` for a salary the employer wrote, and
  **Only jobs with a salary written by the employer** keeps the second kind only.
- **Only the results of your search.** Below the results, Stepstone adds suggestions: jobs in other places and jobs
  with similar titles (more than half of a search like "data scientist" in Berlin). They are left out and never
  charged unless you turn on **Include Stepstone's suggestions**; each job says where it comes from in `section`.
- **Home office as Stepstone files it.** `workplaceType` is `hybrid` when Stepstone shows home office as possible,
  `remote` for the jobs Stepstone files under "home office only" (its own filter, used when you pick it), and `null`
  when the job says nothing. A job that does not mention home office is never reported as on-site.
- **Many searches in one run.** Every keyword is searched in every city; a job found by two searches is delivered
  and charged once, by its Stepstone ID.
- **Only new jobs.** Schedule the same searches every day: each run delivers only the jobs it has not delivered
  before. Jobs already delivered are never charged again.
- **No personal data**: recruiter contact blocks are removed from the text fields (`snippet`, `benefitsText`). A line or
  sentence with a phone number, a personal e-mail address or the name of a contact person is replaced by `[removed]`,
  with the name and job title lines of the signature next to it; in a long line or a list, only the part of the sentence
  that holds the name, phone number or e-mail goes, and the list around it stays. A company's service address (`jobs@…`, `hr@…`) is
  replaced alone, and the hiring company's own name always stays. A brand that reads like a person's name may go with
  a contact sentence it sits in. On 3,096 real texts from the three sites, no recruiter name, e-mail or phone number was
  left and 0.18% of the text was removed.
- **Never a silent empty run.** A search that finds nothing, a link that is not a Stepstone search, a page that cannot
  be read: each gets a free error record or a status that says why, and the run summary lists every search with its
  count.

### Quick start

1. Type one or more **Keywords** (`data scientist`, `Pflegefachkraft`, `Buchhalter`) and, if you want, **Locations**
   (`Berlin`, `München`, `Wien`).
2. Pick the **Country** (Germany by default), or paste Stepstone search links in **Search links**.
3. Click **Start** and read the jobs in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### Inputs

| Field | What it does |
|---|---|
| **Keywords** | One job title or search word per line. Each keyword is searched in each location. `C++` and `C#` are searched the way Stepstone writes them; `.NET` alone is refused (Stepstone drops the dot and finds unrelated jobs): write `.NET Developer`. A keyword with no letter or digit is refused with a free error record. |
| **Locations** | Optional, one city or region per line. Empty = the whole country. A location with no keyword lists every job there. Write the city alone: what follows a comma (`Berlin, Deutschland`) is not read by Stepstone and is left out. `Nordrhein-Westfalen` and the usual abbreviations of the German states (`BW`, `BY`, `NDS`…) are searched under the name Stepstone understands. Up to 100 keywords and 100 locations, 500 searches per run. |
| **Country** | stepstone.de, stepstone.at or stepstone.be, for the keywords and locations. |
| **Radius around the location** | In km, up to 200. Empty = 30 km, the radius Stepstone's own search box uses; `0` = the city only. |
| **Search links** | A Stepstone search page as shown in your browser, with its filters (`https://www.stepstone.de/jobs/data-scientist/in-berlin?ct=222`). A link keeps its own site. |
| **Posted within (Stepstone's own filter)** | Any time, last day or last 7 days: Stepstone's own date filter, passed as is, like its "Datum" menu. Stepstone does not keep it exact: on a test search (19 October) its 7-day list gave 29 of the 59 jobs posted in the last 7 days, and both lists also held jobs posted two weeks earlier. To miss nothing, run a watch (**Only new jobs**) without it: each run then delivers only the jobs it has not delivered before. A search link keeps its own date filter. |
| **Home office** | Any, home office only, partly home office, or either, filtered by Stepstone itself. |
| **Only jobs with a salary written by the employer** | Leaves out jobs with no salary and jobs with only Stepstone's estimate. Few employers write the pay: expect a small share of the jobs, often none. |
| **Include Stepstone's suggestions** | Off by default: only the results of your search. On: the jobs Stepstone suggests below them (other places, similar titles) are delivered and charged too, with their `section`. |
| **Only new jobs** + **Watch name** | Deliver only the jobs this watch has not delivered before. Watch names are case-sensitive (`Berlin Jobs` and `berlin jobs` are two watches); extra spaces are ignored. |
| **Max jobs per search** | Up to 150 (Stepstone's own limit per search). |
| **Max results** | Total number of jobs of the run, all searches together, counted exactly. 1 or more (0 is refused). |

A job that does not state what a filter checks (no salary, no home office information) is left out by that filter,
and never charged.

### Output

One record per job:

```json
{
  "type": "job",
  "status": "ok",
  "site": "de",
  "jobId": "14519393",
  "title": "Data Scientist Supply Chain Consulting (d/w/m)",
  "company": "4flow",
  "companyId": 2033,
  "companyUrl": "https://www.stepstone.de/cmp/de/4flow-2033/jobs",
  "companyLogoUrl": "https://www.stepstone.de/upload_DE/logo/7/logo4flow-2033DE-2605281000.gif",
  "location": "Berlin",
  "postalCode": null,
  "workplaceType": "hybrid",
  "salaryMin": 55000,
  "salaryMax": 79000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "salaryText": null,
  "salaryIsEstimated": true,
  "publishedAt": "2026-10-18T07:03:08Z",
  "expiresAt": "2026-11-17T07:30:49Z",
  "url": "https://www.stepstone.de/stellenangebote--Data-Scientist-Supply-Chain-Consulting-d-w-m-Berlin-4flow--14519393-inline.html",
  "snippet": "4flow ist ein Marktführer in Logistikoptimierung mit Beratung, Software und 4PL-Leistungen an 20+ Standorten weltweit…",
  "benefitsText": "- Spannende internationale Projekte sowie aktive Gestaltung deines Jobprofils und -werdegangs\n- Persönliche und professionelle Entwicklung…",
  "labels": null,
  "isSponsored": false,
  "isTopJob": false,
  "section": "main",
  "input": "data scientist | Berlin",
  "position": 1,
  "scrapedAt": "2026-10-19T01:40:12Z"
}
```

- `snippet` is the short description Stepstone shows in its results (2 to 3 sentences); `benefitsText` the benefits
  the employer lists, as plain text with one benefit per line.
- `labels` keeps Stepstone's own codes: `QUICK_APPLY` (short application form), `NO_COVER_LETTER`.
- `section` is `main` for a result of your search, `regional` (another place) or `semantic` (a similar title) for
  Stepstone's suggestions, delivered only with **Include Stepstone's suggestions**.
- `salaryPeriod` is `year`, `month` or `hour`. `salaryIsEstimated` is `null` when there is no salary, or when Stepstone does not say whether it is its estimate. `isSponsored` and `isTopJob` are `null` when Stepstone does not say. A salary the employer wrote as text (`salaryText`, no figures) counts as written by the employer.
- With **Only new jobs**, each job also has `"isNew": true`.

Error records (free) have `type: "error"`, an `errorCode`, a clear `error` message and `retryable`. The run summary
(OUTPUT record) gives, per search, the site, the jobs delivered, the total Stepstone announced and a note.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Job | $0.70 per 1,000 |
| Run start | $0.005 per run |

Never charged: jobs removed by your filters, a job found by more than one search, jobs already delivered to your
watch, error records. Set **Maximum cost per run** in the run options and the run stops before going over it.

### What we measured

On 18 and 19 October 2026, on Apify:

- **Speed**: 125 data scientist jobs in Berlin in 17 seconds; the default input in 5 seconds with 256 MB
  of memory.
- **Salaries**: of 452 data scientist and accountant jobs in Berlin and Munich, 372 had a salary and all 372 were
  Stepstone's estimate; not one was written by the employer. Jobs on stepstone.at and stepstone.be showed no salary
  at all.
- **150 jobs per search, at most**: Stepstone stops every search after 6 pages of 25, whatever total it announces
  (11,075 for "Pflegefachkraft"). The run says when a search had more, so you can split it by city or keyword.
- **Several searches in one run**: "data scientist" and "Buchhalter" in Berlin and in Munich, four searches, gave
  452 jobs in 39 seconds, every job ID distinct. 39 jobs listed by two of the searches were delivered and charged
  once. The two accountant searches announced 952 and 762 jobs; the run said both were capped by Stepstone.
- **Belgium**: 100 data analyst jobs in Brussels in 9 seconds, each with its snippet; 86 listed benefits and 32
  stated home office.
- **Results, not suggestions** (19 October): for "data scientist" in Berlin, Stepstone listed 32 results of the search,
  then 4 jobs from other places and about 50 with other titles. The run delivers the 31 to 32 results.
- **Posted within** (19 October, "Mechatroniker" in Stuttgart, city only, 131 results, compared with every result of the
  search): last 7 days, 31 jobs: 29 of the 59 posted in the last 7 days, plus 2 posted 13 days earlier. Last day, 5 jobs:
  2 of the 5 posted in the last day, plus the same 2 older ones. That is Stepstone's own filter; a watch gets every job.
- **Home office only**: "Softwareentwickler", home office only: 30 jobs, the 30 Stepstone lists under that filter.

### Limits

- Up to 100 keywords and 100 locations per run, and 500 searches (keywords × locations, plus search links) in all.
- Three sites: stepstone.de, stepstone.at and stepstone.be. Other Stepstone countries now send visitors to other
  sites.
- 150 jobs per search, Stepstone's own limit: use several keywords or cities to cover more. The run says which
  searches it cut.
- Stepstone has no sort by date: a new job can appear on any page of a search, so a watch reads its searches in full,
  over several runs when a run stops early. A watch sees the first 150 results of each search, like any run: keep its
  searches under that.
- A run reads pages that deliver nothing only up to a set amount (the start fee and part of what the delivered jobs
  pay). Searches whose jobs are all filtered out, or a watch whose searches have no new job, can reach it: the run
  stops, delivers what it found and says how many searches were not read. Put fewer such searches in one run.
- **Posted within** is Stepstone's own filter, as is: it can leave out recent jobs (half of them on the test search)
  and include older ones. Every run that uses it says so.
- Records come from Stepstone's result pages. The full job description, the street address and the contract type
  shown only on the job's own page are not included; `url` opens it. Job links are not accepted as input: paste the
  search page instead.

### FAQ

**Do I need a Stepstone account?** No. The Actor reads the public search pages any visitor sees.

**How does "Only new jobs" work?** The watch remembers every job it delivered, by its Stepstone ID. Use the same
**Watch name** in each scheduled run (without a name, the memory belongs to that exact list of searches and filters).
The first run delivers every matching job; the next ones only the jobs not delivered before. A run that stops early
(maxItems, cost limits) is continued by the next run of the watch, from the page where it stopped, so every search of
the watch gets read; a new job on a page already read is delivered when the next reading reaches it. Without **Posted
within**, nothing leaves the watch's reach while it waits: this is the way to miss no job. One run of a watch at a time.

**Why do I get fewer jobs than Stepstone announces?** Stepstone shows at most 150 jobs per search, and its total also
counts the suggestions it adds below the results (other places, similar titles), left out unless you include them.
Narrow the search (a city, a more precise keyword) or add searches.

**Is anything different on Apify's free plan?** No. The same searches, fields, limits and price apply on every plan.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: jobs already in the
dataset are not delivered or charged again.

**What if Stepstone changes its pages?** The run says so in its status and a free error record, instead of reporting
"no jobs", and nothing is charged but the start.

**Is it legal?** It collects public job postings published by employers to be read by anyone. Check the rules that
apply to your use of the data.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error
type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never
your input, your results, your account or the run ID.

# Actor input Schema

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

One job title or search word per line (data scientist, Pflegefachkraft, Buchhalter). C++ and C# work as written (write '.NET Developer', not '.NET' alone); a keyword with no letter or digit is refused. Stepstone lists at most 150 jobs per search: use several keywords and locations to go further.

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

Optional, one city or region per line (Berlin, München, Wien). A location with no keyword lists every job there. Leave empty to search the whole country. Write the city alone: what follows a comma ('Berlin, Deutschland') is not read by Stepstone and is left out.

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

Stepstone site used for the keywords and locations above. Links you paste keep their own site.

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

Optional. Leave empty for 30 km, the radius of Stepstone's own search box; 0 = the city only. Used only with a location.

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

One per line: a Stepstone search page as shown in your browser, with its filters (https://www.stepstone.de/jobs/data-scientist/in-berlin?ct=222).

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

Passes Stepstone's own date filter as is, like its 'Datum' menu. Stepstone does not keep it exact: it can leave out recent jobs (its 7-day list missed up to half of them on some searches) and include older ones (its 1-day list held jobs posted two weeks earlier). To miss nothing, run a watch (Only new jobs) without it. A pasted link keeps its own date filter.

## `workplace` (type: `string`):

As Stepstone files it. 'Home office only' uses Stepstone's own filter (its job cards do not tell it apart). A job that says nothing about home office is left out when you pick anything but Any.

## `salaryOnly` (type: `boolean`):

Stepstone adds its own estimated salary to most German jobs (flagged salaryIsEstimated). Turn on to keep only jobs whose employer wrote the pay. Few employers do: expect only a small share of the jobs (often none).

## `includeSuggestedJobs` (type: `boolean`):

Below the results of a search, Stepstone suggests other jobs: in other locations (section 'regional') or with similar titles (section 'semantic'). Off: only the results of your search are delivered. On: the suggestions are delivered too (charged like any job), each with its section.

## `onlyNew` (type: `boolean`):

Deliver only the jobs this watch has not delivered before. The first run delivers every matching job; the next runs with the same watch name deliver only the jobs not delivered before. Made for scheduled runs: jobs already delivered are never charged again. A run that stops early is continued by the next one.

## `watchName` (type: `string`):

Name of the watch that remembers the jobs already delivered (used with 'Only new jobs'). Optional: without a name, the memory belongs to this exact list of searches and filters. Names are case-sensitive: 'Berlin Jobs' and 'berlin jobs' are two different watches, and two different names never share a memory. Extra spaces are ignored.

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

Leave empty for everything Stepstone lists for a search (150 at most).

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

Total number of jobs delivered by the run, all searches together, counted exactly.

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

Connection. Keep the default (automatic). Costs are included in the price.

## Actor input object example

```json
{
  "keywords": [
    "data scientist"
  ],
  "locations": [
    "Berlin"
  ],
  "country": "de",
  "postedWithin": "any",
  "workplace": "any",
  "salaryOnly": false,
  "includeSuggestedJobs": false,
  "onlyNew": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every job with all its fields, and free error records.

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

A table with one row per job.

## `summary` (type: `string`):

Jobs per search, notes, why the run stopped, and errors.

# 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 scientist"
    ],
    "locations": [
        "Berlin"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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