# StepStone Scraper (`blackfalcondata/stepstone-scraper`) Actor

Scrape stepstone.de and 16 partner portals across DE/AT/BE/NL/UK. ML-predicted salary estimates, 29 search filters, and job change monitoring.

- **URL**: https://apify.com/blackfalcondata/stepstone-scraper.md
- **Developed by:** [Black Falcon Data](https://apify.com/blackfalcondata) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 71.4% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.

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

### What does StepStone Scraper do?

StepStone Scraper extracts structured job data from [stepstone.dk](https://stepstone.dk) — including salary data, contact details, company metadata, full descriptions, skill tags, and ratings and reviews. It supports keyword search, location filters, and controllable result limits, so you can run the same query consistently over time. The actor also offers detail enrichment (full descriptions and company metadata) where the source provides them and a compact output mode for AI-agent and MCP workflows.

### What data can you extract from stepstone.dk?

Each result includes Core listing fields (`jobKey`, `title`, `location`, `postCode`, `url`, `datePosted`, `postedDaysAgo`, and `workFromHome`, and more), detail fields when enrichment is enabled (`detailsFetched`, `description`, `locationDetail`, `salaryDetail`, and `benefits`), contact and apply information (`directApply`), and company metadata (`company`, `companyId`, `companyUrl`, and `companyLogoUrl`). In standard mode, all fields are always present — unavailable data points are returned as `null`, never omitted. In compact mode, only core fields are returned.

Enable detail enrichment in the input to get richer fields such as full descriptions and company metadata where the source provides them.

### Input

The main inputs are a search keyword, an optional location filter, and a result limit. Additional filters and options are available in the input schema.

Key parameters:

- **`startUrls`** — Direct StepStone search URLs to scrape. If provided, query/location/geo are ignored for URL building.
- **`query`** — Job search keyword (e.g., 'software-developer', 'data-analyst'). Not required when startUrls is provided.
- **`location`** — Location filter (e.g., 'Berlin', 'München')
- **`geo`** — Job portal to scrape. Some portals require a paid Apify plan with proxy access. (default: `"DE"`)
- **`sort`** — Sort order for results (default: `"relevance"`)
- **`age`** — Only show jobs posted within this many days
- **`remote`** — Only show remote/home office positions
- **`radius`** — Search radius around location in km (requires location)
- **`minSalary`** — Minimum annual salary filter (EUR)
- **`contractType`** — Filter by contract/employment type
- **`experience`** — Filter by experience level
- **`workType`** — Filter by work schedule (full-time / part-time)
- ...and 19 more parameters

#### Input example

```json
{
  "query": "software-developer",
  "geo": "DE",
  "sort": "relevance",
  "excludeSponsored": false,
  "includeDetails": true,
  "detailEngine": "auto",
  "descriptionFormat": "html",
  "maxResults": 5,
  "maxPages": 10,
  "mode": "full",
  "stateStoreName": "stepstone-state",
  "dedupKey": "jobKey",
  "compact": false,
  "descriptionMaxLength": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "maxRequestRetries": 3
}
````

### Output

Each run produces a dataset of structured job records. Results can be downloaded as JSON, CSV, or Excel from the Dataset tab in Apify Console.

#### Example job record

```json
{
  "jobKey": "13678941",
  "title": "Software Engineer (w/m/d)",
  "company": "Breakthrough-Consulting GmbH Michael Ebert",
  "location": "Aschaffenburg, Home-Office, bundesweit",
  "postCode": null,
  "url": "https://www.stepstone.de/stellenangebote--Software-Engineer-w-m-d-Aschaffenburg-Home-Office-bundesweit-Breakthrough-Consulting-GmbH-Michael-Ebert--13678941-inline.html?rltr=1_1_25_seorl_m_0_0_0_0_0_0",
  "datePosted": "2026-03-27T12:22:14+01:00",
  "postedDaysAgo": 0,
  "workFromHome": "2",
  "workFromHomeLabel": "Remote",
  "isSponsored": false,
  "isTopJob": false,
  "companyId": 390933,
  "companyUrl": "https://www.stepstone.de/cmp/de/breakthrough-consulting-gmbh-michael-ebert-390933/jobs",
  "companyLogoUrl": "https://www.stepstone.de/upload_DE/logo/0/logoBreakthrough-Consulting-GmbH-Michael-Ebert-390933DE-2511041634.gif",
  "textSnippet": "Breakthrough-Consulting GmbH Michael Ebert * Aschaffenburg, Home-Office, bundesweit * Feste Anstellung * Homeoffice möglich, Vollzeit - Die \"Breakthrough-Consulting-GmbH\" setzt sich proaktiv dafür ein...",
  "textSnippetCleaned": "Breakthrough-Consulting GmbH Michael Ebert * Aschaffenburg, Home-Office, bundesweit * Feste Anstellung * Homeoffice möglich, Vollzeit - Die \"Breakthrough-Consulting-GmbH\" setzt sich proaktiv dafür ein...",
  "labels": [],
  "topLabels": [],
  "skills": [],
  "harmonisedId": "F7C1F980-9048-49DD-8107-F6CE9572088A",
  "unifiedSalary": {
    "min": null,
    "max": null,
    "currency": null,
    "period": null,
    "salaryAvailable": true,
    "salaryType": null
  },
  "hasFuturePosting": false,
  "partnership": {
    "isPartnershipJob": false,
    "isBackfilled": false,
    "isCrossPosted": false,
    "sourceSiteFriendlyName": ""
  },
  "metaData": {
    "positionOnPage": 1,
    "positionAbsolute": 1
  },
  "publishFromDate": null,
  "publishToDate": null,
  "isAnonymous": false,
  "isHighlighted": false,
  "section": "main",
  "travelTime": null,
  "geo": "DE",
  "query": "software engineer",
  "scrapedAt": "2026-03-28T08:56:39.064Z",
  "portalUrl": "https://www.stepstone.de",
  "detailsFetched": true,
  "description": "<h4>Einleitung</h4>\n<p>Die&nbsp;<strong>\"Breakthrough-Consulting-GmbH\"</strong>&nbsp;setzt sich proaktiv dafür ein, mehr Menschen es zu ermöglichen, sich professionell aus- und weiterbilden zu lassen....",
  "employmentType": "FULL_TIME",
  "validThrough": "2026-04-26T10:22:14.403Z",
  "locationDetail": {
    "city": "Aschaffenburg",
    "postalCode": "",
    "country": "de",
    "lat": null,
    "lng": null
  },
  "salaryDetail": null,
  "ceSalary": {
    "isPredicted": true,
    "min": 3000,
    "max": 5500,
    "period": "Monat",
    "currency": "€",
    "currencyIso": "EUR"
  },
  "directApply": true,
  "industry": "IT, IT-Softwareentwicklung",
  "companyRating": null,
  "benefits": null,
  "companyWebsite": "https://www.stepstone.de/cmp/de/Breakthrough-Consulting-GmbH-Michael-Ebert-390933/jobs.html"
}
```

### How to scrape stepstone.dk

1. Go to [StepStone Scraper](https://apify.com/blackfalcondata/stepstone-scraper) in Apify Console.
2. Enter a search keyword and optional location filter.
3. Set `maxResults` to control how many results you need.
4. Enable `includeDetails` if you need full descriptions, contact info, or company data.
5. Click **Start** and wait for the run to finish.
6. Export the dataset as JSON, CSV, or Excel.

### Use cases

- Extract job data from stepstone.dk for market research and competitive analysis.
- Track salary trends across regions and categories over time.
- Build outreach lists using contact details and apply URLs from listings.
- Research company hiring patterns, employer profiles, and industry distribution.
- Feed structured data into AI agents, MCP tools, and automated pipelines using compact mode.
- Export clean, structured data to dashboards, spreadsheets, or data warehouses.
- Analyze skill demand across listings using structured skill tags.
- Collect ratings and reviews for reputation monitoring and benchmarking.

### How much does it cost to scrape stepstone.dk?

StepStone Scraper uses [pay-per-event](https://docs.apify.com/platform/actors/paid-actors/pay-per-event) pricing. You pay a small fee when the run starts and then for each result that is actually produced.

- **Run start:** $0.01 per run
- **Per result:** $0.002 per job record

Example costs:

- 10 results: **$0.03**
- 100 results: **$0.21**
- 500 results: **$1.01**

### FAQ

#### How many results can I get from stepstone.dk?

The number of results depends on the search query and available listings on stepstone.dk. Use the `maxResults` parameter to control how many results are returned per run.

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

Yes. StepStone Scraper works with Apify's [integrations](https://apify.com/integrations) to connect with tools like Zapier, Make, Google Sheets, Slack, and more. You can also use webhooks to trigger actions when a run completes.

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

Yes. You can start runs, manage inputs, and retrieve results programmatically through the [Apify API](https://docs.apify.com/api/v2). Client libraries are available for JavaScript, Python, and other languages.

#### Can I use StepStone Scraper through an MCP Server?

Yes. Apify provides an [MCP Server](https://apify.com/apify/actors-mcp-server) that lets AI assistants and agents call this actor directly. Use compact mode and `descriptionMaxLength` to keep payloads manageable for LLM context windows.

#### Is it legal to scrape stepstone.dk?

This actor extracts publicly available data from stepstone.dk. Web scraping of public information is generally considered legal, but you should always review the target site's terms of service and ensure your use case complies with applicable laws and regulations, including GDPR where relevant.

#### Your feedback

If you have questions, need a feature, or found a bug, please [open an issue](https://apify.com/blackfalcondata/stepstone-scraper/issues) on the actor's page in Apify Console. Your feedback helps us improve.

### You might also like

- [Arbeitsagentur Scraper](https://apify.com/blackfalcondata/arbeitsagentur-scraper) — Extract job listings from arbeitsagentur.de — Germany's official public employment portal with 1M+.
- [Dice.com Job Scraper](https://apify.com/blackfalcondata/dice-com-job-scraper) — Scrape Dice.com tech job listings with structured salary (min/max/currency), full descriptions,.
- [Drushim Scraper - Israel Job Listings from drushim.co.il](https://apify.com/blackfalcondata/drushim-scraper) — Extract structured job listings from drushim.co.il, Israel's leading job board. Search by keyword,.
- [Duunitori Scraper](https://apify.com/blackfalcondata/duunitori-scraper) — Extract structured job listings from Duunitori.fi — Finland's largest job board. Salary ranges,.
- [Glassdoor Job Scraper](https://apify.com/blackfalcondata/glassdoor-job-scraper) — Extract structured job listings from Glassdoor across 21 markets with salary data, filters, compact.
- [Indeed Job Scraper](https://apify.com/blackfalcondata/indeed-job-scraper) — Extract structured job listings from Indeed across 62 markets with built-in change tracking.
- [Jobdanmark Scraper](https://apify.com/blackfalcondata/jobdanmark-scraper) — Extract structured job listings from jobdanmark.dk — Denmark's job portal with 14,500+ listings,.
- [Jobindex Scraper](https://apify.com/blackfalcondata/jobindex-scraper) — Scrape structured job listings from Denmark's largest job portals — Jobindex.dk, IT-Jobbank.dk.

# Actor input Schema

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

Direct StepStone search URLs to scrape. If provided, query/location/geo are ignored for URL building.

## `query` (type: `string`):

Job search keyword (e.g., 'software-developer', 'data-analyst'). Not required when startUrls is provided.

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

Location filter (e.g., 'Berlin', 'München')

## `geo` (type: `string`):

Job portal to scrape. Some portals require a paid Apify plan with proxy access.

## `sort` (type: `string`):

Sort order for results

## `age` (type: `integer`):

Only show jobs posted within this many days

## `remote` (type: `boolean`):

Only show remote/home office positions

## `radius` (type: `string`):

Search radius around location in km (requires location)

## `minSalary` (type: `integer`):

Minimum annual salary filter (EUR)

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

Filter by contract/employment type

## `experience` (type: `string`):

Filter by experience level

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

Filter by work schedule (full-time / part-time)

## `companyId` (type: `integer`):

Filter by StepStone company ID (numeric)

## `language` (type: `string`):

Filter by job posting language (e.g., 'en', 'de')

## `applicationMethod` (type: `string`):

Filter by how to apply (e.g., INTERNAL = apply on company site only)

## `excludeSponsored` (type: `boolean`):

Skip sponsored/promoted listings. Filters out items where isSponsored=true.

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

Fetch each job's detail page for full description, ISO dates, salary, and geo coordinates. Slower but much richer data.

## `detailEngine` (type: `string`):

Controls how job detail pages are fetched. 'auto' (recommended) = actor chooses best method automatically. 'cheerio' = lightweight HTTP-only detail fetching. 'playwright' = browser-based detail fetching (heavier, for WAF-protected portals).

## `descriptionFormat` (type: `string`):

Format for job description text (requires Include Detail Pages)

## `maxResults` (type: `integer`):

Maximum number of job listings to return (0 = unlimited)

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

Maximum number of search result pages to scrape

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

full = return all jobs found. incremental = only return jobs not seen in previous runs (requires stateStoreName).

## `stateStoreName` (type: `string`):

KV store name for incremental state. Use same name across scheduled runs. State is scoped per query+location+geo combination.

## `dedupStoreName` (type: `string`):

Named KV store for cross-run dedup. Same name across runs = only new jobs pushed.

## `dedupKey` (type: `string`):

Field used as unique key for dedup (default: jobKey)

## `datasetName` (type: `string`):

Custom dataset name. Supports masks: {DATE} = YYYYMMDD, {TIME} = HHMMSS

## `outputFields` (type: `array`):

Select subset of output fields. Use dot notation for nested: 'ceSalary.min'. If empty: all fields returned.

## `compact` (type: `boolean`):

When true, each result contains only the 11 most essential fields: jobKey, title, company, location, url, portalUrl, datePosted, workFromHome, unifiedSalary, geo, and description. Use this in AI-agent and MCP workflows where token budgets matter.

## `descriptionMaxLength` (type: `integer`):

Truncate the description field to this many characters, appending '...' if truncated. 0 means no truncation. Use in AI-agent workflows to control context window usage. Pairs well with compact mode.

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

Apify proxy configuration. Some portals require enhanced proxy (handled automatically). Your Apify plan must include proxy access.

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

Maximum number of concurrent requests

## `maxRequestRetries` (type: `integer`):

Maximum number of retries per request

## `_benchDelayMs` (type: `integer`):

Internal benchmark override: fixed delay between requests in milliseconds. Not for production use.

## `_benchFreshSession` (type: `boolean`):

Internal benchmark override: force fresh session on every request. Not for production use.

## Actor input object example

```json
{
  "query": "data engineer",
  "location": "Berlin",
  "geo": "DE",
  "sort": "relevance",
  "excludeSponsored": false,
  "includeDetails": true,
  "detailEngine": "auto",
  "descriptionFormat": "html",
  "maxResults": 20,
  "maxPages": 10,
  "mode": "full",
  "stateStoreName": "stepstone-state",
  "dedupKey": "jobKey",
  "compact": false,
  "descriptionMaxLength": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "query": "software-developer",
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("blackfalcondata/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 = {
    "query": "software-developer",
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("blackfalcondata/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 '{
  "query": "software-developer",
  "maxResults": 5
}' |
apify call blackfalcondata/stepstone-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "StepStone Scraper",
        "description": "Scrape stepstone.de and 16 partner portals across DE/AT/BE/NL/UK. ML-predicted salary estimates, 29 search filters, and job change monitoring.",
        "version": "1.7",
        "x-build-id": "HsnIkkh0xc1xZabCS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/blackfalcondata~stepstone-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-blackfalcondata-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/blackfalcondata~stepstone-scraper/runs": {
            "post": {
                "operationId": "runs-sync-blackfalcondata-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/blackfalcondata~stepstone-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-blackfalcondata-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Direct StepStone search URLs to scrape. If provided, query/location/geo are ignored for URL building.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "query": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Job search keyword (e.g., 'software-developer', 'data-analyst'). Not required when startUrls is provided."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Location filter (e.g., 'Berlin', 'München')"
                    },
                    "geo": {
                        "title": "Country / Portal",
                        "enum": [
                            "DE",
                            "BE",
                            "AT",
                            "NL",
                            "TOTALJOBS",
                            "CWJOBS",
                            "JOBSITE",
                            "MILKROUND",
                            "CATERER",
                            "RETAILCHOICE",
                            "CATERERGLOBAL",
                            "CITYJOBS",
                            "JUSTENGINEERS",
                            "EMEDCAREERS",
                            "NIJOBS",
                            "JOBSIE",
                            "PNET"
                        ],
                        "type": "string",
                        "description": "Job portal to scrape. Some portals require a paid Apify plan with proxy access.",
                        "default": "DE"
                    },
                    "sort": {
                        "title": "Sort By",
                        "enum": [
                            "relevance",
                            "date",
                            "salary_low",
                            "salary_high"
                        ],
                        "type": "string",
                        "description": "Sort order for results",
                        "default": "relevance"
                    },
                    "age": {
                        "title": "Posted Within",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only show jobs posted within this many days"
                    },
                    "remote": {
                        "title": "Remote Only",
                        "type": "boolean",
                        "description": "Only show remote/home office positions"
                    },
                    "radius": {
                        "title": "Radius (km)",
                        "enum": [
                            "5",
                            "10",
                            "20",
                            "30",
                            "40",
                            "50",
                            "75",
                            "100"
                        ],
                        "type": "string",
                        "description": "Search radius around location in km (requires location)"
                    },
                    "minSalary": {
                        "title": "Minimum Salary",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum annual salary filter (EUR)"
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "FULL_TIME",
                            "PART_TIME",
                            "CONTRACT",
                            "TEMPORARY",
                            "INTERNSHIP",
                            "APPRENTICESHIP",
                            "FREELANCE",
                            "MINI_JOB",
                            "WORKING_STUDENT",
                            "VOLUNTEER",
                            "THESIS",
                            "DUAL_STUDY"
                        ],
                        "type": "string",
                        "description": "Filter by contract/employment type"
                    },
                    "experience": {
                        "title": "Experience Level",
                        "enum": [
                            "no",
                            "required",
                            "executive"
                        ],
                        "type": "string",
                        "description": "Filter by experience level"
                    },
                    "workType": {
                        "title": "Work Type",
                        "enum": [
                            "FULL_TIME",
                            "PART_TIME"
                        ],
                        "type": "string",
                        "description": "Filter by work schedule (full-time / part-time)"
                    },
                    "companyId": {
                        "title": "Company ID",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Filter by StepStone company ID (numeric)"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Filter by job posting language (e.g., 'en', 'de')"
                    },
                    "applicationMethod": {
                        "title": "Application Method",
                        "enum": [
                            "INTERNAL",
                            "EXTERNAL"
                        ],
                        "type": "string",
                        "description": "Filter by how to apply (e.g., INTERNAL = apply on company site only)"
                    },
                    "excludeSponsored": {
                        "title": "Exclude Sponsored",
                        "type": "boolean",
                        "description": "Skip sponsored/promoted listings. Filters out items where isSponsored=true.",
                        "default": false
                    },
                    "includeDetails": {
                        "title": "Include Detail Pages",
                        "type": "boolean",
                        "description": "Fetch each job's detail page for full description, ISO dates, salary, and geo coordinates. Slower but much richer data.",
                        "default": true
                    },
                    "detailEngine": {
                        "title": "Detail Page Engine",
                        "enum": [
                            "auto",
                            "cheerio",
                            "playwright"
                        ],
                        "type": "string",
                        "description": "Controls how job detail pages are fetched. 'auto' (recommended) = actor chooses best method automatically. 'cheerio' = lightweight HTTP-only detail fetching. 'playwright' = browser-based detail fetching (heavier, for WAF-protected portals).",
                        "default": "auto"
                    },
                    "descriptionFormat": {
                        "title": "Description Format",
                        "enum": [
                            "html",
                            "text",
                            "markdown",
                            "original"
                        ],
                        "type": "string",
                        "description": "Format for job description text (requires Include Detail Pages)",
                        "default": "html"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of job listings to return (0 = unlimited)",
                        "default": 25
                    },
                    "maxPages": {
                        "title": "Max Pages",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of search result pages to scrape",
                        "default": 10
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "full",
                            "incremental"
                        ],
                        "type": "string",
                        "description": "full = return all jobs found. incremental = only return jobs not seen in previous runs (requires stateStoreName).",
                        "default": "full"
                    },
                    "stateStoreName": {
                        "title": "State Store Name",
                        "type": "string",
                        "description": "KV store name for incremental state. Use same name across scheduled runs. State is scoped per query+location+geo combination.",
                        "default": "stepstone-state"
                    },
                    "dedupStoreName": {
                        "title": "Dedup Store Name",
                        "type": "string",
                        "description": "Named KV store for cross-run dedup. Same name across runs = only new jobs pushed."
                    },
                    "dedupKey": {
                        "title": "Dedup Key",
                        "type": "string",
                        "description": "Field used as unique key for dedup (default: jobKey)",
                        "default": "jobKey"
                    },
                    "datasetName": {
                        "title": "Dataset Name",
                        "type": "string",
                        "description": "Custom dataset name. Supports masks: {DATE} = YYYYMMDD, {TIME} = HHMMSS"
                    },
                    "outputFields": {
                        "title": "Output Fields",
                        "type": "array",
                        "description": "Select subset of output fields. Use dot notation for nested: 'ceSalary.min'. If empty: all fields returned."
                    },
                    "compact": {
                        "title": "Compact Mode",
                        "type": "boolean",
                        "description": "When true, each result contains only the 11 most essential fields: jobKey, title, company, location, url, portalUrl, datePosted, workFromHome, unifiedSalary, geo, and description. Use this in AI-agent and MCP workflows where token budgets matter.",
                        "default": false
                    },
                    "descriptionMaxLength": {
                        "title": "Description Max Length (chars)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Truncate the description field to this many characters, appending '...' if truncated. 0 means no truncation. Use in AI-agent workflows to control context window usage. Pairs well with compact mode.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Some portals require enhanced proxy (handled automatically). Your Apify plan must include proxy access.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of concurrent requests",
                        "default": 5
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of retries per request",
                        "default": 3
                    },
                    "_benchDelayMs": {
                        "title": "Benchmark Delay (ms)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Internal benchmark override: fixed delay between requests in milliseconds. Not for production use."
                    },
                    "_benchFreshSession": {
                        "title": "Benchmark Fresh Session",
                        "type": "boolean",
                        "description": "Internal benchmark override: force fresh session on every request. Not for production use."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
