# Arbeitsagentur Jobs Scraper: Germany's Federal Job Board (`themineworks/arbeitsagentur-jobs-scraper`) Actor

Scrape jobs, apprenticeships and internships from the Bundesagentur für Arbeit job board (Jobsuche) by keyword, city and radius: title, employer, address with coordinates, pay when published, working time, contract, dates, link and optional full description. No login.

- **URL**: https://apify.com/themineworks/arbeitsagentur-jobs-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.65 / 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

## Arbeitsagentur Jobs Scraper: Germany's Federal Job Board

[![400 Arbeitsagentur jobs from Hamburg and Munich in 10 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/arbeitsagentur-jobs-scraper-hero.png)](https://console.apify.com/actors/rJcr6M3vB3sbBll0F/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Germany's largest job board, read through its own public API.** The Bundesagentur für Arbeit Jobsuche listed 1,023,322 offers on 6 October 2026 (829,510 jobs and 176,084 apprenticeships among them), from big employers, small firms and staffing agencies alike. Our final test run returned 400 of 400 jobs (nurses and electricians in Hamburg and Munich) in 10 seconds, every request answered on the first try.
- **Pay, place and contract as data, not prose.** Every row has the employer, town, postcode, state and map coordinates; the pay in numbers when the ad publishes it (39% of rows in our test, hourly or yearly); the working time, contract type, start date and publication date.
- **No login, no cookies, nothing to set up, and you only pay for jobs you receive.** A search with no results, a job already delivered for another keyword in the same run and, with `onlyNewJobs`, a job an earlier run already gave you are never charged.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/rJcr6M3vB3sbBll0F/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Jobs and hiring family:** [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 20 software developer jobs in Berlin in a few seconds:

```json
{
  "keywords": ["Softwareentwickler"],
  "locations": ["Berlin"],
  "maxJobs": 20
}
```

`keywords` takes job titles or skills, one per line, in German or English as you would type them on the job board (`Pflegefachkraft`, `Elektriker`, `Data Scientist`). `locations` takes towns, postcodes or regions (`Hamburg`, `80331`, `Köln`); each keyword is searched in each location within `radiusKm`. Leave `locations` empty for all of Germany, or `keywords` empty for every offer in a place.

On Apify's free plan every run returns the first 10 results as a preview, so you can check the data and the fields before you pay. A paid Apify plan returns every result: https://apify.com/pricing?fpr=ymnoit

#### Copy to your AI assistant

```text
themineworks/arbeitsagentur-jobs-scraper on Apify. Scrapes jobs, apprenticeships and internships from the German Federal Employment Agency job board (Bundesagentur für Arbeit Jobsuche), one row per offer with title, employer, town, postcode, state, coordinates, pay in numbers when published, working time, contract type, start and publication dates and link, with an optional full description. Call ApifyClient("TOKEN").actor("themineworks/arbeitsagentur-jobs-scraper").call(run_input={"keywords": ["Pflegefachkraft"], "locations": ["Hamburg"], "maxJobs": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: none (default keywords ["Softwareentwickler"], all of Germany). Optional: keywords (list; empty list = every offer), locations (list of towns, postcodes or regions; empty = all of Germany), radiusKm (default 25, 0 to 200), offerType ("job" default, "apprenticeship", "internship", "self_employment", "any"), workingTime (list of "full_time", "part_time", "shift_night_weekend", "minijob"), contractType ("any", "permanent", "fixed_term"), postedWithinDays (0 to 100), employer (exact employer name), excludeTempAgencies (default false), excludePrivateRecruiters (default false), maxJobs (default 100, 20 to 10000 per search), includeDescription (default false), onlyNewJobs (default false). Full spec: GET https://api.apify.com/v2/acts/themineworks~arbeitsagentur-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **45 fields per offer, 7 more with descriptions**: reference number, title, employer and anonymous employer key, main and all occupations, offer type, town, postcode, district, street, state, country and coordinates, distance from your location, pay text with minimum, maximum, currency, period and type, apprenticeship pay per training year, working time, contract type and length, home office, career changers welcome, start date, publication and change dates, anonymous ad code, the partner site link and the job page link.
- **Full description on demand**: switch on `includeDescription` for the complete ad text, the email addresses and web links the ad publishes for applications, whether a temporary staffing agency or a private recruiter placed it, and the site it came from.
- **Every filter of the job board**: offer type (jobs, apprenticeships and dual study, internships and trainee programmes, self employment), radius from 0 to 200 km, working time, permanent or fixed term, days since publication, one employer, and no temp agencies or no private recruiters.
- **From 20 to 10,000 offers per search**, 100 per page. Each keyword in each location is its own search; three run at a time. Our depth test read 1,000 sales jobs across Germany in 26 seconds.
- **Only new jobs on a schedule**: with `onlyNewJobs`, a daily run returns and charges only offers it has not delivered before.
- **A run summary you can audit**: the `OUTPUT` record lists every search's status, the total the job board reports, pages read, attempts, duplicates and the success rate of every request type.

### How to use it

#### Basic: one keyword in one city

```json
{
  "keywords": ["Elektriker"],
  "locations": ["Hamburg"],
  "maxJobs": 100
}
```

#### Several keywords in several cities

Each keyword runs in each location: this input is 4 searches of up to 100 offers, 400 jobs in all (our final test run, 10 seconds):

```json
{
  "keywords": ["Pflegefachkraft", "Elektriker"],
  "locations": ["Hamburg", "München"],
  "maxJobs": 100
}
```

#### Job: daily new job alerts

Offers published today or yesterday, only those not delivered before. Save it as a task and add a daily schedule (Console > Schedules); each run returns and charges only the new offers. In our test, a second run of a cook search in Leipzig (published within 7 days) found the same 16 offers as the first, delivered none and charged no job.

```json
{
  "keywords": ["Koch"],
  "locations": ["Leipzig"],
  "postedWithinDays": 1,
  "onlyNewJobs": true,
  "maxJobs": 200
}
```

#### Job: apprenticeship and dual study places for a school or career portal

`offerType: "apprenticeship"` returns Ausbildung and duales Studium places, with `training_type`, `study_form`, the degree programme and the apprenticeship pay per training year when the employer publishes it:

```json
{
  "keywords": ["Kaufmann", "Mechatroniker"],
  "locations": ["Köln"],
  "radiusKm": 30,
  "offerType": "apprenticeship",
  "maxJobs": 200
}
```

#### Job: direct employers only, with the full ad text and application emails

Leave out temporary staffing agencies and private recruiters, and read the whole ad. `contact_emails` holds the addresses the ad itself publishes for applications (44% of the 100 ads in our description test):

```json
{
  "keywords": ["Buchhalter"],
  "locations": ["Berlin"],
  "excludeTempAgencies": true,
  "excludePrivateRecruiters": true,
  "includeDescription": true,
  "maxJobs": 100
}
```

#### Job: hiring activity of one employer, or in one region

Leave `keywords` empty and name an employer, then count by `location` or `occupation`. Or name a region and count by `company`:

```json
{
  "keywords": [],
  "employer": "Deutsche Bahn AG",
  "offerType": "any",
  "maxJobs": 5000
}
```

#### Job: part time and minijob offers near a postcode

```json
{
  "keywords": ["Verkäufer"],
  "locations": ["50667"],
  "radiusKm": 10,
  "workingTime": ["part_time", "minijob"],
  "maxJobs": 300
}
```

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | `["Softwareentwickler"]` | Job titles or skills, one per line. Each is its own search in every location. An empty list returns every offer that matches the other filters. |
| `locations` | array of strings | empty | Towns, postcodes or regions, one per line. Each is its own search within `radiusKm`. Empty means all of Germany (the board also lists some offers abroad). |
| `radiusKm` | integer | `25` | Distance around each location, 0 to 200 km. Ignored without a location. |
| `offerType` | string | `job` | `job`, `apprenticeship` (Ausbildung and duales Studium), `internship` (Praktikum and trainee), `self_employment` or `any`. |
| `workingTime` | array | any | Any of `full_time`, `part_time`, `shift_night_weekend`, `minijob`. |
| `contractType` | string | `any` | `any`, `permanent` or `fixed_term`. Ads that do not say are left out by either choice. |
| `postedWithinDays` | integer | any | Offers published in the last N days, 0 to 100 (0 is today). |
| `employer` | string | empty | Only offers from this employer, written as the job board shows it. |
| `excludeTempAgencies` | boolean | `false` | Leave out temporary staffing agencies (Zeitarbeit). |
| `excludePrivateRecruiters` | boolean | `false` | Leave out offers placed by private recruitment agencies. |
| `maxJobs` | integer | `100` | Upper limit per search (one keyword in one location), 20 to 10,000. The job board serves the first 10,000 results of a search. |
| `includeDescription` | boolean | `false` | Adds the full ad text, application emails and links, the temp agency and private recruiter flags and the source site. One extra request per offer. |
| `onlyNewJobs` | boolean | `false` | Skips offers an earlier run of this actor in your account already delivered. For schedules. |

### What data do you get?

One row per offer. An offer found by two keywords or in two locations is delivered once.

**The offer**: `job_id` (the board's reference number), `title`, `company`, `employer_id`, `occupation`, `occupations`, `offer_type`, `training_type`, `study_form`, `study_program`, `anonymous_ad_code`, `external_url`, `job_url`.

**Where**: `location`, `postal_code`, `district`, `street`, `region` (German state or Austrian province), `country`, `country_code`, `latitude`, `longitude`, `locations` (every workplace when there are several), `distance_km` (from your location).

**Pay**: `salary_text`, `salary_min`, `salary_max`, `salary_currency`, `salary_period` (`hour`, `month` or `year`), `salary_type` (`range`, `fixed` or `apprenticeship_pay`), `training_pay_per_year`.

**Terms and dates**: `working_time`, `contract_type`, `contract_months`, `remote_possible`, `remote_type`, `career_changers_welcome`, `start_date`, `posted_at`, `published_until`, `updated_at`.

**With `includeDescription`**: `description` (the ad text as the employer wrote it), `contact_emails`, `links_in_description`, `temp_agency`, `private_recruiter`, `partner_site`, `partner_url`, and `description_error` on the rare row whose details could not be read.

**The search**: `search_keyword`, `search_location`, `search_rank`, `scraped_at`.

How full the fields were in our final test runs (400 jobs in Hamburg and Munich; descriptions for 100 jobs in Berlin):

| Field | Filled | Why not always |
|---|---|---|
| `job_id`, `title`, `company`, `occupation`, `offer_type`, `location`, `region`, `country`, `latitude`, `longitude`, `start_date`, `posted_at`, `job_url` | 100% | |
| `working_time` | 97% | A few ads give no working time. |
| `postal_code` | 90% | Some ads name only the town. |
| `employer_id` | 75% | Offers fed in from partner sites often carry none. |
| `contract_type` | 69% | Many ads do not say permanent or fixed term. |
| `street` | 42% | Only when the employer publishes the workplace address. |
| `salary_text`, `salary_min`, `salary_max`, `salary_period` | 39% | Only when the ad states pay. |
| `remote_possible` | 33% | Only when the ad says whether home office is possible. |
| `external_url` | 24% | Offers that live on an employer or partner site. |
| `anonymous_ad_code` | 18% | Anonymous (Chiffre) ads. |
| `description`, `partner_site` | 100% of 100 | With `includeDescription` on. |
| `private_recruiter`, `temp_agency` | 85%, 72% of 100 | With `includeDescription` on, when the board knows. |
| `contact_emails` | 44% of 100 | Only when the ad text gives an email address. |

#### Stable fields for automations

These fields were present in every row of our test runs and their names will not change:

| Field | Meaning |
|---|---|
| `job_id` | Reference number of the offer, for example `10001-1003644689-S` |
| `title` | Title as published |
| `company` | Employer as published |
| `occupation` | Main occupation the offer is filed under |
| `occupations` | Every occupation the offer is filed under |
| `offer_type` | `job`, `apprenticeship`, `internship` or `self_employment` |
| `country` | Country of the workplace, for example `Germany` |
| `country_code` | `DE`, `AT` and so on |
| `start_date` | Earliest start date, `YYYY-MM-DD` |
| `posted_at` | Date first published, `YYYY-MM-DD` |
| `updated_at` | Last change to the offer |
| `job_url` | The offer on arbeitsagentur.de |
| `search_rank` | Position of the offer in its search |
| `scraped_at` | When the offer was read, ISO 8601 UTC |

#### Output examples

Real rows from our test runs on 6 October 2026; long texts are trimmed.

**An electrician job in Hamburg with a yearly salary**:

```json
{
  "job_id": "12382-2026-97340002-S",
  "title": "Elektriker (m/w/d)",
  "company": "Dahmen GmbH Hamburg",
  "employer_id": "fUvb4vHaVdR6c948dRDfUvk2VkuNDmlepTM1J5EVA9k=",
  "occupation": "Bauelektriker/in",
  "occupations": ["Bauelektriker/in"],
  "offer_type": "job",
  "location": "Hamburg",
  "postal_code": "22761",
  "street": "Bahrenfelder Marktplatz",
  "region": "Hamburg",
  "country": "Germany",
  "country_code": "DE",
  "latitude": 53.5642585,
  "longitude": 9.9001742,
  "distance_km": 6,
  "salary_text": "EUR 44,000 per year",
  "salary_min": 44000,
  "salary_max": 44000,
  "salary_currency": "EUR",
  "salary_period": "year",
  "salary_type": "fixed",
  "working_time": ["full_time"],
  "contract_type": "permanent",
  "remote_possible": false,
  "career_changers_welcome": false,
  "start_date": "2026-10-01",
  "posted_at": "2026-09-01",
  "updated_at": "2026-10-01T13:41:39.124",
  "anonymous_ad_code": "9734-2",
  "job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12382-2026-97340002-S",
  "search_keyword": "Elektriker",
  "search_location": "Hamburg",
  "search_rank": 13,
  "scraped_at": "2026-10-05T21:41:34.458Z"
}
```

**An apprenticeship near Cologne with pay for each training year**:

```json
{
  "job_id": "10001-1003634235-S",
  "title": "Mechatroniker (m/w/d)",
  "company": "Rhein-Erft Akademie GmbH",
  "occupation": "Mechatroniker/in",
  "offer_type": "apprenticeship",
  "training_type": "apprenticeship",
  "location": "Hürth, Rheinland",
  "postal_code": "50354",
  "street": "Industriestr. 149",
  "region": "Nordrhein-Westfalen",
  "country": "Germany",
  "country_code": "DE",
  "latitude": 50.8637398,
  "longitude": 6.872226,
  "distance_km": 12,
  "salary_text": "EUR 1,229 / 1,343 / 1,418 / 1,515 per month (training year 1 to 4)",
  "salary_min": 1229,
  "salary_max": 1515,
  "salary_currency": "EUR",
  "salary_period": "month",
  "salary_type": "apprenticeship_pay",
  "training_pay_per_year": [1229, 1343, 1418, 1515],
  "working_time": ["full_time"],
  "start_date": "2027-08-01",
  "posted_at": "2026-09-01",
  "job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003634235-S",
  "search_keyword": "Mechatroniker",
  "search_location": "Köln",
  "search_rank": 4
}
```

**A bookkeeping job in Berlin with `includeDescription` on** (the description is trimmed here; the row holds all of it):

```json
{
  "job_id": "10000-1207636788-S",
  "title": "Buchhalter/in (m/w/d)",
  "company": "Aurum GmbH & Co. KG",
  "occupation": "Buchhalter/in",
  "occupations": ["Buchhalter/in", "Finanzbuchhalter/in", "Steuerfachangestellte/r"],
  "offer_type": "job",
  "location": "Berlin",
  "postal_code": "10719",
  "street": "Joachimsthaler Str. 12",
  "region": "Berlin",
  "country_code": "DE",
  "working_time": ["full_time", "part_time_morning", "part_time_afternoon"],
  "contract_type": "permanent",
  "remote_possible": true,
  "remote_type": "by_arrangement",
  "start_date": "2026-09-29",
  "posted_at": "2026-08-24",
  "job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10000-1207636788-S",
  "description": "Wir sind eine mittelgroße Steuerberatungsgesellschaft mit Sitz am Kurfürstendamm in Berlin und beschäftigen gegenwärtig rund 20 Mitarbeiter in den Bereichen Steuerberatung und Unternehmensberatung. ...",
  "contact_emails": ["info@aurum-steuer.de"],
  "links_in_description": ["https://www.aurum-steuer.de"],
  "temp_agency": false,
  "private_recruiter": false,
  "partner_site": "arbeitsagentur.de",
  "partner_url": "http://www.arbeitsagentur.de"
}
```

### Pricing

Pay per event: you pay for the job rows you receive, plus a flat $0.005 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `job-scraped` | Once per offer row stored in your dataset | $0.65 per 1,000 | $0.65 per 1,000 | $0.65 per 1,000 | $0.65 per 1,000 |
| `run-start` | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |

The price per single offer is the price per 1,000 divided by 1,000. An offer with the full description costs the same as one without.

Free plan runs return up to 10 results each; paid plans have no cap.

Never charged:

- search pages the job board did not answer;
- searches with no results;
- an offer already delivered earlier in the same run (found by another keyword or in another location);
- with `onlyNewJobs`, an offer an earlier run already delivered to you;
- the info row at the end of a run;
- anything past your "Max cost per run": the actor stops delivering when your limit is reached instead of sending rows for free.

### FAQ

#### What exactly does this actor read?

The Jobsuche of the Bundesagentur für Arbeit (Federal Employment Agency), Germany's public job board at arbeitsagentur.de. It reads the same public search and job details the job board's own pages load, through the agency's public REST API, with the public key the job board itself sends. Nothing is read behind a login.

#### How many offers can I get?

Up to 10,000 per search (one keyword in one location), 100 per page; the job board does not serve results past the first 10,000 of a search. For more, split a search by location, by `offerType` or by `postedWithinDays`. Each keyword in each location is its own search.

#### What do I get on the free plan?

Every run on Apify's free plan returns the first 10 results, so you can check the data and the fields before you pay. A paid Apify plan returns every result, up to the limit you set.

#### How long does a run take?

Without descriptions, one request brings up to 100 offers: 400 jobs from 4 searches took 10 seconds in our final test, and 1,000 sales jobs from one search took 26 seconds. With descriptions each offer needs one more request, eight at a time: 100 offers took 16 seconds.

#### How fresh is the data?

Every run reads the job board live. `posted_at` is the day the offer was first published and `updated_at` its last change. Use `postedWithinDays` for recent offers only, and `onlyNewJobs` with a schedule for alerts.

#### Which offers does it cover?

Everything the Jobsuche lists: jobs (Arbeit), apprenticeships and dual study places (Ausbildung, duales Studium), internships and trainee programmes, and self employment offers. Many offers come in from partner job sites; those rows carry an `external_url` and, with descriptions on, the `partner_site` they came from. A small share of offers are in Austria or other countries; `country_code` tells you where.

#### Does it give employer contact details?

Only what the ad itself publishes for applications. With `includeDescription` on, `contact_emails` lists the email addresses written in the ad text (usually an application inbox such as bewerbung@ or jobs@) and `links_in_description` the web links in it. The contact panel the job board shows behind a CAPTCHA is not read, and the actor never solves a CAPTCHA.

#### How is the pay read?

From the job board's own pay fields, not from the ad text: a range (`salary_type: "range"`), a single figure (`fixed`) or, for apprenticeships, the monthly pay per training year (`apprenticeship_pay`, with every year in `training_pay_per_year`). `salary_period` says whether the amount is per hour, month or year, as the employer entered it. Ads without pay fields have no pay columns.

#### Do I need an account, cookies or a proxy?

No account, no cookies and nothing to set up. The actor reads the public API over Apify's datacenter proxy. In our test runs all 143 requests (23 search pages and 120 job details) were answered on the first try.

#### What if an offer is taken down while the run reads it?

The row is still delivered with everything from the search, and `description_error` says the details could not be read. In our description test all 100 of 100 were read.

#### Can I monitor new offers over time?

Yes. Turn on `onlyNewJobs`, set `postedWithinDays` to 1 or 2, save the input as a task and add a daily schedule. Each run delivers and charges only offers no earlier run of this actor in your account has delivered. The list of delivered offers is kept in a key value store in your account.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and an HTML table, from the run's dataset in Console or through the API.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

- Connector URL: https://mcp.apify.com/?tools=themineworks/arbeitsagentur-jobs-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http arbeitsagentur-jobs-scraper "https://mcp.apify.com/?tools=themineworks/arbeitsagentur-jobs-scraper"`

#### Is it legal to scrape the Arbeitsagentur job board?

The actor reads only offers the job board shows publicly to anyone, through the public API its own pages use. Ads can name a contact person or an address; you are responsible for how you use the data, for the job board's terms and for data protection law such as the GDPR (DSGVO) and the CCPA. If in doubt, ask a lawyer about your use case.

### Integrations

- **Google Sheets**: send each run's rows to a sheet with Apify's Google Sheets integration, or import the CSV link of the dataset.
- **Make, Zapier and n8n**: start the actor and read its dataset with the Apify apps and nodes, for example "new nursing jobs in Hamburg to Slack every morning".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Indeed Jobs Scraper](https://apify.com/themineworks/indeed-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instahyre Jobs Scraper](https://apify.com/themineworks/instahyre-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Apna Jobs Scraper](https://apify.com/themineworks/apna-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CutShort Jobs Scraper](https://apify.com/themineworks/cutshort-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Jobs Scraper](https://apify.com/themineworks/linkedin-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Recruiting & Jobs MCP](https://apify.com/themineworks/recruiting-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search that should return offers and does not? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For another job site, a new source or a field you need, email dmineworks@gmail.com.

*Search Germany's federal job board by keyword, place, radius and every filter it offers, and get each job, apprenticeship or internship back as a clean row with its pay, place and dates as data.*

# Actor input Schema

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

One search per line, in German or English as you would type it on the job board, for example Pflegefachkraft, Softwareentwickler, Elektriker, Buchhaltung. Each keyword is searched in each location. An empty list returns every job that matches the other filters.

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

Cities, postcodes or regions, one per line, for example Berlin, 80331, Köln, Hamburg. Each location is its own search, within the radius below. Leave empty for all of Germany (the board also lists some jobs in Austria and other countries).

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

Distance from each location, 0 to 200 km. 0 means the place itself. Ignored when no location is given.

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

Which kind of offer to return. The job board separates jobs, apprenticeships, internships and self employment.

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

Keep only offers with one of these working times. Leave empty for any.

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

Permanent or fixed term contracts only. Many ads do not say; those are left out by either choice.

## `postedWithinDays` (type: `integer`):

Keep only offers published in the last N days, 0 to 100 (0 is today). Leave empty for any date.

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

Only offers from this employer, written as the job board shows it, for example Deutsche Bahn AG.

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

Leave out offers from temporary staffing agencies.

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

Leave out offers placed by private recruitment agencies (private Arbeitsvermittlung).

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

Upper limit per search (one keyword in one location), 20 to 10,000. The job board serves the first 10,000 results of a search, 100 a page. Also the most you pay for per search.

## `includeDescription` (type: `boolean`):

Adds the full job description text, email addresses and links the ad publishes for applications, the temp agency and private recruiter flags and the partner site. One extra request per job.

## `onlyNewJobs` (type: `boolean`):

For schedules: skip jobs an earlier run of this actor in your account already delivered, so each run returns and charges only new jobs. Works best with Published within (days). The list of delivered jobs is kept in a named key value store in your account.

## Actor input object example

```json
{
  "keywords": [
    "Softwareentwickler",
    "Pflegefachkraft"
  ],
  "locations": [
    "Berlin"
  ],
  "radiusKm": 25,
  "offerType": "job",
  "contractType": "any",
  "excludeTempAgencies": false,
  "excludePrivateRecruiters": false,
  "maxJobs": 20,
  "includeDescription": false,
  "onlyNewJobs": false
}
```

# Actor output Schema

## `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": [
        "Softwareentwickler",
        "Pflegefachkraft"
    ],
    "locations": [
        "Berlin"
    ],
    "maxJobs": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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",
        "Pflegefachkraft",
    ],
    "locations": ["Berlin"],
    "maxJobs": 20,
}

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

```

## MCP server setup

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