# StepStone Jobs Scraper (`carabain-digital/stepstone-jobs`) Actor

Scrape job postings from StepStone.de (Germany): title, company, location, posting date, valid-through, home-office flag and company page. Optional full details: description and employment type. Filter by keyword, location, radius and age. German residential proxy. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/carabain-digital/stepstone-jobs.md
- **Developed by:** [Carabain Digital](https://apify.com/carabain-digital) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 job postings

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

### What is StepStone Jobs Scraper?

**StepStone Jobs Scraper** extracts **job postings from [StepStone.de](https://www.stepstone.de)**, one of the biggest job boards in Germany. Search by keyword, city and radius, and download title, company, location, posting date, valid-through date, home-office flag and company page as JSON, CSV or Excel. Costs **$1 per 1,000 jobs**; the full description and employment type are an optional add-on at $2 per 1,000. A German residential proxy is built in.

- 🔎 **Search like on the site**: keyword, city or postcode, radius in km and "posted in the last N days"
- 🏠 **Home-office flag**, valid-through date and company page for every job
- 📄 **Optional full details**: description as plain text and employment type
- 🎯 **Only real hits**: StepStone pads its result counts with loosely related jobs; this Actor keeps the ones that match your search
- ⚡ **Fast**: plain HTTP, no browser, about 100 jobs in 8 seconds
- 🤖 **Agent friendly**: small flat items, a clear schema, works through the Apify MCP server
- 🔌 **Connect the data** to Google Sheets, Slack, Make, Zapier or your own app via the API

#### What data can I extract from StepStone?

<table>
<tr><td>🆔 Stable job ID and URL</td><td>📝 Job title</td></tr>
<tr><td>🏢 Company and company page</td><td>📍 Location and city</td></tr>
<tr><td>📅 Posting date</td><td>⏳ Valid-through date</td></tr>
<tr><td>🏠 Home-office flag</td><td>💶 Employer-stated salary (rare)</td></tr>
<tr><td>📄 Full description (add-on)</td><td>⏱️ Employment type (add-on)</td></tr>
</table>

StepStone shows its own salary **estimate** on almost every ad. Those estimates are not copied: the salary fields are only filled when the employer stated a salary, which is rare. Postcode, coordinates, hours and education level are not provided.

### How to scrape StepStone jobs

1. [Create a free Apify account](https://console.apify.com/sign-up) and open this Actor.
2. Enter a **keyword** and/or a **location** (and a radius).
3. Set **Max jobs** (up to 150 per search), and optionally **Posted in the last (days)**.
4. Switch on **Full details** if you need the description.
5. Click **Start** and download the jobs from the **Output** tab as JSON, CSV, Excel, XML or HTML.

### How much does it cost to scrape StepStone?

You **pay per job** that ends up in your dataset: **$1 per 1,000 jobs**. No subscription, no rental fee. The proxy is included.

- **Add-on: Full details**, **$2 per 1,000** jobs, **off by default**. Charged only for jobs whose detail page was actually fetched.
- The monthly credit of Apify's free plan covers thousands of jobs.
- No charge for empty searches or failed runs. Set a maximum cost per run in the run options and the scraper stops when it is reached.

### Input

See the **Input** tab for all options. The same fields are used by our other job scrapers.

| Field | Description |
|---|---|
| **Keyword** (`keyword`) | Job title or skill, e.g. `Softwareentwickler` |
| **Location** (`location`) | City or postcode, e.g. `Berlin` |
| **Radius (km)** (`radius_km`) | Distance around the location; needs a location |
| **Posted in the last (days)** (`posted_since_days`) | Only jobs posted in the last N days |
| **Max jobs** (`limit`) | Stop after this many jobs (maximum 150 per search) |
| **Full details** (`includeDetails`) | Paid add-on: description and employment type |
| **Proxy** (`proxyConfiguration`) | German residential proxy by default |

Give a keyword and/or a location. Example input:

```json
{
  "keyword": "Softwareentwickler",
  "location": "Berlin",
  "radius_km": 30,
  "limit": 20
}
```

### Output

Jobs are stored in the default dataset. Export them as JSON, CSV, Excel, XML or HTML. One job looks like this (with the full-details add-on on):

```json
{
  "id": "stepstone:14698956",
  "source": "stepstone",
  "url": "https://www.stepstone.de/stellenangebote--Software-Development-Engineer-2026-m-w-d-Berlin-Amazon-Europe-Core--14698956-inline.html",
  "title": "Software Development Engineer - 2026 (m/w/d)",
  "company": "Amazon Europe Core",
  "company_url": "https://www.stepstone.de/cmp/de/Amazon-Europe-Core-209745/jobs.html",
  "location": "Berlin",
  "city": "Berlin",
  "postcode": null,
  "region": null,
  "country": "DE",
  "lat": null,
  "lon": null,
  "remote": null,
  "posted_at": "2026-10-30T14:27:43Z",
  "valid_through": "2026-11-29T14:27:43Z",
  "employment_type": [
    "FULL_TIME"
  ],
  "hours_per_week_min": null,
  "hours_per_week_max": null,
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "education_level": null,
  "description": "At Amazon, we hire the best minds in technology to innovate and build on behalf of our customers. Customer obsession is part of our company DNA, which has made us one of the world's most beloved brands. Amazon is an equal opportunities employer. We believe pas…",
  "apply_url": null,
  "scraped_at": "2026-10-30T14:41:07Z"
}
```

Without the add-on, `description` is `null` and `employment_type` is empty.

### What can I do with StepStone data?

- 📈 **Labour market research**: compare demand per city, role or company.
- 🧲 **Recruitment and lead generation**: find companies that are hiring, and how many roles they have open.
- 🔔 **Job alerts and monitoring**: schedule a daily run with "posted in the last 1 day" and push new jobs to Slack or e-mail.
- 🤖 **AI and analysis**: feed real vacancy text into your own models.

### Tips for best results

- **StepStone shows at most 150 jobs per search** (6 pages of 25); deeper pages are refused by the site. To collect more, run several searches: other keywords, other cities, or a short date window such as the last day.
- For monitoring, schedule a daily run with **Posted in the last (days)** set to `1`.
- The order is StepStone's own: roughly newest first, with a few ads out of place. Use the date filter for freshness rather than relying on the order.
- Many ads come from staffing agencies and several locations are listed in one ad: `city` is the first one, `location` has them all.
- Turn on **Full details** only when you need the description: StepStone detail pages are large, so it is slower (about 4 jobs per second).

### Frequently asked questions

#### Can I use StepStone Jobs Scraper with the Apify API?

Yes. Use the [Apify API](https://docs.apify.com/api/v2) or the Apify clients. Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("carabain-digital/stepstone-jobs").call(run_input={"keyword": "Softwareentwickler", "location": "Berlin", "limit": 50})
jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
```

#### Can I use StepStone Jobs Scraper through an MCP server or with AI agents?

Yes. Add the [Apify MCP server](https://mcp.apify.com) to your AI agent (Claude, ChatGPT, Cursor and others) and let it call `carabain-digital/stepstone-jobs` with `call-actor`. The input is small and every field has a description, so an agent can fill it from a plain request such as "find 20 new software developer jobs in Berlin". Runs with a small limit finish in seconds; the agent then reads the dataset with `get-dataset-items`. Full details are off by default, so an agent only pays for the base price unless it asks for them.

#### Can I integrate StepStone data with other apps?

Yes: Make, Zapier, Google Sheets, Slack, Airbyte and webhooks, via Apify's [integrations](https://apify.com/integrations).

#### Why does a search return fewer jobs than the number StepStone shows?

StepStone's headline count includes loosely related "similar" jobs and a search shows at most 150 results. The Actor keeps only the jobs that match your search and returns up to 150.

#### Why is salary empty?

StepStone shows an estimate computed by StepStone for most ads, not the employer's salary. The Actor does not present estimates as salaries, so the fields are only filled for the few ads where the employer stated one.

#### Is it legal to scrape StepStone?

The Actor only reads publicly visible job ads, no login, and is polite with its request rate. Job ads can contain personal data such as a contact name, so check your local rules (GDPR) before storing or republishing them, and consult a lawyer if unsure. See Apify's [guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

#### StepStone Jobs Scraper not working? / Feedback

Open an issue in the **Issues** tab of this Actor with the input you used and I will look at it, usually within a few days.

### Other scrapers by us

| Actor | What it scrapes |
|---|---|
| [arbeitsagentur-jobs](https://apify.com/carabain-digital/arbeitsagentur-jobs) | Germany's federal job board (Bundesagentur für Arbeit) |
| [vdab-jobs](https://apify.com/carabain-digital/vdab-jobs) | VDAB, the Flemish public job board (Belgium) |
| [nationale-vacaturebank-jobs](https://apify.com/carabain-digital/nationale-vacaturebank-jobs) | Nationale Vacaturebank, ~95,000 Dutch jobs |
| [intermediair-jobs](https://apify.com/carabain-digital/intermediair-jobs) | Intermediair, Dutch jobs for professionals |
| [jobbird-jobs](https://apify.com/carabain-digital/jobbird-jobs) | Jobbird, Dutch aggregator of recruiter and employer ads |

# Actor input Schema

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

Job title or skill to search for. Example: `Softwareentwickler` or `Pflegefachkraft`. Give a keyword and/or a location.

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

City or postcode to search around. Example: `Berlin` or `Frankfurt am Main`. Give a keyword and/or a location.

## `radius_km` (type: `integer`):

Search radius around the location, in km. Example: `30`. Needs a location.

## `posted_since_days` (type: `integer`):

Only jobs posted in the last N days. Example: `7`. StepStone filters 1, 3, 7 and 14 days; other values are applied on the posting date. Leave empty for all ads.

## `limit` (type: `integer`):

Stop after this many jobs. Example: `100`. StepStone shows at most 150 jobs per search (6 pages of 25), so the maximum is 150: split bigger needs over several keywords or locations.

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

Open every job's detail page to add the full description (plain text) and employment type. Adds $1 per 1,000 enriched jobs. Slower: StepStone detail pages are large.

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

A German residential proxy is on by default: StepStone limits datacenter IPs. Proxy traffic is included in the price.

## Actor input object example

```json
{
  "keyword": "Softwareentwickler",
  "location": "Berlin",
  "radius_km": 30,
  "limit": 20,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

All scraped jobs, one item per job posting.

# 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 = {
    "keyword": "Softwareentwickler",
    "location": "Berlin",
    "radius_km": 30,
    "limit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("carabain-digital/stepstone-jobs").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 = {
    "keyword": "Softwareentwickler",
    "location": "Berlin",
    "radius_km": 30,
    "limit": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("carabain-digital/stepstone-jobs").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 '{
  "keyword": "Softwareentwickler",
  "location": "Berlin",
  "radius_km": 30,
  "limit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call carabain-digital/stepstone-jobs --silent --output-dataset

```

## MCP server setup

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

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/YiukMLrFqONvTtCq8/builds/iTcg8zQh3ecjswMtS/openapi.json
