# StepStone Jobs Scraper (Search / Details / Contacts) (`trakk/stepstone-jobs-scraper`) Actor

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.

- **URL**: https://apify.com/trakk/stepstone-jobs-scraper.md
- **Developed by:** [DataForge](https://apify.com/trakk) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 6 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 stepstone job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 💼 StepStone Jobs Scraper - Search, Details, Contacts

Pull fresh StepStone job listings by keyword, location, search URL, or direct job URL. The Actor is built for Apify and runs with HTTP requests only: no browser, no Playwright, no Puppeteer.

It is meant for people who need job-market data that is actually usable after the run: clean job rows, normalized salary fields, remote/hybrid labels, source metadata, optional full descriptions, and public contact extraction when the job page exposes it.

> Good for recruiters, job-board builders, HR analysts, salary research, competitor hiring trackers, and anyone who would rather export a dataset than click through StepStone all afternoon.

### 💡 Why this Actor

- 🚫 **No browser, HTTP only** — `curl_cffi` Chrome impersonation keeps runs fast and lightweight
- 🗂️ **Search, URLs & details in one Actor** — keyword/location search, crawl StepStone URLs, or fetch direct job pages
- 🧹 **Cleaner datasets by default** — drops StepStone `recommended` padding so rows stay close to your actual filter
- 💶 **Normalized salary & work model** — structured `salaryMin`/`salaryMax`/`salaryCurrency` plus `onsite`/`hybrid`/`remote` labels
- 📇 **Public contact extraction** — optional emails and phone numbers pulled from job detail text
- 🇩🇪 **Built for StepStone's defenses** — Apify German residential proxy tuned for Akamai and EU geo stability

#### 📸 Sample output

![StepStone Jobs Scraper sample output — real data fields](https://api.apify.com/v2/key-value-stores/sAkX2yFx0oRX6gf6p/records/stepstone-jobs-scraper-sample)

*A real run's output — exportable to JSON, CSV, or Excel.*

### What It Does

The Actor can:

- Search StepStone by keyword and location
- Crawl existing StepStone search URLs
- Fetch direct job-detail URLs
- Paginate search results up to your `maxItems` budget
- Drop StepStone `recommended` padding jobs by default
- Normalize `workFromHome` into `onsite`, `hybrid`, or `remote`
- Normalize salary fields when StepStone provides structured salary data
- Add stable absolute `jobUrl` and `sourceUrl` fields
- Optionally fetch full job detail pages
- Optionally extract public emails and phone numbers from detail pages
- Use Apify Proxy with German residential exits for better stability

### Input Modes

#### SEARCH

Use this when you want the Actor to build StepStone URLs for you.

```json
{
  "mode": "SEARCH",
  "keyword": "software developer",
  "location": "berlin",
  "country": "DE",
  "postedWithin": "7d",
  "maxItems": 100
}
```

#### URLS

Use this when you already have StepStone URLs from the site.

```json
{
  "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": 200
}
```

#### DETAILS

Use this for individual job pages.

```json
{
  "mode": "DETAILS",
  "startUrls": [
    { "url": "https://www.stepstone.de/stellenangebote--Example-Job-Berlin-Company--123456-inline.html" }
  ],
  "includeContacts": true
}
```

### Useful Options

| Field | What it does |
| --- | --- |
| `maxItems` | Total dataset rows to keep |
| `maxPagesPerSearch` | Pagination cap for each search |
| `includeDetails` | Fetch full job detail pages |
| `includeContacts` | Extract public emails and phone numbers from detail text |
| `excludeRecommended` | Drop `section=recommended` padding jobs |
| `remoteOnly` | Keep only jobs marked as remote-friendly |
| `salaryOnly` | Keep only jobs with salary data |
| `outputMode` | `compact` for clean rows, `full` for more native StepStone fields |
| `rawOutput` | Attach raw job payload under `_raw` |

### Output

Each result is one job row. Typical fields:

```json
{
  "id": 123456,
  "title": "Data Engineer",
  "companyName": "Example GmbH",
  "location": "Berlin",
  "datePosted": "2026-06-01T10:00:00+02:00",
  "workFromHome": "2",
  "workModel": "remote",
  "salary": "70.000 - 90.000 EUR",
  "salaryMin": 70000,
  "salaryMax": 90000,
  "salaryCurrency": "EUR",
  "section": "main",
  "skills": ["Python", "SQL"],
  "textSnippet": "Build data pipelines for analytics teams.",
  "jobUrl": "https://www.stepstone.de/stellenangebote--Data-Engineer-Berlin-Example--123456-inline.html",
  "sourceUrl": "https://www.stepstone.de/jobs/data-engineer/in-berlin",
  "scrapedAt": "2026-06-16T20:00:00+00:00"
}
```

When `includeDetails` is enabled, the Actor may also add:

- `description`
- `descriptionText`
- `employmentType`
- `validThrough`
- `hiringOrganization`
- `jobLocationDetail`
- `baseSalary`
- `contacts`

When `includeContacts` is enabled, `contacts` can include public details found in the job text:

```json
{
  "contacts": {
    "emails": ["emma.mauser@pflegecampus.de"],
    "phones": ["030 130 17 2640"],
    "people": [
      {
        "name": "Norman Knödel",
        "role": "Pflegedirektor"
      }
    ],
    "snippets": [
      "Noch Fragen? Norman Knödel Pflegedirektor Tel.: 030 130 17 2640"
    ]
  }
}
```

### Notes On StepStone

StepStone is protected by Akamai and is sensitive to geo/TLS fingerprints. This Actor uses `curl_cffi` Chrome impersonation and Apify Proxy. German residential proxy is recommended:

```json
{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

If StepStone returns fewer jobs than the page number suggests, it is often because search pages contain `recommended` padding jobs. The Actor drops those by default so your dataset stays closer to the actual filter.

### Use Cases

- Track competitor hiring by role or city
- Build a fresh job-board feed
- Monitor remote and hybrid job demand
- Benchmark salary ranges where employers publish salary data
- Feed recruiting dashboards and HR analytics
- Collect job URLs for downstream enrichment

### FAQ

**Does it use a browser?**\
No. Runtime is HTTP requests only.

**Can it scrape full descriptions?**\
Yes, enable `includeDetails`. It costs more requests because each job page is fetched separately.

**Can it find emails or phone numbers?**\
Enable `includeContacts`. The Actor extracts only contacts that are publicly visible in the job detail text.

**Why use residential Germany proxy?**\
StepStone is Akamai-protected and EU geo-sensitive. German residential exits are the most stable default.

**Will every job have salary?**\
No. StepStone often exposes salary as empty. The Actor normalizes salary when StepStone provides it.

### Legal

This Actor is an independent tool and is not affiliated with StepStone, The StepStone Group, or their related brands. It extracts publicly available job listing data. You are responsible for using the data in a lawful way and respecting StepStone's terms, GDPR, copyright, database rights, and any rules that apply to your use case.

### SEO Keywords

stepstone scraper, stepstone jobs scraper, stepstone job scraper, stepstone.de scraper, germany jobs scraper, job market data germany, job listings API, HR analytics scraper, recruiter data, salary research Germany, remote jobs Germany, Apify StepStone actor

# Actor input Schema

## `mode` (type: `string`):

SEARCH builds listing URLs from keywords. URLS crawls StepStone URLs you provide. DETAILS fetches direct job pages only.

## `startUrls` (type: `array`):

StepStone search URLs, work URLs, or direct job URLs. Used in URLS and DETAILS modes.

## `keywords` (type: `array`):

One or more job keywords, for example software developer, data engineer, product manager.

## `keyword` (type: `string`):

Convenience field for one keyword. Used when Keywords is empty.

## `location` (type: `string`):

City or region slug, for example berlin, munich, deutschland. Leave empty for all locations.

## `country` (type: `string`):

StepStone country domain for generated keyword searches.

## `postedWithin` (type: `string`):

Filter by posting age when StepStone accepts the age facet.

## `maxItems` (type: `integer`):

Maximum number of jobs to push to the dataset across the whole run.

## `maxPagesPerSearch` (type: `integer`):

Hard cap on pagination depth for each search URL or keyword.

## `includeDetails` (type: `boolean`):

Fetch each job detail page and enrich the row with full description / JSON-LD fields when available.

## `includeContacts` (type: `boolean`):

Extract public emails and phone numbers from the detail page text. Requires Include full job details.

## `excludeRecommended` (type: `boolean`):

Drop section=recommended jobs that StepStone may add when a filtered page has too few exact matches.

## `remoteOnly` (type: `boolean`):

Keep only jobs marked by StepStone as remote-friendly when that field is available.

## `salaryOnly` (type: `boolean`):

Keep only jobs where salary text or structured salary data is available.

## `outputMode` (type: `string`):

Compact returns clean normalized fields. Full keeps more StepStone native fields.

## `rawOutput` (type: `boolean`):

Attach the raw StepStone job object under \_raw for debugging or custom pipelines.

## `debugLog` (type: `boolean`):

Save a small HTML/API debug sample to the key-value store when StepStone parsing fails. Keep off for normal runs.

## `maxConcurrency` (type: `integer`):

How many HTTP requests may run in parallel.

## `maxRetries` (type: `integer`):

Retries for HTTP 403, 408, 425, 429, 5xx and parse failures.

## `maxProxyRetries` (type: `integer`):

Dedicated proxy / transport retry budget per request.

## `requestDelayMs` (type: `integer`):

Optional delay before each request. Keep 0 for fastest runs.

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Residential Germany is recommended because StepStone is Akamai and EU geo sensitive.

## Actor input object example

```json
{
  "mode": "SEARCH",
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/ai?searchOrigin=Homepage_top-search"
    },
    {
      "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin"
    }
  ],
  "keywords": [
    "software developer"
  ],
  "keyword": "",
  "location": "",
  "country": "DE",
  "postedWithin": "all",
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "includeDetails": false,
  "includeContacts": false,
  "excludeRecommended": true,
  "remoteOnly": false,
  "salaryOnly": false,
  "outputMode": "compact",
  "rawOutput": false,
  "debugLog": false,
  "maxConcurrency": 8,
  "maxRetries": 6,
  "maxProxyRetries": 6,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.stepstone.de/jobs/ai?searchOrigin=Homepage_top-search"
        },
        {
            "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin"
        }
    ],
    "keywords": [
        "software developer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/stepstone-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://www.stepstone.de/jobs/ai?searchOrigin=Homepage_top-search" },
        { "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin" },
    ],
    "keywords": ["software developer"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("trakk/stepstone-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/ai?searchOrigin=Homepage_top-search"
    },
    {
      "url": "https://www.stepstone.de/jobs/data-engineer/in-berlin"
    }
  ],
  "keywords": [
    "software developer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call trakk/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trakk/stepstone-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IekYxtGSk693VBQfu/builds/eXkF6jcpn6y3ZBr8S/openapi.json
