# Arbeitsagentur Jobs API - German Job Search with Salary (`paperlinenstudio/arbeitsagentur-jobs-api`) Actor

Search 1M+ jobs from the Bundesagentur für Arbeit (arbeitsagentur.de) via its JSON API. Multiple keywords and cities per run, salary ranges, remote flag, GPS, full descriptions with contact data redacted, and an only-new mode for scheduled runs. No proxies needed.

- **URL**: https://apify.com/paperlinenstudio/arbeitsagentur-jobs-api.md
- **Developed by:** [Paper & Linen Studio](https://apify.com/paperlinenstudio) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 API – German Job Search Scraper with Salary Data

Get structured job listings from **Germany's largest job board, the Bundesagentur für Arbeit (arbeitsagentur.de)**: **1,014,009 jobs** were online during our test on 2 November 2026. This Actor uses the public JSON API behind the official Jobsuche app, so it needs **no browser and no proxies**. It is fast (10,300 jobs in 66 seconds in our test, without details), cheap, and the output is clean, in English, and ready for Excel, Google Sheets, Airtable, Make, n8n, Zapier or your LLM pipeline.

### What makes this Actor different

- 🔎 **Multiple searches in one run.** Every keyword is combined with every location, for example `["Python", "Data Engineer"] × ["Berlin", "München"]`. Duplicates are removed automatically.
- 💶 **Salary data as numbers.** You get `salary.min`, `salary.max`, `salary.fixed` and `salary.period` whenever the employer published them (17% of listings in our test).
- 🏠 **Remote / home-office flag,** working time, contract type, fixed-term months, career-changer friendly, apprenticeship pay.
- 📍 **GPS coordinates,** postal code, region and distance for every location.
- 📝 **Optional full job description,** with **e-mail addresses and phone numbers redacted by default** (GDPR-friendly).
- 🔁 **Incremental "only new" mode.** Schedule the Actor daily and get only new or changed jobs. Great for job alerts, lead lists and Slack/e-mail notifications.
- 🧱 **Breaks the 10,000-results API cap.** Large nationwide searches are automatically split into the 16 federal states.
- 🗺️ **Correct federal-state search.** On the raw API, "Sachsen", "Hessen" and "Brandenburg" are treated as small towns (we measured "Hessen": 3,034 vs. 70,089 jobs state-wide). This Actor fixes that automatically.
- 💸 **Free to use right now.** No monthly rental; you only pay the tiny Apify platform usage (a 10-job test run cost $0.0001).

### Use cases

- Labour-market and salary research (HR, consultancies, journalists, universities)
- Recruiting agencies: find companies that are hiring right now (lead generation)
- Job alert bots and niche job boards (e.g. only remote Python jobs in DACH)
- Training data / RAG datasets for HR & career AI assistants
- Competitor monitoring: which roles is company X hiring for?

### Input

| Field | Description |
|---|---|
| `keywords` | Job titles or keywords ("was"), e.g. `Pflegefachkraft`, `Elektriker`, `Python`. Empty = all jobs. |
| `locations` | Cities, postal codes or states ("wo"), e.g. `Berlin`, `80331`, `Bayern`. Empty = all of Germany. |
| `radiusKm` | Radius around each location, 0–200 km. |
| `publishedWithinDays` | Only jobs published in the last N days (0–100). |
| `offerType` | `any`, `job`, `self_employment`, `apprenticeship`, `internship` |
| `workingTime` | Any of `full_time`, `part_time`, `shift_night_weekend`, `remote`, `minijob` |
| `contractType` | `any`, `fixed_term`, `permanent` |
| `occupationalField`, `employer` | Optional extra filters |
| `includeTemporaryAgencies`, `includePrivateAgencies` | Uncheck to exclude Zeitarbeit / private recruiters |
| `maxItems` | Max jobs in total (default 100) |
| `maxItemsPerSearch` | Max jobs per keyword × location combination (API max 10,000) |
| `autoSplitByState` | Split huge nationwide searches by federal state (default on) |
| `includeDetails` | Fetch the full description (1 extra request per job, extra event) |
| `redactContactData` | Remove e-mails/phone numbers from descriptions (default on) |
| `onlyNew` + `stateKey` | Incremental mode for scheduled runs |

#### Example input

```json
{
  "keywords": ["Python Entwickler", "Data Engineer"],
  "locations": ["Berlin", "München"],
  "radiusKm": 25,
  "workingTime": ["full_time", "remote"],
  "maxItems": 500,
  "includeDetails": true,
  "onlyNew": true,
  "stateKey": "python-jobs-berlin-muc"
}
```

### Output

One dataset item per job. Example (real output from a test run, description shortened):

```json
{
  "referenceNumber": "12265-487858_JB5268533-S",
  "title": "DevOps Softwareentwickler (m/w/d)",
  "employer": "FERCHAU GmbH Niederlassung Berlin",
  "occupation": "Softwareentwickler/in",
  "allOccupations": [
    "Softwareentwickler/in"
  ],
  "offerType": "ARBEIT",
  "trainingType": null,
  "studyProgram": null,
  "workingTime": [
    "full_time"
  ],
  "remotePossible": null,
  "remoteType": null,
  "remotePercent": null,
  "contractDuration": "KEINE_ANGABE",
  "fixedTermMonths": null,
  "fixedTermUntil": null,
  "suitableForCareerChangers": false,
  "salary": {
    "type": "GEHALTSSPANNE",
    "period": "JAHRESGEHALT",
    "min": 50000.0,
    "max": 75000.0,
    "fixed": null
  },
  "apprenticeshipPayYear1": null,
  "startDate": "2026-10-09",
  "publishedFrom": "2026-10-09",
  "firstPublishedAt": "2026-10-09",
  "modifiedAt": "2026-10-09T07:42:10.402",
  "location": {
    "street": null,
    "postalCode": "12489",
    "city": "Berlin",
    "region": "BERLIN",
    "country": "DEUTSCHLAND",
    "latitude": 52.435920336,
    "longitude": 13.542341496
  },
  "allLocations": [
    {
      "street": null,
      "postalCode": "12489",
      "city": "Berlin",
      "region": "BERLIN",
      "country": "DEUTSCHLAND",
      "latitude": 52.435920336,
      "longitude": 13.542341496
    }
  ],
  "distanceKm": 12,
  "url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12265-487858_JB5268533-S",
  "externalUrl": null,
  "employerLogoId": "ghZVs9M8h2dsXvNyd43YMIt1UhKeus7vPcJS99oqLzc=",
  "searchKeyword": "Python Entwickler",
  "searchLocation": "Berlin",
  "scrapedAt": "2026-11-02T22:33:00+00:00",
  "description": "Menschen und Technologien zu verbinden, den Perfect Match für unsere Kunden zu gestalten, immer die richtigen Expert:innen für die jeweilige Herausforderung zu finden - das ist unser Anspruch bei FERCHAU und dafür suchen wir dich: als Expert:in für unseren Kunden.\n\nWir realisieren spannende Projekte…",
  "detailsAvailable": true,
  "isTemporaryAgencyJob": true,
  "isPrivateAgencyJob": false,
  "partnerName": "FERCHAU Engineering GmbH",
  "partnerUrl": "www.ferchau.de"
}

```

A `RUN_SUMMARY` record in the default key-value store lists every search with the number of matches the API reported and the number of jobs saved.

Download the results as JSON, CSV, Excel, XML or HTML, or fetch them through the Apify API.

### Pricing

**The Actor is currently free** – you only pay Apify platform usage, which is very low because no browser is used (our 10-job test run with details cost about $0.0001; the free monthly Apify credit covers many thousands of jobs). A fair pay-per-result price may be introduced later; Apify announces such changes to users at least 14 days in advance. You can always cap the cost of a run with the *Max cost per run* setting.

### FAQ

**Is this legal?** The Actor reads only publicly available job ads through the public endpoints used by the official Jobsuche app (documented by the open-data community at [bund.dev](https://jobsuche.api.bund.dev/)). Please note that the Bundesagentur für Arbeit does not offer this as an officially supported API, and you are responsible for how you use the data. Contact data in descriptions is redacted by default. Do not use the data for spam.

**Why do I get fewer results than the website shows?** The API returns at most 10,000 results per search. Use more specific keywords or locations, or keep `autoSplitByState` on for nationwide searches.

**Can I monitor new jobs daily?** Yes. Turn on `onlyNew`, set a `stateKey` and create an Apify Schedule.

**Does it work for Austria or Switzerland?** No. Use German locations. The API matches unknown place names to a similar German town (in our test, "Wien" was matched to the town "Sien"). Check `RUN_SUMMARY` if the result count looks odd.

***

### 🇩🇪 Deutsch: Arbeitsagentur Jobsuche API

Dieser Actor liefert Stellenangebote der **Jobbörse der Bundesagentur für Arbeit** als strukturierte Daten (JSON, CSV, Excel), ohne Browser und ohne Proxy.

**Funktionen:**

- Mehrere Suchbegriffe × Orte in einem Lauf, automatische Duplikat-Entfernung
- **Gehaltsangaben** (von/bis/fest, Jahres- oder Monatsgehalt), sofern vom Arbeitgeber angegeben
- Homeoffice, Arbeitszeit, Befristung, Quereinstieg, Ausbildungsvergütung
- Koordinaten, PLZ, Bundesland und Entfernung
- Optional die vollständige Stellenbeschreibung, mit **automatischer Schwärzung von E-Mail-Adressen und Telefonnummern** (DSGVO)
- **Nur neue Stellen:** Bei regelmäßigen Läufen (Zeitplan) werden nur neue oder geänderte Angebote ausgegeben
- Umgeht die 10.000-Treffer-Grenze der API durch automatische Aufteilung nach Bundesländern
- "Sachsen", "Hessen" und "Brandenburg" werden korrekt als Bundesland gesucht

**Typische Anwendungen:** Arbeitsmarkt- und Gehaltsanalysen, Lead-Generierung für Personaldienstleister, Job-Alerts, Nischen-Jobbörsen, Datensätze für KI-Anwendungen.

**Preise:** Derzeit kostenlos – es fallen nur die sehr geringen Apify-Plattformkosten an (mit dem kostenlosen Apify-Guthaben lassen sich viele tausend Stellen abrufen). Eine spätere Preisänderung kündigt Apify mindestens 14 Tage vorher an.

**Hinweis:** Die Bundesagentur für Arbeit stellt die genutzten Schnittstellen öffentlich bereit, bietet sie aber nicht offiziell als API mit Support an. Die Nutzung der Daten erfolgt in eigener Verantwortung.

# Actor input Schema

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

Job titles or keywords, e.g. 'Python', 'Pflegefachkraft', 'Elektriker'. Every keyword is combined with every location. Leave empty to search all jobs.

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

Cities, postal codes or German states, e.g. 'Berlin', '80331', 'Bayern'. Leave empty for all of Germany.

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

Search radius around each location in km (0–200). Leave empty for the API default.

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

Only jobs published in the last N days (0–100). Great for daily/weekly scheduled runs.

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

Kind of offer.

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

Filter by working time. Allowed values: full_time, part_time, shift_night_weekend, remote, minijob.

## `contractType` (type: `string`):

Fixed-term or permanent.

## `occupationalField` (type: `string`):

Optional occupational field, e.g. 'Informatik'.

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

Optional exact employer name, e.g. 'Deutsche Bahn AG'.

## `includeTemporaryAgencies` (type: `boolean`):

Uncheck to exclude jobs from temporary staffing agencies.

## `includePrivateAgencies` (type: `boolean`):

Uncheck to exclude jobs posted by private recruitment agencies (PAV).

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

Maximum number of jobs saved in this run (across all searches).

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

Maximum jobs per keyword×location combination. The API itself returns at most 10,000 per search.

## `autoSplitByState` (type: `boolean`):

The API returns max. 10,000 jobs per search. If a search without location has more results (and you asked for more than 10,000), it is automatically split into 16 federal-state searches to get past the cap.

## `fixStateNames` (type: `boolean`):

Without this, the API interprets these names as small towns (radius search). Turned on, they are searched state-wide.

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

Fetch the full description for every job (one extra request per job, charged as an extra event).

## `redactContactData` (type: `boolean`):

Recommended for GDPR: replaces e-mail addresses and phone numbers in descriptions with placeholders.

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

Remembers jobs from previous runs (per state key) and only outputs new or changed ones. Ideal with Apify Schedules.

## `stateKey` (type: `string`):

Use a different key for each monitoring use case. Letters, numbers and dashes only.

## `detailConcurrency` (type: `integer`):

Parallel detail requests (1–10). Keep low to be polite to the public API.

## Actor input object example

```json
{
  "keywords": [
    "Python Entwickler"
  ],
  "locations": [
    "Berlin"
  ],
  "offerType": "any",
  "workingTime": [],
  "contractType": "any",
  "includeTemporaryAgencies": true,
  "includePrivateAgencies": true,
  "maxItems": 100,
  "maxItemsPerSearch": 10000,
  "autoSplitByState": true,
  "fixStateNames": true,
  "includeDetails": false,
  "redactContactData": true,
  "onlyNew": false,
  "stateKey": "default",
  "detailConcurrency": 4
}
```

# Actor output Schema

## `jobs` (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("paperlinenstudio/arbeitsagentur-jobs-api").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("paperlinenstudio/arbeitsagentur-jobs-api").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 paperlinenstudio/arbeitsagentur-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,paperlinenstudio/arbeitsagentur-jobs-api"
        }
    }
}
```

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/bZbn7fHal0eTHtn2w/builds/sNETJWq8yHhHCWXbW/openapi.json
