StepStone Jobs Scraper: Germany, No Login, New-Job Monitor
Pricing
from $0.26 / 1,000 job posting returneds
StepStone Jobs Scraper: Germany, No Login, New-Job Monitor
StepStone jobs scraper without login: search StepStone.de, Germany's largest job board, by keyword and location and get one row per posting: title, company, location, home-office badge, link. Monitor mode returns only new jobs since the last run. Pay per posting returned; empty searches are free.
Pricing
from $0.26 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
StepStone Jobs Search Lookup: StepStone Jobs Scraper by Keyword & Location
You write job searches the way you'd type them into StepStone — Software Engineer @ Berlin —
and this actor runs each one against StepStone.de, one of the largest job boards in the
DACH region (Germany, Austria, Switzerland), and returns one clean row per posting: title,
company, location, home-office badge, how recently it was posted, and a permanent link.
No login. No API key. StepStone's search page is behind a connection-level bot wall, but the page itself is server-rendered with real job data once that wall is cleared — see "Why this one" below.
Who it's for
The accountable_eel catalogue sells company and hiring intelligence columns for outbound and recruiting. Each actor takes a list of identifiers — domains, company slugs, and here, job searches — and returns one flat, stably-named row per result: the shape a Clay table, an n8n workflow, or an AI agent can consume without post-processing. Pricing is pay-per-event: a fraction of a cent for a row you actually got, and nothing at all for a search that finds nothing. No seat licence, no monthly minimum, no credit system to decode.
This actor is the DACH-region counterpart to seek-jobs-search-lookup and
linkedin-jobs-search-lookup: wide-net keyword + location search rather than a per-company
listing. The ATS lookups in the same family (greenhouse-jobs-lookup, lever-jobs-lookup and
friends) answer "what is this company hiring for" — you bring the company list. This one
answers "who is hiring for this role, in this German-speaking city" when you don't have the
list yet.
Why this one
- Reaches data a plain request can't. A bare request to StepStone's search pages is blocked at the connection level — the server accepts the TLS handshake and then either resets the stream or never responds at all, before any page-level check even runs. This actor routes through a proxy tier built for exactly this kind of defense; the page itself, once reached, is ordinary server-rendered HTML with the job data already in it — no headless browser needed.
- The filters are real. A location segment genuinely narrows results — a Berlin search returned only Berlin-inclusive postings in verification, not a superset silently unfiltered — and pagination returns a genuinely disjoint set of postings per page, not a repeated cache.
- You are never billed for the same posting twice. Every posting is deduplicated by its StepStone job ID across the pages of one search and, by default, across every search in the run — an overlapping pair of searches returns, and bills, each posting once.
- A generous depth ceiling, not a silent ceiling. StepStone served a real page 182 pages deep into a 4,544-result search in verification — this actor still caps paging at a modest default (8 pages / ~200 postings per search) to keep proxy cost predictable, not because StepStone itself stops sooner. Raise "Most postings to return per search" if you need more.
- Honest about proxy cost. Reaching StepStone requires a paid proxy tier, unlike most of this catalogue's actors. That cost is priced into what you're charged per posting — see Pricing.
What you get
One row per job posting by default. (Turn off "One row per job posting" in the Input tab to get
one row per search instead, with the whole posting list nested in jobs.) Every row carries
these fields:
| Field | Type / format | Description |
|---|---|---|
query | text | The search line you passed in, unchanged. |
found | boolean | true if the search returned at least one posting. false rows are never charged. |
status | text | OK, NOT_FOUND (no postings for that search), BAD_FORMAT (a blank line), or BLOCKED. |
searchKeywords | text | The keywords actually sent to StepStone. |
searchLocation | text | The location actually sent to StepStone. |
jobCount | number | How many postings this search returned after your filters — this is exactly what you're charged for. |
totalAvailable | number | StepStone's own total-match count for the search, before this actor's page/depth limits. |
truncated | boolean | true if more postings were available than you asked for, or if paging stopped early. |
jobs | array | The full posting list. Present in every row; it's what gets expanded into separate rows in "one row per posting" mode. |
jobId | text | StepStone's own numeric posting ID — stable, and what deduplication keys on. |
title | text | Job title. |
companyName | text | Hiring company as StepStone names it. |
location | text | Location(s) as StepStone prints them on the posting — some postings list several cities. |
remote | boolean | true if the location, home-office badge, or title reads as remote. |
workFromHome | boolean | true if StepStone shows its own "home office" badge on the card. |
postedAgo | text | How recently it was posted, in StepStone's own words ("vor 1 Tag"). |
jobUrl | link | Permanent link to the posting on stepstone.de. |
scrapedAt | date (ISO) | When this actor fetched the row. |
A search that returns no postings comes back as a single found: false row with a
status/message explaining why, and is never charged. So does a blank line.
Run it on a schedule
Turn on Only return results that are new since the last run and point this actor at the same
saved searches on a cadence — each run then returns only postings StepStone added since the last
one, instead of a full re-dump, so a quiet week still confirms the schedule is alive. Set
deltaMode on and pick a Watchlist name for the input you want to run, then schedule
it in Apify (Schedules > Create) or trigger it from n8n/Make; the delta state lives in a named
key-value store, so every schedule run bills only new rows. See
Monitoring: only new results below for the full mechanics.
Pricing
- Job posting returned: $0.34 per 1,000 job postings
Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
You're charged per posting returned, not per search — a search that returns 12 postings costs twelve, a search that returns none costs nothing, and a blank line costs nothing.
Because you pay per posting, "Most postings to return per search" is your budget control: leave it at 50 and a ten-search run costs at most 500 postings' worth.
How to use
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~stepstone-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["Software Engineer @ Berlin"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Paste one search per line:
Software Engineer @ BerlinBilanzbuchhalterPflegefachkraft @ Muenchen
A line with no @ location uses the location you set once in 🔍 Search settings — leave
that blank too and the search covers all of Germany.
🔍 Search settings — these are sent to StepStone, so they narrow the search before results are returned, which makes runs cheaper as well as more relevant:
| Input | What it does |
|---|---|
defaultLocation | Location for any line that doesn't name one. Write it as StepStone does — "Berlin", "Muenchen", "Hamburg". |
maxJobsPerQuery | Most postings to return per search. Default 50, capped at 200 (8 pages) by default. |
🎯 Narrow the results — applied here, to the postings after they arrive, so you can filter on things StepStone's own search box doesn't expose. They combine with AND across fields and OR within a field:
| Input | What it does |
|---|---|
titleKeywords | Keep only titles containing one of these. |
excludeTitleKeywords | Drop titles containing one of these — e.g. ["Praktikum","Werkstudent"]. Applied after the include list. |
companies | Keep only these companies — partial names match. |
excludeCompanies | Drop these companies — useful for filtering out recruitment agencies you already know. |
locations | Narrow a wide search to particular districts. |
remoteOnly | Keep only roles whose location, home-office badge, or title reads as remote. |
skipDuplicateJobs | On by default. Each posting is returned, and billed, once per run even if two searches overlap. |
Bulk example. A 25-search input covering common DACH roles and cities:
{"searches": ["Software Engineer @ Berlin", "Bilanzbuchhalter @ Muenchen", "Pflegefachkraft @ Hamburg","Projektmanager @ Frankfurt", "Vertriebsmitarbeiter @ Koeln", "Elektriker @ Stuttgart","Data Analyst @ Berlin", "Personalreferent @ Duesseldorf", "Lagerist @ Leipzig","Kundenberater @ Hannover", "Marketing Manager @ Berlin", "Bauingenieur @ Muenchen","Steuerfachangestellte @ Wien", "Verkaufsberater @ Zuerich", "IT-Administrator @ Bremen","Erzieher @ Dresden", "Controller @ Nuernberg", "Softwareentwickler @ Wien","Speditionskaufmann @ Hamburg", "Buchhalter @ Berlin", "Recruiter @ Muenchen","Servicetechniker @ Essen", "Qualitaetsmanager @ Stuttgart", "HR Manager @ Zuerich","Produktionsmitarbeiter @ Koeln"]}
25 searches at the default cap of 50 postings each ≈ up to $0.425 if every one is fully found
($0.34 per 1,000 postings returned at the FREE tier, plus the $0.00005 actor-start charge) —
usually less, since skipDuplicateJobs drops repeats across overlapping searches and a search
that finds nothing costs nothing.
Input
{"searches": ["Software Engineer @ Berlin"]}
One search per line. Write it as "keywords @ location", or just the keywords and set a location below. Accepted formats: Softwareentwickler @ Berlin, Bilanzbuchhalter, Pflegefachkraft @ Muenchen.
Output
| query | found | status | searchKeywords | searchLocation | jobCount | totalAvailable | truncated | jobs | jobId | title | companyName | location | remote | workFromHome | postedAgo | jobUrl | isNew | firstSeenAt | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Software Engineer @ Berlin | true | OK | Software Engineer | Berlin | 50 | 586 | true | <all postings found (full list)> | 14488733 | Software Engineer (Risk Platform) (m/f/d) | Riverty | Berlin | false | false | vor 1 Woche | https://www.stepstone.de/stellenangebote--Software-Engineer-Risk-Platform-m-f-d-Berlin-Riverty--14488733-inline.html | 2026-09-21T06:20:18.871Z |
A miss comes back as a row with "found": false and is never charged.
Monitoring: only new results
Turn on Only return results that are new since the last run and this actor becomes a job monitor. Every posting StepStone returns is checked against the job IDs your previous run already delivered, and anything you have seen is dropped before you are billed. A run where nothing was posted returns no rows and costs only the run fee. Each run logs a count like 3 new of 25 fetched, and totalAvailable still shows the full StepStone total, so a zero row explains itself.
The first run has nothing to compare against, so it returns everything it finds and remembers it. From the second run on you get only what StepStone added since.
To turn that into an alert:
- Save your search as a task with the checkbox on.
- Add a Schedule to that task, hourly or daily.
- Add a webhook on Run succeeded, pointing at Slack, n8n, Make or Zapier.
Memory lives in a named key-value store, stepstone-jobs-lookup-delta, one record per search line, holding the last 5,000 postings per watchlist. Two schedules with different filters keep separate memories. Leave the checkbox off but fill in Watchlist name and every posting comes back stamped with isNew and firstSeenAt.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~stepstone-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["Software Engineer @ Berlin"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~stepstone-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["Software Engineer @ Berlin"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~stepstone-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "StepStone Jobs Scraper for Germany | Apify" — the agent will find and run this actor.
Related actors
- ATS Jobs Unified Lookup — once a search here turns up a hiring company, check which ATS platform they use and how many roles are open.
- LinkedIn Jobs Search Lookup — the same keyword+location search shape, run against LinkedIn's public postings instead.
- Greenhouse Jobs Lookup — once you know which company you're after, pull every open role straight from their Greenhouse board.
If this saved you a scrape, a rating on the Store page helps other buyers find it.