# StepStone Jobs Scraper: Germany, Austria & UK Totaljobs (`themineworks/stepstone-totaljobs-scraper`) Actor

Scrape job listings from StepStone Germany, StepStone Austria, Totaljobs and CWJobs by keyword and location: title, company, salary, remote or hybrid, benefits, skills, posting date and the full job description if you want it. Radius and date filters. No login. Pay per job.

- **URL**: https://apify.com/themineworks/stepstone-totaljobs-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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: Germany, Austria & UK Totaljobs

### What does StepStone Jobs Scraper do?

Give it a job title or keyword and a location. Get back the job listings from the StepStone group job boards, one row per job: title, company, company logo and page, location, posting date, salary text with the numbers pulled out, remote or hybrid status, quick apply, the benefits listed on the job card, the ad's opening text and a link to the ad.

It covers four boards: **StepStone.de** (Germany), **StepStone.at** (Austria), **Totaljobs** (UK) and **CWJobs** (UK tech jobs). They run on the same software, so one actor and one set of fields covers all four.

Turn on **Full job description** and each row also gets the complete ad text, the employment type, the closing date and the address with coordinates, read from the job's own page.

✅ StepStone Germany and Austria, Totaljobs, CWJobs | ✅ Radius, posted date and home office filters | ✅ Salary numbers read from the salary text | ✅ Optional full descriptions | ✅ No login or cookies | ✅ Pay only for jobs delivered | ✅ MCP-ready for AI agents

### Who is it for?

Recruiters and staffing agencies tracking who is hiring for which roles in Germany, Austria and the UK. Sales teams that sell to companies while they are hiring. Job market and salary researchers who need clean, flat listing data. Job boards and aggregators that want German, Austrian and British listings in one format. Job seekers who want a daily list of new ads for their search.

### How much does it cost to scrape StepStone and Totaljobs?

You pay per job delivered to your dataset, plus $0.005 per run at the default memory. A full description costs a second, separate event, only for jobs where it was actually added.

| Apify plan | Per job | Per full description |
| --- | --- | --- |
| Free | $0.0015 | $0.001 |
| Starter (Bronze) | $0.0012 | $0.0008 |
| Scale (Silver) | $0.001 | $0.0007 |
| Business (Gold) and above | $0.0007 | $0.0005 |

So 1,000 jobs cost 1,000 times the per job price of your plan, plus $0.005 for the run. Filters, salary numbers, the home office field and the proxies needed to reach the sites are all included.

**Never charged:** pages the site refused, the same job found again by a second keyword, jobs skipped by **Exact matches only** or the date window, descriptions that could not be fetched, and the information row. The Pricing tab always shows the rate for your own plan; if this table and the Pricing tab ever disagree, the Pricing tab is right.

### How does it get the jobs without logging in?

It opens the same search results page a visitor sees, for example `https://www.stepstone.de/jobs/data-analyst/in-berlin`. That page carries its whole result list as data inside it: 25 jobs, how many results the search has, how many pages, and how the site understood your keyword and location. The actor reads that data directly rather than the page layout, page by page (`?page=2`, `?page=3` and so on) until it has as many jobs as you asked for or the results end.

The boards sit behind bot protection that turns many requests away. The actor first uses a fast connection that looks like a normal Chrome browser, and when an address gets through it keeps using it. If a page is still refused after several tries, it tries again through Apify's unblocking proxy, which is slower but gets through. Refused pages are listed in the run summary and never charged.

With **Full job description** on, it then opens each job's own page and reads the description from the structured job data the page publishes for search engines.

### What input does it take?

```json
{
  "keywords": ["data analyst", "business intelligence"],
  "location": "Berlin",
  "site": "stepstone.de",
  "maxResultsPerSearch": 100,
  "postedWithinDays": "7",
  "radius": 20,
  "workFromHome": "hybrid",
  "exactMatchesOnly": true,
  "includeDescription": false
}
```

| Input | Default | What it does |
| --- | --- | --- |
| `keywords` | none | Job titles or keywords, one search each: `data analyst`, `Projektmanager`, `C++ Entwickler`. Up to 50 per run. `keyword` (a single text) and `query` are accepted too |
| `location` | empty | City, region or postcode: `Berlin`, `München`, `Wien`, `London`. Empty searches the whole country |
| `site` | `stepstone.de` | `stepstone.de`, `stepstone.at`, `totaljobs.com` or `cwjobs.co.uk` |
| `maxResultsPerSearch` | 25 | Most jobs per keyword, 1 to 1,000. The sites show 25 per page |
| `postedWithinDays` | any | `1`, `3`, `7` or `14` days |
| `radius` | site default | Kilometres on StepStone (5, 10, 20, 30, 40, 50, 75, 100), miles on Totaljobs and CWJobs (0, 5, 10, 20, 30) |
| `workFromHome` | any | `remote` for fully remote jobs, `hybrid` for partly remote |
| `exactMatchesOnly` | true | Only jobs that match your search. Turn off to also get the similar titles and outside radius jobs the site adds when exact matches run out |
| `includeDescription` | false | Add the full description, employment type, closing date and address from each job's page |
| `allowUnblockerFallback` | true | Retry refused pages through Apify's unblocking proxy |

### What data do you get back?

One row per job. A real row from a test run on 27 Sep 2026 (StepStone.de, data analyst in Berlin), with the long text shortened:

```json
{
  "job_id": "14538687",
  "url": "https://www.stepstone.de/stellenangebote--Senior-Data-Analyst-Analytics-Engineer-m-w-d-Remote-Augsburg-Muenchen-Stuttgart-Nuernberg-Frankfurt-Koeln-Dresden-Hannover-Hamburg-Berlin-Leipzig-Studyflix-GmbH--14538687-inline.html",
  "title": "Senior Data Analyst / Analytics Engineer (m/w/d)",
  "company_name": "Studyflix GmbH",
  "company_id": "213191",
  "company_url": "https://www.stepstone.de/cmp/de/studyflix-gmbh-213191/jobs",
  "company_logo_url": "https://www.stepstone.de/upload_DE/logo/E/logoStudyflix-GmbH-213191DE-2309011641.gif",
  "location": "Remote,Augsburg,München,Stuttgart,Nürnberg,Frankfurt,Köln,Dresden,Hannover,Hamburg,Berlin,Leipzig",
  "posted_at": "2026-09-24T12:58:05.000Z",
  "work_from_home": "hybrid",
  "quick_apply": true,
  "labels": ["QUICK_APPLY"],
  "snippet": "Studyflix ist mit über 6 Mio. Nutzern die größte kostenlose E-Learning- und Karriere-Plattform im DACH-Raum! ...",
  "benefits": [
    "30 Tage Urlaub: Zusätzlich bekommst du an Heiligabend und Silvester jeweils einen halben Tag frei.",
    "Kurze Entscheidungswege: Dich erwarten flache Hierarchien, viel Eigenverantwortung und die Möglichkeit, Themen selbstständig voranzutreiben.",
    "..."
  ],
  "is_anonymous": false,
  "match_type": "exact",
  "position": 11,
  "site": "stepstone.de",
  "country": "DE",
  "search_keyword": "data analyst",
  "search_location": "Berlin",
  "scraped_at": "2026-09-27T15:15:27.577Z"
}
```

On Totaljobs and CWJobs most ads show a salary, and the actor reads the numbers out of it. From the same test day, a Totaljobs row had `"salary_text": "£40000.00 - £47000.00 per annum + + £3,300 London allowance"` with `salary_min` 40000, `salary_max` 47000, `salary_currency` GBP and `salary_period` year.

| Field | Description |
| --- | --- |
| `job_id`, `url` | Job id on the site and the link to the ad |
| `title`, `company_name`, `company_id`, `company_url`, `company_logo_url` | The job and who posted it (for agency ads, the agency) |
| `location` | Location as the ad states it, sometimes several cities |
| `posted_at` | Posting date, ISO 8601 UTC |
| `salary_text` | Salary exactly as shown |
| `salary_min`, `salary_max`, `salary_currency`, `salary_period` | Salary numbers, currency and period (year, month, week, day or hour) |
| `work_from_home` | `remote` or `hybrid` when the ad offers home office |
| `quick_apply`, `labels` | Whether the site's quick application is offered, and the card labels (QUICK\_APPLY, NO\_COVER\_LETTER, FEATURED, NEW and so on) |
| `skills`, `snippet`, `benefits` | Skills listed on the card, the ad's opening text, and the benefits list |
| `is_anonymous` | The employer posted without its name |
| `match_type` | `exact`, or what the site added after the exact matches: `similar` (related titles), `outside_radius`, `recommended`, `related_company` |
| `position` | Rank in the site's results |
| `site`, `country`, `search_keyword`, `search_location`, `scraped_at` | Where and how the row was found, and when |
| `description`, `employment_type`, `valid_through`, `street_address`, `postal_code`, `latitude`, `longitude` | With **Full job description** on: full ad text, employment type, closing date and address details |

Empty fields are dropped rather than sent as `null`. Each run also writes a summary to the key-value store record `OUTPUT`: for every keyword a status (`ok`, `no_results` or `blocked`), the number of results the site reports, pages read and refused, attempts per connection type and how many worked, and what was delivered and skipped.

### What are the limitations?

**Salaries on StepStone.** StepStone Germany and Austria show most salaries only to logged in users, so `salary_min` and `salary_max` are usually empty there (none of 60 Berlin jobs in the test run had one). Totaljobs and CWJobs show a salary on most ads (all 50 London jobs in the test run had salary text, and numbers could be read from 39).

**Home office on Totaljobs and CWJobs.** Their job cards do not say whether a job is remote, so `work_from_home` stays empty there. Their Work From Home filter still works.

**Posted dates on Totaljobs and CWJobs.** Those sites count a refreshed ad as new, so a job returned for "last 7 days" can show a `posted_at` from weeks earlier. The actor keeps what the site returns.

**Speed.** A StepStone page usually takes 2 to 4 seconds. Totaljobs and CWJobs refuse more requests, and a page that has to go through the unblocking proxy takes about 10 seconds. Full descriptions add one page per job.

**Limits.** Up to 50 keywords per run and 1,000 jobs per keyword, one board per run. A run stops cleanly at its timeout (one hour by default) and keeps everything delivered so far; raise the timeout for very large runs. The sites change from time to time; if one refuses a page, the run summary says so and nothing is charged for it.

### What can you use it for?

**Hiring signals for sales.** Find companies hiring data, finance or engineering roles in a city this week, with their company page and logo, and reach them while the budget is open.

**Recruitment and sourcing.** Track new ads for the roles you place, with posting date, salary and remote status, across Germany, Austria and the UK in one format.

**Salary and job market research.** Collect salary ranges by title and city on Totaljobs and CWJobs, and job volumes and benefits by city on StepStone.

**Job alerts and aggregation.** Run the same searches every morning with **Posted within** set to 24 hours and feed the new jobs into a sheet, a Slack channel or your own board.

### How do I get started?

1. Type your job titles into **Keywords**, one per line, and a city into **Location**.
2. Pick the **Job board**: StepStone Germany, StepStone Austria, Totaljobs or CWJobs.
3. Set **Jobs per keyword** and, if you like, **Posted within**, **Radius** and **Home office**.
4. Turn on **Full job description** if you need the complete ad text.
5. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API or MCP.

### Can I run it on a schedule?

Yes. Run it once with the input you want, click **Save as a task**, then in Apify Console go to **Schedules**, create a schedule, pick how often (for example every weekday at 7:00) and add the task. Each scheduled run is billed the same way as a manual one; the schedule itself costs nothing.

### FAQ

#### How much does it cost to scrape 1,000 jobs from StepStone or Totaljobs?

1,000 times the per job price of your plan (see the table above), plus $0.005 for the run. Filters and salary numbers are included. A full description is a separate event per job and only charged when you turn it on and it was added.

#### Do I need a StepStone or Totaljobs account, cookies or an API key?

No. The actor reads the public listings a visitor sees without logging in. There is nothing of yours to connect.

#### Which countries and job boards does it cover?

StepStone.de for Germany, StepStone.at for Austria, and Totaljobs and CWJobs for the United Kingdom. CWJobs is the StepStone group's board for IT and tech jobs; many of its ads link to job pages on totaljobs.com, which is normal.

#### Can I get only remote or hybrid jobs?

Yes. Set **Home office** to fully remote or hybrid. On StepStone these are the site's own "Nur Home-Office" and "Teilweise Home-Office" filters, and each row says `remote` or `hybrid`. Totaljobs and CWJobs have one Work From Home filter, used for both choices.

#### Why do I get jobs with a different title than my keyword?

When the exact matches for a search run out, StepStone and Totaljobs add similar titles and jobs from outside your radius, like their own site does under "similar jobs". By default the actor stops there, so you only get and pay for jobs that match your search. Turn off **Exact matches only** to get the similar jobs too; every row says which kind it is in `match_type`.

#### Can I get the full job description?

Yes. Turn on **Full job description**. The actor opens each job's page and adds the full text, employment type, closing date, street, postcode and coordinates when the page has them. It is slower and charged as a separate event, only for jobs that actually got a description.

#### How do I search a whole country instead of one city?

Leave **Location** empty. The actor then searches all of Germany, Austria or the UK, depending on the board.

#### What does the radius mean on each site?

Kilometres on StepStone (default 30) and miles on Totaljobs and CWJobs (default 10). The sites accept a fixed set of values, so the actor uses the nearest one and notes the change in the run log.

#### Is it legal to scrape StepStone and Totaljobs?

The actor collects only publicly visible job listings and never logs in. Job ads are published to be read, and they are mostly about companies rather than people, but site terms and privacy laws such as GDPR still apply to how you store and use the data, for example recruiter names inside descriptions. This is general information, not legal advice.

### Use in Claude, ChatGPT and any MCP agent

Add it to Claude Code in one line:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=themineworks/stepstone-totaljobs-scraper"
```

Or point any MCP client at:

```
https://mcp.apify.com/?tools=themineworks/stepstone-totaljobs-scraper
```

Things an agent can ask once connected:

- "Which companies posted data analyst jobs in Berlin on StepStone this week?"
- "List remote Python developer jobs on CWJobs with a day rate above £500."
- "Compare salary ranges for business analyst jobs in London and Manchester on Totaljobs."

Or call it from code with the Apify client:

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/stepstone-totaljobs-scraper').call({
  keywords: ['data analyst'],
  location: 'London',
  site: 'totaljobs.com',
  maxResultsPerSearch: 100,
  postedWithinDays: '7',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((j) => j.salary_min >= 50000));
```

### More from The Mine Works

Browse every tool at [themineworks.com](https://themineworks.com/). Related actors for job data:

- **[Indeed Jobs Scraper](https://apify.com/themineworks/indeed-scraper)**: job listings from Indeed in the US, UK, Germany and more, by keyword and location.
- **[LinkedIn Jobs Scraper](https://apify.com/themineworks/linkedin-jobs-scraper)**: public LinkedIn job posts without cookies.
- **[ATS Jobs Scraper](https://apify.com/themineworks/ats-jobs)**: jobs straight from company career sites on Greenhouse, Lever, Workday and Ashby.

Found this useful? A quick Store review helps other buyers find it. Found a bug or want a field added? Open an issue on the actor's Apify Console page.

***

**Disclaimer:** This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by StepStone, Totaljobs or CWJobs. StepStone, Totaljobs and CWJobs are trademarks of their owners. Use scraped public data in line with GDPR, the UK GDPR and your local laws.

# Actor input Schema

## `keywords` (type: `array`):

Required. One job title or keyword per line, for example data analyst or Projektmanager. Each keyword is its own search; a job found by two keywords is returned and charged once. Up to 50 per run.

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

City, region or postcode, typed the way you would on the site: Berlin, München, Wien, London, Manchester. Leave empty to search the whole country.

## `site` (type: `string`):

Which StepStone group job board to search.

## `maxResultsPerSearch` (type: `integer`):

Most jobs to return for each keyword. The sites show 25 jobs per page, so 25 is one page and 100 is four.

## `postedWithinDays` (type: `string`):

Only jobs posted recently. Uses the site's own date filter. StepStone offers 24 hours and 7 days, so 3 and 14 days are finished by the posting date on each job. Totaljobs and CWJobs count a refreshed ad as new, so some jobs there show an older posted date.

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

Search distance around the location. Kilometres on StepStone (5, 10, 20, 30, 40, 50, 75 or 100; the site default is 30). Miles on Totaljobs and CWJobs (0, 5, 10, 20 or 30; the site default is 10). Other values move to the nearest one the site offers. Leave empty for the site default.

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

Only remote or hybrid jobs, using the site's own home office filter. On Totaljobs and CWJobs both choices use the site's single Work From Home filter.

## `exactMatchesOnly` (type: `boolean`):

On by default: you only get and pay for jobs that match your search. When the exact matches run out, StepStone and Totaljobs add similar job titles and jobs from outside your radius; turn this off to get those too. Every row says which kind it is in match\_type.

## `includeDescription` (type: `boolean`):

Also open each job's own page and add the full description, employment type, closing date and address details. Slower, and charged as an extra event per job that actually gets its description. A job whose page cannot be read is still returned, without the description and without that charge.

## `allowUnblockerFallback` (type: `boolean`):

Search pages are read over a fast connection first. If the site refuses a page several times, try it through Apify's unblocking proxy, which is slower. Included in the price. Turn off to report such pages as refused instead.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "location": "Berlin",
  "site": "stepstone.de",
  "maxResultsPerSearch": 25,
  "postedWithinDays": "",
  "workFromHome": "",
  "exactMatchesOnly": true,
  "includeDescription": false,
  "allowUnblockerFallback": true
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "data analyst"
    ],
    "location": "Berlin",
    "site": "stepstone.de",
    "maxResultsPerSearch": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/stepstone-totaljobs-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 = {
    "keywords": ["data analyst"],
    "location": "Berlin",
    "site": "stepstone.de",
    "maxResultsPerSearch": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/stepstone-totaljobs-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 '{
  "keywords": [
    "data analyst"
  ],
  "location": "Berlin",
  "site": "stepstone.de",
  "maxResultsPerSearch": 25
}' |
apify call themineworks/stepstone-totaljobs-scraper --silent --output-dataset

```

## MCP server setup

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