# StepStone Jobs Scraper - Germany, Austria & Belgium (`thirdwatch/stepstone-jobs-scraper`) Actor

Search StepStone job listings in Germany, Austria, and Belgium. Extract job descriptions, employers, locations, salaries, skills, posting dates, and application URLs when available.

- **URL**: https://apify.com/thirdwatch/stepstone-jobs-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 66 total users, 18 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## StepStone Jobs Scraper — Germany, Austria & Belgium

### What you get

Turn StepStone searches into clean job-market data without a browser, login, or manual pagination. Search by role and location or paste an existing StepStone result page. The Actor returns one normalized row per job across `stepstone.de`, `stepstone.at`, and `stepstone.be`.

It is built for recurring recruiting feeds, salary research, hiring-intent signals, and European job-board products—not just one-off exports.

### Why use this StepStone scraper?

- **Three markets, one schema:** Germany, Austria, and Belgium produce the same columns.
- **Full job details:** complete descriptions, employment type, industry, structured address, expiry date, employer, and apply flow.
- **Useful search controls:** newest-first sorting, posted-within filters, home-office mode, and direct-apply jobs.
- **Up to 1,000 jobs per query:** pagination is automatic and duplicate job IDs are removed across inputs.
- **Fast and inexpensive:** structured job data comes back directly, so runs finish quickly and stay cheap to operate.
- **Pay only for results:** empty searches and failed requests create no paid dataset items.

Pricing scales down with volume, so it is designed for scheduled feeds and bulk market research, not tiny demo-only runs.

### Input

Use keyword searches, existing URLs, or both.

```json
{
  "country": "de",
  "queries": ["software engineer", "data scientist"],
  "location": "Berlin",
  "maxResultsPerQuery": 100,
  "sortBy": "date",
  "postedWithinDays": 7,
  "workFromHome": "any",
  "directApplyOnly": false,
  "includeDetails": true,
  "includeDescription": true,
  "cleanHtml": true,
  "maxConcurrency": 5
}
```

You can also paste filtered search pages or individual jobs:

```json
{
  "startUrls": [
    {"url": "https://www.stepstone.de/jobs/data-engineer/in-muenchen?sort=2"},
    {"url": "https://www.stepstone.at/jobs/software-engineer/in-wien"}
  ],
  "maxResultsPerQuery": 250
}
```

Filters already present in a Start URL are preserved. Explicit Actor inputs add or override their matching URL parameters.

### Input parameters

| Parameter | Required | Description |
|---|---|---|
| `country` | No | StepStone market for keyword searches: `de`, `at`, or `be`. Start URLs can mix markets. Default `de`. |
| `queries` | No | Job titles or keywords, one search per value. |
| `location` | No | City or region applied to keyword searches. Default `Berlin`. |
| `startUrls` | No | StepStone search or job page URLs to use instead of, or alongside, keyword searches. |
| `maxResultsPerQuery` | No | Maximum unique jobs returned per query or search URL. Default `100`. |
| `sortBy` | No | `relevance` or `date` (newest first). Default `relevance`. |
| `postedWithinDays` | No | Keep jobs posted within this many days: `0` (any), `1`, `7`, `14`, or `30`. Default `0`. |
| `workFromHome` | No | Limit to `partial` or `full` remote jobs, or `any`. Default `any`. |
| `directApplyOnly` | No | Only return listings where StepStone hosts the application flow. Default `false`. |
| `includeDetails` | No | Fetch the full description, employment type, industry, valid-through date, and structured address. Default `true`. |
| `includeDescription` | No | Include the complete job description when detail enrichment is on. Default `true`. |
| `cleanHtml` | No | Return descriptions as readable text instead of HTML. Default `true`. |
| `maxConcurrency` | No | Number of detail pages fetched concurrently (1-10). Default `5`. |

### Output fields

Every country uses the same stable schema. Search-only mode returns the first group immediately; detail mode adds the richer fields.

| Group | Fields |
|---|---|
| Identity | `job_id`, `title`, `job_url`, `source_market`, `source_search_url` |
| Employer | `company_id`, `company_name`, `company_url`, `company_logo_url` |
| Location | `location`, `postal_code`, `address_street`, `address_locality`, `address_region`, `address_country` |
| Salary | `salary_raw`, `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_available` |
| Job attributes | `employment_type`, `industry`, `skills`, `work_from_home`, `labels`, `direct_apply` |
| Dates | `date_posted`, `valid_through`, `scraped_at` |
| Content | `snippet`, `description`, `description_html` |
| Ranking context | `section`, `is_sponsored`, `is_top_job` |
| Application | `apply_url` when StepStone hosts the direct application flow |

Example result:

```json
{
  "job_id": "14138674",
  "title": "Software Engineer (ServiceNow) - RegTech",
  "company_name": "N26 GmbH",
  "location": "Berlin, de",
  "work_from_home": "hybrid",
  "date_posted": "2026-07-11T01:31:28.927Z",
  "valid_through": "2026-08-10T01:31:28.927Z",
  "employment_type": "FULL_TIME",
  "industry": "IT, IT-Softwareentwicklung",
  "direct_apply": true,
  "description": "About the opportunity ...",
  "job_url": "https://www.stepstone.de/stellenangebote--...--14138674-inline.html",
  "apply_url": "https://www.stepstone.de/stellenangebote--...--14138674-inline.html",
  "source_market": "de"
}
```

### Common workflows

#### Monitor new jobs by role and city

Set `sortBy` to `date`, `postedWithinDays` to `1` or `7`, and schedule the Task daily. Stable `job_id` values make downstream deduplication straightforward.

#### Build salary benchmarks

Run several role/location pairs with `includeDetails: false`. The search payload already includes StepStone's published salary range and currency when available, so this is the cheapest mode.

#### Find companies actively hiring

Aggregate by `company_name` and `company_id`, then join the employer URL into a recruiting, sales, or market-intelligence workflow. The Actor returns public job and employer information; it does not invent personal contact data.

#### Feed a job board or ATS

Keep `includeDetails` enabled for full descriptions and expiry dates. Use `source_market` to partition Germany, Austria, and Belgium while retaining one schema.

### Cost and speed controls

- Disable `includeDetails` for the lowest-cost monitoring and salary-analysis runs.
- Disable `includeDescription` when descriptions are not needed downstream.
- Keep `maxConcurrency` between 3 and 5 for balanced throughput and reliability.
- Use focused queries and recent-date filters instead of downloading thousands of irrelevant rows.

### Reliability behavior

If a search page can't be loaded on the first attempt, the Actor automatically retries through an alternate route for that market so a temporary hiccup doesn't cost you the results. If one job's detail page fails to load, the Actor still keeps the useful fields already found on the search page instead of discarding the job. If every input fails, the run fails explicitly rather than reporting a misleading successful run with zero results.

### FAQ

#### Does it need a StepStone account or cookies?

No. It reads publicly accessible job searches and job pages.

#### Can I scrape a filtered StepStone URL?

Yes. Paste it into `startUrls`; the Actor preserves its query-string filters and paginates the result set.

#### Does it return external ATS application URLs?

`apply_url` is set when StepStone declares a direct application flow. For externally hosted applications, the destination may only be resolved after an interactive click, so the Actor returns the public `job_url` and leaves `apply_url` empty rather than guessing.

#### Are descriptions plain text or HTML?

Both modes are supported. `cleanHtml: true` returns readable text in `description`; turn it off to retain the source HTML.

#### Is this affiliated with StepStone?

No. This independent Actor extracts publicly available information. Use the data in accordance with StepStone's terms and applicable privacy, employment, and database laws.

### Support

Open an issue on the Actor page with a reproducible public URL and the missing or incorrect field. We prioritize broken searches and schema regressions.

**SEO keywords:** StepStone scraper, StepStone jobs API, StepStone Germany scraper, StepStone Austria jobs, StepStone Belgium jobs, German job listings API, salary data scraper, recruiting data, job market intelligence, StepStone job monitoring.

### Use cases

- Recruiters tracking openings and building candidate pipelines
- Job-market researchers analyzing hiring trends
- Data teams feeding job boards and alerting products

### Limitations

- Salary fields are populated only when StepStone publishes a salary range on the listing; most postings don't disclose one.
- Only `stepstone.de`, `stepstone.at`, and `stepstone.be` are covered; other StepStone country sites are not included.
- `apply_url` is left empty when the real application destination can only be resolved by an interactive click (external ATS flows); the public `job_url` is returned instead.
- If a job's detail page fails to load, only the fields already present on the search result (title, company, location) are returned for that job — the full description and structured fields are skipped rather than guessed.

### Related Actors

- [Adzuna Scraper - Global Job Search Aggregator](https://apify.com/thirdwatch/adzuna-jobs-scraper) — Thirdwatch
- [Xing Jobs Scraper](https://apify.com/thirdwatch/xing-jobs-scraper) — Thirdwatch
- [Career Site Job Listing Scraper](https://apify.com/thirdwatch/career-site-job-scraper) — Thirdwatch

Last verified: 2026-09

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

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

Choose the StepStone country site used for keyword searches. Start URLs can mix supported markets.

## `queries` (type: `array`):

One search per value, for example software engineer or data scientist.

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

City or region applied to keyword searches, for example Berlin, Wien, or Brussels.

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

Optional StepStone result pages or individual job URLs. Existing URL filters and country domains are preserved.

## `maxResultsPerQuery` (type: `integer`):

Each query or search URL can return up to this many unique jobs.

## `sortBy` (type: `string`):

Order each search by StepStone relevance or newest posting date.

## `postedWithinDays` (type: `string`):

Keep jobs posted within this many days. Use 0 for any date.

## `workFromHome` (type: `string`):

Limit results to partly remote or fully remote jobs, or keep every work mode.

## `directApplyOnly` (type: `boolean`):

Only return listings where StepStone hosts the application flow.

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

Adds the complete description, employment type, industry, valid-through date, and structured address.

## `includeDescription` (type: `boolean`):

Include the complete public job description when detail enrichment is enabled.

## `cleanHtml` (type: `boolean`):

Return description as readable text instead of HTML.

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

Number of detail pages fetched concurrently. Lower this if the source becomes unstable.

## Actor input object example

```json
{
  "country": "de",
  "queries": [
    "software engineer"
  ],
  "location": "Berlin",
  "startUrls": [],
  "maxResultsPerQuery": 3,
  "sortBy": "relevance",
  "postedWithinDays": "0",
  "workFromHome": "any",
  "directApplyOnly": false,
  "includeDetails": true,
  "includeDescription": true,
  "cleanHtml": true,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "queries": [
        "software engineer"
    ],
    "location": "Berlin",
    "maxResultsPerQuery": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/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 = {
    "queries": ["software engineer"],
    "location": "Berlin",
    "maxResultsPerQuery": 3,
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "software engineer"
  ],
  "location": "Berlin",
  "maxResultsPerQuery": 3
}' |
apify call thirdwatch/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thirdwatch/stepstone-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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