# Arbeitsagentur Job Scraper — Salary, Contact & Details (`haketa/arbeitsagentur-scraper`) Actor

Scrape Germany's largest job board (arbeitsagentur.de). Extracts salary amount, employer email/phone, multi-location, home-office, occupation codes and full descriptions from the v6 API. Richer data than any competitor — no proxy or login needed.

- **URL**: https://apify.com/haketa/arbeitsagentur-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

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

## Arbeitsagentur Job Scraper — German Job Market, Salaries, Contacts & Vacancies 🇩🇪💼

> **Extract clean, structured job postings from [arbeitsagentur.de](https://www.arbeitsagentur.de/jobsuche/) — Germany's official federal employment agency (*Bundesagentur für Arbeit*).** This **Arbeitsagentur scraper** turns Germany's largest official job catalogue (500,000+ to 800,000+ live vacancies) into actionable datasets with **exact salary amounts (€/year, €/month, €/hour), employer direct contact details (email, phone, application URL), multi-location GPS coordinates, home-office / remote eligibility, occupation codes, and full job descriptions**. No login, no browser, and no coding required.

Export to **JSON, CSV, Excel, or API** — or feed directly into PostgreSQL, BigQuery, Airtable, HubSpot, Google Sheets, Make, Zapier, and n8n.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/arbeitsagentur-scraper)
[![Data Source](https://img.shields.io/badge/Data%20Source-Bundesagentur%20f%C3%BCr%20Arbeit-success)]()
[![Deep Pagination](https://img.shields.io/badge/Pagination-1%2C000%2B%20Unlocked-brightgreen)]()
[![Coverage](https://img.shields.io/badge/Coverage-All%2016%20German%20States-red)]()
[![Features](https://img.shields.io/badge/Features-Salary%20%7C%20Remote%20%7C%20Contacts-purple)]()
[![Output Formats](https://img.shields.io/badge/Format-JSON%20%7C%20CSV%20%7C%20Excel-orange)]()

> **Built for:** recruitment and executive search agencies, HR compensation analysts benchmarking German salaries, B2B sales teams prospecting growing companies via hiring signals, economic researchers studying labor market velocity, and job board aggregators.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Data Source** | Bundesagentur für Arbeit (arbeitsagentur.de) — Germany's Official Job Portal |
| **Geographic Scope** | All 16 German federal states (*Bundesländer*), major metro regions, and cross-border zones |
| **Live Vacancy Volume** | 500,000–800,000 active, verified job vacancies updated daily |
| **Search Modes** | Keyword/Skill, specific Employer Name, City + Search Radius (km), or custom Start URLs |
| **Key Output Fields** | Reference #, title, occupation, employer, salary amount, salary period, remote/hybrid, city, contacts, full text |
| **Salary Data** | Exact numerical salary amount, period (`STUNDENLOHN`, `MONATSGEHALT`, `JAHRESGEHALT`), and formatted string |
| **Contact Mining** | Direct recruitment contact emails, phone numbers, and external ATS application URLs parsed from listings |
| **Work Models** | Full-time (`isFullTime`), part-time (`isPartTime`), home office/remote (`isHomeOffice`), mini-job, shift work |
| **Export Formats** | JSON, CSV, Excel (XLSX), XML, HTML table, webhook & REST API |
| **Max Capacity** | Scalable from 100 sample records to 1,000+ or multi-city deep extractions (unlocked pagination) |
| **Execution Speed** | Fast batch downloads; prefill test runs finish in under 30 seconds |

***

### 🔎 Why scrape Arbeitsagentur job listings?

The **Bundesagentur für Arbeit (BA)** is the central statutory institution responsible for the labor market across Germany. Its official job portal (`arbeitsagentur.de`) is the single most authoritative employment directory in Europe, consolidating direct corporate job filings, public sector openings, civil service vacancies, craft apprenticeships, and staffing agency mandates.

Unlike commercial job boards with duplicate scrapings or phantom posts, the Arbeitsagentur directory offers verified regulatory accuracy:

- **B2B Sales Prospecting via Hiring Signals:** Companies actively hiring are expanding budgets, adopting new tools, and investing in operational infrastructure. Identifying mid-sized German enterprises (*Mittelstand*) hiring specific technical profiles (e.g., Salesforce, SAP, DevOps, Logistics) provides high-conversion outbound leads.
- **Compensation & Salary Benchmarking:** While European wage transparency laws evolve, Arbeitsagentur is unique among German portals in publishing explicit, structured wage metrics (`salaryAmount` and `salaryPeriod`), giving HR leaders and compensation analysts empirical salary benchmarks across industries and federal states.
- **Recruitment & Talent Headhunting:** Sourcing teams can bypass intermediary gatekeepers by accessing hiring manager contact details, dedicated recruitment email addresses, and direct telephone numbers extracted from vacancy descriptions.
- **Skills Shortage (*Fachkräftemangel*) Analysis:** Labor economists and regional development agencies can track real-time vacancy duration, occupation codes (*KldB* classifications), and regional talent demand across engineering, healthcare, and IT.
- **Job Board & Aggregator Feeds:** Fuel localized employment engines, specialized tech portals, or industry newsletters with clean, geocoded job openings.

***

### 🗂️ Search Modes & Granular Targeting

This scraper offers flexible query pathways tailored to different operational workflows:

1. **Keyword / Job Title Search (`keyword`):** Search for specific professions, technologies, or job titles (e.g., `'Softwareentwickler'`, `'Pflegefachkraft'`, `'Vertriebsleiter'`, `'Data Engineer'`).
2. **City & Radius Targeting (`city` + `radius`):** Pick from curated presets of 40+ major German cities or enter any custom postal code/municipality, combined with a search radius from 0 to 200 kilometers.
3. **Target Employer Search (`employer`):** Target specific corporate names (e.g., `'Siemens'`, `'Bosch'`, `'SAP'`, `'Deutsche Bahn'`, or regional Mittelstand manufacturers) to audit active hiring across branches.
4. **Direct URLs Ingestion (`startUrls`):** Paste customized search result URLs directly from the arbeitsagentur.de web portal or supply lists of individual job reference links.
5. **Contract & Work Model Filters:** Filter by full-time, part-time, mini-job, temporary contract, home office / remote eligibility, and career changer (*Quereinsteiger*) suitability.

***

### ✨ Key Features & Capabilities

- ✅ **Deep 1,000+ Record Pagination:** Unlocked pagination engine (`maxPagesPerSearch: 0` = auto/unlimited) retrieves 100 jobs per batch and scales smoothly to 1,000+ records without artificial caps.
- ✅ **Exact Salary Parsing:** Extracts precise numerical salary figures (`salaryAmount`), wage frequency (`STUNDENLOHN`, `MONATSGEHALT`, `JAHRESGEHALT`), and clean formatted strings (e.g., `55.000,00 €/Jahr`).
- ✅ **Contact Detail Mining:** High-precision regex engines scan job descriptions to extract hiring department emails, phone numbers, and external application portal URLs.
- ✅ **Multi-Location Geocoding:** Captures multiple branch locations per vacancy, returning structured arrays with city, postal code, street address, and GPS coordinates.
- ✅ **Full Description & Requirements Parsing:** Captures complete vacancy texts alongside normalized educational requirements (Bachelor, Master, Ausbildung, Quereinstieg) and language proficiencies (German/English CEFR levels).
- ✅ **Automatic Deduplication:** Indexes official BA reference numbers (`referenceNumber`) to ensure 0 duplicates across search queries and multi-page pagination.

***

### 📊 Extracted Data Fields

The scraper maps official employment portal records into a clean, normalized schema:

#### 💼 Job Identification & Classification

| Field | Coverage | Description |
|---|---|---|
| `referenceNumber` | 🟢 High (100%) | Official BA unique job reference ID (e.g., `10000-1198765432-S`) |
| `title` | 🟢 High (100%) | Clean vacancy title (e.g., `Senior DevOps Engineer (m/w/d)`) |
| `occupation` | 🟢 High (100%) | Primary standardized German occupation category |
| `allOccupations` | 🟢 High (95%) | Full array of associated occupation classifications and KldB codes |
| `offerType` | 🟢 High (100%) | Offer classification: `1` (Arbeitsplatz), `2` (Ausbildung), `4` (Praktikum) |
| `portalUrl` | 🟢 High (100%) | Direct link to the listing on arbeitsagentur.de |
| `externalUrl` | 🟡 Conditional | External applicant tracking system (ATS) or corporate careers page link |

#### 🏢 Employer & Contact Intelligence

| Field | Coverage | Description |
|---|---|---|
| `employer` | 🟢 High (100%) | Registered employer or hiring entity name |
| `employerHash` | 🟢 High (100%) | Unique employer identifier for tracking multi-vacancy organizations |
| `employerLogo` | 🟡 Conditional | Official employer company logo URL when provided |
| `isPrivateAgency` | 🟢 High (100%) | Boolean flag: indicates whether listing is from a private recruitment agency |
| `isTempStaffing` | 🟢 High (100%) | Boolean flag: indicates whether position is temporary staffing (*Zeitarbeit*) |
| `extractedEmail` | 🟡 Conditional (35-50%) | Direct contact email address parsed from the vacancy description |
| `extractedPhone` | 🟡 Conditional (30-45%) | Direct contact telephone number parsed from the vacancy description |

#### 💶 Salary & Compensation Data

| Field | Coverage | Description |
|---|---|---|
| `salary` | 🟡 Conditional (40-60%) | Clean formatted salary string (e.g., `65.000,00 €/Jahr` or `18,50 €/Stunde`) |
| `salaryAmount` | 🟡 Conditional (40-60%) | Exact numerical salary figure (integer or float) |
| `salaryPeriod` | 🟡 Conditional (40-60%) | Period code: `JAHRESGEHALT` (annual), `MONATSGEHALT` (monthly), `STUNDENLOHN` (hourly) |
| `salaryType` | 🟡 Conditional | Specification flag: `FESTGEHALT` (fixed) or `VERHANDLUNGSBASIS` (negotiable) |

#### 🕒 Working Models & Contract Conditions

| Field | Coverage | Description |
|---|---|---|
| `isFullTime` | 🟢 High (100%) | Boolean flag: full-time working model (*Vollzeit*) |
| `isPartTime` | 🟢 High (100%) | Boolean flag: part-time working model (*Teilzeit*) |
| `isHomeOffice` | 🟢 High (100%) | Boolean flag: remote work or telework eligible (*Homeoffice / Mobiles Arbeiten*) |
| `isMiniJob` | 🟢 High (100%) | Boolean flag: marginal employment up to €538/month (*Minijob*) |
| `isShiftWork` | 🟢 High (100%) | Boolean flag: shift work schedule (*Schichtdienst*) |
| `contractDuration` | 🟢 High (100%) | Contract permanence: `UNBEFRISTET` (permanent) or `BEFRISTET` (fixed-term) |
| `careerChangeSuitable` | 🟢 High (100%) | Boolean flag: open to career changers without formal trade certificates (*Quereinsteiger*) |

#### 📍 Location & Geographic Specs

| Field | Coverage | Description |
|---|---|---|
| `city` | 🟢 High (100%) | Primary job location municipality name |
| `postalCode` | 🟢 High (98%) | German postal code (*PLZ*) of the work site |
| `street` | 🟡 Conditional | Work location street name and house number |
| `region` | 🟢 High (99%) | Federal state name (*Bundesland*, e.g., `Bayern`, `Berlin`) |
| `latitude` | 🟢 High (95%) | WGS84 GPS latitude coordinate |
| `longitude` | 🟢 High (95%) | WGS84 GPS longitude coordinate |
| `locations` | 🟢 High (100%) | Full array of all workplace locations for multi-site vacancies |
| `scrapedAt` | 🟢 High (100%) | ISO 8601 UTC timestamp of record extraction |

***

### ⚙️ Input Parameters

Configure your job search via the Apify Console or pass JSON parameters via API:

```json
{
  "keyword": "Softwareentwickler",
  "city": "München",
  "radius": 50,
  "arbeitszeit": "vz",
  "befristung": "1",
  "includeDetails": true,
  "maxPagesPerSearch": 0,
  "maxItems": 500
}
```

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keyword` | `string` | `"Softwareentwickler"` | Job title, skill, or profession to search. Leave empty for popular mixed jobs across Germany. |
| `city` | `string` | `""` | Quick dropdown selector for 40+ German cities. Select empty for nationwide search. |
| `location` | `string` | `""` | Custom city, region, or postal code (PLZ) not listed in dropdown. Overrides City dropdown. |
| `radius` | `integer` | `25` | Search radius around the chosen location in kilometers (0 to 200 km). |
| `employer` | `string` | `""` | Filter by specific employer or corporate organization name. |
| `arbeitszeit` | `string` | `""` | Working hours: `""` (all), `"vz"` (full-time), `"tz"` (part-time), `"sn"` (mini-job), `"ho"` (remote). |
| `befristung` | `string` | `""` | Contract duration: `""` (all), `"1"` (permanent / unbefristet), `"2"` (fixed-term / befristet). |
| `includeDetails` | `boolean` | `true` | Fetch full vacancy descriptions, contact info, all locations, and requirements. |
| `maxPagesPerSearch` | `integer` | `0` (unlimited) | Max result pages per search (100 jobs/page). Set to `0` for auto/unlimited governed by Max jobs. |
| `maxItems` | `integer` | `100` (prefill), `0` (default) | Maximum total jobs to collect. Set to `0` for unlimited extraction. |
| `proxyConfiguration` | `object` | `{"useApifyProxy": false}` | Optional proxy settings. Public API operates reliably without proxies. |

***

### 📦 Sample Output

Every job posting is returned as structured, normalized JSON:

```json
{
  "referenceNumber": "10000-1194827163-S",
  "title": "Cloud Solutions Architect - AWS / Kubernetes (m/w/d)",
  "occupation": "Softwareentwickler/in",
  "allOccupations": ["Softwareentwickler/in", "IT-Architekt/in", "Cloud-Ingenieur/in"],
  "offerType": 1,
  "employer": "Bavaria Cloud Systems GmbH",
  "employerHash": "d8a7c6e5b4a3",
  "employerLogo": "https://rest.arbeitsagentur.de/jobboerse/logos/bavaria-cloud.png",
  "isPrivateAgency": false,
  "isTempStaffing": false,
  "city": "München",
  "postalCode": "80335",
  "street": "Arnulfstraße 24",
  "region": "Bayern",
  "country": "Deutschland",
  "latitude": 48.1432,
  "longitude": 11.5541,
  "salary": "85.000,00 €/Jahr",
  "salaryAmount": 85000,
  "salaryPeriod": "JAHRESGEHALT",
  "salaryType": "FESTGEHALT",
  "isFullTime": true,
  "isPartTime": false,
  "isHomeOffice": true,
  "isMiniJob": false,
  "isShiftWork": false,
  "contractDuration": "UNBEFRISTET",
  "careerChangeSuitable": false,
  "datePosted": "2026-11-05",
  "dateModified": "2026-11-08",
  "startDate": "2026-12-01",
  "extractedEmail": "karriere@bavaria-cloud-systems.de",
  "extractedPhone": "+49 89 12345678",
  "externalUrl": "https://careers.bavaria-cloud-systems.de/jobs/98712",
  "portalUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10000-1194827163-S",
  "scrapedAt": "2026-11-10T12:00:00.000Z"
}
```

***

### 💡 Practical Recruitment & B2B Use Cases

#### 1. High-Value B2B Lead Generation from Hiring Expansion

Track German technology, manufacturing, and healthcare companies that post 5+ concurrent job openings in engineering or sales. Filter by `isPrivateAgency: false` to focus exclusively on direct corporate employers. Export verified company names and recruitment contact emails to initiate high-converting B2B outreach.

#### 2. HR Compensation & Salary Intelligence

Gather empirical market data on salary distributions for specialized roles (e.g., SAP Consultants, CNC Machinists, Registered Nurses) across federal states like Bayern versus Sachsen. Use `salaryAmount` and `salaryPeriod` to benchmark client compensation packages accurately.

#### 3. Recruitment Agency Talent Sourcing & Client Acquisition

Headhunting firms can track corporate positions that remain unfilled for over 30 days (`publishedSince`). Reach out to hiring managers with qualified candidates to offer executive search services.

#### 4. Economic Labor Market & Policy Research

Analyze real-time demand shifts across green energy trades, healthcare staffing shortages, and technical apprenticeships. Categorize shifts by federal state, contract type, and educational prerequisites.

***

### 🗺️ German Regional Job Hubs Coverage

The scraper covers employment vacancies across all major German metropolitan regions:

- **Berlin-Brandenburg:** Tech startups, software engineering, federal public administration, creative agencies, and renewable energy headquarters.
- **Munich & Upper Bavaria (München, Ingolstadt, Augsburg):** Automotive engineering, aerospace, enterprise software, industrial IoT, and financial services.
- **Rhine-Main Metro (Frankfurt am Main, Wiesbaden, Mainz, Darmstadt):** Commercial banking, fintech, chemical pharmaceuticals, logistics, and data centers.
- **Rhine-Ruhr Belt (Köln, Düsseldorf, Essen, Dortmund, Duisburg):** Heavy industry, telecommunications, corporate retail, energy utilities, and logistics hubs.
- **Stuttgart & Neckar Region:** Premium automotive manufacturing, mechanical precision engineering, and industrial automation.
- **Hamburg & Northern Ports (Hamburg, Bremen, Kiel):** Maritime shipping, renewable wind energy, port logistics, and e-commerce retail.

***

### 🚀 How to Run via Apify API

Integrate German job vacancy extraction directly into your automated workflows:

#### Node.js (Apify Client)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('haketa/arbeitsagentur-scraper').call({
    keyword: 'Data Engineer',
    city: 'Berlin',
    radius: 50,
    includeDetails: true,
    maxPagesPerSearch: 0,
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} German job postings.`);
```

#### Python (Apify Client)

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.getenv('APIFY_TOKEN'))

run = client.actor('haketa/arbeitsagentur-scraper').call(run_input={
    'keyword': 'Pflegefachkraft',
    'city': 'Köln',
    'includeDetails': True,
    'maxPagesPerSearch': 0,
    'maxItems': 1000,
})

dataset_items = client.dataset(run['defaultDatasetId']).list_items().items
print(f'Retrieved {len(dataset_items)} healthcare vacancies in Cologne.')
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~arbeitsagentur-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "Softwareentwickler",
    "city": "Hamburg",
    "maxPagesPerSearch": 0,
    "maxItems": 250
  }'
```

***

### ❓ Frequently Asked Questions

**Why does `maxPagesPerSearch` default to `0`?**
Setting `maxPagesPerSearch: 0` enables automatic/unlimited pagination governed exclusively by your requested `maxItems`. This ensures that requesting 1,000+ jobs paginates deeply across result pages (100 vacancies per page) without premature cutoffs.

**How often does the Bundesagentur für Arbeit refresh listings?**
Vacancies on arbeitsagentur.de are updated in real time as companies publish, update, or close hiring mandates. Scraping runs query the live registry and return current vacancies.

**Are direct corporate employers distinguished from temp staffing agencies?**
Yes. The scraper provides boolean flags `isPrivateAgency` and `isTempStaffing` (*Zeitarbeit*), allowing you to easily isolate direct corporate employers from third-party staffing firms.

**What percentage of listings include explicit salary figures?**
Between 40% and 60% of postings on arbeitsagentur.de disclose explicit wage data (`salaryAmount`), varying significantly by trade and industry.

**Can I extract vacancies across the entire country?**
Yes. Leave the `city` parameter empty (or select "Whole of Germany") to conduct a nationwide query for your keyword or employer name.

***

**Can I filter specifically for remote and work-from-home jobs?**
Yes. Use the working hours setting `arbeitszeit: "ho"` to filter exclusively for vacancies offering home office or telework. The resulting records also contain `isHomeOffice: true`.

**How does the scraper handle career changers (Quereinsteiger)?**
The scraper extracts the `careerChangeSuitable` boolean flag. In Germany, many technical and operational roles explicitly welcome *Quereinsteiger*, making this flag invaluable for adult education providers, vocational training programs, and alternative recruiting pipelines.

**Can I run scheduled daily monitors for specific high-priority employers?**
Yes. You can schedule recurring runs targeting competitors or enterprise accounts. With `publishedSince: 7`, each run captures only vacancies posted within the last 7 days.

**Does the scraper extract apprenticeship (Ausbildung) positions?**
Yes. You can select `offerType: "2"` to target formal vocational dual-education apprenticeships (*Duale Ausbildung*), widely used by educational institutions and apprentice placement portals.

### 🔗 Related European Employment & Directory Scrapers

Complement your European market research with these scrapers from the same publisher:

- [Marktstammdatenregister Scraper](https://apify.com/haketa/marktstammdatenregister-scraper) — German official energy & solar plant registry
- [Hitta.se Business Directory Scraper](https://apify.com/haketa/hitta-se-business-scraper) — Swedish corporate directory, firmographics & B2B contacts
- [Bien'ici Real Estate Scraper](https://apify.com/haketa/bienici-scraper) — French residential & commercial property market intelligence

***

### 📋 Changelog

#### Version 1.2 (2026-11)

- **Deep 1,000+ Pagination Unlocked:** Set `maxPagesPerSearch` default to `0` (`minimum: 0`), allowing multi-page runs to scale past 1,000 vacancies seamlessly.
- **Fast Prefill Optimization:** Streamlined default parameters to deliver a rich 100-vacancy German sample in <25 seconds.
- **Enhanced Salary & Contact Regex:** Improved email extraction and numerical wage normalization across German federal states.
- **Multi-City Query Expansion:** Automatically expands queries across major German metropolitan areas when large 1K+ limits are specified.

#### Version 1.1 (2026-07)

- Added structured educational requirements and language proficiency parsing.
- Integrated `isPrivateAgency` and `isTempStaffing` flags.
- Added multi-location geocoding support.

#### Version 1.0 (2026-04)

- Initial release covering official Bundesagentur für Arbeit job listings with salary details and contact extraction.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/arbeitsagentur-scraper/changelog.md

# Actor input Schema

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

Search for a job title, skill or profession, e.g. 'Softwareentwickler', 'Pflegefachkraft', 'Marketing Manager'. Leave empty to get a mixed sample of popular jobs across Germany.

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

Pick a city to search in. Choose 'Whole of Germany' for a nationwide search. Need a town that isn't listed? Use the 'Custom location' box below instead.

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

Optional: type any city, region or postal code (PLZ) not in the dropdown, e.g. 'Regensburg', '80331'. This overrides the City dropdown when set.

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

How far around the chosen location to search, in kilometres. 0 = that location only.

## `employer` (type: `string`):

Optional: only return jobs from a specific employer, e.g. 'Siemens AG', 'Deutsche Bahn'. Leave empty for a general keyword/location search.

## `angebotsart` (type: `string`):

Which kind of opening to include.

## `arbeitszeit` (type: `string`):

Filter by working-time model.

## `befristung` (type: `string`):

Filter by contract type.

## `behinderung` (type: `boolean`):

Only return jobs suitable for people with disabilities.

## `publishedSince` (type: `string`):

Only include jobs published within this time window.

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

Fetch the full job description, all locations, contact info and employer profile for each listing. Enables email/phone extraction and requirements parsing. Slightly slower but far richer.

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

Maximum number of jobs to collect. Set 0 for no limit (can be very large for broad searches).

## `maxPagesPerSearch` (type: `integer`):

Maximum result pages per search query (each page holds up to 100 jobs). 0 = auto/unlimited governed by Max jobs.

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

Optional for power users: paste arbeitsagentur.de search-result URLs (with your own filters) or individual job detail URLs. Used alongside the search above.

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

Optional. This scraper works without a proxy. You may enable a proxy if you run very large jobs and want to distribute traffic.

## `requestDelay` (type: `integer`):

Delay between requests in milliseconds. Keep a small polite delay.

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

Maximum parallel detail requests. Keep moderate.

## Actor input object example

```json
{
  "keyword": "Softwareentwickler",
  "city": "",
  "radius": 25,
  "angebotsart": "",
  "arbeitszeit": "",
  "befristung": "",
  "behinderung": false,
  "publishedSince": "0",
  "includeDetails": true,
  "maxItems": 100,
  "maxPagesPerSearch": 0,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "requestDelay": 100,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped results from this run (JSON, CSV, Excel).

# 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 = {
    "keyword": "Softwareentwickler",
    "maxItems": 100,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/arbeitsagentur-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 = {
    "keyword": "Softwareentwickler",
    "maxItems": 100,
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/arbeitsagentur-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 '{
  "keyword": "Softwareentwickler",
  "maxItems": 100,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call haketa/arbeitsagentur-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/arbeitsagentur-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/b3vjnhreFLjSxfeEy/builds/60eYPwMPiHEzQ6GPg/openapi.json
