# Arbeitsagentur Jobs Scraper (Germany Job Listings) (`webdatatools/arbeitsagentur-jobs-scraper`) Actor

Scrape German job listings from the Bundesagentur fuer Arbeit Jobsuche by keyword, place, radius, working time and publication date: title, employer, location, publication and start dates, reference number and link.

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

## Pricing

from $1.20 / 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.
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

### What is Arbeitsagentur Jobs Scraper?

**Arbeitsagentur Jobs Scraper** collects job listings from the **Bundesagentur fuer Arbeit Jobsuche**, the official German job board (arbeitsagentur.de). Enter keywords, optionally a German place or postcode with a radius, and a working-time or publication-date filter. The Actor reads the same public REST API the Jobsuche website uses and writes one row per job.

Use it for labour-market research, regional hiring monitoring, recruiter lead lists of employers, salary-free job tracking and building job alerts for Germany.

### What data does Arbeitsagentur Jobs Scraper extract?

| Field | Description |
|---|---|
| `position` | Rank within the search, in API order |
| `jobId` | Reference number (`referenznummer`), unique per job |
| `title` | Job title as the employer wrote it |
| `employer` | Employer name (`firma`) |
| `location`, `postalCode`, `region`, `country` | First work location: town, postcode, state, country |
| `publishedAt` | First publication date (YYYY-MM-DD) |
| `startDate` | Earliest possible start (`eintrittszeitraum`) |
| `employmentType` | Working time flags, e.g. "Full-time", "Part-time (morning)" |
| `homeOffice` | Whether home office is possible (true/false, null when not stated) |
| `distanceKm` | Distance from the searched place in km, as the API reports it |
| `url` | Public job page on arbeitsagentur.de |
| `description` | Full job text, only with "Include job description" on (null otherwise) |
| `searchKeyword`, `searchLocation`, `totalMatches` | Your search and the number of matches the API reports |
| `scrapedAt` | Time the row was written (ISO 8601) |

### How to use Arbeitsagentur Jobs Scraper

1. Enter **Keywords**, several separated by `;` (e.g. `Softwareentwickler; Data Analyst`).
2. Optionally enter a **Location** (e.g. `Berlin` or `80331`) and a **Radius** in km (0 to 200). Leave the location empty for all of Germany.
3. Choose **Working time** and, if needed, **Published within (days)**.
4. Set **Max jobs per search** (up to 1,000) and run. Turn on **Include job description** only when you need the full text; it makes one extra request per job.
5. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### Example input

```json
{
    "keywords": "Softwareentwickler",
    "location": "Berlin",
    "radius": 25,
    "maxJobs": 30
}
```

### Example output

Real row from a run on 2026-10-23 (search `Softwareentwickler`, Berlin, radius 25 km; 208 matches reported):

```json
{
    "position": 1,
    "jobId": "10001-1003891446-S",
    "title": "Softwareentwicklerin (w/m/d)",
    "employer": "GASAG AG",
    "location": "Berlin",
    "postalCode": "10829",
    "region": "BERLIN",
    "country": "DEUTSCHLAND",
    "publishedAt": "2026-10-21",
    "startDate": "2026-10-22",
    "employmentType": "Full-time",
    "homeOffice": true,
    "distanceKm": 6,
    "url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003891446-S",
    "description": null,
    "searchKeyword": "Softwareentwickler",
    "searchLocation": "Berlin",
    "totalMatches": 208,
    "scrapedAt": "2026-10-23T02:56:22.989Z"
}
```

### Input parameters

| Parameter | Default | Description |
|---|---|---|
| `keywords` | `Softwareentwickler` | Job title, skill or employer; several separated by `;` |
| `location` | empty | German place or postcode; empty means all of Germany |
| `radius` | 25 | Radius in km around the location (0 to 200) |
| `employmentType` | `all` | `all`, `vz` full-time, `tz` part-time, `mj` mini-job, `snw` shift/night/weekend |
| `publishedWithinDays` | 0 | Only jobs published in the last N days (0 to 100); 0 means no filter |
| `maxJobs` | 100 | Per keyword, up to 1,000 |
| `includeDetails` | false | Adds the full job description with one more request per job |
| `proxyMode` | `auto` | `auto`: direct first, Apify Residential proxy only if the API refuses. `never`: direct only. `always`: residential from the start |

### Pricing

Pay per job: **$0.002 per job** on the FREE plan, with volume tiers down to $0.0012 per job on the higher Apify plans (the platform stored PLATINUM and DIAMOND at $0.0012). A small start fee of $0.00005 per GB of memory applies to each run.

Measured cost on our account (2026-10-23, 4 GB run memory during measurement, cloud run): 120 jobs without details cost $0.00127 in platform usage, about $0.011 per 1,000 jobs. A 25-job run with details cost $0.0023. Platform usage is far below the price per job; the price includes it.

### Arbeitsagentur Jobs Scraper vs. other job sites

Scrapers that read HTML result pages break when the layout changes. This Actor calls the Jobsuche REST API that the official website uses, so it returns structured fields (reference number, dates, postcode, working-time flags) without parsing pages. It covers only jobs listed on the Bundesagentur fuer Arbeit board, not every German job site.

### Using Arbeitsagentur Jobs Scraper with AI agents and MCP

The Actor is pay-per-event, so AI agents can call it through the Apify MCP server with a plain keyword and place. Agents should keep `maxJobs` small for exploratory questions and turn on `includeDetails` only when they need the job text.

### FAQ

**Does it need a login or an account?**
No. It reads the public Jobsuche API. No Arbeitsagentur login, cookies or personal data are used.

**Does it collect personal data?**
It stores job listings: the employer's name and the place of work. It does not collect applicant data or contact details of individuals.

**Why is `description` empty?**
Descriptions come from the detail endpoint and are fetched only when "Include job description" is on. A failed detail request leaves the field null and is logged.

**What are the limits?**
The search API returns at most 100 jobs per page; the Actor pages through results until `maxJobs` or the end of the matches. The number of matches (`totalMatches`) is what the API reports for that search.

**What about errors?**
If the API refuses direct access, the Actor retries through the Residential proxy and logs the switch. If no job can be read at all, the run fails with the reason in its log.

**Do I need a German address or a German IP?**
No. In tests from Apify's cloud the public API answered directly without a proxy.

### Limitations

- Only jobs published on arbeitsagentur.de are included.
- `employmentType` lists the working-time flags the listing sets; a listing can carry several.
- `location` is the first work location of a listing; multi-location jobs are not split.
- The Jobsuche API is not documented as a public product. If Arbeitsagentur changes its API version or key, the Actor will fail visibly and needs an update.
- Not verified: `description` has been checked on one detail response (2026-10-23), not on every employer's text format.

### Related Actors

Our other job and listing Actors are available in the webdatatools account on Apify. Search the Store for "webdatatools" to see them.

### Support

Use the Issues tab on the Actor's Apify Store page. Include the run ID and the input you used.

# Actor input Schema

## `keywords` (type: `string`):

Job title, skill or employer, e.g. `Softwareentwickler` or `Pflegefachkraft`. Several separated by `;` run one after another.

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

Optional German place or postcode, e.g. `Berlin` or `80331`. Leave empty for all of Germany.

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

Search radius around the location, 0 to 200 km. Used only with a location.

## `employmentType` (type: `string`):

Full-time, part-time, mini-job or shift/night/weekend work. Leave on "All" for every type.

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

Only jobs published in the last N days, 0 to 100. 0 means no date filter.

## `maxJobs` (type: `integer`):

For each keyword, read until this limit or the end of the results.

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

Also calls the job detail endpoint for each job to add the full description. Slower and uses more requests.

## Actor input object example

```json
{
  "keywords": "Softwareentwickler",
  "location": "Berlin",
  "radius": 25,
  "employmentType": "all",
  "publishedWithinDays": 0,
  "maxJobs": 100,
  "includeDetails": false
}
```

# Actor output Schema

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

All arbeitsagentur jobs from this run.

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

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

# Run the Actor and wait for it to finish
run = client.actor("webdatatools/arbeitsagentur-jobs-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": "Softwareentwickler",
  "location": "Berlin"
}' |
apify call webdatatools/arbeitsagentur-jobs-scraper --silent --output-dataset

```

## MCP server setup

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