StepStone Jobs Scraper (Search / Details / Contacts) avatar

StepStone Jobs Scraper (Search / Details / Contacts)

Pricing

from $0.55 / 1,000 stepstone job results

Go to Apify Store
StepStone Jobs Scraper (Search / Details / Contacts)

StepStone Jobs Scraper (Search / Details / Contacts)

Scrape StepStone jobs by keyword, location, search URL, or job URL. HTTP-only, no browser. Includes pagination, full job details, salary/work model fields, company data, and public email/phone contact extraction.

Pricing

from $0.55 / 1,000 stepstone job results

Rating

0.0

(0)

Developer

DataForge

DataForge

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

2 hours ago

Last modified

Share

StepStone Jobs Scraper — a field manual, one chapter per mode

StepStone is geo-sensitive and sits behind Akamai, so most tools stall on its search pages. This Actor reads StepStone's own result-list data request-only, with Chrome TLS impersonation over residential proxies (Germany by default). It runs four ways, and the mode you pick decides everything else.

This manual is organized the same way the Actor is: one chapter per mode. Read the chapter that matches what you have — a keyword, a URL, or a specific job page — and skip the rest.

Covers StepStone Germany (.de), Austria (.at), France (.fr), and Denmark (.dk / best effort) · HTTP-only, no login, no browser · CSV / Excel / JSON / API.

ChaptermodeStart fromYou provide
1SEARCHkeyword + locationkeywords, location, country
2URLSStepStone linksstartUrls (search or job pages)
3DETAILSexact job pagesstartUrls (direct job URLs)
4AUTOwhatever you haveany of the above — it decides

Not sure which chapter is yours? Start from what's in your hand:

What you have mode
───────────── ────
🔎 a keyword + a place ────────────────────▶ SEARCH build + paginate search URLs
🔗 StepStone links you already collected ──▶ URLS search pages paginate, job pages read
📄 exact job-page URLs, full detail ───────▶ DETAILS whole page + JSON-LD (+contacts)
🧭 a mix / not sure ───────────────────────▶ AUTO inspects each input, routes it

🔎 Chapter 1 — SEARCH: build searches from a keyword and place

Give it a role and a location and it constructs the StepStone search URL for the country you choose, follows pagination up to maxPagesPerSearch, and returns one flat row per job. This is the mode for "find me every data engineer job in Berlin."

Input:

{
"mode": "SEARCH",
"keywords": ["software developer"],
"location": "berlin",
"country": "DE",
"postedWithin": "14d",
"maxItems": 10,
"maxPagesPerSearch": 1
}

What comes back — one job row (compact):

{
"id": "123456789",
"title": "Senior Software Developer (m/w/d)",
"companyName": "Example GmbH",
"location": "Berlin",
"postCode": "10115",
"datePosted": "2026-08-01T00:00:00Z",
"workModel": "hybrid",
"section": "organic",
"labels": ["Full-time", "Permanent"],
"skills": ["Python", "AWS"],
"salary": "65.000 € - 80.000 €",
"salaryMin": 65000,
"salaryMax": 80000,
"salaryCurrency": "EUR",
"salaryPeriod": "YEAR",
"jobUrl": "https://www.stepstone.de/stellenangebote--...",
"sourceUrl": "https://www.stepstone.de/jobs/software-developer/in-berlin",
"country": "DE",
"searchKeyword": "software developer",
"scrapedAt": "2026-08-07T10:30:02Z"
}

Pass several keywords and they each run as their own search. postedWithin accepts all · 1d · 3d · 7d · 14d, applied while building the URL or after parsing.


Already sitting on StepStone search-result pages or a stack of job links? Paste them into startUrls and this mode crawls each one — search pages get paginated, job pages get read directly. It's the mode for reproducing a filtered search you built by hand in the browser.

Input:

{
"mode": "URLS",
"startUrls": [
{ "url": "https://www.stepstone.de/jobs/ai?searchOrigin=Homepage_top-search" },
{ "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin" }
],
"maxItems": 50,
"maxPagesPerSearch": 3
}

Every row records where it came from: sourceUrl (the page it was found on), jobUrl / relativeUrl (the listing itself), and page · positionOnPage · positionAbsolute for exactly where it ranked. Listing flags travel too — isAnonymous, isSponsored, isTopJob, isHighlighted, plus section (organic, recommended, …).


📄 Chapter 3 — DETAILS: read specific job pages, in full

When you already have the precise job URLs and want the whole page — not a result-list snippet — DETAILS fetches each one and returns the rich record. This is the mode for enriching a shortlist.

Input:

{
"mode": "DETAILS",
"startUrls": [
{ "url": "https://www.stepstone.de/stellenangebote--Senior-Software-Developer--123456789" }
],
"includeDetails": true,
"includeContacts": true
}

What includeDetails: true adds (fetched and merged from each job page):

FieldMeaning
descriptionText · descriptionClean text plus original HTML
detailTitleTitle from the job page itself
employmentTypeFull-time, part-time, etc.
validThrough · datePostedDetailPosting window from JSON-LD
directApplyWhether direct apply is offered
hiringOrganization · jobLocationDetail · baseSalaryStructured JSON-LD blocks
detailUrl · detailFetchedSource URL and fetch flag

What includeContacts: true adds — public contact data scraped from the job text (it auto-enables detail fetching):

FieldMeaning
contacts.emailsPublic email addresses on the page
contacts.phonesPublic phone numbers, validated by surrounding context
contacts.peopleNamed contact persons with name and role
contacts.snippetsThe surrounding text for each match

Many listings publish none of this — those rows simply omit the values.


🧭 Chapter 4 — AUTO: let it decide

The default. AUTO looks at what you passed and routes for you: keywords → behaves like SEARCH, startUrls → behaves like URLS/DETAILS depending on whether each link is a search or a job page. Mix keyword searches and pasted URLs in one run and it sorts them out — everything lands in the same dataset.

Input:

{
"mode": "AUTO",
"keywords": ["product manager"],
"location": "munich",
"startUrls": [
{ "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin" }
],
"maxItems": 25
}

Provide at least one of keywords or startUrls and AUTO handles the rest.


🌍 Coverage: DACH, France, and Denmark

country switches the domain used for generated keyword searches:

ValueDomainNotes
DEstepstone.deGermany (default)
ATstepstone.atAustria
FRstepstone.frFrance
DKstepstone.dkDenmark — best effort

Because StepStone is geo-sensitive, the proxy defaults to residential Germany; change apifyProxyCountry in proxyConfiguration to match your target market.


🎛️ Cross-cutting knobs (work in every chapter)

🎯 FilterspostedWithin (age), remoteOnly (keep remote-flagged jobs), salaryOnly (keep only jobs with salary text or structured salary), excludeRecommended (drop recommended padding StepStone adds to thin pages — on by default).

💶 Work model & salary — every job is normalized to workModel = onsite / hybrid / remote, and salary is parsed into salary · salaryMin · salaryMax · salaryCurrency · salaryPeriod · salaryAvailable · salaryType when StepStone exposes it.

Output shapeoutputMode: compact (clean normalized fields, default) or full (more native StepStone fields); rawOutput: true attaches the raw object under _raw for custom pipelines.

⚡ Performance — the fixed 1 GB runtime processes result rows, detail pages, and contact enrichment concurrently. maxConcurrency controls the parallel pipeline; maxRetries and maxProxyRetries default to 4 with short capped backoff, while requestDelayMs stays at 0 for the fastest normal runs.

Every completed run writes an OUTPUT summary with saved, issues, durationSeconds, and a small errorSamples list. Empty valid inputs return NO_INPUT without contacting StepStone or producing a failed run; malformed field types are rejected by Apify before the Actor starts.

The Overview dataset tab gives a quick scan of every run: Job ID, Title, Company, Location, Work model, Salary (+ min/max), Posted date, Section, and clickable Job / Source URLs.


💬 Quick answers

  • Login or cookies? No — request-only, impersonating a Chrome TLS fingerprint over Apify Proxy.
  • Why are some salary fields empty? StepStone only publishes salary on some listings; use salaryOnly: true to keep only those.
  • Why does contact data come back empty sometimes? Many job pages have no public emails/phones/people. Empty means "not present," not "not looked for."
  • How do I keep exports clean? Leave outputMode on compact; only reach for full / rawOutput when troubleshooting.

Got clean StepStone data out of a run? Leaving a rating on the Apify Store is the best way to support the Actor and shape where it goes next.

🏷️ Tags: stepstone · stepstone scraper · jobs scraper · job listings · recruiting · salary data · lead generation · germany jobs · hiring intelligence