How to use it: 3 steps
- Make a free Apify accountApify 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
python developerin Search queries. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Search public StepStone 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.
Who uses it
Recruiters in DACH and Benelux
Find companies that hire for a skill now.
Pay researchers
See salary ranges for a role in one city.
Job seekers
Get new jobs for your role every day.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| 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). |
Examples
- 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. That is enough for about 6,200 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
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].
Details
Step by step on Apify
- Open the Input tab.
- In Search queries (
queries), keeppython developeror type your own job title. - Keep Location (
location) asBerlinor type your city. Keep Maximum jobs (maxItems) at 20. - Click Start.
- 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 for better results
- 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 and good to know
- If StepStone fails before the first page, the
queryevent is not charged - If a job page fails with
includeDetails, the row is saved with the snippet andjob-detailsis not charged. After 6 failed job pages in a row the Actor stops opening job pages and ends withreason: "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"
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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. You need your Apify API token from Apify Console → Settings → API & Integrations.
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)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"}'# 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)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (23)
| Field | Type | Meaning |
|---|---|---|
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 (10)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Search queries required | queries | array | ["python developer"] |
| Location | location | string | "Berlin" |
| Radius (km) | radiusKm | integer | 30 |
| Country site | domain | string | "de" |
| Posted in the last days | postedWithinDays | integer | 0 |
| Workplace | workplace | string | "any" |
| Sort by | sortBy | string | "relevance" |
| Full job description | includeDetails | boolean | false |
| Maximum jobs | maxItems | integer | 20 |
| Only new jobs | onlyNew | boolean | false |



