# Arbeitsagentur Jobs Scraper: Germany Jobs & Salaries (`precious_bathmat/arbeitsagentur-job-scraper`) Actor

Scrape jobs from the German Federal Employment Agency (Jobbörse der Arbeitsagentur), Germany's largest job board with 1M+ jobs: employer, occupation, address, salary, contract, hours, home office, plus a hiring report per search. Official API.

- **URL**: https://apify.com/precious_bathmat/arbeitsagentur-job-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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

## Arbeitsagentur Jobs Scraper: Germany Jobs & Salaries

Scrape **jobs from the Jobbörse of the German Federal Employment Agency (Bundesagentur für Arbeit)**, Germany's largest job board with **over 1 million open jobs**, through its **official public API**: no login, no key of yours, no browser. Get a **hiring report for every search**:

- **Every job**: title, employer, occupation, offer type (job, apprenticeship, internship, freelance), workplace address, city, postcode, state and coordinates, full-time / part-time / shifts, home office, permanent or fixed-term, salary (yearly or hourly, in euros), start date, posted date, link
- **Optional job details**: the full description and whether the job comes from a **temp agency** (Zeitarbeit) or a **private recruiter**
- **Filters**: city, postcode or state with a radius, offer type, permanent or fixed-term, working hours, exclude temp agencies, exclude private recruiters, posted within N days
- **Report per search**: the **top employers, places and occupations over every matching job**, temp-agency share, how many ads state pay, permanent vs fixed-term, full-time vs part-time, yearly salary and hourly pay, salary by state, freshness, highest-paid jobs

### What does this Arbeitsagentur scraper do?

```
Jobbörse · "Lagerhelfer" (warehouse helper) · Germany · 5,482 jobs
 82% from temp agencies · top employer Randstad Deutschland (716)
 Pay stated in 67% of ads · median €15.67 an hour (€15.34 to €16.00)
 Most jobs: Berlin 323
```

1. Enter **keywords** (German or English) or leave empty for every job, and optionally **locations** with a radius.
2. Pick filters: **offer type**, **contract**, **hours**, **exclude temp agencies**, **posted within**.
3. You get **one row per job** and **one report per keyword and location**.

```mermaid
flowchart LR
    A[Keywords,<br/>cities or states,<br/>filters] --> B[Jobbörse<br/>official API]
    B --> C[Jobs<br/>employer, address,<br/>salary, contract,<br/>hours]
    C -. optional .-> D[Job details<br/>description,<br/>temp agency]
    B --> E[Report<br/>top employers,<br/>temp share,<br/>salary, contracts]
    C --> E
```

### Who is it for?

- **Recruiters and staffing agencies in Germany**: who is hiring for a role, where, and how much of the market is already held by temp agencies
- **Sales teams selling to employers** (HR software, job ads, training): companies with the most open jobs per occupation and city
- **HR and compensation teams**: advertised pay for a role, yearly and hourly, by state
- **Job seekers and career services**: every job for a role near you, with start dates and pay where stated
- **Analysts, economists and journalists**: labour demand by occupation, region, contract type and working time from the official job board

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `id`, `title`, `url`, `externalUrl`, `employerProfileUrl` | The job, the employer's own ad if any, and the employer page |
| `employer`, `occupation`, `otherOccupations`, `offerType` | Who hires, for what occupation, and what kind of offer |
| `city`, `postcode`, `street`, `region`, `country`, `latitude`, `longitude`, `otherLocations` | The workplace |
| `hours`, `miniJob`, `homeOffice`, `homeOfficeType`, `homeOfficePercent` | Working time and home office |
| `contract`, `fixedTermMonths`, `startDate` | Permanent or fixed-term, and when it starts |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `currency` | Pay in euros, per year or per hour, when stated |
| `suitableForCareerChangers`, `postedAt`, `updatedAt` | Career changers welcome, dates |
| With **job details**: `description`, `isTempAgency`, `isPrivateRecruiter`, `partnerSite` | The full ad and who posted it |

**Report** (`REPORTS`, one per keyword and location)

| Field | What it tells you |
|---|---|
| `totalOnJobboerse`, `jobsRead` | Every matching job, and how many were read |
| `topEmployers`, `topPlaces`, `topOccupations` | Over **every** matching job |
| `tempAgencySharePercent`, `privateRecruiterSharePercent`, `salaryShownSharePercent` | Over every matching job |
| `contract`, `hours`, `careerChangersWelcome`, `postedWithin` | Counts over every matching job |
| `yearlySalary`, `hourlyPay`, `yearlySalaryByRegion` | Pay median and middle half, among the jobs read |
| `jobsByRegion`, `homeOfficePercent`, `freshness`, `highestPaid` | Among the jobs read |

### Example: 17 October 2026

Five occupations across Germany, 1,000 jobs each: **5,000 jobs and 5 reports in 47 seconds, 53 requests**.

| Keyword | Jobs in Germany | Temp-agency share | Pay stated | Median pay (jobs read) | Top employer |
|---|---|---|---|---|---|
| Pflegefachkraft (nurse) | 24,466 | 13% | 21% | €46,342 a year · €23.50 an hour | rocket match (821) |
| Elektriker (electrician) | 15,386 | 40% | 32% | €20.00 an hour | Frielingsdorf Nord (409) |
| Erzieher (educator) | 14,018 | 11% | 18% | €45,000 a year · €22.50 an hour | PerZukunft Arbeitsvermittlung (151) |
| Lagerhelfer (warehouse helper) | 5,482 | 82% | 67% | €15.67 an hour | Randstad Deutschland (716) |
| Python | 2,847 | 22% | 21% | €65,000 a year (€57,500 – €72,500) | Robert Bosch (88) |

- **Every job on the Jobbörse**: 1,020,772 open jobs; top employers Netto (25,040), Lidl (14,652) and TimePartner (13,622); 21% from temp agencies. A run read the 10,000-job maximum for that search in 163 seconds.
- With **job details** on, 400 Python jobs in Berlin and Hamburg came with full descriptions in 116 seconds.

### Pricing

**$0.001 per job**, **$0.001 per job with details** (only when details are on) and **$0.02 per search report**.

- 1,000 jobs with a report: **$1.02**
- The run above (5,000 jobs, 5 reports): **$5.10**
- Just the market numbers for a role (report + 1 job): **$0.021**

### Good to know

- **Official source**: the Bundesagentur für Arbeit's public job search API (documented at jobsuche.api.bund.dev), with its public client id.
- **10,000 jobs per search** is the Jobbörse's own limit; split big searches by location or filters. The report's employer, place and occupation counts always cover every match.
- **Salary** is stated on roughly a fifth to two thirds of ads depending on the occupation; the rest have none.
- **Order**: results come in the Jobbörse's relevance order; use **Posted within** for the newest jobs.
- **Privacy**: contact people and phone numbers are not collected; emails and phone numbers in descriptions are hidden. Addresses are the workplace addresses employers publish.
- **Not affiliated with the Bundesagentur für Arbeit.**

### Input

| Field | Meaning |
|---|---|
| **Keywords** | One search each; empty = every job |
| **Locations** | Cities, postcodes or states; empty = all of Germany |
| **Radius (km)** | Around each location (default 25) |
| **Offer type** | Jobs, apprenticeships / dual study, internships / trainee, self-employment |
| **Contract** | Permanent or fixed-term |
| **Working hours** | Full-time, part-time, shift / night / weekend |
| **Exclude temp agencies**, **Exclude private recruiters** | Switches |
| **Posted within (days)** | 1 to 100 |
| **Jobs per search** | 1 to 10,000 (default 200) |
| **Job details** | Off by default |
| **Reports** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "Posted within 1 day" for a feed of new German jobs.

# Actor input Schema

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

Job titles, occupations or skills, one search each, in German or English, e.g. "Pflegefachkraft", "Python", "Elektriker", "Lagerhelfer". Empty = every job (with the filters below).

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

Optional cities, postcodes or states, e.g. "München", "10115", "Bayern". Each keyword is searched around each. Empty = all of Germany.

## `radiusKm` (type: `integer`):

Distance around each location (0 to 200).

## `offerType` (type: `string`):

Only this kind of offer.

## `contract` (type: `string`):

Only permanent or only fixed-term jobs.

## `hours` (type: `array`):

Optional: only these working-time models.

## `excludeTempAgencies` (type: `boolean`):

Leave out jobs from temporary staffing agencies (Zeitarbeit / Arbeitnehmerüberlassung).

## `excludePrivateRecruiters` (type: `boolean`):

Leave out jobs from private recruitment agencies.

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

Only jobs published in the last N days (1 to 100). Empty = any time.

## `maxJobsPerSearch` (type: `integer`):

Most jobs to read per keyword and location (1 to 10,000, the Jobbörse's own limit).

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

Read each job's full description and whether it comes from a temp agency or private recruiter. Charged per job.

## `includeReports` (type: `boolean`):

One report per keyword and location: top employers, places and occupations over every matching job, temp-agency share, salary shown share, permanent vs fixed-term, full-time vs part-time, yearly salary and hourly pay, salary by state, freshness, highest-paid jobs.

## Actor input object example

```json
{
  "keywords": [
    "Python"
  ],
  "radiusKm": 25,
  "offerType": "any",
  "contract": "any",
  "excludeTempAgencies": false,
  "excludePrivateRecruiters": false,
  "maxJobsPerSearch": 200,
  "includeDetails": false,
  "includeReports": true
}
```

# Actor output Schema

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

One row per job: title, employer, occupation, offer type, workplace address and state, hours, home office, contract, salary, start date, posted date, link.

## `reports` (type: `string`):

Per search: top employers, places and occupations, temp-agency share, contract and hours mix, salary, freshness.

## `reportsCsv` (type: `string`):

One flat row per search.

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

Requests, problems and the limits of the data.

# 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": [
        "Python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/arbeitsagentur-job-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": ["Python"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/arbeitsagentur-job-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": [
    "Python"
  ]
}' |
apify call precious_bathmat/arbeitsagentur-job-scraper --silent --output-dataset

```

## MCP server setup

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