# Stepstone Scraper: German Job Listings (stepstone.de) (`hexagone-data/stepstone-scraper`) Actor

Scrape stepstone.de job searches (keyword, city, radius, filters) exactly as the site lists them: every job, no suggested jobs mixed in, stops at the site's total. Title, company, locations, salary estimate, dates; optional full job page. Pay per result.

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

## Pricing

from $0.63 / 1,000 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

## Stepstone Jobs Scraper — stepstone.de Job Offers (Germany)

Collect job offers from **stepstone.de**, Germany's large job board. Paste the search URLs you built on the site (keyword, city, radius, remote, contract type, language...) or type a keyword and a city, and get one clean record per job: title, company, all locations, Stepstone's salary estimate clearly marked as an estimate, posting and expiry dates, badges, and — optionally — the full description in sections, contract and work type, address and coordinates, benefits and how to apply.

### Measured: exactly the jobs the site shows

On **30 October 2026** we ran this Actor on the search `https://www.stepstone.de/jobs/steinmetz` and compared its dataset with the site's own result pages, read just before and just after the run. The site showed **161 jobs** for that search.

| Checked | Result |
|---|---|
| Jobs of the search delivered | **161 of 161** — none missing, no duplicate |
| Suggested jobs mixed in | **0** — every row is a result of the search (Stepstone's "similar jobs" are skipped) |
| Salary as shown by the site | **130 of 161** jobs have one, like on the page; 31 sampled salaries all matched the page |
| Where it stops | At the site's total: 161 jobs with `maxItems` set to 211, status `done` ("161 of 161 announced main results seen") |
| Time | 44 seconds (list only) |

At today's price that run costs **$0.15** (161 × $0.0009 + $0.005 start fee).

Why it matters: some tools read a different Stepstone interface that mixes suggested jobs into the results and does not go down to the last jobs of the list, so you pay for rows that are not your search and still miss real ones. This Actor reads the result pages you see on stepstone.de and tells you, per search, how many jobs it saw against the number the site announces.

### Try it with 20 jobs

1. Paste a search URL into **Start URLs**, e.g. `https://www.stepstone.de/jobs/python`.
2. Keep **Maximum number of jobs** at `20` (the form's prefill).
3. Start the Actor, then read the **Run summary** before exporting JSON, CSV or Excel.

```json
{
  "startUrls": [{"url": "https://www.stepstone.de/jobs/pflegefachkraft/in-hamburg?radius=50"}],
  "maxItems": 20,
  "includeDetails": false
}
```

In API calls, `maxItems` defaults to **500**; `0` means no limit.

### What to paste

| Input | Example | What you get |
|---|---|---|
| A search URL, filters included | `https://www.stepstone.de/jobs/python?action=facet_selected;workFromHome;1&wfh=1` | Every job of that search, pages 1 to the last page the site announces. Filters are kept exactly as the site wrote them. |
| A city search with radius | `https://www.stepstone.de/jobs/elektriker/in-muenchen?radius=50` | Same; nearby jobs listed inside the pages are delivered with `section: "regional"`. |
| A single job page | `https://www.stepstone.de/stellenangebote--...--13850318-inline.html` | One full record (job page + application type), charged as a job with details. If the URL no longer shows this job, nothing is delivered or charged (`job_not_available`). |
| Keyword + location + radius (no URL) | `python`, `Hamburg`, `50` | Builds `https://www.stepstone.de/jobs/python/in-hamburg?radius=50`. Use a URL for any other filter. |

Tips: to get **English-language** offers, add the site's language filter to your URL (`&fdl=en`); the site's own language field is not reliable, so the Actor does not output one. **Fully remote** jobs appear on Stepstone mainly as a location ("bundesweit, Home-Office"); the "Nur Home-Office" filter returned cards that all say "Teilweise Home-Office" when we checked. Jobs are deduplicated within a run by `jobId`, so overlapping searches never deliver the same job twice.

**Suggestions are never delivered.** Stepstone pads result pages with "similar jobs" from other searches — even an empty search shows 13 of them. They are not results of your search, so the Actor skips them and counts them in the summary.

**Nearby jobs after the last page** (`includeNearbyJobs`, off by default): some city searches list extra "in der Umgebung" jobs *after* the last announced page (Hamburg r50: 105 of them, measured 29 Oct 2026). Turn the option on to collect them too.

### Output

| Field | Meaning |
|---|---|
| `jobId`, `harmonisedId`, `url` | Stepstone job number (text, deduplication key), global UUID, job page URL without tracking. |
| `title`, `company`, `companyId`, `companyUrl`, `companyLogo` | As shown on the card. `company` is `null` when Stepstone hides the employer — it is never guessed from the URL. |
| `location`, `locations` | Location text as shown, and the same text split on ", " outside parentheses: **location parts as shown**, in order — usually cities, but also "Deutschland", "Home-Office", "Germany (remote)" or "bundesweit (Hamburg, Köln, …)" kept whole. Not a normalised city list. |
| `workFromHome` | The remote badge shown: `Teilweise Home-Office` (site value "2"); `null` when the card shows none. The value "1" (`Nur Home-Office`) is mapped but was **never seen** on 2,809 offers. Any other value is delivered as-is with an `UNKNOWN_VALUE` warning. |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `salaryIsEstimate` | **Stepstone's salary estimate** ("geschätzt für Vollzeit"), not a salary published by the employer: `salaryIsEstimate` is `true` on every salary we have seen (2,121 of 2,809 offers had one). `null` everywhere when no salary is shown. The period comes from the data (`year`, `month`, `hour`), because annual cards print only "/". Hourly estimates keep their decimals, as on the card ("18.09 - 20.27 /Stunde" gives `18.09` and `20.27`). |
| `postedAt`, `expiresAt` | ISO 8601 UTC (the card's "vor 6 Tagen" is not reused). |
| `snippet`, `labels`, `quickApply` | Card summary, badges (`Schnelle Bewerbung`, `Anschreiben nicht erforderlich`), quick-apply flag. |
| `isSponsored`, `isHighlighted`, `isTopJob` | Flags from the site's data (all false on the 2,809 offers we checked). |
| `section` | `main` (search result) or `regional` (nearby job). |
| `sourceUrl`, `page`, `position`, `scrapedAt`, `detailsSource` | Provenance; `detailsSource` is `jobPage` when the job page was read. |
| With **includeDetails** | `contractType`, `workType` (job page header), `employmentType`, `industry` (schema.org), `address`, `latitude`, `longitude` (when the page gives an address: 19 of 31 checked), `descriptionSections` (`name`, `title`, `html`, `text` — collapsed sections such as contact details included), `description` (all sections as text), `benefits`, `applicationType`, `externalApply` (`true` = apply on the company website). |

Unknown values are `null` — never an empty string, `false` or `0` made up by the Actor.

#### Real output example

This is a real record produced by this Actor's code from the stepstone.de pages captured on **29 October 2026** (search `https://www.stepstone.de/jobs/python`, details on). Nothing was reordered or picked; only long texts (`snippet`, `description` and each section's `html`/`text`) are cut with "…" here. It shows the format, not today's offers.

```json
{
  "jobId": "13850318",
  "harmonisedId": "c582c330-a53c-449e-99ac-874cfc102a2c",
  "url": "https://www.stepstone.de/stellenangebote--Senior-Python-Backend-Engineer-AI-Focus-Karlsruhe-Koeln-Muenchen-Stuttgart-Erlangen-inovex-GmbH--13850318-inline.html",
  "title": "Senior Python Backend Engineer* (AI Focus)",
  "company": "inovex GmbH",
  "companyId": "24494",
  "companyUrl": "https://www.stepstone.de/cmp/de/inovex-gmbh-24494/jobs",
  "companyLogo": "https://www.stepstone.de/upload_DE/logo/2/logoinovex-GmbH-24494DE-2305301051.gif",
  "location": "Karlsruhe, Köln, München, Stuttgart, Erlangen",
  "locations": [
    "Karlsruhe",
    "Köln",
    "München",
    "Stuttgart",
    "Erlangen"
  ],
  "workFromHome": "Teilweise Home-Office",
  "salaryMin": 75000,
  "salaryMax": 90000,
  "salaryPeriod": "year",
  "salaryCurrency": "EUR",
  "salaryIsEstimate": true,
  "postedAt": "2026-10-21T09:03:07.617Z",
  "expiresAt": "2026-11-20T09:23:56.27Z",
  "snippet": "inovex ist ein IT-Beratungsunternehmen mit 500 Expert:innen, das Unternehmen bei Digitalisierung und Agilisierung unters…",
  "labels": [],
  "quickApply": false,
  "isSponsored": false,
  "isHighlighted": false,
  "isTopJob": false,
  "section": "main",
  "sourceUrl": "https://www.stepstone.de/jobs/python",
  "page": 1,
  "position": 2,
  "scrapedAt": "2026-10-29T10:09:54+00:00",
  "detailsSource": "jobPage",
  "contractType": "Feste Anstellung",
  "workType": "Homeoffice möglich, Vollzeit",
  "employmentType": "FULL_TIME",
  "industry": "IT, IT-Softwareentwicklung",
  "address": null,
  "latitude": null,
  "longitude": null,
  "descriptionSections": [
    {
      "name": "introduction",
      "title": null,
      "html": "<p>Seit 25 Jahren unterstützen wir bei inovex mit rund 500 IT-Expert:innen Unter…",
      "text": "Seit 25 Jahren unterstützen wir bei inovex mit rund 500 IT-Expert:innen Unterneh…"
    },
    {
      "name": "description",
      "title": "Was du bei uns bewegen kannst",
      "html": "<ul>\n\t<li>\n\t<p><strong>Agile Projektarbeit: </strong>In cross-funktionalen Teams…",
      "text": "Agile Projektarbeit: In cross-funktionalen Teams setzt du Projekte für Kunden un…"
    },
    {
      "name": "profile",
      "title": "Wer gut zu uns passen würde",
      "html": "<ul>\n\t<li><strong>Senior-Expertise mit AI-Fokus: </strong>Dein Fundament sind mi…",
      "text": "Senior-Expertise mit AI-Fokus: Dein Fundament sind mindestens 7 Jahre exzellente…"
    },
    {
      "name": "benefits",
      "title": "Was wir dir bieten",
      "html": "<ul>\n\t<li><strong>inovex Culture:</strong> Kommunikation auf Augenhöhe, flache H…",
      "text": "inovex Culture: Kommunikation auf Augenhöhe, flache Hierarchien, Arbeiten in sel…"
    },
    {
      "name": "additionalInformation",
      "title": "Interessiert?",
      "html": "<p><strong>Dann möchten wir dich kennenlernen!</strong><br>\nDas&nbsp;People &amp…",
      "text": "Dann möchten wir dich kennenlernen!\n\nDas People & Culture Team ist dein Ansprech…"
    }
  ],
  "description": "Seit 25 Jahren unterstützen wir bei inovex mit rund 500 IT-Expert:innen Unternehmen bei der Digitalisierung und Agilisie…",
  "benefits": [
    "Kfz-/Reisezulage",
    "Coaching-Angebote",
    "Firmenwagen",
    "Mitarbeiter-Laptop",
    "Betriebsarzt im Unternehmen",
    "Firmenhandy",
    "Betriebliche Altersvorsorge",
    "Mitarbeiterrabatte",
    "Zusätzlicher Urlaubstag",
    "Fitnessangebote",
    "Flexible Arbeitszeiten",
    "Gute Verkehrsanbindung",
    "Homeoffice",
    "Firmenevents- und Veranstaltungen",
    "Vorsorgeuntersuchung",
    "Parkplatz",
    "Sabbatical",
    "Sportaktivitäten",
    "Studienförderung"
  ],
  "applicationType": "ThirdParty",
  "externalApply": true
}
```

### Run summary

Every run leaves an **OUTPUT** record (JSON) and a readable **Run summary** (HTML, Output tab). For each start URL you see the status, the jobs delivered, the distinct jobs seen versus the number the site announced, the pages that failed, and plain-English warnings (`anomalies`).

| Status | Meaning |
|---|---|
| `done` | Every announced page was read and the **main results** seen match the site's announced count (nearby jobs count towards it only when `includeNearbyJobs` is on). On lists of 2+ pages a gap of up to 1.5 % is tolerated, because Stepstone reorders results while you page through them (19 of 2,129 measured); on a single-page list no gap is tolerated. The summary always prints "X of Y announced main results seen" and, separately, the nearby jobs. |
| `partial_collection` | You did **not** get the full listing: a page failed after retries, came back empty, only repeated earlier jobs, the page count shrank during the run, or the gap is larger than normal reordering. Numbers are in the summary and an `ANO_COUVERTURE` warning. |
| `stopped_at_site_limit` | The site announces more jobs than its pages can show. Split the search (smaller radius, more filters, several cities). |
| `stopped_at_limit` | Your `maxItems` or maximum charge was reached. |
| `no_results` | The site announced 0 results. Warning `NO_RESULTS`: the search is empty, the URL is wrong or the site is down. |
| `no_new_jobs` | Every job of this URL was already delivered by an earlier start URL. |
| `job_not_available` | A job page URL returned something else (a search listing, or another job): nothing is delivered or charged. |
| `not_processed` | Not reached: your `maxItems` or maximum charge was reached first. |
| `interrupted` | The run stopped (time limit or abort) while this URL was being read; resurrect the run to continue it. |
| `not_found` | The site answered 404: the search or job page does not exist (a removed job, a mistyped URL). Read once, nothing delivered or charged. |
| `blocked_by_site`, `rate_limited`, `unrecognized_page`, `structure_changed`, `network_error`, `http_error`, `site_maintenance`, `internal_error` | The site refused every proxy session, limited the requests, served something that is not a job listing or a maintenance page, or the Actor hit an unexpected error. This is **never** reported as an empty search. |

If **no** start URL delivers a job, the run **fails** with a message that names the cause. One empty URL next to URLs that deliver only adds a warning. With details on, job pages that could not be read are counted (`detailErrors`, warning `ANO_DETAILS`) and those jobs are delivered without detail fields. If 5 job pages in a row are refused by the site, the Actor stops reading job pages for the rest of the run and delivers the remaining jobs without details (`detailsSkipped`, warning `DETAILS_STOPPED`). The summary never says "all fine" in any of these cases.

### Pricing

Pay per result, plus a start fee:

- **Job** (`apify-default-dataset-item`): $0.0009 per delivered job — $0.90 per 1,000 jobs.
- **Job details** (`job-details`): $0.0005 per delivered job **whose job page was actually read** (`detailsSource: "jobPage"`) — only with `includeDetails`, or for a job page URL you pasted.
- **Actor start** (`apify-actor-start`): $0.005 per run (once per GB of memory; the default is 1 GB).

Apify subscribers pay less automatically, on every event: 10% off on the Bronze plan, 20% on Silver, 30% on Gold and above.

| Run | Price |
|---|---|
| 20 jobs, list only | $0.023 |
| 20 jobs, with details | $0.033 |
| 1,000 jobs, list only | $0.905 |
| 1,000 jobs, with details | $1.405 |

These totals include the $0.005 start fee.

A job delivered without its details (job page refused, removed, or details stopped after 5 refusals in a row) costs only the job price. Searches that return nothing, suggestions and duplicates are not charged. The final message and the Run summary give the number of `job-details` events charged (`detailsCharged`).

**Maximum charge per run**: with details on, the Actor only reads a job page if both the job and its details still fit in your limit. When the limit no longer covers a job **with** its details, the run stops cleanly (`stopped_at_limit`, "maximum charge per run was reached") instead of delivering jobs without the details you asked for; a few cents may remain unspent when some job pages could not be read. If a run is migrated by the platform exactly between writing a batch of jobs and charging its details, those details are not charged (never charged twice).

### Known limits

- **Access**: stepstone.de refuses datacenter proxies; the default is Apify residential proxy, Germany. Some residential IPs are refused too; the Actor switches to a new IP on each refusal (up to 8 per request) and retries random server errors, then gives each page one last try after a pause. A page that still fails is skipped, counted and reported (`partial_collection`), never silently dropped. If you turn the proxy off or choose a non-residential group, the Actor respects it and says so in the final message and the Run summary (`PROXY_SETTING`).
- **Speed**: 3 to 5 seconds between requests. A list page holds 25 jobs, so 1,000 jobs take about 40 pages (~3-4 minutes). **With details, each job costs two more requests** (job page + apply-button API): 500 jobs take about 70 minutes, 1,000 about 2.3 hours. The default run timeout is **2 hours** (enough for the default 500 jobs with details, with margin); raise it, or lower `maxItems`, for bigger runs with details.
- **Completeness**: judged on the main results only. Stepstone reorders results during paging; a full read of 2,129 jobs missed 19 (0.9 %). Beyond 1.5 % (any gap on a single-page list) the URL is reported `partial_collection`.
- **Salary**: always Stepstone's estimate. The employer's own salary, when any, is only inside the description text. A few estimates give only a lower bound (`salaryMax` null).
- **Address**: given by 19 of 31 job pages checked; sometimes only a city, sometimes in English ("80331 Munich, Germany"). Delivered as written.
- **Application link**: `externalApply` says whether you apply on the company site; the external URL itself is behind a Stepstone redirect and is not delivered.
- **Not covered**: logged-in content (salary behind "Gehalt anzeigen"), Stepstone sites of other countries.

### Support

Check the **Run summary** first. For a problem you can reproduce, open an issue in the Actor's **Issues** tab with the run ID, the start URLs and what you expected versus what you got (never paste API tokens).

This Actor is maintained by Hexagone Data. It is not affiliated with, endorsed or sponsored by StepStone GmbH; "StepStone" and "Stepstone" are trademarks of their owner, used here only to describe the website the data comes from. It reads public job pages without logging in; use the data in line with the site's terms and applicable law (personal data in job descriptions, such as contact names, is delivered as published).

# Actor input Schema

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

stepstone.de search pages, with your filters exactly as the site built them (e.g. https://www.stepstone.de/jobs/python or https://www.stepstone.de/jobs/pflegefachkraft/in-hamburg?radius=50), or single job pages (stellenangebote--...-inline.html). Pagination is followed up to the last page announced by the site. When set, keyword/location/radius are ignored.

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

Job title or skill, e.g. python or pflegefachkraft. Builds https://www.stepstone.de/jobs/<keyword>/in-<location>?radius=<km>. Use start URLs for any other site filter.

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

City, e.g. Hamburg or Muenchen.

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

Search radius around the location, 5 to 100 km.

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

Stops after this many unique jobs across all start URLs. 0 = no limit. You pay per delivered job.

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

Off by default. When on, each delivered job's page is read once (plus one small apply-button API call): description in sections, contract and work type, address and coordinates, benefits, application type. Adds the 'job-details' charge ($0.001 per job whose page was read, i.e. $2.50 instead of $1.50 per 1,000 jobs) and about two extra requests per job.

## `includeNearbyJobs` (type: `boolean`):

Off by default. Some city searches list extra jobs 'in der Umgebung' after the last announced page. When on, the Actor keeps reading while such jobs appear. Suggested jobs from other searches are never delivered.

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

Residential proxy, country DE, by default: stepstone.de refuses datacenter proxies. The Actor switches to a new IP whenever one is refused.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/python"
    }
  ],
  "maxItems": 20,
  "includeDetails": false,
  "includeNearbyJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

All job records, one per job offer, with every field.

## `jobsOverview` (type: `string`):

Title, company, location, salary estimate, posting date, link.

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

Readable per-URL summary: status, jobs delivered vs announced, reason for anything missing.

## `summaryJson` (type: `string`):

The same summary as JSON (OUTPUT record).

# 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 = {
    "startUrls": [
        {
            "url": "https://www.stepstone.de/jobs/python"
        }
    ],
    "maxItems": 20,
    "includeDetails": false,
    "includeNearbyJobs": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hexagone-data/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 = {
    "startUrls": [{ "url": "https://www.stepstone.de/jobs/python" }],
    "maxItems": 20,
    "includeDetails": False,
    "includeNearbyJobs": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("hexagone-data/stepstone-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 '{
  "startUrls": [
    {
      "url": "https://www.stepstone.de/jobs/python"
    }
  ],
  "maxItems": 20,
  "includeDetails": false,
  "includeNearbyJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call hexagone-data/stepstone-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hexagone-data/stepstone-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/MLEkblQkSodzIsrDb/builds/ui2ZZCvo0r65sOpXQ/openapi.json
