# StepStone Jobs Scraper DE, AT, BE, NL — New Jobs, No Login (`cliqtomedia/stepstone-jobs-scraper`) Actor

Search public StepStone jobs in Germany, Austria, Belgium and the Netherlands. Export title, company, salary, workplace type and dates. Return only new jobs. No login.

- **URL**: https://apify.com/cliqtomedia/stepstone-jobs-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.68 / 1,000 saved jobs

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

Search public [StepStone](https://www.stepstone.de/) job listings in Germany, Austria, Belgium and the Netherlands and get one clean row per job: title, company, location, posting date, salary as numbers, workplace type and job URL. No login and no API key are needed. A typical run with 20 jobs takes about 5 seconds and costs $0.022.

Use it if you are a recruiter, a sourcing agency or a labour-market analyst who tracks jobs in DACH or Benelux. The smallest run is one search query, for example `python developer` in `Berlin`.

![StepStone Jobs Scraper: search query and city in, clean job rows with salary and workplace type out, export as JSON or CSV](https://api.apify.com/v2/key-value-stores/WXNw0XOhqoMVcaoMJ/records/README-BANNER-20261014.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor opens the public StepStone search for each of your queries, reads the job list and saves each job as one Dataset row. It works on four StepStone sites: stepstone.de, stepstone.at, stepstone.be and stepstone.nl.

Each row has absolute job and company URLs, an ISO date, salary as numbers with a currency and period, and a `workplaceType` of `onsite`, `remote` or `hybrid`. You can also:

- keep only jobs that earlier runs did not return (`onlyNew`), for daily monitoring;
- open every job page and add the full description and employment type (`includeDetails`);
- search up to 10 queries in one run; a job found by two queries is saved once.

#### Good fit

- Daily or weekly lists of new jobs for a role and a city.
- Salary ranges for a role in one city, for market research.
- A list of companies that hire for a skill right now, for sales or sourcing.

#### Not a fit / limits

- No login, no applications, no recruiter names, e-mails or phone numbers. E-mails and phone numbers in descriptions are replaced with `[removed]`.
- Only stepstone.de, .at, .be and .nl. Other StepStone countries are not supported.
- Most salaries are StepStone's own estimates, not employer figures (`salaryIsEstimate: true`). In our tests they come only with the first 150 results of a query (search pages 1–6). Later pages are read from StepStone's result list without estimates, so those jobs have empty salary fields.
- Up to 1000 jobs per run. StepStone itself may stop a search earlier.

### Quick start

1. Open the **Input** tab.
2. In **Search queries** (`queries`), keep `python developer` or type your own job title.
3. Keep **Location** (`location`) as `Berlin` or type your city. Keep **Maximum jobs** (`maxItems`) at 20.
4. Click **Start**.
5. Open the **Output** tab and check the **Jobs** view: `title`, `company`, `location`, `salaryMin`, `salaryMax`, `url`.

Expected result: about 20 rows in 5–10 seconds. On our test runs 19 of 20 rows had a salary estimate.

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Get new jobs for a role every day | `queries`, `location`, `onlyNew: true` | job | `title`, `company`, `postedAt`, `url` | Apify schedule + Google Sheets or webhook |
| Compare salary ranges in a city | `queries`, `location`, `maxItems: 200` | job | `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryIsEstimate` | CSV / Excel export |
| Find companies that hire for a skill | `queries` with several skills, empty `location` | job | `company`, `companyUrl`, `location` | CRM import |
| Read full job texts for analysis | `includeDetails: true` | job | `descriptionText`, `employmentType`, `expiresAt` | Your own text or AI pipeline |

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `queries` | Search queries | array of strings | yes | prefill `["python developer"]` | 1–10 items, 1–100 characters each | One StepStone search per query. Each query is charged once. | `["SAP Berater", "data analyst"]` | Use job titles as people type them on StepStone. |
| `location` | Location | string | no | default empty, prefill `Berlin` | up to 100 characters | City or region. Empty = the whole country. | `München` | Use a city from the selected country site. |
| `radiusKm` | Radius (km) | integer | no | 30 | 0–100 | Search radius around `location`. Ignored when `location` is empty. | `50` | Larger radius = more jobs. |
| `domain` | Country site | string (select) | no | `de` | `de`, `at`, `be`, `nl` | Which StepStone site to search. | `at` | Match it with the location country. |
| `postedWithinDays` | Posted in the last days | integer | no | 0 | 0, 1, 3, 7, 14, 30 | Keeps only jobs posted in that many days. 0 = no date filter. | `7` | Use 1 or 7 for daily or weekly lists. Other numbers fail input validation. |
| `workplace` | Workplace | string (select) | no | `any` | `any`, `remote`, `hybrid` | Keeps only remote or only hybrid jobs. | `remote` | Leave `any` unless you need home office. |
| `sortBy` | Sort by | string (select) | no | `relevance` | `relevance`, `date` | Order of StepStone results. | `date` | `date` is used automatically with `onlyNew` and with 3, 14 or 30 days. |
| `includeDetails` | Full job description | boolean | no | false | true / false | Opens each job page: full description, `employmentType`, exact `expiresAt`. Adds the `job-details` charge. | `true` | About 1 job per second. Use only when you need the full text. |
| `maxItems` | Maximum jobs | integer | no | default 50, prefill 20 | 1–1000 | Stops after this many saved jobs in total, across all queries. | `200` | Start small, then raise it. |
| `onlyNew` | Only new jobs | boolean | no | false | true / false | Saves only jobs that earlier runs with the same settings did not return. | `true` | Use with a schedule. The first run saves the current jobs as a baseline. |

Unknown input keys fail the run with a clear input error. Duplicate jobs inside one run are saved once.

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| No city | `location` empty | `radiusKm` | Radius is ignored; the whole country is searched. | `location: ""` | More results for the same query. |
| Monitoring | `onlyNew: true` | `sortBy` | Newest first is used; a query stops at the first page with nothing new. | daily schedule | An unchanged run saves 0 rows and costs $0.006. |
| Date filter | `postedWithinDays` 3, 14 or 30 | `sortBy` | Newest first is used; rows older than the limit are dropped. | `14` | Pages are still read, so `query` is charged even with 0 rows. |
| Several queries | `queries` | `maxItems` | `maxItems` is the total for the run, not per query. | 3 queries, `maxItems: 100` | Later queries may get fewer rows. |
| Full texts | `includeDetails: true` | `maxItems` | One extra page per saved job. | 100 jobs ≈ 2 minutes | Adds $0.005 per job (FREE tier). |

#### Input examples

##### New Python jobs in Berlin

```json
{
  "queries": ["python developer"],
  "location": "Berlin",
  "maxItems": 20
}
```

Expected behavior: one search on stepstone.de, 30 km around Berlin.
Expected output: up to 20 jobs with `title`, `company`, `salaryMin`, `salaryMax`, `workplaceType`.
Limit or cost note: $0.022 on the FREE tier.

##### Weekly nursing jobs in Vienna

```json
{
  "queries": ["pflege"],
  "location": "Wien",
  "domain": "at",
  "postedWithinDays": 7,
  "maxItems": 50
}
```

Expected behavior: stepstone.at, only jobs from the last 7 days.

##### Daily monitor for data jobs in Amsterdam, with full texts

```json
{
  "queries": ["data analyst"],
  "location": "Amsterdam",
  "domain": "nl",
  "includeDetails": true,
  "onlyNew": true,
  "maxItems": 50
}
```

Expected behavior: the first run saves the current jobs. Later runs save only new jobs, each with the full description.

### Output

#### Output fields

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `jobId` | StepStone job ID | string | no | `13818030` | |
| `title` | Job title | string | no | `Backend Entwickler Python (m/w/d) - Data Engineer Python` | |
| `company` | Employer name | string | yes | `Ratbacher GmbH` | null if StepStone hides it |
| `companyUrl` | Company page on StepStone | string | yes | `https://www.stepstone.de/cmp/de/ratbacher-gmbh-46710/jobs` | absolute URL |
| `location` | Location text | string | yes | `Berlin, Mannheim, Frankfurt` | as shown on StepStone |
| `country` | Country of the site | string | no | `DE`, `AT`, `BE`, `NL` | from `domain` |
| `url` | Job page | string | no | `https://www.stepstone.de/stellenangebote--...--13818030-inline.html` | absolute, no tracking parameters |
| `postedAt` | Posting date | string (ISO 8601, UTC) | yes | `2026-09-22T11:03:04.747Z` | StepStone may refresh this date |
| `expiresAt` | Listing end date | string (ISO 8601) | yes | `2027-03-21T11:30:13.917Z` | exact with `includeDetails` |
| `salaryMin` | Lower salary bound | number | yes | `53000` | null = no salary shown |
| `salaryMax` | Upper salary bound | number | yes | `74000` | null = no salary shown |
| `salaryCurrency` | Currency | string | yes | `EUR` | ISO code |
| `salaryPeriod` | Salary period | string | yes | `year`, `month`, `week`, `day`, `hour` | |
| `salaryIsEstimate` | Salary is StepStone's estimate | boolean | yes | `true` | null when there is no salary |
| `employmentType` | Contract type | string | yes | `full_time`, `part_time`, `contract`, `temporary`, `internship`, `other` | only with `includeDetails`, else null |
| `workplaceType` | Home office option | string | yes | `onsite`, `remote`, `hybrid` | |
| `descriptionText` | Plain text | string | yes | short snippet or full text | contacts replaced with `[removed]` |
| `descriptionHtml` | Full description HTML | string | yes | | only with `includeDetails` |
| `descriptionType` | Which text you got | string | no | `snippet`, `full` | `snippet` if a job page failed |
| `isSponsored` | Promoted listing | boolean | yes | `false` | |
| `query` | Query that found the job | string | no | `python developer` | |
| `source` | Source name | string | no | `StepStone` | |
| `fetchedAt` | Collection time | string (ISO 8601) | no | `2026-10-14T12:54:39.873Z` | |

`null` means StepStone did not show the value. The Actor never writes `0` or `""` instead of an unknown value.

#### Output entities and surfaces

| Situation | Dataset/API/KVS/live view | Result shape | User action |
| --- | --- | --- | --- |
| Normal item | Dataset, **Jobs** view | one row per job | Export or use `url` |
| No jobs for the search | Empty Dataset; `RUN_SUMMARY` with `status: "not_found"` | run SUCCEEDED | Change the query or location |
| Monitor with nothing new | Empty Dataset; `status: "complete"`, `skippedSeen` > 0 | run SUCCEEDED | Nothing to do |
| Partial result (cost limit, time limit) | Saved rows + `RUN_SUMMARY` with `status: "partial"` and `reason` (`CHARGE_LIMIT`, `TIME_LIMIT`, `SCAN_LIMIT`, `DETAILS_UNAVAILABLE`) | run SUCCEEDED | `CHARGE_LIMIT`: raise the cost limit. `TIME_LIMIT`: raise the timeout or lower `maxItems`. `SCAN_LIMIT`: narrow the query or filters. `DETAILS_UNAVAILABLE`: run again later or without `includeDetails` |
| Source error or block | Saved rows (if any) + `RUN_SUMMARY` with `reason` like `SOURCE_HTTP_403` | run FAILED | Try again later |

`RUN_SUMMARY` (Key-value store, **Run status and counters** in the Output tab) also has counters per query: `sourceTotal`, `pages`, `saved`, `hasMore`.

#### Output example

From the first input example (one row, description shortened):

```json
{
  "jobId": "13818030",
  "title": "Backend Entwickler Python (m/w/d) - Data Engineer Python",
  "company": "Ratbacher GmbH",
  "companyUrl": "https://www.stepstone.de/cmp/de/ratbacher-gmbh-46710/jobs",
  "location": "Berlin, Mannheim, Frankfurt, Stuttgart, Karlsruhe",
  "country": "DE",
  "url": "https://www.stepstone.de/stellenangebote--Backend-Entwickler-Python-m-w-d-Data-Engineer-Python-Berlin-Mannheim-Frankfurt-Stuttgart-Karlsruhe-Ratbacher-GmbH--13818030-inline.html",
  "postedAt": "2026-09-22T11:03:04.747Z",
  "expiresAt": "2027-03-21T11:30:13.917Z",
  "salaryMin": 53000,
  "salaryMax": 74000,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "salaryIsEstimate": true,
  "employmentType": null,
  "workplaceType": "hybrid",
  "descriptionText": "Als Backend Entwickler Python (m/w/d) übernimmst Du eine zentrale Rolle: ...",
  "descriptionHtml": null,
  "descriptionType": "snippet",
  "isSponsored": false,
  "query": "python developer",
  "source": "StepStone",
  "fetchedAt": "2026-10-14T12:54:39.873Z"
}
```

`employmentType` and `descriptionHtml` are null because `includeDetails` was off.

#### Field names compared with raw StepStone data

If you used raw StepStone search data before, these are the new names:

| Raw StepStone field | This Actor | Change |
| --- | --- | --- |
| `id` | `jobId` | string |
| `title` | `title` | same |
| `companyName` | `company` | |
| `companyUrl` | `companyUrl` | absolute URL |
| `location` | `location` | extra spaces removed |
| `url` | `url` | absolute URL, tracking removed |
| `datePosted` | `postedAt` | ISO 8601 UTC |
| `unifiedSalary.min` / `max` | `salaryMin` / `salaryMax` | numbers, StepStone estimate included |
| `unifiedSalary.currencyIso` / `period` | `salaryCurrency` / `salaryPeriod` | lower-case period |
| `unifiedSalary.salaryType` | `salaryIsEstimate` | boolean |
| `workFromHome` | `workplaceType` | `onsite` / `remote` / `hybrid` instead of 0 / 1 / 2 |
| `textSnippet` | `descriptionText` | plain text, contacts removed |

### Pricing and limits

#### Pricing unit

The Actor uses pay-per-event pricing. You pay only for these events:

| Event | When | FREE | BRONZE | SILVER | GOLD+ |
| --- | --- | ---: | ---: | ---: | ---: |
| `apify-actor-start` | once per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `query` | once per query, after StepStone answers the first page | $0.005 | $0.005 | $0.005 | $0.005 |
| `job` | each saved job | $0.0008 | $0.00076 | $0.00072 | $0.00068 |
| `job-details` | each job with a full description (`includeDetails`) | $0.005 | $0.0048 | $0.0046 | $0.0045 |

Platform usage (compute, proxy) is included; you do not pay it separately.

- A search with 0 jobs, a date filter with no matches and a monitor run with nothing new each cost $0.006 (start + one query).
- If StepStone fails before the first page, the `query` event is not charged.
- If a job page fails with `includeDetails`, the row is saved with the snippet and `job-details` is not charged. After 6 failed job pages in a row the Actor stops opening job pages and ends with `reason: "DETAILS_UNAVAILABLE"`; rows already found are saved.
- Partial runs charge only for saved rows. When your run cost limit is reached, the Actor stops and saves `reason: "CHARGE_LIMIT"`.

#### Cost examples

FREE tier prices. Times are from our test runs.

| Scenario | Input scope | Saved jobs | Base charge | Optional charge | Run time |
| --- | --- | ---: | ---: | ---: | --- |
| Quick start | 1 query, `maxItems: 20` | 20 | $0.022 | none | ~5 s |
| Medium | 1 query, `maxItems: 200` | 200 | $0.166 | none | ~35 s |
| Large | 3 queries, `maxItems: 1000` | 1000 | $0.811 (2 queries used) | none | ~2.5 min |
| Full texts | 1 query, 10 jobs, `includeDetails: true` | 10 | $0.014 | $0.050 | ~20 s |
| Empty search | 1 query, no jobs | 0 | $0.006 | none | ~5 s |
| Monitor, nothing new | 1 query, `onlyNew: true` | 0 | $0.006 | none | ~3 s |

Limits: up to 10 queries and 1000 saved jobs per run; up to 40 search pages per query and 80 per run. With `includeDetails` the Actor opens about 1 job page per second, so 1000 jobs take about 17 minutes. The default run timeout is 30 minutes.

### API, export and integrations

- **Export:** download the Dataset as JSON, CSV, Excel, XML or HTML from the Output tab.
- **API:** start the Actor and read the Dataset with the [Apify API](https://docs.apify.com/api/v2). Use the `jobs` view: `/datasets/{id}/items?view=jobs`.
- **Scheduling:** create a [schedule](https://docs.apify.com/platform/schedules) with `onlyNew: true` to get only new jobs every day.
- **Webhooks / no-code:** send the Dataset to Google Sheets, Slack, Make or Zapier with Apify integrations after each run.

#### Use with AI agents (MCP)

- MCP server with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/stepstone-jobs-scraper` ([Apify MCP docs](https://docs.apify.com/platform/integrations/mcp)).
- Smallest useful input:

```json
{ "queries": ["python developer"], "location": "Berlin", "maxItems": 20 }
```

- Key output fields: `title` (job title), `company` (employer), `location` (city text), `salaryMin` / `salaryMax` (numbers, often a StepStone estimate), `url` (job page).
- Typical call: about 5 seconds and $0.022 for 20 jobs. Keep `maxItems` at 100 or less and `includeDetails` off for fast answers.

### Troubleshooting

#### The run finished with 0 jobs

Symptom: empty Dataset, run SUCCEEDED, `RUN_SUMMARY.status` is `not_found`.
Likely reason: StepStone has no jobs for this query, location or filter.
Check: open the same search on the StepStone site.
Action: use a shorter query, a bigger `radiusKm` or an empty `location`.

#### A monitor run saved 0 jobs

Symptom: `status: "complete"`, `saved: 0`, `skippedSeen` > 0.
Likely reason: no new jobs since the last run with the same settings.
Action: nothing to fix. This is normal for `onlyNew`.

#### Full descriptions stopped

Symptom: `status: "partial"`, `reason: "DETAILS_UNAVAILABLE"`, rows have `descriptionType: "snippet"`.
Likely reason: StepStone job pages failed 6 times in a row.
Action: run again later, or turn off `includeDetails` to get the search rows only.

#### Jobs have no salary

Symptom: `salaryMin` and `salaryMax` are null.
Likely reason: StepStone shows no salary for the job, or the job is after the first 150 results of the query.
Action: use a narrower query or a city to get the jobs you need into the first 150 results.

#### The run failed with a SOURCE\_ reason

Symptom: run FAILED, `reason` like `SOURCE_HTTP_403` or `SOURCE_UNAVAILABLE`.
Likely reason: StepStone blocked or did not answer after 4 tries.
Action: start the run again later. Jobs saved before the error stay in the Dataset.

#### The run stopped early with CHARGE_LIMIT

Symptom: `status: "partial"`, `reason: "CHARGE_LIMIT"`.
Likely reason: the maximum cost per run in your run options was reached.
Action: raise the maximum cost or lower `maxItems`.

### FAQ

#### Do I need a StepStone account or API key?

No. The Actor reads only public search and job pages. It does not log in.

#### Are the salaries real?

Most are StepStone's estimates (`salaryIsEstimate: true`), not the employer's figures. When the salary is not marked as an estimate, `salaryIsEstimate` is `false`. Use estimates as a market range, not as an offer.

#### Is the output complete?

The Actor saves what StepStone shows for your search, up to `maxItems`. StepStone may show a different order or count on different days. `RUN_SUMMARY.queries[].sourceTotal` shows how many jobs StepStone reported.

#### How fresh are the jobs?

Each run reads StepStone live. `postedAt` is the date StepStone shows; StepStone sometimes refreshes this date for older jobs.

#### Can I get recruiter contacts?

No. E-mails and phone numbers in descriptions are replaced with `[removed]`.

### Related Actors

- [Personio Jobs Monitor & Scraper](https://apify.com/cliqtomedia/personio-jobs-monitor-scraper) — jobs straight from company career pages on Personio, common in DACH.
- [Greenhouse Jobs Scraper & Monitor](https://apify.com/cliqtomedia/greenhouse-jobs-monitor-scraper) — jobs from company boards on Greenhouse.
- [Remote Jobs Aggregator](https://apify.com/cliqtomedia/remote-jobs-aggregator) — remote jobs from RemoteOK, We Work Remotely and Himalayas.

### Support

For a bug, a question or a feature request, open an issue in the **Issues** tab of this Actor. Add the run ID, your input (without private data) and the `reason` from `RUN_SUMMARY`. Never send tokens, cookies or billing data.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/stepstone-jobs-scraper/changelog.md

# Actor input Schema

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

Job titles or keywords, one per line, up to 10. Each query is charged once. Jobs found by several queries are saved once; a query stops at a page that adds nothing new.

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

City or region as typed on StepStone, for example Berlin, München or Wien. Empty searches the whole country.

## `radiusKm` (type: `integer`):

Search radius around the location in kilometres. Ignored when the location is empty.

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

Which StepStone site to search. Use a location from the same country.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted within this many days: 0, 1, 3, 7, 14 or 30. Zero disables the filter. Dates are checked on every row; jobs without a date are dropped when the filter is on.

## `workplace` (type: `string`):

Filter by home-office option. Checked on returned rows.

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

Order of results on StepStone. Newest first is used automatically with Only new jobs or with 3, 14 or 30 days.

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

Open each job page and add the full description and employment type. Slower and charged as a separate event per job with a description.

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

Stop after saving this many jobs in total across all queries.

## `onlyNew` (type: `boolean`):

Save only jobs not returned by earlier runs with the same queries, site, location, radius, date and workplace settings. Uses newest-first order and stops a query at the first page with nothing new. The first run builds the baseline.

## Actor input object example

```json
{
  "queries": [
    "python developer"
  ],
  "location": "Berlin",
  "radiusKm": 30,
  "domain": "de",
  "postedWithinDays": 0,
  "workplace": "any",
  "sortBy": "relevance",
  "includeDetails": false,
  "maxItems": 20,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "queries": [
        "python developer"
    ],
    "location": "Berlin",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/stepstone-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["python developer"],
    "location": "Berlin",
    "maxItems": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "python developer"
  ],
  "location": "Berlin",
  "maxItems": 20
}' |
apify call cliqtomedia/stepstone-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1vc9yeai9ccY1vPQZ/builds/wdUCT49fbyLAaNVBa/openapi.json
