# Arbeitsagentur Jobs Scraper (Bundesagentur für Arbeit) (`veedel_digital/arbeitsagentur-jobs`) Actor

Scrape job listings from Germany's largest job board, the Bundesagentur für Arbeit, via its official API. Salary, coordinates, home office, full descriptions, 15 filters and a monitoring mode that returns only new jobs. No proxies, pay per job.

- **URL**: https://apify.com/veedel_digital/arbeitsagentur-jobs.md
- **Developed by:** [Tim Tonat](https://apify.com/veedel_digital) (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

### What does Arbeitsagentur Jobs Scraper do?

This Actor **scrapes job listings from the Bundesagentur für Arbeit** (arbeitsagentur.de), one of Germany's largest job boards. It uses the same API as the official Jobsuche app, so it is fast, stable and needs **no proxies and no browser**.

Enter keywords and locations, and get **one clean row per job** with:

- title, employer, occupation, offer type and reference number
- **work location with postal code, federal state and coordinates** (all locations of multi-site jobs)
- **salary** as structured numbers (min, max, period) whenever the employer states it
- working time, contract type, start date, publication date, **home office** flag
- with *Include full job description*: the **full description text**, temp-agency flag and the original source site

Deutsch: Der Actor liest Stellenangebote aus der Jobsuche der Bundesagentur für Arbeit, mit allen Filtern der Jobbörse, Gehalt, Koordinaten und einem Modus, der bei regelmäßigen Läufen nur neue Stellen liefert.

### Why use this Arbeitsagentur scraper?

- **Recruiters and staffing agencies**: find companies that are hiring in your region and trade, e.g. electricians around Cologne, every morning
- **Sales teams**: hiring is a buying signal. A company looking for 10 IT people needs laptops, software and office space
- **Salary benchmarking**: about one in four listings states a salary, delivered here as numbers, not text
- **Labor market research**: every search also returns free statistics on top employers, cities and occupations
- **Job boards and apps**: feed German jobs with coordinates straight into your map or database
- **Monitoring**: with *Only new jobs since the last run* a daily schedule returns just the new postings, and you pay only for those

### Why this Actor

- **Low, simple price**: $0.001 per job, $0.002 with the full description. No start fee, runs on 256 MB.
- **Salary as numbers**: `min`, `max`, `period` and `currency`, ready for sorting and charts
- **Coordinates for every work location**, also for jobs with several sites
- **Many searches in one run**: every keyword × every location, duplicates across searches removed automatically
- **Monitoring built in**: *Only new jobs since the last run* remembers what you already have
- **Free market summary** per search: total jobs, top employers, top cities, top occupations
- **12 filters** of the official job board, or paste any arbeitsagentur.de search URL

### How to scrape jobs from the Arbeitsagentur

1. Click **Try for free**.
2. Enter one or more **Keywords** (e.g. "Elektriker") and **Locations** (e.g. "Köln"). Every keyword is searched in every location.
3. Optional: set radius, offer type, working time, contract, publication date, employer and the other filters. Or paste a search URL from arbeitsagentur.de.
4. Set **Max jobs per search** and click **Start**.
5. Open the **Overview** table, or download everything as JSON, CSV or Excel.

To monitor new jobs, enable **Only new jobs since the last run** and create a **Schedule**, e.g. daily at 7:00.

### How much does it cost?

This Actor uses **pay per event**, and **platform usage is included**:

- **$0.001 per job** in the results
- **$0.001 extra per job** if *Include full job description* is enabled and the description was loaded

1,000 jobs cost $1, or $2 with full descriptions. Failed searches and descriptions that could not be loaded are not charged. Jobs skipped by *Only new jobs* are not charged either. The exact prices are in the **Pricing** tab.

### Input

See the **Input** tab for all options.

```json
{
    "keywords": ["Elektriker", "Mechatroniker"],
    "locations": ["Köln", "Düsseldorf"],
    "radiusKm": 25,
    "offerType": "job",
    "workingTime": ["fullTime"],
    "publishedWithinDays": 7,
    "excludeTempAgencies": true,
    "maxResultsPerSearch": 500,
    "includeDetails": false,
    "onlyNewSinceLastRun": true
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "refnr": "10001-1003836471-S",
    "title": "Elektriker (m/w/d)",
    "employer": "work InTime GmbH",
    "offerType": "job",
    "occupation": "Elektroinstallateur/in",
    "city": "Köln",
    "postalCode": "50667",
    "region": "Nordrhein-Westfalen",
    "country": "Germany",
    "countryCode": "DE",
    "latitude": 50.9455,
    "longitude": 6.9701,
    "distanceKm": 1,
    "publishedAt": "2026-10-09",
    "startDate": "2026-10-09",
    "workingTime": ["fullTime"],
    "contractType": "permanent",
    "remote": false,
    "salary": { "min": 18, "max": 21, "currency": "EUR", "period": "hour", "isRange": true },
    "jobUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003836471-S",
    "externalUrl": null,
    "search": { "keyword": "Elektriker", "location": "Köln" }
}
```

With *Include full job description* every row also contains `descriptionText`, all `locations`, `isTempAgency`, `isPrivateAgency`, `sourceName` and `sourceUrl`.

The key-value store record **SUMMARY** lists for each search the total number of matching jobs and the top employers, cities and occupations.

### Related Actors

- [Career Page Jobs Scraper](https://apify.com/veedel_digital/career-jobs): all jobs from any career page, ATS detected automatically (8 systems)
- [Personio Jobs Scraper](https://apify.com/veedel_digital/personio-jobs): jobs from Personio career pages in Germany and DACH
- [Website Lead Enricher](https://apify.com/veedel_digital/lead-enricher): company name, contacts, tech stack and DNS data from a list of domains
- [Website Contact & Imprint Extractor](https://apify.com/veedel_digital/contact-extractor): emails, phone numbers, social profiles and imprint data from websites

All Actors by Veedel Digital: [apify.com/veedel_digital](https://apify.com/veedel_digital)

### FAQ

#### Is there a limit?

The Arbeitsagentur API returns at most 10,000 jobs per search. For larger result sets, split the search by location or keyword. All combinations run in one Actor run.

#### Does it include jobs from Austria?

Yes. The Arbeitsagentur also lists jobs in Austria and other countries; `country` and `countryCode` tell them apart.

#### Is scraping the Arbeitsagentur allowed?

The Actor only reads public job listings through the public interface of the official Jobsuche app. Job listings contain company data, not personal profiles. As with any data source, you are responsible for how you use the results.

#### Something does not work

Please open an issue in the **Issues** tab with your input and the run ID. You can also start the Actor programmatically from the **API** tab.

# Actor input Schema

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

Job titles, skills or companies, one per line, e.g. "Elektriker" or "Data Scientist". Every keyword is searched in every location.

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

Cities, postal codes or regions, one per line, e.g. "Köln" or "10115". Leave empty to search all of Germany.

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

Search radius around each location. Ignored when no location is set.

## `searchUrls` (type: `array`):

Optional. Run a search on arbeitsagentur.de/jobsuche, copy the URL from the address bar and paste it here. Its filters are taken over exactly.

## `maxResultsPerSearch` (type: `integer`):

Upper limit per keyword/location combination. The API returns at most 10,000 jobs per search; split larger searches by location. The form starts at 20 for a quick, cheap first test run. Raise it for full runs.

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

Fetches every job's detail page: full description text, all work locations, temp-agency flag and original source. Costs one extra event per job.

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

Type of position. "Job" covers regular employment.

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

Leave empty for all.

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

Leave empty for all.

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

Only jobs published in the last X days (0 = today). Leave empty for all.

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

Exact employer name as shown on arbeitsagentur.de, e.g. "Deutsche Bahn AG".

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

E.g. "Informatik" or "Energietechnik".

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

Hides jobs from temporary employment agencies (Arbeitnehmerüberlassung).

## `excludePrivateAgencies` (type: `boolean`):

Hides jobs posted by private recruitment agencies (private Arbeitsvermittlung).

## `careerChangersOnly` (type: `boolean`):

Only jobs the employer marked as suitable for career changers.

## `remoteOnly` (type: `boolean`):

Keeps only jobs where the employer offers home office. Filtered after the search, so more pages may be read.

## `withSalaryOnly` (type: `boolean`):

Keeps only jobs that state a salary or salary range.

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers every job this search has returned and skips it next time. Ideal for scheduled runs and alerts. You only pay for new jobs.

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

Optional. Runs with the same name share one memory. By default the memory is tied to the exact search and filters.

## Actor input object example

```json
{
  "keywords": [
    "Elektriker",
    "Data Scientist"
  ],
  "locations": [
    "Köln"
  ],
  "radiusKm": 25,
  "maxResultsPerSearch": 20,
  "includeDetails": false,
  "offerType": "job",
  "excludeTempAgencies": false,
  "excludePrivateAgencies": false,
  "careerChangersOnly": false,
  "remoteOnly": false,
  "withSalaryOnly": false,
  "onlyNewSinceLastRun": false
}
```

# Actor output Schema

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

Dataset with all jobs

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

Total results, top employers, top cities and counts per search

# 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": [
        "Elektriker",
        "Data Scientist"
    ],
    "locations": [
        "Köln"
    ],
    "maxResultsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("veedel_digital/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": [
        "Elektriker",
        "Data Scientist",
    ],
    "locations": ["Köln"],
    "maxResultsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("veedel_digital/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": [
    "Elektriker",
    "Data Scientist"
  ],
  "locations": [
    "Köln"
  ],
  "maxResultsPerSearch": 20
}' |
apify call veedel_digital/arbeitsagentur-jobs --silent --output-dataset

```

## MCP server setup

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