# Arbeitsagentur Jobs Scraper — BA Jobsuche Germany (`crawloop/arbeitsagentur-jobs-scraper`) Actor

Scrape Arbeitsagentur / Bundesagentur für Arbeit job listings (Germany Jobsuche). Search by keyword, location, filters, or start URLs. Export title, employer, location, contract type, salary notes, full description, and application links. Fast HTTP API — no browser.

- **URL**: https://apify.com/crawloop/arbeitsagentur-jobs-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (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 $0.90 / 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/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 Jobs Scraper — Bundesagentur für Arbeit / Germany Jobsuche

> **Disclaimer:** Unofficial tool for publicly accessible Arbeitsagentur (Bundesagentur für Arbeit) job listings. **Bundesagentur für Arbeit**, **Arbeitsagentur**, **Jobbörse**, and related names are trademarks of their respective owners. Not affiliated with, sponsored by, or endorsed by the Bundesagentur für Arbeit. For informational, research, aggregation, and recruiting-intelligence use only. Respect applicable terms of use and law.

Scrape **German job listings** from the official **Arbeitsagentur / Bundesagentur für Arbeit Jobsuche** portal. Search by **keyword (was)**, **location (wo)**, **advanced filters**, or **portal search start URLs**. Export structured JSON with **title**, **employer**, **occupation**, **address**, **contract type**, **salary notes**, **full description**, **home-office flags**, and **external application URLs** — fast **HTTP Jobsuche API** scraping, **no headless browser**.

Ideal for **Germany job board aggregation**, **labor-market research**, **recruiting intelligence**, **employer lead generation**, and **BA Jobbörse data pipelines**.

### Key Features

- **Arbeitsagentur / BA Jobsuche API** — search + job-detail endpoints over HTTP (`curl_cffi`); no Playwright/Puppeteer
- **Germany-wide search** — keywords, city/region, radius (km), employer name, occupational field (Berufsfeld)
- **Advanced filters** — offer type (Arbeit / Ausbildung / Praktikum / Selbständigkeit), fixed-term vs permanent, working time (Vollzeit, Teilzeit, Homeoffice, Minijob, shift)
- **Start URL parsing** — paste a Jobsuche search URL; query parameters are mapped to API filters automatically
- **Full job details** — optional detail fetch for complete Stellenbeschreibung and richer metadata
- **Deduplicated `refnr`** — unique reference numbers across multi-URL / multi-filter runs
- **Low memory** — designed for 256–512 MB runs
- **Clean camelCase schema** — ready for job boards, BI tools, ATS enrichment, and recruiting CRM pipelines
- **Apify Proxy ready** — DE residential recommended on the Apify platform

### Use Cases

| Use case | What you get |
| :--- | :--- |
| **Job aggregation** | Fresh BA / Arbeitsagentur openings into a job board or search index |
| **Labor-market research** | Hiring volume by keyword, city, occupation, and contract type in Germany |
| **Recruiting intelligence** | Competitor and employer vacancy monitoring by region |
| **Lead generation** | Employers actively hiring in a target segment |
| **Salary / contract signals** | Salary notes and befristet / unbefristet flags where published |
| **Ausbildung & Praktikum tracking** | Filter by offer type for apprenticeships and internships |

### When to use this Actor

- You need **Arbeitsagentur.de / Jobbörse** listings as structured data
- You want **keyword + location + filter** search without a browser
- You need **full job descriptions** and application links for downstream processing
- You run **recurring Germany jobs** pulls for dashboards or alerts

### When not to use this Actor

- **Non-German job portals** — this Actor covers Arbeitsagentur / Bundesagentur für Arbeit only
- **Guaranteed email or phone** — many listings omit direct contacts; use `externalApplicationUrl` when present
- **Historical archives** — only currently published Jobsuche results
- **Private / authenticated BA services** — public Jobsuche listings only

### Quick Start

**Keyword + city:**

```json
{
  "position": "Softwareentwickler",
  "location": "Berlin",
  "maxItems": 50,
  "fetchDetails": true,
  "offerType": "1",
  "radiusKm": 25,
  "workingTime": ["vz", "ho"],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

**Portal search start URL:**

```json
{
  "startUrls": [
    {
      "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Pflegefachkraft&wo=Muenchen&umkreis=50"
    }
  ],
  "maxItems": 100,
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `position` | String | — | Keywords / job title (API `was`) |
| `location` | String | — | City or region (API `wo`) |
| `startUrls` | Array | — | Jobsuche search URLs; query params merge with filters |
| `maxItems` | Integer | `100` | Max jobs (`0` = unlimited, subject to portal caps) |
| `fetchDetails` | Boolean | `true` | Fetch full description via job-details endpoint |
| `offerType` | String | `"1"` | `1` Arbeit, `2` Selbständigkeit, `4` Ausbildung, `34` Praktikum/Trainee, empty = any |
| `contractType` | String | — | `1` befristet, `2` unbefristet, `1;2` both |
| `workingTime` | Array | `[]` | `vz`, `tz`, `snw`, `ho`, `mj` |
| `radiusKm` | Integer | `25` | Radius in km around location |
| `employer` | String | — | Employer name filter |
| `occupationalField` | String | — | Berufsfeld free text |
| `publishedWithinDays` | Integer | — | Only jobs published in the last N days (0–100) |
| `includeTemporaryAgencies` | Boolean | `true` | When `false`, excludes Zeitarbeit (`zeitarbeit=false`) |
| `includePrivatePlacement` | Boolean | `true` | When `false`, excludes PAV (`pav=false`) |
| `disabilityFriendly` | Boolean | `false` | Only disability-friendly listings |
| `pageSize` | Integer | `50` | Search page size (1–100) |
| `concurrency` | Integer | `10` | Parallel detail requests |
| `proxyConfiguration` | Object | DE residential | Apify Proxy (required on platform for reliable results) |

### Output Format

Each dataset item is one Arbeitsagentur job listing.

| Field | Type | Description |
| :--- | :--- | :--- |
| `refnr` | String | Stellen-Referenznummer |
| `url` | String | Public job detail URL |
| `title` | String | Job title |
| `description` | String | Full description (when `fetchDetails` is true) |
| `employer` | String | Employer / company name |
| `occupation` | String | Primary occupation (Hauptberuf) |
| `alternativeOccupations` | Array | Related occupation labels |
| `offerType` | String | e.g. `ARBEIT` |
| `contractType` | String | e.g. `BEFRISTET` / `UNBEFRISTET` |
| `contractMonths` | Integer | Fixed-term length in months (if present) |
| `salaryNote` | String | Portal salary indicator |
| `publishedAt` / `modifiedAt` / `startDate` | String | Portal dates |
| `externalApplicationUrl` | String | External apply link when provided |
| `homeOfficePossible` / `homeOfficeType` | Boolean / String | Remote-work flags |
| `workingTime` | Object | Full-time / part-time / shift flags |
| `location` | Object | Address, coordinates, distance |
| `isTemporaryAgency` / `isPrivatePlacement` / `isMiniJob` | Boolean | Listing flags |
| `searchWas` / `searchWo` | String | Search keywords / location used |
| `scrapedAt` | String | ISO timestamp |

#### Output Example

```json
{
  "refnr": "10001-1003353506-S",
  "url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003353506-S",
  "title": "Softwareentwickler:in (w/d/m)",
  "employer": "Example Employer GmbH",
  "occupation": "Softwareentwickler/in",
  "offerType": "ARBEIT",
  "contractType": "BEFRISTET",
  "contractMonths": 29,
  "salaryNote": "KEINE_ANGABEN",
  "publishedAt": "2026-07-08",
  "startDate": "2026-07-09",
  "homeOfficePossible": true,
  "homeOfficeType": "NACH_VEREINBARUNG",
  "workingTime": {
    "fullTime": true,
    "partTimeMorning": false,
    "partTimeAfternoon": false,
    "partTimeEvening": false,
    "partTimeFlexible": false,
    "shiftNightWeekend": false
  },
  "location": {
    "street": "Example-Str.",
    "houseNumber": "1",
    "postalCode": "10115",
    "city": "Berlin",
    "region": "BERLIN",
    "country": "DEUTSCHLAND",
    "latitude": 52.52,
    "longitude": 13.40
  },
  "searchWas": "Softwareentwickler",
  "searchWo": "Berlin",
  "scrapedAt": "2026-07-16T10:00:00+00:00"
}
```

### FAQ

**Do I need a browser?**\
No. The Actor uses the public Jobsuche REST search and detail endpoints.

**Why enable Apify Proxy?**\
Platform IPs often receive empty result sets from the Jobsuche API. DE residential proxy is recommended.

**Why are descriptions empty?**\
Keep `fetchDetails` enabled (default). Search cards alone may omit the full text.

**Why did pagination stop near ~250 results?**\
The portal often caps `maxErgebnisse` per query. Narrow keywords, location, or filters for more precise slices.

**Are email and phone always available?**\
No. Many listings only expose an external application URL or on-site apply flow.

**Zeitarbeit / PAV filters**\
Set `includeTemporaryAgencies` or `includePrivatePlacement` to `false` to exclude those sources. Leaving both at `true` uses portal defaults (do not force both API flags to `true` simultaneously).

### Limitations

- Unofficial use of the public Jobsuche API; endpoints may change
- Result volume per query can be capped by the portal
- Salary is often `KEINE_ANGABEN` — not a structured EUR amount
- Contact fields are frequently absent

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/arbeitsagentur-jobs-scraper').call({
  position: 'Softwareentwickler',
  location: 'Berlin',
  maxItems: 50,
  fetchDetails: true,
  offerType: '1',
  radiusKm: 25,
  workingTime: ['vz', 'ho'],
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'DE',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/arbeitsagentur-jobs-scraper").call(
    run_input={
        "position": "Softwareentwickler",
        "location": "Berlin",
        "maxItems": 50,
        "fetchDetails": True,
        "offerType": "1",
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "DE",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("employer"), item.get("url"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~arbeitsagentur-jobs-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"position":"Softwareentwickler","location":"Berlin","maxItems":50,"fetchDetails":true,"offerType":"1"}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/arbeitsagentur-jobs-scraper`.

Example prompts:

- "Run Arbeitsagentur Jobs Scraper for Softwareentwickler in Berlin, max 50, return title, employer, contractType, url"
- "Scrape BA Jobsuche Pflegefachkraft in München with details and summarize home-office flags"
- "Pull Ausbildung openings in Hamburg from Arbeitsagentur and list employers"

### Suite next step

Standalone Germany **Arbeitsagentur / BA Jobsuche** Actor — no sibling job-board suite yet. For DACH B2B company directories (employers / suppliers, not job ads), see [WLW Scraper](https://apify.com/crawloop/wlw-scraper) or [Europages Scraper](https://apify.com/crawloop/europages-scraper).

### Related Actors

| Actor | Focus |
| :--- | :--- |
| **Arbeitsagentur Jobs Scraper** ◄── you are here | Germany BA Jobsuche job listings |
| [WLW Scraper](https://apify.com/crawloop/wlw-scraper) | DACH B2B supplier directory |
| [Europages Scraper](https://apify.com/crawloop/europages-scraper) | European B2B company directory |

# Actor input Schema

## `position` (type: `string`):

Job title or free-text keywords (API parameter `was`). Example: Softwareentwickler, Pflegefachkraft.

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

City, region, or place name (API parameter `wo`). Example: Berlin, München, Hamburg.

## `startUrls` (type: `array`):

Optional Arbeitsagentur search page URLs. Query parameters (was, wo, umkreis, angebotsart, …) are parsed and used as search filters. Overrides position/location when present.

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

Maximum number of job listings to collect across all searches. Use 0 for unlimited (subject to portal result caps).

## `fetchDetails` (type: `boolean`):

When true, call the job-details endpoint for each listing to get the full description and richer fields. Slightly slower but much more complete.

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

Angebotsart filter.

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

Befristung filter. Multiple values allowed via semicolon in the API; this select covers the common cases.

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

Arbeitszeit filters. Multiple values are combined (semicolon-separated in the API).

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

Search radius in kilometres around the location (`umkreis`). Example: 25 or 200.

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

Filter by employer name (`arbeitgeber`). Example: Deutsche Bahn AG.

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

Berufsfeld free-text filter. Example: Informatik, Pflege.

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

Only jobs published within the last N days (`veroeffentlichtseit`). Range 0–100.

## `includeTemporaryAgencies` (type: `boolean`):

Include jobs from temporary employment agencies (`zeitarbeit`). Default true.

## `includePrivatePlacement` (type: `boolean`):

Include jobs from private placement agencies (`pav`). Leave unset for portal default.

## `disabilityFriendly` (type: `boolean`):

When true, only return jobs marked for applicants with disabilities (`behinderung`).

## `pageSize` (type: `integer`):

Number of search results requested per API page (1–100).

## `concurrency` (type: `integer`):

Max parallel job-detail requests when fetchDetails is enabled.

## `proxyConfiguration` (type: `object`):

Required on Apify. Arbeitsagentur returns 0 results from platform IPs without a proxy. DE residential recommended.

## Actor input object example

```json
{
  "position": "Softwareentwickler",
  "location": "Berlin",
  "startUrls": [
    {
      "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin&umkreis=25"
    }
  ],
  "maxItems": 100,
  "fetchDetails": true,
  "offerType": "1",
  "contractType": "",
  "workingTime": [],
  "radiusKm": 25,
  "includeTemporaryAgencies": true,
  "includePrivatePlacement": true,
  "disabilityFriendly": false,
  "pageSize": 50,
  "concurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "position": "Softwareentwickler",
    "location": "Berlin",
    "startUrls": [
        {
            "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin&umkreis=25"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "position": "Softwareentwickler",
    "location": "Berlin",
    "startUrls": [{ "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin&umkreis=25" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/arbeitsagentur-jobs-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 '{
  "position": "Softwareentwickler",
  "location": "Berlin",
  "startUrls": [
    {
      "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin&umkreis=25"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call crawloop/arbeitsagentur-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OB7Ce5EwwJBd0KHbd/builds/VZHVB9bYfs4BrSaRg/openapi.json
