# StepStone Jobs Scraper — DACH Job Listings | No Login (`bovi/stepstone-jobs-scraper`) Actor

Scrape StepStone.de job listings into clean JSON. Returns job title, company, location, employment type, work mode, posted date, job URL, and description snippet. Covers Germany, Austria, Switzerland. Pay per job listing.

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

## Pricing

from $2.90 / 1,000 job-listings

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Extract job listings from **StepStone.de** — Germany's leading job board with over 60,000 active postings — into clean, structured JSON. No login required. No StepStone API key needed.

**Pricing:** Scraping 1,000 job listings costs approximately $2.90.

### What it scrapes

For each job listing, the actor extracts:

| Field | Description | Example |
|---|---|---|
| `job_id` | StepStone numeric listing ID | `14081997` |
| `title` | Job title | `Agentic Software Engineer (m/w/d)` |
| `company` | Employer name | `Reply GmbH` |
| `location` | City / region | `Berlin, Hamburg` |
| `employment_type` | Contract type | `Permanent`, `Freelance`, `Internship` |
| `work_mode` | Remote / hybrid / on-site | `Home office possible`, `Hybrid` |
| `posted_date` | Posting date (ISO-8601) | `2026-06-04` |
| `job_url` | Direct link to job page | `https://www.stepstone.de/stellenangebote--...` |
| `description_snippet` | Key bullet points from listing | `Python, FastAPI, PostgreSQL \| Microservices on AWS` |
| `scraped_at` | Scrape timestamp (UTC) | `2026-06-07T10:23:00Z` |
| `search_keyword` | Keyword used to find this job | `Software Engineer` |
| `search_location` | Location filter applied | `Berlin` |

### How to use

#### 1. Configure inputs

- **Search keywords**: One or more job titles or skill keywords. Each keyword runs separately. Examples: `["Software Engineer", "Data Analyst", "Product Manager"]`
- **Location**: Optional city or region to filter results. Examples: `Berlin`, `München`, `Frankfurt`. Leave empty to search all of Germany.
- **Max items**: Total maximum records to collect across all keywords (default: 100).
- **Max pages per keyword**: How many result pages to fetch per keyword. Each page returns ~20 jobs. Default: 5 pages = ~100 jobs per keyword.
- **Proxy configuration**: Pre-configured with Apify RESIDENTIAL proxy (Germany) — required to bypass StepStone's regional access controls. No changes needed.

#### 2. Run the actor

Typical run times:
- 100 jobs: ~1–2 minutes
- 500 jobs: ~5–8 minutes
- 2,000 jobs: ~20–30 minutes

#### 3. Download results

Results are available in JSON, CSV, XLSX, or XML format directly from the Apify dataset.

### Example output

```json
{
  "job_id": "14081997",
  "title": "Agentic Software Engineer (m/w/d)",
  "company": "Reply GmbH",
  "location": "Berlin",
  "employment_type": "Permanent",
  "work_mode": "Home office possible",
  "posted_date": "2026-06-05",
  "job_url": "https://www.stepstone.de/stellenangebote--Agentic-Software-Engineer--14081997-inline.html",
  "description_snippet": "Entwicklung KI-basierter Agentenlösungen | Zusammenarbeit mit cross-funktionalen Teams | Python, LangChain, OpenAI API",
  "scraped_at": "2026-06-07T10:23:00Z",
  "search_keyword": "Software Engineer",
  "search_location": "Berlin"
}
````

### Example input

```json
{
  "searchKeywords": ["Software Engineer", "Python Developer"],
  "location": "Berlin",
  "maxItems": 200,
  "maxPages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

### Coverage and scale

- **~60,000+ active listings** across Germany, Austria, and Switzerland
- **~20 jobs per page**, up to 25 pages per search (500 jobs per keyword with default settings)
- **All job categories**: IT/Tech, Engineering, Marketing, Finance, Sales, HR, Healthcare, and more
- **All employment types**: permanent, fixed-term, part-time, freelance, internship, apprenticeship

### Use cases

- **Talent intelligence**: monitor competitor hiring velocity, headcount trends, tech stack signals
- **Sales prospecting**: identify companies actively growing a department (hiring = buying intent)
- **Market research**: analyze salary bands, required skills, geographic demand across the DACH market
- **Job aggregation**: build niche job boards or alerts for specific roles/cities
- **Academic research**: labor market studies, skills gap analysis, remote-work adoption trends

### Technical approach

- **Transport**: `curl_cffi` with Chrome TLS fingerprint + Apify RESIDENTIAL proxy (Germany) to pass Akamai Bot Manager
- **Parser**: structural HTML parsing anchored on `data-at` attributes and tag hierarchy — resilient to CSS class changes
- **Deduplication**: cross-keyword deduplication by job ID — no duplicate records even when keywords overlap
- **Pagination**: automatic pagination up to `maxPages`; stops early if no next page detected

### Legal disclaimer

This actor scrapes publicly visible job listings from StepStone.de, which are freely accessible to all internet users without login. No user accounts, paywalled content, or personally identifiable information (PII) is accessed. Use in compliance with StepStone's Terms of Service and applicable data protection regulations (GDPR). This actor is intended for market intelligence and research purposes.

### FAQ

**Does this require a StepStone account?**
No. All scraped data is from public listings visible without login. Salary details are hidden behind login and are not scraped.

**Why does it use a residential proxy?**
StepStone.de uses Akamai Bot Manager which blocks datacenter IP ranges. EU residential proxies (included via Apify proxy) pass this check transparently. The proxy cost is included in the per-listing price.

**Can I scrape a specific city outside Germany?**
Yes — StepStone serves Austria (Wien, Graz) and Switzerland (Zürich, Basel). Use city name in the location field.

**What happens if a keyword returns no results?**
The actor logs a warning and moves to the next keyword. Zero results are not charged.

# Actor input Schema

## `searchKeywords` (type: `array`):

Job search keywords. Each keyword produces up to maxItems results. Example: \["Software Engineer", "Data Analyst"].

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

City or region to filter jobs. Examples: "Berlin", "München", "Hamburg". Leave empty for all Germany.

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

Maximum number of job records to return across all keywords.

## `maxPages` (type: `integer`):

How many result pages to fetch per keyword. Each page returns ~20 jobs.

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

Proxy settings. StepStone.de requires residential proxy (Apify RESIDENTIAL group, country=DE). The actor configures this automatically — leave as default unless you need custom settings.

## Actor input object example

```json
{
  "searchKeywords": [
    "Software Engineer",
    "Marketing Manager"
  ],
  "location": "Berlin",
  "maxItems": 100,
  "maxPages": 5,
  "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 = {
    "searchKeywords": [
        "Software Engineer",
        "Marketing Manager"
    ],
    "location": "Berlin",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/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 = {
    "searchKeywords": [
        "Software Engineer",
        "Marketing Manager",
    ],
    "location": "Berlin",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/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 '{
  "searchKeywords": [
    "Software Engineer",
    "Marketing Manager"
  ],
  "location": "Berlin",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call bovi/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "StepStone Jobs Scraper — DACH Job Listings | No Login",
        "description": "Scrape StepStone.de job listings into clean JSON. Returns job title, company, location, employment type, work mode, posted date, job URL, and description snippet. Covers Germany, Austria, Switzerland. Pay per job listing.",
        "version": "0.1",
        "x-build-id": "QiuhCCNY5GH22M5nh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bovi~stepstone-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bovi-stepstone-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/bovi~stepstone-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-bovi-stepstone-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/bovi~stepstone-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-bovi-stepstone-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchKeywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job search keywords. Each keyword produces up to maxItems results. Example: [\"Software Engineer\", \"Data Analyst\"].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City or region to filter jobs. Examples: \"Berlin\", \"München\", \"Hamburg\". Leave empty for all Germany."
                    },
                    "maxItems": {
                        "title": "Max items total",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of job records to return across all keywords.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Max pages per keyword",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many result pages to fetch per keyword. Each page returns ~20 jobs.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. StepStone.de requires residential proxy (Apify RESIDENTIAL group, country=DE). The actor configures this automatically — leave as default unless you need custom settings."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
