# StepStone Jobs Scraper — Salary, Company & Full Job Details (`haketa/stepstone-scraper`) Actor

Scrape job listings from StepStone across DACH & Benelux — title, company, location, salary, contract type, description and apply URL.

- **URL**: https://apify.com/haketa/stepstone-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (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 $2.29 / 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/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

## StepStone Jobs Scraper — Salary, Company & Full Job Details

Extract **job listings from StepStone** — the leading job board in Germany and Austria — as clean, structured JSON. Search by keyword and location (or paste your own filtered StepStone URLs) and get the job title, hiring company, location, **salary range**, contract type, work model, **full job description**, benefits, posting date, company profile and application link for every result.

Unlike thin scrapers that return only a title and a company name, this Actor opens each job and pulls the **complete picture** — including a **structured salary range (min, max, currency, period)** that most StepStone scrapers miss entirely.

Built for **recruiters, sourcers, HR-tech teams, labour-market analysts and sales teams** who need fresh, reliable StepStone data at scale — without writing or maintaining a scraper.

---

### Why this scraper

- 💶 **Real, structured salary data** — `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` as separate numeric fields, not a blurry "show salary" placeholder. Filter, sort and benchmark compensation directly.
- 🧾 **Full job content** — complete description, benefits, contract type, work model, ISO posting date, company profile and apply URL on every job.
- 🇩🇪🇦🇹 **Germany & Austria** keyword search, plus Start-URL mode for any StepStone country site or your own filtered searches.
- 🧹 **Clean, typed, deduplicated output** — consistent fields keyed by a stable job ID, ready for spreadsheets, databases and BI tools.
- 🛟 **Reliable at scale** — streams results as it runs, handles slow pages and bad records gracefully, and stops cleanly before any run-timeout so you always keep what was collected.

---

### What you can do with it

#### 🎯 Recruitment & sourcing
Pull every open role for a job title, skill or region and turn it into a live pipeline of openings and hiring companies. Track new postings daily, spot which employers are scaling teams, and reach out before the role is filled.

#### 📈 Sales & lead generation
Companies that are hiring are companies that are investing. Convert job posts into a B2B prospecting list with company name, profile link and location — perfect for recruiting agencies, staffing firms, SaaS vendors and service providers targeting growing teams.

#### 💰 Salary & compensation research
With structured salary ranges on most jobs, benchmark pay by role, seniority, city and industry. Build salary reports, monitor wage trends over time and feed compensation models — a low-cost alternative to expensive salary databases.

#### 📊 Labour-market & skills intelligence
Measure demand for specific skills, technologies and roles across the DACH market. Watch how remote/hybrid work, contract types and posting volumes shift month over month.

#### 🕵️ Competitor hiring intelligence
Monitor exactly which roles a specific employer is opening, in which locations, and how fast their headcount is growing — a strong early signal of strategy and expansion.

#### 🔁 Job-board aggregation & ATS feeds
Feed StepStone listings into your own job site, applicant-tracking system, CRM, data warehouse or dashboard with a clean, stable schema and deduplication built in.

---

### Features

- 🔎 **Keyword + location search** across **stepstone.de** (Germany) and **stepstone.at** (Austria).
- 🔗 **Start-URL mode** — paste any StepStone search-results URL (with your own filters, any country site) or individual job URLs.
- 🧾 **Detail-page enrichment** — full description, structured salary, contract type, work model, benefits, ISO posting date, company profile and apply URL.
- 📄 **Full pagination** — walks every results page (~25 jobs each) up to your limit.
- ⚡ **Fast list mode** — turn detail scraping off for a quick overview when you don't need the full content.
- 🧹 **Deduplication** — every job keyed by a stable `jobId`, safe to merge across scheduled runs.
- ⚙️ **Configurable** — limit jobs, limit pages, set a request delay, tune concurrency, choose your proxy.
- 🌍 **Proxy-ready** — works best with European residential proxies (recommended in the input).
- 📤 **Export anywhere** — JSON, CSV, Excel, HTML, or via API, with one-click integrations.

---

### Input

| Field | Type | Description |
|-------|------|-------------|
| `keyword` | string | Job title / keyword to search, e.g. `software developer`, `pflegefachkraft`, `marketing manager`. |
| `location` | string | Where to search, e.g. `berlin`, `münchen`, `wien`. Leave empty for a country-wide search. |
| `domain` | select | StepStone country site for keyword search: `de` (Germany) or `at` (Austria). |
| `startUrls` | array | StepStone search-result URLs or individual job URLs (any country site). |
| `radius` | integer | Search radius in km around the location (keyword mode). |
| `scrapeDetails` | boolean | Open each job for full description, salary, benefits, apply URL, etc. Default **on**. |
| `maxItems` | integer | Maximum number of jobs. `0` = no limit. |
| `maxPagesPerSearch` | integer | Maximum result pages per search. `0` = no limit. |
| `proxyConfiguration` | object | Proxy settings. European **residential** proxy strongly recommended. |
| `requestDelay` | integer | Delay between requests in milliseconds. |
| `maxConcurrency` | integer | Parallel detail-page requests. |

#### Example 1 — keyword search

```json
{
  "keyword": "software developer",
  "location": "berlin",
  "domain": "de",
  "scrapeDetails": true,
  "maxItems": 200,
  "maxPagesPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
````

#### Example 2 — your own filtered Start URLs

Search StepStone in your browser with whatever filters you like (employment type, seniority, radius, date posted, salary, etc.), copy the URL, and paste it in:

```json
{
  "startUrls": [
    "https://www.stepstone.de/jobs/data-engineer/in-hamburg?wfh=2",
    "https://www.stepstone.at/jobs/marketing/in-wien"
  ],
  "scrapeDetails": true,
  "maxItems": 500
}
```

#### Example 3 — specific jobs only

```json
{
  "startUrls": [
    "https://www.stepstone.de/stellenangebote--Senior-Java-Developer--12345678-inline.html"
  ]
}
```

#### Example 4 — fast, list-only overview

```json
{
  "keyword": "controller",
  "location": "frankfurt",
  "scrapeDetails": false,
  "maxItems": 1000
}
```

***

### Output

Each job is one dataset record. With `scrapeDetails` enabled you get the complete field set:

```json
{
  "jobId": "14091725",
  "title": "Rust Software Developer (d/m/w) für Cloud-native Lösungen / Kubernetes",
  "url": "https://www.stepstone.de/stellenangebote--...-14091725-inline.html",
  "company": "genua GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/de/genua-gmbh-58088",
  "companyProfileUrl": "https://www.stepstone.de/cmp/de/genua-gmbh-58088",
  "companyLogo": "https://...",
  "location": "Kirchheim bei München, Stuttgart, Köln, Berlin, Leipzig",
  "country": "de",
  "region": "Bayern",
  "locality": "Kirchheim bei München",
  "postalCode": "85551",
  "workFromHome": "Teilweise Home-Office",
  "contractType": "Feste Anstellung",
  "workType": "Vollzeit",
  "employmentType": "FULL_TIME",
  "industry": "IT, IT-Softwareentwicklung",
  "salary": "60.000 – 75.000 EUR/Jahr (geschätzt)",
  "salaryMin": 60000,
  "salaryMax": 75000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "Jahr",
  "salaryPredicted": true,
  "datePosted": "2026-06-16T10:03:06.02Z",
  "validThrough": "2026-07-01T09:35:50.797Z",
  "postedRelative": "vor 4 Tagen",
  "snippet": "Du willst Software nicht nur entwickeln, sondern ganzheitlich denken…",
  "description": "genua – Excellence in Digital Security. Das Team der genua GmbH …",
  "benefits": "Flexible Arbeitszeiten, 30 Tage Urlaub, Weiterbildung …",
  "applyUrl": "https://www.stepstone.de/stellenangebote--...-14091725-inline.html",
  "directApply": true,
  "searchWhat": "software developer",
  "searchWhere": "berlin",
  "searchDomain": "de",
  "rank": 1,
  "scrapedAt": "2026-06-20T09:51:58.000Z"
}
```

#### Field reference

| Field | Description |
|-------|-------------|
| `jobId` | StepStone job identifier (stable — safe for deduplication). |
| `title` | Job title. |
| `url` | Canonical job posting URL. |
| `company` | Hiring company name. |
| `companyUrl` / `companyProfileUrl` | StepStone company profile links. |
| `companyLogo` | Company logo image URL. |
| `location` | Location(s) as shown on the listing. |
| `country` / `region` / `locality` / `postalCode` | Parsed address fields (detail mode). |
| `workFromHome` | Remote / home-office information. |
| `contractType` | Contract type (e.g. permanent, temporary). |
| `workType` | Full-time / part-time. |
| `employmentType` | Normalised employment type. |
| `industry` | Industry / job function. |
| `salary` | Salary as a formatted string — real range or StepStone estimate. |
| `salaryMin` / `salaryMax` | Numeric salary range bounds. |
| `salaryCurrency` | Salary currency (ISO, e.g. `EUR`). |
| `salaryPeriod` | Salary period (`Jahr` / `Monat` / `Stunde`). |
| `salaryPredicted` | `true` when the salary is a StepStone estimate. |
| `datePosted` / `validThrough` | ISO posting and expiry dates. |
| `postedRelative` | Human-readable recency, e.g. `vor 4 Tagen`. |
| `snippet` | Short teaser from the results page. |
| `description` | Full job description text. |
| `benefits` | Benefits section text. |
| `applyUrl` | Application link. |
| `directApply` | Whether the job can be applied to directly on StepStone. |
| `searchWhat` / `searchWhere` / `searchDomain` | The query that produced the record. |
| `rank` | Position within the search results. |
| `scrapedAt` | ISO timestamp of scraping. |

> **Tip:** turn **`scrapeDetails` off** for a fast, lightweight list (title, company, location, snippet, posting date) when you only need an overview. Turn it **on** for production runs that need salary, full description and apply links.

***

### How to use

1. Open the Actor and set `keyword` and `location` (or paste `startUrls`).
2. Keep the **residential proxy** suggested in the input.
3. Set `maxItems` / `maxPagesPerSearch` to control volume.
4. Click **Start**. Watch results stream into the dataset live.
5. Export as **JSON, CSV, Excel, HTML or via API** — or connect to Google Sheets, Make, Zapier, Slack and more.

#### Run on a schedule

Use the platform **Scheduler** to run the same query every day or week. Each run captures the newest postings, and because every job has a stable `jobId`, you can safely deduplicate and build a historical dataset — ideal for trend analysis, salary tracking and "new jobs today" alerts.

#### Run it via API & integrations

Every run can be started, monitored and its data fetched programmatically through the standard platform API and official client libraries, so you can wire StepStone data straight into your own systems. One-click integrations let you push results to Google Sheets, Slack, Make, Zapier, Airbyte, webhooks and more.

***

### Tips for best results

- **Use residential proxies** — datacenter IPs are blocked; European residential IPs give the most reliable results.
- **Be specific** — a focused keyword + location returns more relevant jobs and runs faster than a broad nationwide sweep.
- **Split big jobs** — run separate searches per city or per role rather than one giant query; it's faster, easier to schedule and easier to debug.
- **List first, then enrich** — run list-only mode to gauge volume, then enable details for the slice you actually need.
- **Deduplicate on `jobId`** when merging runs over time.
- **Mind recency** — use `datePosted` / `postedRelative` to keep only fresh postings.
- **Tune concurrency** — raise `maxConcurrency` for speed, lower it (and raise `requestDelay`) if you ever see rate-limiting on very large runs.

***

### Performance & cost

- **List-only mode** is the fastest and cheapest — one request per results page (~25 jobs each).
- **Detail mode** opens one additional page per job for the full description and salary, so cost scales with the number of jobs.
- Use `maxItems`, `maxPagesPerSearch` and `maxConcurrency` to balance speed, completeness and cost.
- Results **stream into the dataset as they are scraped**, so partial data is always available — and a run stops gracefully before any timeout instead of failing.

***

### Frequently asked questions

**Which StepStone sites are supported?**
Keyword search covers **stepstone.de** (Germany) and **stepstone.at** (Austria). For other StepStone country sites, paste their search URLs into `startUrls`.

**Do I get the full job description?**
Yes — with `scrapeDetails` enabled, each job's full description, benefits and salary are included.

**Does it really get salary data?**
Yes. When StepStone provides a salary — whether stated by the employer or estimated by StepStone — it is captured as a formatted string **and** as structured `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` fields, with `salaryPredicted` flagging estimates.

**Why is `salaryPredicted` often `true`?**
Most German and Austrian postings don't state a salary, so StepStone shows its own estimate. The flag lets you keep, weight or exclude estimated salaries as you prefer.

**Can I scrape only specific jobs?**
Yes — paste individual job URLs into `startUrls` and they are scraped in full detail, regardless of the `scrapeDetails` toggle.

**Can I use my own search filters?**
Absolutely. Filter on StepStone in your browser (employment type, seniority, radius, date posted, salary, remote, etc.), copy the URL, and paste it into `startUrls`. The Actor follows your filters and paginates through all results.

**How many jobs can it return?**
As many as the search exposes. Use `maxItems` to cap the total and `maxPagesPerSearch` to cap pages per search. Set both to `0` for no limit.

**How fresh is the data?**
It is scraped live at run time. Schedule the Actor to keep a continuously updated dataset.

**Will large runs fail or time out?**
No — results stream as they go, and the Actor stops cleanly before any run-timeout, so you always keep what was collected and can resume with a higher limit or longer timeout.

**Do I need to write any code?**
No. Set the inputs, click Start, and export. Developers can also drive everything via the API.

**What export formats are available?**
JSON, CSV, Excel, HTML, RSS and API access, plus one-click integrations to Sheets, Slack, Make, Zapier, webhooks and more.

**Is a proxy required?**
A European residential proxy is strongly recommended (and pre-filled). Without it, requests are likely to be blocked.

**Can I get company details?**
Yes — company name, profile URL and logo are included, and the company profile link lets you enrich further.

**Does it support German umlauts in locations?**
Yes — locations like `münchen`, `köln` and `düsseldorf` work as expected.

***

### Troubleshooting

- **No results?** Check your keyword/location spelling, confirm your Start URLs are valid StepStone search pages, and make sure a European residential proxy is enabled.
- **Fewer jobs than expected?** Raise `maxItems` and `maxPagesPerSearch`, or broaden your keyword/location.
- **Run is slow?** Lower `maxItems`, turn `scrapeDetails` off for an overview first, or split the query into smaller searches.
- **Missing salary on some jobs?** Not every posting has a salary; StepStone only shows one when stated or estimated.

***

### Changelog

#### 0.1 — Initial release (June 2026)

- Keyword + location search for **stepstone.de** (Germany) and **stepstone.at** (Austria).
- **Start-URL mode** — any StepStone country site, your own filtered searches, or individual job URLs.
- Full detail-page enrichment: complete **description**, **benefits**, contract type and work model.
- **Structured salary** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` plus a predicted-salary flag.
- Company name, **profile URL** and logo.
- ISO **posting & expiry dates**, relative recency, **apply URL** and direct-apply flag.
- Full pagination, **deduplication by job ID**, and a fast list-only mode.
- Streaming output with graceful run-timeout handling, so large runs always keep their data.

# Actor input Schema

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

What to search for, e.g. 'software developer', 'pflegefachkraft', 'marketing manager'. Leave empty to scrape all jobs in a location.

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

Where to search, e.g. 'berlin', 'münchen', 'wien'. Leave empty for a country-wide search.

## `domain` (type: `string`):

Which StepStone country site to search (keyword mode). For other countries paste search URLs into Start URLs instead.

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

Paste StepStone search-result URLs (any country, with your own filters) or individual job URLs. Used instead of / alongside keyword search.

## `radius` (type: `integer`):

Search radius around the location in km (keyword mode). 0 = default.

## `scrapeDetails` (type: `boolean`):

Open each job to add full description, real/predicted salary, contract type, benefits, company profile, ISO posting date and apply URL. Slower but far richer. Turn OFF for a fast list-only run.

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

Maximum number of jobs to scrape. 0 = no limit.

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

Maximum result pages per search (each page ~25 jobs). 0 = no limit.

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

StepStone blocks datacenter IPs — European RESIDENTIAL proxy is strongly recommended.

## `requestDelay` (type: `integer`):

Delay between requests in milliseconds to stay polite and avoid rate-limiting.

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

Parallel detail-page requests. Keep moderate to avoid rate-limiting.

## Actor input object example

```json
{
  "keyword": "software developer",
  "location": "berlin",
  "domain": "de",
  "startUrls": [],
  "radius": 0,
  "scrapeDetails": true,
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "requestDelay": 800,
  "maxConcurrency": 6
}
```

# Actor output Schema

## `jobId` (type: `string`):

StepStone job ID

## `title` (type: `string`):

Job title

## `url` (type: `string`):

Job posting URL

## `company` (type: `string`):

Hiring company

## `companyUrl` (type: `string`):

Company profile URL

## `companyProfileUrl` (type: `string`):

Company profile page

## `companyLogo` (type: `string`):

Company logo URL

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

Job location(s)

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

Country code

## `region` (type: `string`):

Region/state

## `locality` (type: `string`):

City

## `postalCode` (type: `string`):

Postal code

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

Home-office / remote info

## `contractType` (type: `string`):

Permanent / temporary etc.

## `workType` (type: `string`):

Full-time / part-time

## `employmentType` (type: `string`):

Schema.org employment type

## `industry` (type: `string`):

Industry / function

## `salary` (type: `string`):

Salary display (real or predicted)

## `salaryMin` (type: `string`):

Minimum salary amount

## `salaryMax` (type: `string`):

Maximum salary amount

## `salaryCurrency` (type: `string`):

Salary currency (ISO)

## `salaryPeriod` (type: `string`):

Salary period (Jahr/Monat/Stunde)

## `salaryPredicted` (type: `string`):

Salary is StepStone estimate

## `datePosted` (type: `string`):

ISO posting date

## `validThrough` (type: `string`):

ISO expiry date

## `postedRelative` (type: `string`):

e.g. 'vor 4 Tagen'

## `snippet` (type: `string`):

Search-result teaser

## `description` (type: `string`):

Full job description (text)

## `benefits` (type: `string`):

Benefits section

## `applyUrl` (type: `string`):

Application URL

## `directApply` (type: `string`):

Apply directly on StepStone

## `searchWhat` (type: `string`):

Keyword used

## `searchWhere` (type: `string`):

Location used

## `searchDomain` (type: `string`):

StepStone domain

## `rank` (type: `string`):

Position in results

## `scrapedAt` (type: `string`):

ISO scrape timestamp

# 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": "software developer",
    "location": "berlin",
    "startUrls": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/stepstone-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 = {
    "keyword": "software developer",
    "location": "berlin",
    "startUrls": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/stepstone-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 '{
  "keyword": "software developer",
  "location": "berlin",
  "startUrls": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call haketa/stepstone-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "StepStone Jobs Scraper — Salary, Company & Full Job Details",
        "description": "Scrape job listings from StepStone across DACH & Benelux — title, company, location, salary, contract type, description and apply URL.",
        "version": "0.1",
        "x-build-id": "wdWtNLL2TIu5MnbVQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/haketa~stepstone-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-haketa-stepstone-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/haketa~stepstone-scraper/runs": {
            "post": {
                "operationId": "runs-sync-haketa-stepstone-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/haketa~stepstone-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-haketa-stepstone-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": {
                    "keyword": {
                        "title": "Keyword / job title",
                        "type": "string",
                        "description": "What to search for, e.g. 'software developer', 'pflegefachkraft', 'marketing manager'. Leave empty to scrape all jobs in a location."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Where to search, e.g. 'berlin', 'münchen', 'wien'. Leave empty for a country-wide search."
                    },
                    "domain": {
                        "title": "StepStone domain",
                        "enum": [
                            "de",
                            "at"
                        ],
                        "type": "string",
                        "description": "Which StepStone country site to search (keyword mode). For other countries paste search URLs into Start URLs instead.",
                        "default": "de"
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Paste StepStone search-result URLs (any country, with your own filters) or individual job URLs. Used instead of / alongside keyword search.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "radius": {
                        "title": "Radius (km)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Search radius around the location in km (keyword mode). 0 = default.",
                        "default": 0
                    },
                    "scrapeDetails": {
                        "title": "Scrape detail pages",
                        "type": "boolean",
                        "description": "Open each job to add full description, real/predicted salary, contract type, benefits, company profile, ISO posting date and apply URL. Slower but far richer. Turn OFF for a fast list-only run.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max jobs",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of jobs to scrape. 0 = no limit.",
                        "default": 0
                    },
                    "maxPagesPerSearch": {
                        "title": "Max pages per search",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum result pages per search (each page ~25 jobs). 0 = no limit.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "StepStone blocks datacenter IPs — European RESIDENTIAL proxy is strongly recommended.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "DE"
                        }
                    },
                    "requestDelay": {
                        "title": "Request delay (ms)",
                        "minimum": 0,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Delay between requests in milliseconds to stay polite and avoid rate-limiting.",
                        "default": 800
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Parallel detail-page requests. Keep moderate to avoid rate-limiting.",
                        "default": 6
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
