# StepStone scraper for jobs in Germany, Austria, Belgium and the Netherlands

> StepStone scraper for public jobs in Germany, Austria, Belgium and the Netherlands. Export title, company, salary and dates. Get only new jobs.

URL: https://cliqtomedia.com/actors/stepstone-jobs-scraper/

Category: Jobs & hiring · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/stepstone-jobs-scraper?fpr=cliqto

Search StepStone for a role and a city. You get one clean row per job with company, date and salary numbers. Turn on only new for a daily list.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `python developer` in Search queries. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Search public [StepStone](https://www.stepstone.de/) job listings in Germany, Austria, Belgium and the Netherlands and get one clean row per job: title, company, location, posting date, salary as numbers, workplace type and job URL. No login and no API key are needed. A typical run with 20 jobs takes about 5 seconds and costs $0.022.

- keep only jobs that earlier runs did not return (`onlyNew`), for daily monitoring;
- open every job page and add the full description and employment type (`includeDetails`);
- search up to 10 queries in one run; a job found by two queries is saved once.

### Good for

- Daily or weekly lists of new jobs for a role and a city.
- Salary ranges for a role in one city, for market research.
- A list of companies that hire for a skill right now, for sales or sourcing.

### Not a good fit

- No login, no applications, no recruiter names, e-mails or phone numbers. E-mails and phone numbers in descriptions are replaced with `[removed]`.
- Only stepstone.de, .at, .be and .nl. Other StepStone countries are not supported.
- Most salaries are StepStone's own estimates, not employer figures (`salaryIsEstimate: true`). In our tests they come only with the first 150 results of a query (search pages 1–6). Later pages are read from StepStone's result list without estimates, so those jobs have empty salary fields.
- Up to 1000 jobs per run. StepStone itself may stop a search earlier.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Search query | $0.005 | One search query read from StepStone (first result page), charged even when it returns no jobs. |
| Saved job | $0.0008 (from $0.00068 on paid Apify plans) | One unique StepStone job saved to the dataset. |
| Full job description | $0.005 (from $0.0045 on paid Apify plans) | Full description and employment type added to a saved job (only with Full job description on). |

- One job: about $0.0018.
- 1,000 jobs: about $0.80.
- Every day 100 jobs, for 30 days: about $2.43 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/stepstone-jobs-scraper?fpr=cliqto

## Questions

### Do I need a StepStone account?

No. The tool reads public search and job pages only.

### Are the salaries from the employer?

Mostly no. Most are StepStone estimates. Check the salaryIsEstimate field.

### How many jobs can I get?

Up to 1,000 jobs and 10 queries per run.

### Can I get recruiter emails?

No. Emails and phone numbers in job texts are replaced with [removed].

### Are the salaries real?

Most are StepStone's estimates (`salaryIsEstimate: true`), not the employer's figures. When the salary is not marked as an estimate, `salaryIsEstimate` is `false`. Use estimates as a market range, not as an offer.

### Is the output complete?

The Actor saves what StepStone shows for your search, up to `maxItems`. StepStone may show a different order or count on different days. `RUN_SUMMARY.queries[].sourceTotal` shows how many jobs StepStone reported.

### How fresh are the jobs?

Each run reads StepStone live. `postedAt` is the date StepStone shows; StepStone sometimes refreshes this date for older jobs.

### Can I get recruiter contacts?

No. E-mails and phone numbers in descriptions are replaced with `[removed]`.

## Data fields

- `jobId` (string): StepStone job ID.
- `title` (string): Job title.
- `company` (string): Company name, null if hidden.
- `companyUrl` (string): Company profile URL on StepStone.
- `location` (string): Location text from the listing.
- `country` (string): Country code of the StepStone site: DE, AT, BE or NL.
- `url` (string): Job page URL without tracking parameters.
- `postedAt` (string): Posting date, ISO 8601.
- `expiresAt` (string): Listing end date, ISO 8601, if known.
- `salaryMin` (number): Lower salary bound; null when StepStone shows no salary.
- `salaryMax` (number): Upper salary bound; null when StepStone shows no salary.
- `salaryCurrency` (string): ISO currency code, e.g. EUR.
- `salaryPeriod` (string): year, month, week, day or hour.
- `salaryIsEstimate` (boolean): true when the salary is StepStone's estimate, not the employer's figure.
- `employmentType` (string): full_time, part_time, contract, temporary, internship or other; only with full description.
- `workplaceType` (string): onsite, remote or hybrid.
- `descriptionText` (string): Plain-text snippet or full description, contacts removed.
- `descriptionHtml` (string): Full description HTML when Full job description is on.
- `descriptionType` (string): snippet or full.
- `isSponsored` (boolean): true for promoted listings.
- `query` (string): Search query that found the job.
- `source` (string): Always StepStone.
- `fetchedAt` (string): Time the row was collected, ISO 8601.

## Input settings

- `queries` (array, required): Job titles or keywords, one per line, up to 10. Each query is charged once. Jobs found by several queries are saved once; a query stops at a page that adds nothing new.
- `location` (string): City or region as typed on StepStone, for example Berlin, München or Wien. Empty searches the whole country.
- `radiusKm` (integer): Search radius around the location in kilometres. Ignored when the location is empty.
- `domain` (string): Which StepStone site to search. Use a location from the same country.
- `postedWithinDays` (integer): Keep only jobs posted within this many days: 0, 1, 3, 7, 14 or 30. Zero disables the filter. Dates are checked on every row; jobs without a date are dropped when the filter is on.
- `workplace` (string): Filter by home-office option. Checked on returned rows.
- `sortBy` (string): Order of results on StepStone. Newest first is used automatically with Only new jobs or with 3, 14 or 30 days.
- `includeDetails` (boolean): Open each job page and add the full description and employment type. Slower and charged as a separate event per job with a description.
- `maxItems` (integer): Stop after saving this many jobs in total across all queries.
- `onlyNew` (boolean): Save only jobs not returned by earlier runs with the same queries, site, location, radius, date and workplace settings. Uses newest-first order and stops a query at the first page with nothing new. The first run builds the baseline.

## Step by step on Apify

1. Open the Input tab.
2. In Search queries (`queries`), keep `python developer` or type your own job title.
3. Keep Location (`location`) as `Berlin` or type your city. Keep Maximum jobs (`maxItems`) at 20.
4. Click Start.
5. Open the Output tab and check the Jobs view: `title`, `company`, `location`, `salaryMin`, `salaryMax`, `url`.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Get new jobs for a role every day | `queries`, `location`, `onlyNew: true` | job | `title`, `company`, `postedAt`, `url` | Apify schedule + Google Sheets or webhook |
| Compare salary ranges in a city | `queries`, `location`, `maxItems: 200` | job | `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryIsEstimate` | CSV / Excel export |
| Find companies that hire for a skill | `queries` with several skills, empty `location` | job | `company`, `companyUrl`, `location` | CRM import |
| Read full job texts for analysis | `includeDetails: true` | job | `descriptionText`, `employmentType`, `expiresAt` | Your own text or AI pipeline |

## Tips

- Use a city from the same country as the StepStone site you pick.
- Turn on details to add the full job text and job type.
- Salary data comes with the first 150 results of a query. Use specific queries.

## Limits



- If StepStone fails before the first page, the `query` event is not charged.
- If a job page fails with `includeDetails`, the row is saved with the snippet and `job-details` is not charged. After 6 failed job pages in a row the Actor stops opening job pages and ends with `reason: "DETAILS_UNAVAILABLE"`; rows already found are saved.
- Partial runs charge only for saved rows. When your run cost limit is reached, the Actor stops and saves `reason: "CHARGE_LIMIT"`.

## Sample result

```json
{
  "jobId": "13818030",
  "title": "Backend Entwickler Python (m/w/d) - Data Engineer Python",
  "company": "Ratbacher GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/de/ratbacher-gmbh-46710/jobs",
  "location": "Berlin, Mannheim, Frankfurt, Stuttgart, Karlsruhe",
  "country": "DE",
  "url": "https://www.stepstone.de/stellenangebote--Backend-Entwickler-Python-m-w-d-Data-Engineer-Python-Berlin-Mannheim-Frankfurt-Stuttgart-Karlsruhe-Ratbacher-GmbH--13818030-inline.html",
  "postedAt": "2026-09-22T11:03:04.747Z",
  "expiresAt": "2027-03-21T11:30:13.917Z",
  "salaryMin": 53000,
  "salaryMax": 74000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "salaryIsEstimate": true,
  "employmentType": null,
  "workplaceType": "hybrid",
  "descriptionText": "Als Backend Entwickler Python (m/w/d) übernimmst Du eine zentrale Rolle: ...",
  "descriptionHtml": null,
  "descriptionType": "snippet",
  "isSponsored": false,
  "query": "python developer",
  "source": "StepStone",
  "fetchedAt": "2026-10-14T12:54:39.873Z"
}
```

## Use it from code

Actor ID: `cliqtomedia/stepstone-jobs-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/stepstone-jobs-scraper").call(run_input={
    "queries": [
        "python developer"
    ],
    "location": "Berlin"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~stepstone-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["python developer"], "location": "Berlin"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/stepstone-jobs-scraper")
result = tool.invoke({"run_input": {"queries": ["python developer"], "location": "Berlin"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [Personio Vacancy Watch](https://cliqtomedia.com/actors/personio-jobs-monitor-scraper/)
- [Greenhouse Jobs Monitor & Scraper](https://cliqtomedia.com/actors/greenhouse-jobs-monitor-scraper/)
- [Remote Jobs Aggregator - RemoteOK, WWR & Himalayas, No login](https://cliqtomedia.com/actors/remote-jobs-aggregator/)
- [Wellfound Jobs Scraper](https://cliqtomedia.com/actors/wellfound-jobs-scraper/)
- [Ashby Jobs Scraper](https://cliqtomedia.com/actors/ashby-jobs-scraper/)
- [Lever Job Scraper](https://cliqtomedia.com/actors/lever-jobs-scraper/)
