StepStone Jobs Scraper: Germany, No Login, New-Job Monitor avatar

StepStone Jobs Scraper: Germany, No Login, New-Job Monitor

Pricing

from $0.26 / 1,000 job posting returneds

Go to Apify Store
StepStone Jobs Scraper: Germany, No Login, New-Job Monitor

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

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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:

FieldType / formatDescription
querytextThe search line you passed in, unchanged.
foundbooleantrue if the search returned at least one posting. false rows are never charged.
statustextOK, NOT_FOUND (no postings for that search), BAD_FORMAT (a blank line), or BLOCKED.
searchKeywordstextThe keywords actually sent to StepStone.
searchLocationtextThe location actually sent to StepStone.
jobCountnumberHow many postings this search returned after your filters — this is exactly what you're charged for.
totalAvailablenumberStepStone's own total-match count for the search, before this actor's page/depth limits.
truncatedbooleantrue if more postings were available than you asked for, or if paging stopped early.
jobsarrayThe full posting list. Present in every row; it's what gets expanded into separate rows in "one row per posting" mode.
jobIdtextStepStone's own numeric posting ID — stable, and what deduplication keys on.
titletextJob title.
companyNametextHiring company as StepStone names it.
locationtextLocation(s) as StepStone prints them on the posting — some postings list several cities.
remotebooleantrue if the location, home-office badge, or title reads as remote.
workFromHomebooleantrue if StepStone shows its own "home office" badge on the card.
postedAgotextHow recently it was posted, in StepStone's own words ("vor 1 Tag").
jobUrllinkPermanent link to the posting on stepstone.de.
scrapedAtdate (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

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. 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"]}'
  3. 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 @ Berlin
Bilanzbuchhalter
Pflegefachkraft @ 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:

InputWhat it does
defaultLocationLocation for any line that doesn't name one. Write it as StepStone does — "Berlin", "Muenchen", "Hamburg".
maxJobsPerQueryMost 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:

InputWhat it does
titleKeywordsKeep only titles containing one of these.
excludeTitleKeywordsDrop titles containing one of these — e.g. ["Praktikum","Werkstudent"]. Applied after the include list.
companiesKeep only these companies — partial names match.
excludeCompaniesDrop these companies — useful for filtering out recruitment agencies you already know.
locationsNarrow a wide search to particular districts.
remoteOnlyKeep only roles whose location, home-office badge, or title reads as remote.
skipDuplicateJobsOn 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

queryfoundstatussearchKeywordssearchLocationjobCounttotalAvailabletruncatedjobsjobIdtitlecompanyNamelocationremoteworkFromHomepostedAgojobUrlisNewfirstSeenAtscrapedAt
Software Engineer @ BerlintrueOKSoftware EngineerBerlin50586true<all postings found (full list)>14488733Software Engineer (Risk Platform) (m/f/d)RivertyBerlinfalsefalsevor 1 Wochehttps://www.stepstone.de/stellenangebote--Software-Engineer-Risk-Platform-m-f-d-Berlin-Riverty--14488733-inline.html2026-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:

  1. Save your search as a task with the checkbox on.
  2. Add a Schedule to that task, hourly or daily.
  3. 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.

  • 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.