# Arbeitsagentur Jobs Scraper (`jobscrawler/arbeitsagentur-jobs-scraper`) Actor

Fetch actual public Bundesagentur für Arbeit job search and full-detail API records. Supports keyword/location searches, native search URLs, bounded concurrent detail requests, and source-preserving JSON output. No paid vendor API key; gated contact and account APIs are not requested.

- **URL**: https://apify.com/jobscrawler/arbeitsagentur-jobs-scraper.md
- **Developed by:** [Jobs Scraper](https://apify.com/jobscrawler) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Arbeitsagentur Jobs Scraper do?

Collect actual public job vacancies from the [Bundesagentur für Arbeit Jobsuche](https://www.arbeitsagentur.de/jobsuche/). This Actor uses the source's current public search and full-detail APIs instead of scraping navigation or page titles. It does not create synthetic jobs, collect account-only records, or claim that a successful empty process is usable output. No paid vendor API key or user account is required for the public routes used here.

### Why use the public job API?

The browser-free route retrieves a search page and then fetches full job descriptions with bounded concurrency, capped at four detail requests at once. It preserves source reference IDs and supports recruitment research and vacancy analysis. On Apify, you can use the API tab, schedules, integrations, and run monitoring. Direct public access is attempted first. An explicitly configured proxy may be used per denied request; no CAPTCHA, login requirement, or private contact endpoint is bypassed.

### What data is available?

| Field | Type | Source meaning |
| --- | --- | --- |
| title | string | Published job title |
| companyName | string | Source employer name, when exposed |
| location | string | Source place, region and country labels |
| description | string | Full public job description, not a search snippet |
| salary | string | Serialized published pay amount, period and type; no currency is guessed |
| jobType | string | Published working-time and contract labels |
| remote | boolean | Source home-office availability; true does not necessarily mean fully remote |
| jobId, jobUrl | string | Source reference and its official public detail URL |
| rawData | object | Original public list/detail fields, including available coordinates, dates and native flags |

### How to run it

1. Open the Input tab and keep the default Softwareentwickler/Berlin search or provide an official search URL.
2. Set maxItems, normally 10, and optionally searchQuery, location, maxPages or maxConcurrency.
3. Start the Actor and inspect the actual records, not only its process status.
4. Download the dataset in JSON, HTML, CSV or Excel. Use the API tab for integrations.

### Input and source URL precedence

The default target is [the public native search](https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1\&was=Softwareentwickler\&wo=Berlin). maxItems defaults to 10 and is limited to 1000. searchQuery overrides the legacy keyword shortcut. A single explicit startUrl preserves its own was and wo query parameters, even if conflicting shortcuts are supplied. Native geography, radius and other query semantics are handled by the source; results are not reduced to a naive city substring. Multiple startUrls are fetched with a shared global output cap. Source pagination stays ordered within each search. An official job-detail URL can also fetch an individual published reference.

Only GET requests are supported for this provider; leave requestBody empty. Private pd routes, contact/candidate operations and unrelated frontend paths are rejected. The X-API-Key header uses the application's publicly published identifier from the [official frontend configuration](https://www.arbeitsagentur.de/jobsuche/config/config.js), not a customer API key or a paid vendor credential. Current routes are pc/v6/jobs and pc/v4/jobdetails with the source's base64url-encoded reference.

### Output and missing values

The normalized dataset has 21 optional source/provenance fields. Full descriptions and reference IDs must match before a record is accepted. Original public values remain in rawData. Missing, null and empty optional values are omitted; real zero and false values remain. Salary currency and confidential company names are never invented. A job URL identifies the listing and does not imply that an application was submitted. Source descriptions may contain Markdown or untrusted markup; sanitize them in downstream applications.

RUN_SUMMARY contains actual counts and status. SOURCE_METADATA records source/detail request URLs, timing, bytes and statuses without request credentials. ERROR_DIAGNOSTIC is separate from the dataset. A zero-result run fails rather than outputting fake diagnostics as jobs. Live records change; sparse queries and removed listings can return fewer items.

### Cost, testing and support

Public requests do not need a paid vendor API key. Apify runtime, storage and explicitly enabled proxies may still cost money; consult current Store and platform pricing. No fixed per-run estimate or publishing claim is made here. Test locally with apify run; local storage is not automatically uploaded to Console. Production deployment requires authorized apify push access and a separate live run. Production and all possible native filter combinations are not yet verified by a local default test.

This Actor is not affiliated with the Bundesagentur für Arbeit. Use public data responsibly under source terms and applicable law, and avoid unnecessary personal-data collection. Gated contact information and account data are intentionally excluded. Report issues through the Issues tab with a sanitized input, source URL and run ID, never credentials.

# Actor input Schema

## `startUrl` (type: `string`):

Optional official Jobsuche search, job-detail, or supported public API URL. A single explicit URL retains its native was/wo filters over query/location shortcuts.

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

Official public Jobsuche search or detail URLs. Defaults search Softwareentwickler in Berlin. No private/account/contact routes are accepted.

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

Maximum records to output.

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

Optional case-insensitive title or description filter.

## `searchQuery` (type: `string`):

Optional source search term for was. Overrides keyword and default-target terms; a single explicit startUrl retains its own was value.

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

Optional source location query for wo. Native radius and geography semantics are applied by the source, not a substring filter. A single explicit startUrl keeps its own wo value.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## `maxConcurrency` (type: `integer`):

Bounded parallel HTTP source requests; pagination within each source remains ordered.

## `maxPages` (type: `integer`):

Maximum pagination requests per source. Stops sooner when maxItems is reached.

## `maxRetries` (type: `integer`):

Retries network failures and transient HTTP errors with backoff. Does not retry denied requests.

## `requestMethod` (type: `string`):

Official public search/detail requests use GET. POST is not supported for this source.

## `requestBody` (type: `object`):

Leave empty. These public source routes do not accept a POST body.

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

Explicitly configured custom or Apify proxy fallback after a blocked direct request. Off by default.

## Actor input object example

```json
{
  "startUrl": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin",
  "startUrls": [
    {
      "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin"
    }
  ],
  "maxItems": 10,
  "keyword": "Softwareentwickler",
  "searchQuery": "Softwareentwickler",
  "location": "Berlin",
  "requestTimeoutSecs": 30,
  "maxConcurrency": 4,
  "maxPages": 20,
  "maxRetries": 2,
  "requestMethod": "GET",
  "requestBody": {},
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing extracted public records.

## `runSummary` (type: `string`):

Run status and output counts.

## `diagnostics` (type: `string`):

Source metadata and sanitized errors.

# 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 = {
    "startUrl": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin",
    "startUrls": [
        {
            "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin"
        }
    ],
    "maxItems": 10,
    "keyword": "Softwareentwickler",
    "searchQuery": "Softwareentwickler",
    "location": "Berlin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobscrawler/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 = {
    "startUrl": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin",
    "startUrls": [{ "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin" }],
    "maxItems": 10,
    "keyword": "Softwareentwickler",
    "searchQuery": "Softwareentwickler",
    "location": "Berlin",
}

# Run the Actor and wait for it to finish
run = client.actor("jobscrawler/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 '{
  "startUrl": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin",
  "startUrls": [
    {
      "url": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Softwareentwickler&wo=Berlin"
    }
  ],
  "maxItems": 10,
  "keyword": "Softwareentwickler",
  "searchQuery": "Softwareentwickler",
  "location": "Berlin"
}' |
apify call jobscrawler/arbeitsagentur-jobs-scraper --silent --output-dataset

```

## MCP server setup

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