# Arbeitsagentur Scraper - Job Ads with Contacts & Captcha Bypass (`mof1re/arbeitsagentur-scraper`) Actor

Scrape job and Ausbildung listings from arbeitsagentur.de with full company profiles and contact details, not just search snippets. Auto-solves the contact captcha, merges 3 API endpoints into one record. No browser, fast, residential proxies included.

- **URL**: https://apify.com/mof1re/arbeitsagentur-scraper.md
- **Developed by:** [Vladimir Efimenco](https://apify.com/mof1re) (community)
- **Categories:** Developer tools, Jobs, Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 result events

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Arbeitsagentur Scraper: German Job Ads & Bundesagentur für Arbeit 🇩🇪

This Arbeitsagentur Scraper pulls job and Ausbildung listings straight from **arbeitsagentur.de**, built on the site's internal API, not a headless browser. Every ad comes back enriched with full company profile and contact details, not just the search-result snippet.

### ⚡ Why this Arbeitsagentur Scraper

- **Most complete dataset available for this source.** Merges three separate upstream endpoints (search results, company profile, contact details) into one flat record per ad. Most alternative arbeitsagentur.de scrapers only give you the search snippet.
- **CAPTCHA solved automatically.** The Arbeitsagentur contact endpoint is protected by an image captcha. This actor runs its own OCR solver, so contact details (email, phone, application links) come back without manual intervention.
- **All public data only.** Everything returned here is publicly visible on arbeitsagentur.de. No login bypass, no private data access, no ToS-violating scraping technique. Just structured extraction of what's already public.
- **Proxies included.** Residential proxy pool is built in. You don't need to bring your own.
- **Fast.** No browser, no rendering wait. Pure HTTP calls to the same API the arbeitsagentur.de frontend uses.

### 🎯 Who uses this

- **Recruitment agencies & staffing firms** sourcing candidates or tracking which German employers are hiring right now, by profession and city.
- **Labor market researchers & HR analysts** studying hiring trends, salary disclosure, remote-work adoption, or Ausbildung/apprenticeship volume across German regions.
- **Lead-generation teams** grabbing employer contact info (email, phone, HQ, company size) attached to an active hiring signal, which is a warmer lead than a cold list.
- **Job boards & career sites** mirroring or enriching listings with Bundesagentur für Arbeit data, including Ausbildung and dual-study programs.
- **Developers building job-matching tools or ATS integrations** who need clean structured JSON instead of scraping arbeitsagentur.de pages by hand.

### 🧾 What you get, per job ad

- Job details: title, profession, offer type, training type, salary by year, working hours, remote eligibility, dates
- Company profile: description, size, founding year, headquarters, photos, social links, employee benefits
- Contact details: name, email, phone, postal address, accepted application methods
- Optional keyword matching flag (`word_match`) against your own keyword list

*(field descriptions below; full list of ~60 fields is also documented in the actor's dataset schema, visible in the Output tab)*

### 📊 Data Fields

#### 💼 Job Details

| Field | Description |
|---|---|
| `job_title` | Job posting title |
| `main_profession` | Primary profession/occupation category |
| `job_offer_type` | Type of job offer (e.g. Ausbildung, dual study) |
| `training_type` | Type of vocational training |
| `reference_number` | Arbeitsagentur reference number for the ad |
| `reference_code` | Employer's own reference/chiffre code |
| `external_url` | External application URL, if the employer posts off-platform |
| `suitable_for_career_changers` | Whether career changers are accepted |
| `study_format` | Dual study format, if applicable |
| `degree_program` | Degree program name, if applicable |
| `training_salary_year_1` | Training salary, year 1 |
| `training_salary_year_2` | Training salary, year 2 |
| `training_salary_year_3` | Training salary, year 3 |
| `training_salary_year_4` | Training salary, year 4 |
| `salary_disclosure` | General salary/pay disclosure text |
| `contract_duration` | Contract duration, if fixed-term |
| `shift_night_weekend_work` | Whether shift/night/weekend work is required |
| `full_time` | Full-time position |
| `part_time_morning/afternoon/evening/flexible` | Part-time availability windows |
| `remote_work_possible` | Whether remote/home office work is possible |
| `is_minor_employment` | Whether this is minor/marginal employment (Minijob) |
| `disability_required` | Whether a disability status is required |
| `is_private_employment_agency` | Whether posted by a private employment agency |
| `is_temp_staffing` | Whether this is temp/staffing agency work |
| `is_managed_account` | Whether the employer account is agency-managed |
| `job_locations` | List of job location objects (address, city, coordinates) |
| `start_date_range` | Earliest/latest possible start date range |
| `publication_period` | Publication date range used in the search filter |
| `first_published_date` | Date the ad was first published |
| `last_modified_date` | Date the ad was last modified |
| `all_professions` | All profession codes associated with the ad |
| `employer_customer_id_hash` | Hashed employer customer ID, used to fetch company profile |

#### 🏢 Company Profile

| Field | Description |
|---|---|
| `company` | Company/employer name |
| `company_description` | Company profile description text |
| `company_headquarters` | Company headquarters city |
| `company_size` | Company size category |
| `founding_year` | Year the company was founded |
| `company_images` | List of company photo URLs |
| `company_links` | Company website/other links by type |
| `social_media_links` | Company social media links by platform |
| `company_tags` | Company profile tags/keywords |
| `company_employee_benefits` | List of employee benefits offered |
| `company_contact_information` | Raw company contact info block |
| `similar_search_terms` | Related search terms suggested by the API |

#### 📇 Contact & Application

| Field | Description |
|---|---|
| `contact_name` | Contact person's full name |
| `contact_company` | Contact person's company name |
| `contact_salutation` | Contact person's salutation |
| `contact_email` | Contact email address |
| `contact_phone` | Contact phone number, formatted |
| `contact_address` | Contact postal address |
| `apply_via_arbeitsagentur_de` | Whether applications go through arbeitsagentur.de |
| `apply_online` | Whether online applications are accepted |
| `apply_by_email` | Whether applications can be sent by email |
| `apply_in_person` | Whether in-person applications are accepted |
| `apply_in_writing` | Whether written/postal applications are accepted |
| `apply_by_phone` | Whether phone applications are accepted |
| `application_form_url` | URL to the online application form |
| `required_documents` | List of documents required to apply |

#### 🎯 Matching

| Field | Description |
|---|---|
| `word_match` | `true` if the ad matched any keyword from your `matchWords` input |

### 🔧 Input options

| Field | Description |
|---|---|
| `query` | Search keyword (job title, profession) |
| `cities` | One or more German cities (multi-select) |
| `zipCode` + `area` | Radius search around a ZIP code (10 to 200 km) |
| `publishedSince` | Today / yesterday / 1 / 2 / 4 weeks |
| `workingHours` | Full time / part time |
| `matchWords` | Your own keyword list, flags matching ads |
| `maxResults` | How many ads to fetch total |

### 📋 Example output

```json
[
  {
    "job_title": "Kaufmann/-frau – Büromanagement (m/w/d)",
    "main_profession": "Kaufmann/-frau - Büromanagement",
    "job_offer_type": "AUSBILDUNG",
    "training_type": "AUSBILDUNG",
    "reference_number": "10000-1207136463-S",
    "reference_code": null,
    "external_url": null,
    "suitable_for_career_changers": null,
    "study_format": null,
    "degree_program": null,
    "training_salary_year_1": 937,
    "training_salary_year_2": 964,
    "training_salary_year_3": 1062,
    "training_salary_year_4": 1121,
    "salary_disclosure": "AUSBILDUNGSVERGUETUNG_NACH_JAHREN",
    "contract_duration": "KEINE_ANGABE",
    "shift_night_weekend_work": false,
    "full_time": true,
    "part_time_morning": false,
    "part_time_afternoon": false,
    "part_time_evening": false,
    "part_time_flexible": false,
    "remote_work_possible": null,
    "is_minor_employment": null,
    "job_locations": [
      {
        "address": {
          "street": "Roßstr.",
          "house_number": "124",
          "zip_code": "40476",
          "city": "Düsseldorf",
          "region": "NORDRHEIN_WESTFALEN",
          "country": "DEUTSCHLAND"
        },
        "latitude": 51.249915,
        "longitude": 6.7746735
      }
    ],
    "start_date_range": {
      "from": "2026-09-01"
    },
    "publication_period": {
      "from": "2026-07-09"
    },
    "first_published_date": "2026-07-09",
    "last_modified_date": "2026-07-09T11:12:52.717",
    "all_professions": [
      "Kaufmann/-frau - Büromanagement"
    ],
    "company": "Jens in der Strodt GmbH & Co. KG",
    "company_description": null,
    "company_headquarters": null,
    "company_size": null,
    "founding_year": null,
    "company_images": [],
    "company_links": {},
    "social_media_links": {},
    "company_tags": null,
    "company_employee_benefits": null,
    "company_contact_information": null,
    "contact_company": "Jens in der Strodt GmbH & Co.KG",
    "contact_name": {
      "first_name": "Kirsten",
      "last_name": "Glasmacher"
    },
    "contact_salutation": "FRAU",
    "contact_email": "info@strodt.de",
    "contact_phone": null,
    "contact_address": {
      "street": "Roßstr.",
      "house_number": "124",
      "zip_code": "40476",
      "city": "Düsseldorf",
      "region": "NORDRHEIN_WESTFALEN",
      "country": "DEUTSCHLAND"
    },
    "apply_via_arbeitsagentur_de": false,
    "apply_by_email": true,
    "apply_in_person": false,
    "apply_in_writing": false,
    "apply_by_phone": false,
    "apply_online": false,
    "application_form_url": null,
    "required_documents": "Lebenslauf, Zeugnisse",
    "word_match": false
  },
  {
    "job_title": "Auszubildende zur Medizinischen Fachangestellten (w/m/d)",
    "main_profession": "Medizinische/r Fachangestellte/r",
    "job_offer_type": "AUSBILDUNG",
    "training_type": "AUSBILDUNG",
    "reference_number": "14933-01782021e50c46b-S",
    "reference_code": null,
    "external_url": null,
    "suitable_for_career_changers": false,
    "study_format": null,
    "degree_program": null,
    "training_salary_year_1": null,
    "training_salary_year_2": null,
    "training_salary_year_3": null,
    "training_salary_year_4": null,
    "salary_disclosure": "KEINE_ANGABEN",
    "contract_duration": "KEINE_ANGABE",
    "shift_night_weekend_work": false,
    "full_time": true,
    "part_time_morning": false,
    "part_time_afternoon": false,
    "part_time_evening": false,
    "part_time_flexible": false,
    "remote_work_possible": false,
    "is_minor_employment": false,
    "job_locations": [
      {
        "address": {
          "street": "Paul-Thomas-Str.",
          "house_number": "58",
          "zip_code": "40599",
          "city": "Düsseldorf",
          "region": "NORDRHEIN_WESTFALEN",
          "country": "DEUTSCHLAND"
        },
        "latitude": 51.17292,
        "longitude": 6.8541885
      }
    ],
    "start_date_range": {
      "from": "2026-07-09"
    },
    "publication_period": {
      "from": "2026-07-09"
    },
    "first_published_date": "2026-07-09",
    "last_modified_date": "2026-07-09T10:41:53.225",
    "all_professions": [
      "Medizinische/r Fachangestellte/r"
    ],
    "company": "Ober Scharrer Gruppe GmbH",
    "company_description": null,
    "company_headquarters": null,
    "company_size": null,
    "founding_year": null,
    "company_images": [],
    "company_links": {
      "Homepage": "https://www.osg.de"
    },
    "social_media_links": {},
    "company_tags": null,
    "company_employee_benefits": null,
    "company_contact_information": null,
    "contact_company": "Ober Scharrer Gruppe GmbH",
    "contact_name": {
      "first_name": "Fatma",
      "last_name": "Hacivelioglu"
    },
    "contact_salutation": "FRAU",
    "contact_email": "bewerbung@osg.de",
    "contact_phone": null,
    "contact_address": {
      "street": "Dr-Mack-Str 88",
      "zip_code": "90762",
      "city": "Fürth, Bayern",
      "region": "BAYERN",
      "country": "DEUTSCHLAND"
    },
    "apply_via_arbeitsagentur_de": false,
    "apply_by_email": false,
    "apply_in_person": false,
    "apply_in_writing": false,
    "apply_by_phone": false,
    "apply_online": true,
    "application_form_url": "https://jobs.osg.de/stellenangebote/565225998?ref=2210111000&utm_medium=organic&utm_source=arbeitsagentur",
    "required_documents": "Anschreiben, Lebenslauf und Zeugnisse",
    "word_match": false
  }
]
```

### 💳 Pricing

Pay-per-result. You're charged for ads actually delivered, not for pages fetched or requests made.

### ❓ FAQ

**Do I need my own proxies?** No. Residential proxies are built into the actor, no separate proxy charge, nothing to configure.

**Does this cover Ausbildung and dual-study listings, not just regular jobs?** Yes. `job_offer_type` and `training_type` distinguish regular positions from Ausbildung and Duales Studium, with training-year salary fields filled in whenever the employer discloses them.

**Is this Arbeitsagentur Scraper different from other arbeitsagentur.de scrapers on the store?** Yes. Most only return the search snippet. This one adds full company profile and captcha-protected contact data on top.

**Why do I get contact details when other arbeitsagentur.de scrapers don't?** Because arbeitsagentur.de puts an image captcha in front of that specific endpoint. This actor solves it automatically on every run instead of skipping that data.

**Is this legal?** Everything scraped here is publicly visible on arbeitsagentur.de to any visitor. No login, no private data, no bypass of anything besides a captcha on a public page. As always, check your own use case against GDPR if you're storing personal contact data.

**How fresh is the data?** Arbeitsagentur.de updates continuously, and this actor queries live at run time, so you always get the current state of the listing, not a cached snapshot.

### ⚠️ Notes

- Free-tier accounts are capped at a small sample size per run. Upgrade to a paid Apify plan for full volume.
- Data reflects what's publicly listed on arbeitsagentur.de at the time of the run; the source updates continuously.

### 🔗 See also

Need a scraper for another platform besides Trustpilot reviews? Check out:

- [Booking Reviews Scraper](https://apify.com/mof1re/booking-reviews-scraper-browserless)
- [AirBNB Reviews Scraper](https://apify.com/mof1re/airbnb-reviews-scraper-browserless)
- [TripAdvisor Reviews Scraper](https://apify.com/mof1re/tripadvisor-reviews-scraper-browserless)
- [Trustpilot reviews scraper, Beast Mode Available now](https://apify.com/mof1re/trustpilot-scraper-fast-browserlessapif)

# Actor input Schema

## `query` (type: `string`):

Job title / keyword to search for (was= param)

## `cities` (type: `array`):

Pick one or more cities. Sent to the API joined with ';' as arbeitsort=City1;City2

## `zipCode` (type: `string`):

Optional. Required if you want to use the 'area' radius filter (wo= param)

## `area` (type: `string`):

Only applied if ZIP code is set (umkreis= param)

## `publishedSince` (type: `string`):

How far back to search (veroeffentlichtseit= param)

## `workingHours` (type: `string`):

Full time or part time (arbeitszeit= param)

## `matchWords` (type: `array`):

List of keywords to flag matching ads (checked against job title / profession / company description). Leave empty to skip matching.

## `maxResults` (type: `integer`):

Total number of job ads to fetch. Pages are fetched at 200 results/page, stopping early if the source runs out of results. Max 5000

## Actor input object example

```json
{
  "query": "",
  "cities": [],
  "area": "10",
  "publishedSince": "4",
  "matchWords": [],
  "maxResults": 100
}
```

# Actor output Schema

## `jobAds` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("mof1re/arbeitsagentur-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("mof1re/arbeitsagentur-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call mof1re/arbeitsagentur-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mof1re/arbeitsagentur-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/VKnaXQoTcHK47XfDd/builds/thdPzcvkShUbBOS9C/openapi.json
