# Arbeitsagentur Jobs Scraper — Official API (Germany) (`perceptr0n/arbeitsagentur-jobs-scraper`) Actor

Search Germany's largest job board (Bundesagentur für Arbeit) through its official public API. Full job descriptions, salary ranges, home-office flags, geo coordinates. Fast and reliable — no blocking, no proxies.

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

## Pricing

from $0.01 / actor start

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Arbeitsagentur Jobs Scraper — Official API (Germany)

Search **Germany's largest job board** — the Bundesagentur für Arbeit Jobbörse
with **1M+ live job listings** — and get clean, structured JSON in seconds.

Unlike HTML scrapers, this actor uses the **official public Jobsuche API**
(documented by the [bundesAPI project](https://github.com/bundesAPI/jobsuche-api)).
That means:

- ⚡ **Fast & reliable** — no browser, no blocking, no captchas, no proxies
- 📄 **Full job descriptions** — complete posting text, not just teasers
- 💶 **Salary ranges** — `salaryFrom` / `salaryTo` where employers provide them
- 🏠 **Home-office & working-time flags** — full-time, part-time, shift, mini-job
- 📍 **Geo coordinates** — every job location with lat/lon for mapping
- 🔁 **Monitoring-ready** — filter by "published in the last N days" and run on a schedule

### Use cases

- **Job-market analytics** — demand by region, profession, salary levels
- **HR / recruiting tech** — feed fresh German job postings into your product
- **Job alerts** — schedule daily runs with `publishedSince: 1` for new listings
- **Lead generation** — companies that are hiring are companies that are buying
- **AI agents** — clean input/output schema, works out of the box via MCP

### Input example

```json
{
    "keyword": "Pflegefachkraft",
    "location": "München",
    "radiusKm": 50,
    "publishedSince": 7,
    "excludeTemporaryEmployment": true,
    "includeDetails": true,
    "maxItems": 500
}
```

### Output example

```json
{
    "title": "Elektriker/in",
    "profession": "Elektroinstallateur/in",
    "company": "Die Elbmonteure Service GmbH",
    "salaryFrom": 3200,
    "salaryTo": 3800,
    "homeOfficePossible": false,
    "workingTime": { "fullTime": true, "shiftNightWeekend": false },
    "entryFrom": "2026-08-01",
    "firstPublished": "2026-07-19",
    "locations": [
        { "zip": "10179", "city": "Berlin", "region": "Berlin", "country": "Deutschland", "lat": 52.5132, "lon": 13.4157 }
    ],
    "refnr": "15318-0B3L4BVB1PA9Q1KJ-S",
    "jobUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/15318-0B3L4BVB1PA9Q1KJ-S",
    "description": "Verstärke die Elbmonteure …"
}
```

### Tips

- **German search terms** return the best results (`Koch` beats `cook`).
- Leave `location` empty for **nationwide** searches.
- Set `includeDetails: false` for large volume runs where you only need
  structured metadata — it roughly doubles the speed.
- For **daily monitoring**, create a Schedule with `publishedSince: 1` and
  connect a webhook or export integration.

### Data & fair use

The data comes from the public Jobsuche API of the Bundesagentur für Arbeit
using its documented public client id. This actor is **not affiliated with or
endorsed by the Bundesagentur für Arbeit**. Only public job postings and
employer information are accessed — no applicant or personal data. The actor
throttles its requests to keep load on the public API low.

### What does a run cost?

| Job postings | Cost |
|---|---|
| 100 | $0.11 |
| 1,000 | $1.01 |
| 10,000 | $10.01 |

$0.01 per run start plus $0.001 per job. Turning `includeDetails` off roughly
halves the run time — the price stays the same.

### FAQ

**Is there an official Arbeitsagentur API?**
Yes, and this actor uses it: the public Jobsuche API of the Bundesagentur für
Arbeit. That is why runs are fast and never blocked — but the raw API returns
nested German field names, paginates awkwardly and needs a separate call per job
description. This actor handles all of that.

**How do I get new jobs only?**
Set `publishedSince` to `1` and schedule the actor daily. Each run then returns
only what was posted since yesterday.

**Can I search all of Germany at once?**
Yes — leave `location` empty. With a location set, `radiusKm` controls how far
around it the search reaches.

**Why do some jobs have no salary?**
Salary fields are optional for employers in Germany. `salaryFrom` / `salaryTo`
are filled whenever the employer published a range; otherwise they stay empty
rather than being estimated.

**Does this include applicant or personal data?**
No. Only public job postings and the employer information attached to them.

**How do I export to Excel?**
Run the actor, then export the dataset as CSV or XLSX from the Apify console, or
pull it through the API into Google Sheets.

### Related actors

| Actor | What it does |
|---|---|
| [kununu Scraper](https://apify.com/perceptr0n/kununu-employer-data-scraper) | Employer ratings, salaries and benefits for the same DACH companies |
| [EU Public Tenders (TED)](https://apify.com/perceptr0n/eu-tenders-ted-scraper) | Public contracts across all 27 EU member states |
| [Messe München Exhibitors](https://apify.com/perceptr0n/messe-muenchen-exhibitor-list-scraper) | Trade-fair exhibitors with address, e-mail and phone |

### Support

Found an issue or missing a feature (new filters, delta mode, exports)?
Open an issue in the **Issues** tab — response within 1–2 business days.

# Actor input Schema

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

What to search for: job title, skill or profession — e.g. `Elektriker`, `Data Analyst`, `Pflege`. German terms give the best coverage. At least one of keyword/location is required.

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

City, region or ZIP code in Germany — e.g. `Berlin`, `München`, `10115`. Leave empty for a nationwide search.

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

Radius around the location in kilometers.

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

Type of position to search for.

## `publishedSince` (type: `integer`):

Only return jobs published within the last N days (e.g. `7` for weekly monitoring). Leave empty for all.

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

Only jobs from employers matching this name — e.g. `Deutsche Bahn`.

## `workingTime` (type: `string`):

Filter by working-time model.

## `excludeTemporaryEmployment` (type: `boolean`):

Filter out listings from temporary-employment agencies.

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

Fetch the complete job description text for every result (one extra API call per job, slightly slower).

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

Stop after this many jobs.

## Actor input object example

```json
{
  "keyword": "Elektriker",
  "location": "Berlin",
  "radiusKm": 25,
  "offerType": "1",
  "excludeTemporaryEmployment": false,
  "includeDetails": true,
  "maxItems": 200
}
```

# 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": "Elektriker",
    "location": "Berlin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("perceptr0n/arbeitsagentur-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 = {
    "keyword": "Elektriker",
    "location": "Berlin",
}

# Run the Actor and wait for it to finish
run = client.actor("perceptr0n/arbeitsagentur-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "Elektriker",
  "location": "Berlin"
}' |
apify call perceptr0n/arbeitsagentur-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=perceptr0n/arbeitsagentur-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/aB1pDEPN6yP6mM9cc/builds/dWSKYN9aXsgUejsCV/openapi.json
