# MeineStadt.de Jobs Scraper (`parsebird/meinestadt-de-jobs-scraper`) Actor

Scrape job listings from MeineStadt.de by keyword and city. Get titles, companies, salaries, employment type, and full descriptions with requirements and benefits. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/meinestadt-de-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### MeineStadt.de Jobs Scraper

Scrape job listings from **[MeineStadt.de](https://jobs.meinestadt.de)** — one of Germany's largest local job boards — into clean, structured JSON. The MeineStadt.de Jobs Scraper searches by keyword and city and pulls the job title, company, salary, employment type, and (optionally) the full description with requirements and benefits, without needing the MeineStadt.de API.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any keyword across a specific German city or the whole country, then optionally fetch each job's detail page for salary range, requirements, benefits, and company info — with results deduplicated across keywords automatically.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/meinestadt-de-jobs-scraper (Apify). Scrapes job listings from jobs.meinestadt.de (Germany) by keyword and city. Call with ApifyClient.
Input JSON fields: searchQueries: string[] — one or more search keywords, e.g. ["Pflege","Krankenschwester"]; searchQuery: string — single keyword, backward-compatible alternative; city: string — German city, e.g. "Berlin" (empty = all of Germany); maxResultsPerQuery: int (default 100) — max results per keyword, deduplicated; maxResults: int (default 0 = unlimited) — total cap across all keywords; includeDetails: bool (default true) — fetch full description, salary, requirements, and benefits from each job's detail page; directUrls: string[] — direct MeineStadt.de job URLs to monitor, bypassing search; proxyConfiguration: object — UNBLOCKER proxy group is required and set by default.
Output: one dataset item per job — id, title, company, location, canton, company_logo_url, search_query, employment_type,
  workload_min, workload_max, remote_option, salary_text, description_snippet, description_full, requirements,
  company_benefits, company_description, apply_url, posted_at, expires_at, source_url, source_platform, country, scraped_at.
Example: { "searchQueries": ["Pflege", "Krankenschwester"], "city": "Berlin", "maxResultsPerQuery": 50 }
API: https://api.apify.com/v2/acts/parsebird~meinestadt-de-jobs-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does MeineStadt.de Jobs Scraper do?

[MeineStadt.de](https://jobs.meinestadt.de) runs a local job board for roughly 11,000 German towns and cities, blending sponsored listings with jobs sourced directly from employers. There is no public MeineStadt.de search API — this scraper reads the site's own job-search results instead. For every keyword and city combination it extracts:

- 🏷️ **Job identity** — title, company, city, German state (canton), and company logo.
- 💰 **Pay and terms** — salary range as shown on the site, employment type (full-time, part-time, contract, apprenticeship, internship), and remote/hybrid/onsite signal.
- 📋 **Full details** (optional) — complete job description, required skills, company benefits, and a short company profile, fetched from each job's own detail page.
- 📅 **Dates** — when the job was posted and when the listing expires.

Common uses: German job-market monitoring, recruiting and sourcing research, salary benchmarking by city and role, and tracking specific listings over time.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| searchQueries | array | No | — | One or more search keywords. Each runs as a separate search; results are deduplicated across keywords. |
| searchQuery | string | No | — | A single search keyword (backward compatible). Ignored if `searchQueries` is set. |
| city | string | No | — | City to search in, e.g. `Berlin` or `Munchen`. Leave empty for all of Germany. |
| radius | integer | No | 30 | Accepted for compatibility (0-200 km). MeineStadt.de's city pages already include nearby-area listings by default and expose no separate radius filter, so this currently has no additional effect — see the FAQ. |
| maxResultsPerQuery | integer | No | 100 | Maximum results per keyword, deduplicated. MeineStadt.de returns 5 results per page, paginated automatically. |
| maxResults | integer | No | 0 | Total cap across all keywords combined. 0 = unlimited (each keyword still capped by `maxResultsPerQuery`). |
| includeDetails | boolean | No | true | Fetch full job descriptions, salary, requirements, and benefits from each detail page. Slower but much richer. |
| directUrls | array | No | — | Direct MeineStadt.de job URLs to scrape, bypassing search — for monitoring specific listings. |
| proxyConfiguration | object | No | UNBLOCKER | Apify Proxy settings. MeineStadt.de blocks both datacenter and residential proxies; UNBLOCKER is required and set by default. |

#### Example inputs

Multi-query search:

```json
{
  "searchQueries": ["Pflege", "Krankenschwester", "Altenpfleger"],
  "city": "Berlin",
  "maxResultsPerQuery": 50,
  "maxResults": 0
}
```

Basic search:

```json
{
  "searchQueries": ["Software Engineer"],
  "city": "Berlin",
  "maxResultsPerQuery": 100
}
```

Fast SERP-only scan (no detail pages):

```json
{
  "searchQueries": ["Software Engineer", "Entwickler"],
  "city": "Hamburg",
  "maxResultsPerQuery": 200,
  "includeDetails": false
}
```

Monitor specific listings:

```json
{
  "directUrls": [
    "https://jobs.meinestadt.de/berlin/premium?id=100010962331",
    "https://jobs.meinestadt.de/muenchen/premium?id=100010956488"
  ]
}
```

### What data can you extract from MeineStadt.de?

#### Core fields

| Field | Description |
|-------|-------------|
| id | Unique job identifier |
| title | Job title |
| company | Company name |
| location | Job location (city) |
| canton | German state code (BW, BY, BE, …), resolved from the job's postal code or city |
| company\_logo\_url | Company logo image URL |
| search\_query | Which search keyword found this job |

#### Job details

| Field | Description |
|-------|-------------|
| employment\_type | full-time, part-time, contract, apprenticeship, or internship |
| workload\_min / workload\_max | Work percentage (0-100%); populated when the listing states a single, unambiguous workload |
| remote\_option | remote, hybrid, or onsite (inferred from stated benefits and description text) |
| salary\_text | Salary as displayed, e.g. `47.715 € - 58.055 €/Jahr` |
| description\_snippet | First 500 characters of the job description |
| description\_full | Complete job description (only with `includeDetails`) |
| requirements | Required skills (array) |
| company\_benefits | Benefits offered (array) |
| company\_description | About the company (only with `includeDetails`, when the listing includes one) |

#### Application & metadata

| Field | Description |
|-------|-------------|
| apply\_url | The MeineStadt.de job page where the "Jetzt bewerben" (apply) action lives |
| posted\_at / expires\_at | Publication and expiration dates (ISO 8601) |
| source\_url | Original job posting URL on MeineStadt.de |
| source\_platform | `meinestadt.de` |
| country | `DE` |
| scraped\_at | Scraping timestamp |

### Output example

```json
{
  "id": "100013577384",
  "title": "Consultant (m/w/d) Inhouse Consulting mit Schwerpunkt Rüstungsmanagement",
  "company": "BwConsulting GmbH",
  "location": "Berlin",
  "canton": "BE",
  "employment_type": "full-time",
  "remote_option": "hybrid",
  "salary_text": "50.500 € - 67.400 €/Jahr",
  "requirements": ["MS Office", "IT", "Informatik", "Englisch", "Anforderungsmanagement"],
  "company_benefits": ["Entwicklungsmöglichkeiten", "Homeoffice", "Weiterbildungsmaßnahmen"],
  "posted_at": "2026-08-31",
  "expires_at": "2026-09-11",
  "source_url": "https://jobs.meinestadt.de/berlin/premium?id=100013577384",
  "source_platform": "meinestadt.de",
  "country": "DE",
  "scraped_at": "2026-09-05T10:00:00.000Z"
}
```

Download the dataset as **JSON, CSV, Excel, HTML, or XML** from the Storage tab or the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Job-market monitoring** — track new listings for a role and city combination over time.
- **Recruiting research** — see which companies are hiring, where, and at what salary.
- **Salary benchmarking** — compare `salary_text` across companies and cities for the same role.
- **Listing tracking** — use `directUrls` to watch specific job postings for changes or expiry.

### How it works

1. **Search** — each keyword in `searchQueries` (or `searchQuery`) is combined with `city` into a MeineStadt.de search URL.
2. **Paginate** — the scraper walks result pages (5 jobs per page) until `maxResultsPerQuery` is reached or the site runs out of results for that keyword.
3. **Deduplicate** — jobs already seen (by ID) are skipped, both within a keyword and across keywords.
4. **Enrich (optional)** — with `includeDetails` on, each job's own page is fetched for the full description, requirements, benefits, and company info.
5. Rows stream to the dataset, capped by `maxResults` if set.

### How much does it cost to scrape MeineStadt.de?

This actor is **pay per result**, with two events depending on how much data is fetched per job.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| Job (SERP data) | $0.00099 | **$0.99** |
| Job detail (full description, salary, requirements, benefits) | $0.00499 | **$4.99** |

Every saved job charges the **Job** event once. If `includeDetails` is on (the default) and the detail page was fetched successfully, the **Job detail** event is also charged for that job. Turn `includeDetails` off for a fast, cheap title/company/salary-only scan. Apify's monthly free platform usage covers small runs.

### How to scrape MeineStadt.de

1. Click **Try for free** and sign in to Apify.
2. Enter one or more **search keywords** in `searchQueries`, and optionally a **city**.
3. Set **maxResultsPerQuery** (start low, e.g. 20-50) and toggle **Fetch full job details** as needed.
4. Click **Start**, then watch rows appear in the **Output** tab.
5. Export from **Storage**, or pull results via the API.

#### Run it via API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/meinestadt-de-jobs-scraper").call(run_input={
    "searchQueries": ["Pflege"],
    "city": "Berlin",
    "maxResultsPerQuery": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "-", job["company"], "-", job.get("salary_text"))
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/meinestadt-de-jobs-scraper').call({
    searchQueries: ['Software Engineer'],
    city: 'Hamburg',
    maxResultsPerQuery: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with [Apify integrations](https://docs.apify.com/platform/integrations).

### FAQ

**Do I need a MeineStadt.de account or API key?**
No. The scraper reads public MeineStadt.de search and job pages only. MeineStadt.de has no public search API — this actor is the alternative.

**Why does `radius` have no effect?**
MeineStadt.de's own city job pages already blend listings from the city and its surrounding area by default, and the site doesn't expose a separate radius query parameter to widen or narrow that. The input is kept for compatibility with other job-scraper schemas.

**Why is `canton` sometimes missing?**
`canton` is resolved from the job's postal code first, then from the city name, using standard German postal-code and city-to-state mappings. If neither is available or recognized, it's left empty rather than guessed.

**Why is my city returning jobs from all over Germany?**
MeineStadt.de silently falls back to nationwide results for a city slug it doesn't recognize, instead of returning an error. Spell out umlauts (`Muenchen` or `München`, not `Munchen`) — the actor's run log will warn you if this fallback is detected.

**What does `apply_url` point to?**
The "Jetzt bewerben" (apply) button on MeineStadt.de is a JavaScript action rather than a plain link, so the underlying employer application URL isn't present in the page's HTML. `apply_url` points to the MeineStadt.de job page itself, where that button lives.

**What proxy do I need?**
Apify's **UNBLOCKER** proxy group, which is set as the default. MeineStadt.de is protected by Akamai and blocks both datacenter and residential Apify proxies outright.

**Can I get results as CSV or Excel?**
Yes. Use the **Export** button on the dataset, or request a specific format via the [Apify API](https://docs.apify.com/api/v2#/reference/datasets).

**Something's not working.**
Open an issue on the **Issues** tab with your input and the run link — we respond quickly.

### Is it legal to scrape MeineStadt.de?

MeineStadt.de job listings are public information that any visitor can see without logging in. Scraping publicly available pages is legal in most jurisdictions, and this actor does not access private data or bypass any login. You are responsible for how you use the data — follow MeineStadt.de's Terms of Use and applicable data-protection law, and consult a lawyer if you are unsure. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Arbeitsagentur Scraper](https://apify.com/parsebird/arbeitsagentur-scraper) — job listings from Germany's federal employment agency.
- [Xing Jobs Scraper (Deutsch)](https://apify.com/parsebird/xing-jobs-scraper-deutsch) — jobs from Xing, Germany's professional network.
- [Jobware.de Job Scraper](https://apify.com/parsebird/jobware-de-scraper) — listings from the German job board Jobware.de.
- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — jobs from Indeed across 60+ countries, including Germany.

Browse all [ParseBird actors](https://apify.com/parsebird) on Apify Store.

# Actor input Schema

## `searchQueries` (type: `array`):

One or more search keywords, for example `Pflege` or `Software Engineer`. Each keyword runs as a separate search; results are deduplicated across keywords.

## `searchQuery` (type: `string`):

A single search keyword. Kept for backward compatibility — prefer 'Search keywords' above for multiple queries. Ignored if 'Search keywords' is set.

## `city` (type: `string`):

German city to search in, for example `Berlin` or `Munchen`. Leave empty to search all of Germany.

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

Search radius in km around the city (0-200). Note: MeineStadt.de's own city pages already include nearby-area listings by default; this site does not expose a separate radius filter, so this value is accepted for compatibility but currently has no additional effect on results.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per search keyword, deduplicated. MeineStadt.de returns 5 results per page, paginated automatically.

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

Total cap across all keywords combined. 0 = unlimited (each keyword is still limited by 'Max results per keyword').

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

Visit each job's detail page for the full description, salary, requirements, benefits, and company info. Slower but much richer. Turn off for a fast title/company/salary-only scan.

## `directUrls` (type: `array`):

Direct MeineStadt.de job URLs to scrape, e.g. `https://jobs.meinestadt.de/berlin/premium?id=100010962331`. Bypasses search entirely — use this to monitor specific listings.

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

MeineStadt.de is protected by Akamai and blocks both datacenter and residential Apify proxies. Apify's UNBLOCKER proxy group is required and is set as the default.

## Actor input object example

```json
{
  "searchQueries": [
    "Pflege"
  ],
  "city": "Berlin",
  "radius": 30,
  "maxResultsPerQuery": 20,
  "maxResults": 0,
  "includeDetails": true,
  "directUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchQueries": [
        "Pflege"
    ],
    "searchQuery": "",
    "city": "Berlin",
    "radius": 30,
    "maxResultsPerQuery": 20,
    "maxResults": 0,
    "directUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/meinestadt-de-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 = {
    "searchQueries": ["Pflege"],
    "searchQuery": "",
    "city": "Berlin",
    "radius": 30,
    "maxResultsPerQuery": 20,
    "maxResults": 0,
    "directUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/meinestadt-de-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 '{
  "searchQueries": [
    "Pflege"
  ],
  "searchQuery": "",
  "city": "Berlin",
  "radius": 30,
  "maxResultsPerQuery": 20,
  "maxResults": 0,
  "directUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call parsebird/meinestadt-de-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/meinestadt-de-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/JkbmzcQHMtVlpKB5q/builds/uFs8tNkH2oBfvWkN5/openapi.json
