# Arbeitsagentur Scraper — German Federal Job Board (`memo23/arbeitsagentur-scraper`) Actor

Scrape jobs from arbeitsagentur.de — Germany's federal job board with 1M+ offers. Full description, employer profile + website, coordinates, parsed salary, recruiter emails & phones, and the external apply URL. Jobs, Ausbildung, Praktikum. Any URL or keyword filters. JSON/CSV out.

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

## Pricing

from $1.50 / 1,000 job results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Federal Job Board (Bundesagentur für Arbeit)

Extract structured job data from [arbeitsagentur.de](https://www.arbeitsagentur.de/jobsuche/) — Germany's largest job board, run by the Federal Employment Agency with over a million live offers. Get the full description, employer profile, precise coordinates, working-time flags, and the external apply URL for every job — regular positions, apprenticeships (Ausbildung), internships, and self-employment offers alike. Paste any Jobsuche search URL or use the built-in keyword/location filters; results arrive as clean JSON or CSV, one row per job.

#### How it works

![How Arbeitsagentur Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-arbeitsagentur.png)

#### ✨ Why use this scraper?

- **Germany's biggest job source** — the Bundesagentur für Arbeit aggregates 1M+ offers nationwide, including postings syndicated from partner boards (HeyJobs, Softgarden, employer ATS feeds).
- **Complete rows in one fetch** — full description, employer self-presentation with homepage link, lat/lng coordinates, and all working-time flags come from a single page load. No follow-up calls, no missing columns.
- **External apply URL captured** — when a posting redirects to the employer's own application page, the direct URL lands in `externalApplyUrl`.
- **Contacts and wages mined from descriptions** — recruiter emails, phone numbers, and URLs are extracted into `extractedEmails` / `extractedPhones` / `extractedUrls`, and German wage strings ("12,82 EUR/Std.", "2.800 € bis 3.200 € monatlich") are parsed into a structured `salary` object with min/max, currency, and pay period.
- **All four offer types** — regular jobs (Arbeit), apprenticeships (Ausbildung/Duales Studium), internships/trainee positions (Praktikum), and self-employment (Selbständigkeit).
- **Search exactly like the site** — keyword, location, radius, offer type, publication age, and working-time filters map 1:1 to the site's own search form; or paste any Jobsuche URL with your filters already applied.
- **No browser, no drama** — the data comes from the page's embedded server-side JSON, so runs are fast, cheap, and resilient to cosmetic layout changes.

#### 🎯 Use cases

| Who | What for |
|---|---|
| **Recruiters & staffing agencies** | Monitor fresh postings in a region or profession; identify employers hiring at scale |
| **Job boards & aggregators** | Syndicate German federal job data into your own product with stable structured fields |
| **HR-tech & analytics teams** | Track labour-market demand by profession, region, and contract type over time |
| **Ausbildung platforms** | Pull every apprenticeship offer (`angebotsart=4`) with employer contacts and locations |
| **Lead generation** | Find companies that are actively hiring — each row carries the employer name, profile, and website |
| **Researchers & journalists** | Study the German labour market with coordinates, working-time, and contract metadata |

#### 📥 Supported inputs

| Input | Example | What happens |
|---|---|---|
| Search URL | `https://www.arbeitsagentur.de/jobsuche/suche?was=Software&wo=Berlin` | Walks all result pages, scrapes each job |
| Search URL with any site filters | `...suche?angebotsart=4&wo=Hamburg&umkreis=25` | Filters pass through unchanged |
| Direct job URL | `https://www.arbeitsagentur.de/jobsuche/jobdetail/12444-563465373301945-DT-S` | Scrapes that one job |
| Built-in filters (no URL) | `keyword: "Pflege"`, `location: "Hamburg"`, `offerType: "apprenticeship"` | Builds the search URL for you |

**Not supported:** other arbeitsagentur.de services (Berufenet profiles, training courses / Weiterbildungssuche, employer accounts), and any content that requires a login.

#### 🔄 How it works

1. **Classify** every start URL — search page vs direct job detail.
2. **Walk** each search's result pages (25 jobs per page) and collect job reference numbers, streaming details in parallel while pagination continues.
3. **Fetch** each job's detail page and parse the complete job record from the page's embedded server-side JSON — no fragile DOM selectors.
4. **Merge** the employer self-presentation (description, homepage, career links) and all job locations with coordinates into the same row.
5. **Push** one normalized row per job to the dataset — JSON, CSV, or Excel export via the Apify platform.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | Jobsuche search URLs and/or direct job URLs. When set, the filters below are ignored |
| `keyword` | string | — | Search keyword (`was`) — title, skill, or profession |
| `location` | string | — | City, region, or postcode (`wo`) |
| `radiusKm` | integer | — | Radius around the location in km (up to 200) |
| `offerType` | string | `job` | `job`, `self-employment`, `apprenticeship`, or `internship-trainee` |
| `publishedSinceDays` | integer | — | Site-side filter: only offers published in the last N days |
| `workingTime` | array | — | `full-time`, `part-time`, `shift-night-weekend`, `home-office`, `mini-job` |
| `postedWithinHours` | integer | — | Post-scrape recency gate (24 = last day) for monitoring runs |
| `enrichEmails` | boolean | `false` | Experimental: discover an employer contact email from the company website |
| `maxItems` | integer | `1000` | Hard cap on jobs collected |
| `maxConcurrency` | integer | `10` | Parallel detail fetches |
| `proxy` | object | Apify auto | Proxy configuration; default works fine |

#### 📊 Output overview

Each dataset row is one job. The canonical core (identity, company, location, dates, description, apply flow) is always present — fields the source doesn't provide are `null`, never missing. Arbeitsagentur-specific extras follow the core: profession classification, all job locations with coordinates, working-time flags, employer self-presentation, partner-board attribution, flags like `isStaffingAgency` / `suitableForCareerChangers`, plus contacts and wage figures mined from the description text (`extractedEmails`, `extractedPhones`, `extractedUrls`, structured `salary`).

#### 📦 Output sample

Real row (trimmed) from a live run:

```json
{
  "type": "job",
  "source": "arbeitsagentur.de",
  "jobId": "12444-563465373301945-DT-S",
  "jobUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12444-563465373301945-DT-S",
  "title": "Senior SAP Software Architect (m/w/d)",
  "companyName": "Deutsche Telekom AG",
  "companyWebsite": "http://www.telekom.com/",
  "companyDomain": "telekom.com",
  "location": "Magdeburg",
  "remote": false,
  "employmentTypes": ["full-time"],
  "postedDate": "2026-07-12",
  "modifiedDate": "2026-07-13T12:01:24.433",
  "description": "**Über T-Systems International GmbH**\nBei T-Systems bieten wir unseren Geschäftskunden die richtigen Systemlösungen für ihr digitales Business. …",
  "applyType": "internal",
  "applyUrl": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12444-563465373301945-DT-S",
  "externalApplyUrl": null,
  "refNumber": "12444-563465373301945-DT-S",
  "offerType": "job",
  "profession": "Software-Architect",
  "companyDescription": "Die Deutsche Telekom ist Europas größtes Telekommunikationsunternehmen und weltweit in mehr als 50 Ländern vertreten. …",
  "companyLinks": [
    { "url": "http://www.telekom.com", "kind": "Homepage" },
    { "url": "https://karriere.telekom.com/berufseinstieg", "kind": "Karriereseite" }
  ],
  "partnerName": "Deutsche Telekom AG",
  "postcode": "39124",
  "region": "SACHSEN_ANHALT",
  "country": "DEUTSCHLAND",
  "coordinates": { "latitude": 52.1577066, "longitude": 11.6419235 },
  "locations": [
    { "postcode": "39124", "city": "Magdeburg", "region": "SACHSEN_ANHALT", "country": "DEUTSCHLAND", "coordinates": { "latitude": 52.1577066, "longitude": 11.6419235 } },
    { "postcode": "80335", "city": "München", "region": "BAYERN", "country": "DEUTSCHLAND", "coordinates": { "latitude": 48.1450237, "longitude": 11.5540846 } }
  ],
  "workingTime": { "fullTime": true, "partTimeFlexible": false, "shiftNightWeekend": false },
  "homeOfficePossible": false,
  "suitableForCareerChangers": false,
  "isStaffingAgency": false,
  "isPrivateRecruiter": false,
  "entryDate": "2026-07-12",
  "extractedEmails": [],
  "extractedPhones": [],
  "salary": null,
  "scrapedAt": "2026-07-14T04:08:57.540Z"
}
````

Staffing-agency postings additionally carry mined contacts and parsed wages (real values from the same run):

```json
{
  "title": "Reinigungskraft (m/w/d)",
  "companyName": "Aleksander Djoric NEW Gebäudereinigung",
  "salary": { "currency": "EUR", "min": 15, "max": 15, "unit": "hour", "raw": "15,00 €" }
}
```

```json
{
  "title": "Reinigungskraft (m/w/d)",
  "companyName": "ISD Immobilien Service Deutschland GmbH & Co. KG",
  "applyType": "email",
  "applyEmail": "bewerbermanagement@isd-service.de",
  "extractedEmails": ["bewerbermanagement@isd-service.de"],
  "extractedPhones": ["030/89775634"]
}
```

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identity** | `jobId` / `refNumber` (the site's referenznummer), `jobUrl`, `title`, `offerType`, `cipherNumber` |
| **Profession** | `profession` (the BA's official classification), `alternativeProfessions` |
| **Company** | `companyName`, `companyWebsite`, `companyDomain`, `companyDescription`, `companyLinks[]`, `employerHash` |
| **Partner attribution** | `partnerName`, `partnerUrl` — the syndicating partner board when the posting came via one |
| **Location** | `location`, `postcode`, `region`, `country`, `coordinates` (lat/lng), `locations[]` — every advertised site with its own coordinates |
| **Working time** | `employmentTypes[]`, `workingTime{}` flags, `homeOfficePossible`, `remote`, `contractType` (`permanent` / `fixed-term`), `isMarginalEmployment` |
| **Dates** | `postedDate`, `firstPublishedDate`, `modifiedDate`, `entryDate`, `closingDate` |
| **Apply flow** | `applyType` (`internal` / `external` / `email`), `applyUrl`, `applyEmail`, `externalApplyUrl` — the direct employer application link when the posting uses one |
| **Mined from description** | `extractedEmails[]`, `extractedPhones[]`, `extractedUrls[]` — recruiter contacts found in the posting text; `salary{min, max, currency, unit, raw}` — parsed German wage figures (hourly/monthly/yearly) |
| **Signals** | `isStaffingAgency` (Arbeitnehmerüberlassung), `isPrivateRecruiter`, `suitableForCareerChangers`, `forSeverelyDisabled` |
| **Enrichment (opt-in)** | `contactEmail`, `contactWebsite`, `emailEnrichment{}` |

#### ❓ FAQ

**How many jobs can I scrape?**
The site reports ~1M+ live offers nationwide. A single search caps at what the site itself will paginate; split large pulls by region, profession, or offer type for full coverage. Use `maxItems` to control billing.

**Does it include apprenticeships (Ausbildung)?**
Yes — set `offerType: "apprenticeship"` (or paste a search URL with `angebotsart=4`). Internships/trainee positions and self-employment offers work the same way.

**Is the salary included?**
The site has no structured salary field, but many postings (especially staffing agencies) state wages in the description text — those are parsed into `salary` with `min`/`max`, `currency`, and `unit` (`hour`/`month`/`year`), with the original string kept in `salaryRaw`. Postings with no stated wage have `salary: null`.

**What do the `applyType` values mean?**
`external` — the posting links out to the employer's own application page (URL in `externalApplyUrl`). `email` — no external link, but a contact email was found in the description (in `applyEmail`). `internal` — applications go through the job's arbeitsagentur.de page (`applyUrl`).

**Why do some rows have several `locations`?**
Employers can advertise one posting for multiple sites. Every advertised location is kept, each with its own postcode and coordinates; the top-level `location`/`coordinates` are the first one.

**Do I need a special proxy?**
No — the default Apify proxy works. If you ever see repeated 403s, switch the proxy input to RESIDENTIAL with country DE.

#### 💬 Support

- 🐛 Found a bug or need a field added? Open an issue on the actor's **Issues** tab in Apify Console.
- 💡 Custom requirements (different output shape, scheduled deliveries, other job boards)? Message me through Apify — details in **Additional services** below.

#### 🛠 Additional services

Need something beyond this actor? I build and maintain custom scraping solutions:

- **Custom scrapers** for any job board, directory, or listing site
- **Data pipelines** — scheduled runs, deduplication, delivery to your DB/S3/webhook
- **Monitoring setups** — daily fresh-postings feeds filtered to your criteria

#### 🔎 Explore more scrapers

More job-board and directory scrapers from the same author are available on my [Apify profile](https://apify.com/memo23) — including UK boards (CharityJob, Goodmoves, s1jobs, TotalJobs), business directories, and real-estate portals.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Bundesagentur für Arbeit (German Federal Employment Agency) or any of its subsidiaries or partner job boards. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available job listing pages — no authenticated endpoints, employer-only features, or content behind an arbeitsagentur.de login. Users are responsible for ensuring their use complies with arbeitsagentur.de's terms of use, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

arbeitsagentur scraper, scrape arbeitsagentur, arbeitsagentur api, bundesagentur für arbeit scraper, jobsuche scraper, german job board scraper, germany jobs api, scrape german jobs, jobbörse scraper, ausbildung scraper, apprenticeship data germany, german labour market data, job postings dataset germany, recruiting data germany, hiring trends germany, job market analytics, stellenangebote scraper, arbeitsagentur jobs export, Apify arbeitsagentur, indeed germany alternative scraper, stepstone alternative scraper

# Actor input Schema

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

Full arbeitsagentur.de URLs to crawl. Mix search and job-detail URLs in the same array if useful. When set, the search filters below are ignored.

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

Job title, skill, or profession — e.g. `Software`, `Pflege`, `Elektriker`. Leave empty to match all jobs.

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

City, region, or postcode — e.g. `Berlin`, `München`, `20095`. Leave empty for all of Germany.

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

Radius around the location in kilometres (the site supports up to 200). Only applied when a location is set.

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

What kind of offer to search: regular jobs, self-employment, apprenticeships (Ausbildung/Duales Studium), or internships/trainee positions.

## `publishedSinceDays` (type: `integer`):

Only return offers published in the last N days (site-side filter). Leave empty for all.

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

Working-time models to include. Allowed values: `full-time`, `part-time`, `shift-night-weekend`, `home-office`, `mini-job`. Leave empty for all.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each employer by discovering the company's website and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.

## `postedWithinHours` (type: `integer`):

Filters on each job's publication date after scraping. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age. Tip: the `Published within the last N days` filter above is applied by the site itself and is cheaper.

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

Hard cap on the number of jobs collected. Arbeitsagentur lists over a million offers across Germany; use this cap to limit billing.

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

Maximum number of job detail pages processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of job detail pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

arbeitsagentur.de serves server-rendered pages without heavy anti-bot — the default (automatic) Apify proxy works. Switch to RESIDENTIAL with country DE if you ever see repeated 403s.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.arbeitsagentur.de/jobsuche/suche?was=Software&wo=Berlin"
  ],
  "keyword": "Software",
  "location": "Berlin",
  "offerType": "job",
  "enrichEmails": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.arbeitsagentur.de/jobsuche/suche?was=Software&wo=Berlin"
    ],
    "keyword": "Software",
    "location": "Berlin",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "startUrls": ["https://www.arbeitsagentur.de/jobsuche/suche?was=Software&wo=Berlin"],
    "keyword": "Software",
    "location": "Berlin",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "startUrls": [
    "https://www.arbeitsagentur.de/jobsuche/suche?was=Software&wo=Berlin"
  ],
  "keyword": "Software",
  "location": "Berlin",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/arbeitsagentur-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Arbeitsagentur Scraper — German Federal Job Board",
        "description": "Scrape jobs from arbeitsagentur.de — Germany's federal job board with 1M+ offers. Full description, employer profile + website, coordinates, parsed salary, recruiter emails & phones, and the external apply URL. Jobs, Ausbildung, Praktikum. Any URL or keyword filters. JSON/CSV out.",
        "version": "0.0",
        "x-build-id": "BOsW7Kon7Xn40PUy2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~arbeitsagentur-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-arbeitsagentur-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~arbeitsagentur-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-arbeitsagentur-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~arbeitsagentur-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-arbeitsagentur-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Arbeitsagentur URLs",
                        "type": "array",
                        "description": "Full arbeitsagentur.de URLs to crawl. Mix search and job-detail URLs in the same array if useful. When set, the search filters below are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword (was)",
                        "type": "string",
                        "description": "Job title, skill, or profession — e.g. `Software`, `Pflege`, `Elektriker`. Leave empty to match all jobs."
                    },
                    "location": {
                        "title": "Location (wo)",
                        "type": "string",
                        "description": "City, region, or postcode — e.g. `Berlin`, `München`, `20095`. Leave empty for all of Germany."
                    },
                    "radiusKm": {
                        "title": "Search radius in km",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Radius around the location in kilometres (the site supports up to 200). Only applied when a location is set."
                    },
                    "offerType": {
                        "title": "Offer type",
                        "enum": [
                            "job",
                            "self-employment",
                            "apprenticeship",
                            "internship-trainee"
                        ],
                        "type": "string",
                        "description": "What kind of offer to search: regular jobs, self-employment, apprenticeships (Ausbildung/Duales Studium), or internships/trainee positions.",
                        "default": "job"
                    },
                    "publishedSinceDays": {
                        "title": "Published within the last N days",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only return offers published in the last N days (site-side filter). Leave empty for all."
                    },
                    "workingTime": {
                        "title": "Working time",
                        "type": "array",
                        "description": "Working-time models to include. Allowed values: `full-time`, `part-time`, `shift-night-weekend`, `home-office`, `mini-job`. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full-time",
                                "part-time",
                                "shift-night-weekend",
                                "home-office",
                                "mini-job"
                            ]
                        }
                    },
                    "enrichEmails": {
                        "title": "Enrich with employer contact emails (experimental, billed per email)",
                        "type": "boolean",
                        "description": "If enabled, tries to find a contact email for each employer by discovering the company's website and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.",
                        "default": false
                    },
                    "postedWithinHours": {
                        "title": "Only jobs published in the last N hours",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Filters on each job's publication date after scraping. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age. Tip: the `Published within the last N days` filter above is applied by the site itself and is cheaper."
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of jobs collected. Arbeitsagentur lists over a million offers across Germany; use this cap to limit billing.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of job detail pages processed in parallel.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of job detail pages processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "arbeitsagentur.de serves server-rendered pages without heavy anti-bot — the default (automatic) Apify proxy works. Switch to RESIDENTIAL with country DE if you ever see repeated 403s.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
