# DACH Jobs API: Career Site Jobs Germany, Austria, Switzerland (`goldfoot/dach-jobs-index`) Actor

Search open jobs taken directly from the career sites of thousands of companies in Germany, Austria and Switzerland (Personio, softgarden, Greenhouse, Ashby, Lever, SmartRecruiters & more). Filter by keyword, city, category, remote, seniority and salary. No job boards, no duplicates, no recruiters.

- **URL**: https://apify.com/goldfoot/dach-jobs-index.md
- **Developed by:** [Julian Aliabadi](https://apify.com/goldfoot) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## DACH Jobs API: Career-Site Jobs from Germany, Austria & Switzerland

Search **open jobs taken directly from the career sites of companies in Germany, Austria and Switzerland**: one input, a clean table of jobs back in seconds. No job boards, no recruiters, no duplicates. Every job links to the employer's own posting.

The index is built from the companies' **own applicant tracking systems** (softgarden, Personio, SmartRecruiters, Recruitee, Greenhouse, Ashby, Teamtailor, Lever) and refreshed regularly. Each job is classified by **city, country, job category, seniority, workplace (remote / hybrid / on-site)** and **salary** where the employer publishes it.

✅ DACH only: Germany, Austria, Switzerland · ✅ Direct from employers' career sites · ✅ Filters for keyword, city, category, remote, seniority, salary · ✅ "Only new jobs" monitoring · ✅ Fast: no browser, no waiting for a crawl

### What can you use it for?

- **Niche job boards & newsletters**: e.g. "remote data jobs in Germany", "Werkstudent jobs in München", "AI jobs in Zürich".
- **Sales leads from hiring signals**: companies hiring a "Head of Finance" or "DevOps Engineer" right now are buying signals. Schedule a daily run with *Only new jobs* and pipe the results into your CRM, Slack or Google Sheets.
- **Recruiting & sourcing**: see who is hiring which roles in which cities, before the jobs hit the big job boards.
- **Labour-market research**: count roles by city, category, seniority and remote share; track salary transparency.
- **AI agents**: give an agent a clean, structured DACH job feed instead of scraping job boards.

### How to use

1. Enter **keywords** (e.g. `data engineer`, `Werkstudent`, `Pflege`), or leave them empty for all jobs.
2. Optionally filter by **cities**, **countries**, **categories**, **workplace**, **seniority**, **companies**, **salary**, or **new in the last N days**.
3. Click **Start**. Results come back newest first. Download them as JSON, CSV or Excel, or use the API.

#### Example: remote and Munich senior tech jobs

```json
{
  "cities": ["München", "remote"],
  "techOnly": true,
  "seniority": ["senior"],
  "maxResults": 200
}
```

#### Example: daily alert for new data jobs in Germany

```json
{
  "keywords": ["data engineer", "data scientist", "analytics engineer"],
  "countries": ["DE"],
  "onlyNewJobs": true,
  "monitorId": "data-de"
}
```

Create a **Schedule** for this input (e.g. every morning). The first run returns all matching jobs; each later run returns **only jobs you haven't received before**.

### Output

Each job looks like this:

```json
{
  "id": "smartrecruiters:sixt:744000161299182",
  "title": "Staff Software Engineer (m/f/d) - Revenue Management",
  "company": "SIXT",
  "ats": "smartrecruiters",
  "url": "https://jobs.smartrecruiters.com/sixt/744000161299182",
  "location": "Munich, BY, Germany",
  "cities": ["München"],
  "countries": ["DE"],
  "workplace": "hybrid",
  "category": "backend-fullstack",
  "isTech": true,
  "seniority": "senior",
  "mentionsAI": false,
  "department": "TECH & Engineering",
  "employmentType": "Full-time",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "postedAt": "2026-11-12T13:28:31.881Z",
  "firstSeenAt": "2026-11-14T13:12:09.365Z"
}
```

Turn on **Include full description** to add the plain-text job description (where the career site provides it).

**Categories:** `backend-fullstack`, `frontend`, `mobile`, `data-ai`, `devops-sre-platform`, `security`, `qa-testing`, `engineering-management`, `product`, `design`, `it-support`, `hardware-embedded`, `engineering-other`, `sales`, `marketing`, `customer`, `finance-legal`, `people`, `healthcare`, `education-social`, `retail`, `logistics`, `hospitality`, `trades`, `operations`.

### Pricing

You pay **per job returned**, nothing for the search itself. Set **Max results** to cap your cost. Filters are applied before charging, so you only pay for jobs that match.

### How fresh is the data?

The index is refreshed from the companies' career sites on a regular schedule. Every result has `firstSeenAt` (when the index first saw the job) and `indexUpdatedAt` (time of the last refresh). Use **New in the last N days** to get only recent openings.

### Need a company that's missing, or live data?

- To scrape **any specific company's career site live** (also outside DACH), use the sister actor [Career Site Jobs Scraper](https://apify.com/goldfoot/ats-jobs-feed). Paste a career page URL or just a domain.
- Missing an important DACH employer? Open an issue on this actor and we'll add it to the index.

### Auf Deutsch: Stellenangebote aus Deutschland, Österreich und der Schweiz per API

Dieser Actor durchsucht **offene Stellenangebote direkt von den Karriereseiten** tausender Arbeitgeber in der DACH-Region (Personio, softgarden, Greenhouse, Ashby u. a.), nicht von Jobbörsen. Filter nach Stichwort (z. B. „Werkstudent“, „Pflege“, „Data Engineer“), Stadt, Bereich, Seniorität, Remote/Hybrid und Gehaltsangabe. Mit „Nur neue Stellen“ für tägliche Job-Alerts oder Hiring-Signale im Vertrieb. Abrechnung pro gefundener Stelle.

### FAQ

**Which companies are included?** About 3,700 employers in Germany, Austria and Switzerland that publish jobs through a supported applicant tracking system: tech companies, Mittelstand, healthcare, retail and more. Large corporations on Workday or SAP SuccessFactors are not included yet.

**How is "DACH" decided?** A job is included if its location names a city or region in Germany, Austria or Switzerland, or if it's a remote job for DACH/Europe without another country.

**Is this legal?** The index only contains job postings that employers publish on their public career sites for exactly this purpose, distribution to candidates. No personal data is collected.

**Category or seniority looks wrong?** They're derived automatically from the job title, so occasional misclassifications happen. Use keywords for precise matching.

# Actor input Schema

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

Return jobs whose title contains ANY of these words (case-insensitive, umlauts optional). Leave empty for all jobs. Examples: python, data engineer, Werkstudent, Pflege.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these words, e.g. intern, Werkstudent, senior.

## `searchInDescription` (type: `boolean`):

Match keywords in the full description too (slower, more results).

## `categories` (type: `array`):

Only these categories (derived from the job title). Empty = all.

## `techOnly` (type: `boolean`):

Only engineering, data, product, design, IT and other technical roles.

## `countries` (type: `array`):

Empty = all of DACH.

## `cities` (type: `array`):

Only jobs in these cities (German or English names, e.g. München or Munich, Zürich, Wien). Add "remote" to also include fully remote jobs.

## `workplace` (type: `array`):

Empty = any.

## `seniority` (type: `array`):

Derived from the job title. Empty = any.

## `companies` (type: `array`):

Only these companies (name or website contains the text, e.g. "celonis", "n26.com").

## `mentionsAI` (type: `boolean`):

Only jobs whose title mentions AI, KI, ML, LLM or GenAI.

## `withSalaryOnly` (type: `boolean`):

Only jobs that publish a salary or salary range.

## `newWithinDays` (type: `integer`):

Only jobs first seen by the index within the last N days. 0 = no limit.

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

Add the plain-text job description to each result.

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

Stop after this many jobs (newest first). 0 = no limit. You pay per job returned.

## `onlyNewJobs` (type: `boolean`):

Return only jobs not returned in previous runs with the same Monitor ID. Combine with a Schedule for alerts.

## `monitorId` (type: `string`):

Separate memory for each saved search.

## Actor input object example

```json
{
  "keywords": [
    "data engineer",
    "python"
  ],
  "searchInDescription": false,
  "techOnly": false,
  "mentionsAI": false,
  "withSalaryOnly": false,
  "newWithinDays": 0,
  "includeDescription": false,
  "maxResults": 100,
  "onlyNewJobs": false,
  "monitorId": "default"
}
```

# Actor output Schema

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

All matching jobs returned by this run, one item per job.

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

Index date, index size, number of matches and jobs returned.

# 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 engineer",
        "python"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("goldfoot/dach-jobs-index").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 engineer",
        "python",
    ],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("goldfoot/dach-jobs-index").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 engineer",
    "python"
  ],
  "maxResults": 100
}' |
apify call goldfoot/dach-jobs-index --silent --output-dataset

```

## MCP server setup

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

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/1sMfqA5vl1uokx0z1/builds/0qc8BMmcT1k82XlYz/openapi.json
