# Arbeitsagentur Jobs Scraper – German Job Listings API (`gazidev/arbeitsagentur-jobs`) Actor

Scrape job listings from the Bundesagentur für Arbeit Jobbörse (Germany's largest job board, 1M+ jobs) via its official API: keyword, city or radius, contract, working time, full descriptions, only-new monitoring. $0.60 per 1,000 jobs.

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

## Pricing

from $0.60 / 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 – German Job Listings (Jobbörse API)

Get job listings from the **Bundesagentur für Arbeit Jobbörse**, Germany's largest job board (over 1 million open positions), through its **official public job search API**. Search by keyword, city, ZIP code, radius or federal state. You get clean, structured job data in JSON, CSV or Excel.

- **Official API, no browser, no blocking**. It's fast and cheap: about 100 jobs per request.
- **All filters you know from arbeitsagentur.de**: offer type (job, apprenticeship/Ausbildung, internship, self-employment), published within N days, full/part-time, minijob, shift work, permanent or temporary contracts, employer, home office, and excluding temporary agencies (Zeitarbeit) or private recruiters.
- **Full descriptions (optional)**: the complete job ad text, plus private-recruiter and temporary-agency flags and the partner job portal.
- **Monitoring mode**: `onlyNew` remembers what you've already received. Schedule it daily to get a feed of only fresh jobs.
- **Past the 10,000 cap**: nationwide searches are split by federal state automatically.

### Pricing

| Event | Price |
|---|---|
| `job` | **$0.0006** per job ($0.60 per 1,000) |
| `job-details` | **$0.0006** per job, only when *Fetch full job description* is on |

Skipped jobs (already seen, filtered out) are free. The run stops cleanly at your *maximum cost per run*.

### Input example

```json
{
  "keywords": ["Pflegefachkraft", "Altenpfleger"],
  "locations": ["Hamburg", "80331"],
  "radiusKm": 25,
  "publishedWithinDays": 7,
  "workingTime": ["full-time"],
  "contractType": ["permanent"],
  "excludeTemporaryAgencies": true,
  "includeDetails": true,
  "maxItems": 2000
}
```

Every keyword is searched in every location. An empty `locations` list means all of Germany.

### Output example

```json
{
  "refnr": "12412-4535f487_JB5096264-S",
  "title": "Pflegefachkraft (m/w/d) Kinder-Kurzzeitpflege",
  "employer": "pluss Personalmanagement GmbH",
  "profession": "Pflegefachmann/-frau (Altenpflege)",
  "offerType": "job",
  "city": "Hamburg", "zip": "22297", "region": "HAMBURG", "lat": 53.6077, "lon": 10.0126,
  "distanceKm": 5,
  "workingTime": ["full-time"],
  "contract": "permanent",
  "homeOfficePossible": false,
  "startDate": "2026-10-05",
  "publishedDate": "2026-03-16",
  "modifiedAt": "2026-10-05T09:35:42.001",
  "jobUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12412-4535f487_JB5096264-S",
  "externalUrl": "https://...",
  "description": "Unser Kunde begleitet Familien ...",
  "privateRecruiter": false,
  "temporaryAgency": true
}
```

### Use cases

- **Recruiters & staffing agencies**: find companies hiring right now in your niche and region (sales leads).
- **Job boards & aggregators**: daily German job feed with `onlyNew` plus a schedule.
- **Labour-market research**: demand by profession, region, contract type and working time.
- **Job seekers & career tools**: alerts for new jobs matching your criteria.
- **HR tech / AI**: training and matching data with full descriptions.

### Notes

- Data comes from the public Jobsuche API of the Bundesagentur für Arbeit (documented at jobsuche.api.bund.dev). This Actor is not affiliated with the Bundesagentur für Arbeit.
- The API returns at most 10,000 results per query. Narrow very large searches, or leave the location empty to use the automatic split by federal state.
- Contact details of employers are only included when the listing itself publishes them. Respect GDPR when you process personal data.

### Related Actors by gazidev

Greenhouse, Lever, Ashby & Workday Jobs API · Remote Jobs Aggregator · Impressum Scraper (German company data)

# Actor input Schema

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

One search per keyword, in German or English (e.g. 'Pflegefachkraft', 'Python Entwickler', 'Lagerhelfer'). Leave empty to get all jobs in the locations.

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

City ('München'), ZIP code ('10115'), federal state ('Bayern') or 'Deutschland'. Every keyword is searched in every location. Empty = all of Germany. To scrape all of Germany without keywords, add 'Deutschland' or set a filter such as 'Published within the last N days' (a completely empty input runs a small demo).

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

0 = the API default. Ignored for federal states and Germany.

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

Only jobs from this employer, e.g. 'Deutsche Bahn AG'.

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

Matches the 'Angebotsart' filter on arbeitsagentur.de.

## `publishedWithinDays` (type: `integer`):

0 = any date. Use 1 for a daily feed.

## `workingTime` (type: `array`):

Any of the selected. Empty = all.

## `contractType` (type: `array`):

Any of the selected. Empty = all.

## `onlyHomeOffice` (type: `boolean`):

Filtered on the 'homeoffice möglich' flag of each listing (skipped jobs are free).

## `excludeTemporaryAgencies` (type: `boolean`):

Removes jobs from temporary staffing agencies (Arbeitnehmerüberlassung).

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

Removes jobs posted by private recruitment agencies.

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

Adds the full description text, recruiter/agency flags and partner portal (one extra request per job, charged as 'job-details').

## `onlyNew` (type: `boolean`):

Remembers job reference numbers between runs (named key-value store) and outputs only jobs not seen before. Schedule the run daily for a fresh-jobs feed.

## `monitorName` (type: `string`):

Use different names to keep separate 'seen' lists for different searches.

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

0 = no limit. The run also stops at your maximum cost per run.

## `maxItemsPerSearch` (type: `integer`):

0 = no limit (the API returns up to 10,000 per query; nationwide searches are split by federal state automatically).

## `splitByState` (type: `boolean`):

Gets past the API's 10,000-results-per-query cap for searches without a location.

## Actor input object example

```json
{
  "keywords": [
    "Python Entwickler"
  ],
  "locations": [
    "Berlin"
  ],
  "radiusKm": 25,
  "offerType": "job",
  "publishedWithinDays": 0,
  "onlyHomeOffice": false,
  "excludeTemporaryAgencies": false,
  "excludePrivateRecruiters": false,
  "includeDetails": false,
  "onlyNew": false,
  "monitorName": "default",
  "maxItems": 1000,
  "maxItemsPerSearch": 0,
  "splitByState": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

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

No description

## `summary` (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 = {
    "keywords": [
        "Python Entwickler"
    ],
    "locations": [
        "Berlin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/arbeitsagentur-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 = {
    "keywords": ["Python Entwickler"],
    "locations": ["Berlin"],
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/arbeitsagentur-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 '{
  "keywords": [
    "Python Entwickler"
  ],
  "locations": [
    "Berlin"
  ]
}' |
apify call gazidev/arbeitsagentur-jobs --silent --output-dataset

```

## MCP server setup

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