# Arbeitsagentur Jobs Scraper (Germany) (`bircolabots/arbeitsagentur-jobs`) Actor

Scrape jobs from arbeitsagentur.de, Germany's largest job board. Filter remote / home office jobs and professional fields like IT. Get title, company, city, salary and contract type. Fast, no proxy, no personal data.

- **URL**: https://apify.com/bircolabots/arbeitsagentur-jobs.md
- **Developed by:** [Cicero Millen](https://apify.com/bircolabots) (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 $2.00 / 1,000 job listings

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 (Germany)

Get job listings from **Germany's largest public job board**, the Jobsuche of the Federal Employment Agency
(**Bundesagentur für Arbeit**), as a clean table you can download as Excel, CSV or JSON or send to your own tools.

- ⚡ **Fast and cheap:** reads the official public search API directly. No browser, no proxies, no login.
- 🇩🇪 **Huge coverage:** around one million open positions, from apprenticeships to senior roles, all over Germany.
- 🔒 **No personal data:** only job and company data. No recruiter names, e-mails or phone numbers. Easy to use under GDPR / DSGVO.
- 🏠 **Remote filter that works:** the job board's own home office filter returns nothing; this Actor checks every job itself.
- 🧭 **Filter by professional field** (Berufsfeld), e.g. all IT jobs, plus employer, contract type and career changers.
- 💶 **Pay only for results:** you pay per job saved, and you can cap the cost of every run.

### How it works

1. Type a **keyword** (job title, occupation or skill) and a **city or postal code**, or leave them empty for all of Germany.
2. Pick **filters**: remote only, professional field, publication date, type of offer, working time, contract type, employer, agencies. Add more keywords or cities to search them all in one run.
3. Click **Start**. Jobs appear in the **Output** tab as a table, ready to export or to send to Google Sheets, Make, Zapier, n8n or your own API.

### What data you get

One row per job:

| Field | What it contains |
|---|---|
| `title` | Job title |
| `company` | Employer name |
| `occupation` | Main occupation, as classified by the agency |
| `remoteOnly` | Only jobs where the employer allows home office | `false` |
| `professionalFields` | One or more official occupational fields (Berufsfeld), e.g. `Informatik` | all |
| `offerType` | `ARBEIT` (job), `SELBSTAENDIGKEIT` (self-employment), `AUSBILDUNG` (apprenticeship / dual study), `PRAKTIKUM_TRAINEE` (internship) |
| `city`, `postalCode`, `region`, `country` | First workplace location |
| `latitude`, `longitude` | Coordinates of the first workplace |
| `locationsCount` | How many workplaces the listing has |
| `fullTime`, `partTime`, `shiftNightWeekend` | Working time |
| `homeOffice`, `homeOfficeType` | Remote work, when the employer says so |
| `contractDuration`, `fixedTermUntil` | Permanent (`UNBEFRISTET`) or fixed-term (`BEFRISTET`) |
| `startDate` | Earliest start date |
| `salaryType`, `salaryMin`, `salaryMax`, `salaryFixed` | Salary, when the employer publishes it |
| `miniJob`, `careerChangersWelcome` | Mini-job and "career changers welcome" flags |
| `firstPublished`, `publishedFrom`, `modifiedAt` | Dates |
| `url` | Link to the listing on arbeitsagentur.de |
| `externalUrl` | Link to the original posting, when the job comes from a partner job board |
| `id`, `scrapedAt` | Reference number of the listing and time of the run (UTC) |

Fields the source does not provide for a listing are `null`.

### Use cases

- **Job seekers and career coaches:** track new openings for a role or city every day.
- **Recruiters and staffing agencies:** see which **companies** are hiring, for what, and where.
- **Job boards and aggregators:** feed niche boards (IT, healthcare, apprenticeships) with fresh German jobs.
- **Market and salary research:** demand by occupation, region and contract type, with published salary ranges.
- **Data teams and AI agents:** a clean, structured feed of the German labor market.

### Input examples

**Python jobs in Berlin, last 7 days**

```json
{
    "keyword": "python",
    "location": "Berlin",
    "radiusKm": 25,
    "publishedWithinDays": 7,
    "maxItems": 200
}
```

**Remote IT jobs in all of Germany, permanent contracts**

```json
{
    "professionalFields": ["Informatik", "Softwareentwicklung und Programmierung"],
    "remoteOnly": true,
    "contractType": "permanent",
    "maxItems": 300
}
```

**Python and Java jobs in Berlin and Hamburg, last 7 days**

```json
{
    "keyword": "python",
    "extraKeywords": ["java"],
    "location": "Berlin",
    "extraLocations": ["Hamburg"],
    "publishedWithinDays": 7,
    "maxItems": 500
}
```

**Apprenticeships (Ausbildung) in Munich**

```json
{
    "keyword": "Kaufmann",
    "location": "München",
    "offerType": "4",
    "maxItems": 500
}
```

**Part-time nursing jobs in all of Germany, no temporary agencies**

```json
{
    "keyword": "Pflegefachkraft",
    "workingTime": "tz",
    "excludeTempAgencies": true,
    "maxItems": 1000
}
```

#### All input fields

| Field | Description | Default |
|---|---|---|
| `keyword` | Job title, occupation or skill, in German or English. Empty = all jobs | empty |
| `location` | City or postal code in Germany. Empty = whole country | empty |
| `radiusKm` | Radius around the location, 0–200 km | 25 |
| `extraKeywords`, `extraLocations` | More keywords / cities searched in the same run (all combinations, max 50); duplicates are removed | empty |
| `publishedWithinDays` | Only jobs published in the last N days (0–100) | no filter |
| `remoteOnly` | Only jobs where the employer allows home office | `false` |
| `professionalFields` | One or more official occupational fields (Berufsfeld), e.g. `Informatik` | all |
| `offerType` | `1` jobs, `2` self-employment, `4` apprenticeship / dual study, `34` internship / trainee | `1` |
| `workingTime` | `any`, `vz` full-time, `tz` part-time, `snw` shifts / nights / weekends, `mj` mini-job | `any` |
| `contractType` | `any`, `permanent` (unbefristet), `fixedTerm` (befristet) | `any` |
| `employer` | Exact employer name as on arbeitsagentur.de, e.g. `Deutsche Bahn AG` | empty |
| `careerChangersOnly` | Only jobs open to career changers (Quereinstieg) | `false` |
| `excludeTempAgencies` | Skip temporary employment agencies (Zeitarbeit) | `false` |
| `excludePrivateAgencies` | Skip private recruitment agencies | `false` |
| `maxItems` | Maximum number of jobs to save (1–10,000) | 100 |

**Tip:** German keywords usually find more jobs (e.g. "Softwareentwickler" instead of "software developer").

### Output example

```json
{
    "id": "19069-423893-S",
    "title": "Python dev",
    "company": "Join Solutions GmbH",
    "occupation": "Softwareentwickler/in",
    "offerType": "ARBEIT",
    "city": "Berlin",
    "postalCode": "10119",
    "region": "BERLIN",
    "country": "DEUTSCHLAND",
    "latitude": 52.52751,
    "longitude": 13.4153145,
    "locationsCount": 1,
    "fullTime": true,
    "partTime": false,
    "shiftNightWeekend": false,
    "homeOffice": false,
    "homeOfficeType": null,
    "contractDuration": "UNBEFRISTET",
    "fixedTermUntil": null,
    "startDate": "2026-09-30",
    "salaryType": "JAHRESGEHALT",
    "salaryMin": 50000.0,
    "salaryMax": 65000.0,
    "salaryFixed": null,
    "miniJob": false,
    "careerChangersWelcome": false,
    "firstPublished": "2026-08-31",
    "publishedFrom": "2026-09-28",
    "modifiedAt": "2026-09-30T13:54:17.656",
    "url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/19069-423893-S",
    "externalUrl": null,
    "scrapedAt": "2026-10-02T20:00:00+00:00"
}
```

### Pricing and cost

Pay per event, you only pay for what you get:

| Event | Price |
|---|---|
| Job saved to the dataset | **$0.002** per job ($2.00 per 1,000 jobs) |
| Run start | $0.00005 per run |

Examples: **100 jobs ≈ $0.20**, **1,000 jobs ≈ $2.00**. Set **Maximum cost per run** in the run options to cap your spending; the Actor stops when the cap is reached and keeps the jobs already saved.

### Schedule it and connect it

- **Daily updates:** create a task with your search and add a **Schedule** in Apify Console (e.g. every morning). Combine it with `publishedWithinDays: 1` to get only the newest jobs.
- **Integrations:** send results automatically to Google Sheets, Slack, Make, Zapier, n8n or any webhook using Apify integrations.
- **API:** run the Actor and download results from your own code with the Apify API or the Python / JavaScript clients.

### Limits

- The source returns at most **10,000 results per search**. To collect more, split the search by city, keyword or publication date.
- The Actor saves the data of the search results. It does not open each listing, so the long job description text is not included.
- Data comes as published by the employers; some fields (salary, home office) are often empty.
- `remoteOnly` keeps about 1 in 10 jobs, so it reads more result pages; with a narrow search you may get fewer jobs than `maxItems`.

### FAQ

**Where does the data come from?**
From the public job search of the Bundesagentur für Arbeit (arbeitsagentur.de), the same data you see on the website.

**Does it collect personal data?**
No. The output is a fixed list of job and company fields. Contact persons, e-mail addresses and phone numbers are never collected.

**Do I need a proxy or an account at arbeitsagentur.de?**
No. The Actor uses the public search API without login, so no proxy is needed.

**Why did I get fewer jobs than `maxItems`?**
Your search has fewer results than that. Try a broader keyword, a bigger radius or no date filter.

**How do I get only remote jobs?**
Tick `remoteOnly`. The job board's own home office filter currently returns no results, so the Actor reads the results and keeps only jobs where the employer allows home office.

**How do I get only IT jobs?**
Use `professionalFields`, e.g. `Informatik`, `Softwareentwicklung und Programmierung` and `IT-Netzwerktechnik, -Administration, -Organisation`. This is more precise than keywords.

**Can I search the whole of Germany?**
Yes: leave `location` empty. Remember the limit of 10,000 results per search.

**Is it allowed to use this data?**
The Actor only collects publicly available job listings and no personal data. You are responsible for how you use the data; check that your use complies with the laws that apply to you.

### Support

Found a bug or need a field or filter? Open an issue in the **Issues** tab. I read all of them.

# Actor input Schema

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

Job title, occupation or skill to search for (German or English), e.g. "Softwareentwickler" or "python". Leave empty to get all jobs.

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

City or postal code in Germany, e.g. "Berlin", "München" or "80331". Leave empty for the whole country.

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

Search radius around the location. Only used when a location is set.

## `extraKeywords` (type: `array`):

Search several keywords in one run, e.g. "java" and "devops". Combined with every location; the same job is saved only once.

## `extraLocations` (type: `array`):

Search several cities or postal codes in one run, e.g. "Hamburg" and "München". Up to 50 keyword × location combinations per run.

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

Only return jobs published in the last N days. Leave empty for no date filter.

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

Keep only jobs where the employer allows home office. The official home office filter of the job board does not work, so the Actor checks each job itself (about 1 in 10 jobs qualifies).

## `professionalFields` (type: `array`):

Official occupational fields of the Bundesagentur für Arbeit. Pick one or more, e.g. "Informatik" and "Softwareentwicklung und Programmierung" for IT jobs, or "Krankenpflege, Rettungsdienst und Geburtshilfe" for nursing.

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

Type of offer to return.

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

Filter by working time.

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

Permanent or fixed-term contracts.

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

Only jobs from this employer. Use the exact company name as shown on arbeitsagentur.de, e.g. "Deutsche Bahn AG" (partial names return no results).

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

Keep only jobs the employer marks as suitable for career changers.

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

Skip listings posted by temporary employment agencies (Zeitarbeit).

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

Skip listings posted by private employment agencies (private Arbeitsvermittlung).

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

Stop after this many jobs. You pay per job saved, so this also caps the cost. The source returns at most 10,000 results per search; split the search by city or keyword to go deeper.

## Actor input object example

```json
{
  "keyword": "python",
  "location": "Berlin",
  "radiusKm": 25,
  "remoteOnly": false,
  "offerType": "1",
  "workingTime": "any",
  "contractType": "any",
  "careerChangersOnly": false,
  "excludeTempAgencies": false,
  "excludePrivateAgencies": false,
  "maxItems": 100
}
```

# Actor output Schema

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

No description

## `results` (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 = {
    "keyword": "python",
    "location": "Berlin"
};

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

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

```

## MCP server setup

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