# stellenanzeigen.de Scraper — German Jobs & Salaries, No Phones (`highbrow_fame/stellenanzeigen-jobs`) Actor

Job ads from stellenanzeigen.de, a big German job board: title, company, places, hours, contract type, home office, salary, benefits, dates and the full ad text. No contact persons, no phones.

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

## Pricing

$1.20 / 1,000 job delivereds

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

## stellenanzeigen.de Scraper — German Jobs & Salaries, No Phones

Get job ads from stellenanzeigen.de, one of Germany's big job boards: title, company, places, full-time or part-time, contract type, home office, the salary when the ad states one — as text and as minimum, maximum and period — the benefits stellenanzeigen.de shows as badges, the posting dates and the apply link, plus the full ad text with the industry and the experience asked for. Paste your stellenanzeigen.de search links, or type keywords and places.

**Why this one**

- 🔗 **Your search, as you set it up.** Search on stellenanzeigen.de and paste the link — keyword, place, radius and every filter are kept. Pages like "Buchhalter/in Jobs in Berlin" (`/jobs/…`) and a company's page (`/unternehmen/…`) work too. Or type **Keywords** and **Places** here (Berlin, 80331, Landkreis München, Bayern) and pick working hours, contract type, home office and leadership below.
- 🎯 **The same results as the website.** A live run for "buchhalter" delivered 541 jobs — exactly the number stellenanzeigen.de counted; the loose matches it lists after them are left out. Each job comes once per search.
- 📚 **Complete lists.** stellenanzeigen.de's paging repeats some jobs and skips others, so one pass through a long list misses a few percent. When a search comes up short, it is read again in the website's other orders for the jobs not seen yet: "pflege" gave 2,568 of 2,641 jobs in one pass and 2,634 after three; all of Germany 25,853 of 27,513 in one pass and 27,482 after three.
- 💶 **Salaries and benefits you can filter on.** In a live run of 2,634 care jobs, 1,180 stated a salary; `salaryMin`, `salaryMax` and `salaryPeriod` turn "70.000 - 87.000 €/Jahr" into numbers. `benefits` lists the website's badges (Jobrad, Jobticket, Tarifvergütung, 30 days' holiday …).
- 🏠 **Home office, hours, contract type** as stellenanzeigen.de tags them — the same tags its filters use. A live run of the link for "Home-Office möglich" gave 1,000 jobs, all 1,000 tagged `possible` or `full`.
- 📄 **The full ad.** With **Full job ad** on (the default), every job comes with its complete text, the industry and the months of experience asked for.
- ⚡ **Fast.** No browser. A live run read all 2,634 "pflege" jobs with full ads in 293 seconds; another read five searches — 2,108 jobs with full ads — in 148 seconds.
- 🔒 **No contact persons, no phones.** Job ads name recruiters and HR staff with their direct lines ("Abteilungsleiterin: Frau …", "Anruf oder kurze E-Mail an Frau … genügt!"). In 600 ads sampled from live runs, 283 had a phone number, an e-mail address or a named contact; after cleaning, none did. The application e-mail (often a person's address) is never output. Companies are named; people are not.
- 💸 **You pay only for jobs delivered.** A link that is not a stellenanzeigen.de search, a place stellenanzeigen.de does not know, or a search with no jobs comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `jobId`, `url` | the job on stellenanzeigen.de |
| `company`, `companyUrl`, `companyLogo` | who is hiring, and its page with all its jobs on stellenanzeigen.de (partner ads have none: their employers have no page there); `companyHidden` is true when the ad does not name the employer |
| `location`, `locations` | the places as the ad lists them, and each with `city`, `district`, `postalCode`, `state`, `country` |
| `homeOffice` | `possible`, `full` (100 % home office) or empty when the ad is not tagged for it |
| `employmentTypes` | `full-time`, `part-time` |
| `contractTypes` | `permanent`, `temporary`, `freelance`, `apprenticeship`, `trainee`, `dual-study`, `minijob`, `internship`, `working-student`, `thesis`, `volunteer` |
| `leadershipPosition` | true for a leading position, false for one without staff responsibility |
| `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | as the website shows it ("39.000 - 54.000 €/Jahr") and in numbers; `salaryPeriod` is `year`, `month` or `hour` |
| `benefits` | the website's benefit badges |
| `postedDate`, `firstPublishedDate`, `expiresDate` | the date the website lists it by, the day it was first published, the day it runs out |
| `isTopJob`, `sourcePortal` | a paid top listing; the portal the ad comes from (`stanz` is stellenanzeigen.de itself, others are partner portals such as `yourfirm` or regional newspapers) |
| `snippet`, `referenceNumber` | the website's short teaser, and the employer's reference number |
| `applyUrl`, `quickApply` | the employer's page to apply on; `quickApply` is true when the ad takes applications through stellenanzeigen.de's own form |
| `input`, `place`, `position`, `scrapedAt` | which search it came from, the place it covers, its place in the results, when it was read |
| `status`, `error` | `OK`, or why a search gave nothing |

With **Full job ad** (on by default) also:

| Field | What it is |
|---|---|
| `description` | the full ad as plain text, without contact persons, phone numbers and e-mail addresses |
| `industry` | the field of work the ad names ("Kundenbetreuung", "Krankenpflege") |
| `experienceMonths` | the professional experience asked for, in months, when the ad states it |

#### Example

A real record from a live run — a company page, 25 September 2026 (description shortened):

```json
{
  "input": "https://www.stellenanzeigen.de/unternehmen/sparkasse-vorderpfalz/",
  "position": 1,
  "jobId": "SDE-117074",
  "title": "Firmenkundenbetreuer (m/w/d)",
  "company": "Sparkasse Vorderpfalz",
  "companyHidden": false,
  "companyUrl": "https://www.stellenanzeigen.de/unternehmen/sparkasse-vorderpfalz/",
  "location": "Ludwigshafen am Rhein",
  "locations": [{ "city": "Ludwigshafen am Rhein", "district": null, "postalCode": "67059", "state": "Rheinland-Pfalz", "country": "Deutschland" }],
  "homeOffice": "possible",
  "employmentTypes": ["full-time"],
  "contractTypes": ["permanent"],
  "leadershipPosition": false,
  "salary": "70.000 - 87.000 €/Jahr",
  "salaryMin": 70000,
  "salaryMax": 87000,
  "salaryPeriod": "year",
  "salaryCurrency": "EUR",
  "benefits": ["Gesundheitsangebote", "Firmenevents", "Jobrad", "Jobticket", "Tarifvergütung"],
  "postedDate": "2026-09-25",
  "firstPublishedDate": "2026-08-26",
  "expiresDate": "2026-10-26",
  "isTopJob": true,
  "sourcePortal": "stanz",
  "snippet": "Verstärken Sie unser Team als Firmenkundenbetreuer (m/w/d) bei der Sparkasse Vorderpfalz. Beraten Sie Firmenkunden umfassend und verantworten Sie die Vertriebserfolge in einem wertschätzenden Arbeitsumfeld.",
  "quickApply": false,
  "applyUrl": "https://connect.guidecom.de/jobportal/sparkasse-vorderpfalz/viewAusschreibung/2026-005.html",
  "url": "https://www.stellenanzeigen.de/job/firmenkundenbetreuer-m-w-d-ludwigshafen-am-rhein-sde-117074/",
  "industry": "Kundenbetreuung",
  "experienceMonths": 24,
  "description": "Firmenkundenbetreuer (m/w/d)\nDas ist uns wichtig\nSie arbeiten gerne mit Menschen? Dann sind Sie bei uns genau richtig! Gemeinsam mit rund 800 Mitarbeitern treten wir in einem weit verzweigten Geschäftsstellennetz für die wirtschaftliche Stärke unserer Region ein…",
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from stellenanzeigen.de, one per line — or type **Keywords** and/or **Places**. Every keyword is searched in every place; a keyword alone searches all of Germany, a place alone gives all its jobs.
2. Optionally pick **Working hours**, **Contract type**, **Home office**, **Leadership**, a **Radius** around the places, **Posted within (days)** and the **Order** (best matches or newest first). A link keeps the filters set on the website.
3. Set **Max jobs per search**, and turn off **Full job ad** if the list fields are enough (faster).
4. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

For a daily feed of new jobs, save your input as a task with **Posted within (days)** set to 1 (today and yesterday) and schedule it every morning.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full ad costs nothing extra, only time. Links that are not stellenanzeigen.de searches, places stellenanzeigen.de does not know and searches without jobs are free.

### FAQ

**How many jobs per search?** As many as stellenanzeigen.de counts for it — the website has no page limit. A live run read all of Germany: 27,482 of the 27,513 jobs it counted, in 24 minutes without the full ads. The last few jobs of a long list can stay out of reach: the website's paging skips some jobs in every order it offers.

**Why do some jobs come from other portals?** stellenanzeigen.de shows partner ads (yourfirm, regional newspapers and others) among its own; so does this tool, as the website does. `sourcePortal` says where an ad comes from; `url` always opens it on stellenanzeigen.de. In a live run, 857 of 2,634 jobs were partner ads.

**Why is a place "not known"?** Places are looked up the way the website's place box does it. A town, a postcode, a district ("Landkreis München") or a state ("Bayern") works; a place stellenanzeigen.de does not offer comes back as a free NOT_FOUND record rather than a search of all of Germany.

**Why are contact persons missing?** They are personal data. Every job has its `url`, and most have an `applyUrl`; candidates apply through stellenanzeigen.de or the employer. When an employer trades under a person's name (a doctor's practice, for example), that company name is kept as stellenanzeigen.de publishes it.

**Is this affiliated with stellenanzeigen.de?** No. This is an independent tool that reads the job ads stellenanzeigen.de publishes on its website.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Search on stellenanzeigen.de with the filters you want and paste the address of the results page — a /suche/?fulltext=… search, a /jobs/… page ("Buchhalter/in Jobs in Berlin") or a company's /unternehmen/… page. One per line.

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

Or search here without a link: job titles or keywords (buchhalter, softwareentwickler, pflegefachkraft). Each keyword is searched in each place below, or in all of Germany when there is no place. The filters below apply.

## `locations` (type: `array`):

Towns, postcodes, districts or states in Germany (Berlin, 80331, Landkreis München, Bayern). A place without keywords gives all its jobs.

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

For the places above: how far around the place, as on stellenanzeigen.de.

## `employmentTypes` (type: `array`):

Optional: only full-time or only part-time jobs.

## `contractTypes` (type: `array`):

Optional: only jobs of any of these kinds.

## `homeOffice` (type: `string`):

Optional: only jobs where working from home is possible, or fully remote jobs.

## `positionLevel` (type: `string`):

Optional: only leading positions, or only positions without staff responsibility.

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

Optional: only jobs published this many days ago or later (1 = today and yesterday, as on stellenanzeigen.de). 0: any date.

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

For keyword searches: the best matches first (as on stellenanzeigen.de), or the newest first.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many jobs.

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

Opens every job for the full ad text, the industry and the experience asked for. One more request per job.

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

How many searches to work on at the same time.

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

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.stellenanzeigen.de/jobs/buchhalter-in/berlin/"
  ],
  "radius": "30",
  "homeOffice": "",
  "positionLevel": "",
  "postedWithinDays": 0,
  "sortBy": "relevance",
  "maxListingsPerSearch": 30,
  "includeDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://www.stellenanzeigen.de/jobs/buchhalter-in/berlin/"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/stellenanzeigen-jobs").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 = {
    "searchUrls": ["https://www.stellenanzeigen.de/jobs/buchhalter-in/berlin/"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/stellenanzeigen-jobs").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 '{
  "searchUrls": [
    "https://www.stellenanzeigen.de/jobs/buchhalter-in/berlin/"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/stellenanzeigen-jobs --silent --output-dataset

```

## MCP server setup

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

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/yGbf3VakFD4HYGjtZ/builds/vk03PiK31bYVB0VHR/openapi.json
