Arbeitsagentur Jobs Scraper — BA Jobsuche Germany
Pricing
from $0.60 / 1,000 job listings
Arbeitsagentur Jobs Scraper — BA Jobsuche Germany
Scrape Arbeitsagentur / Bundesagentur für Arbeit job listings (Germany Jobsuche). Search by keyword, location, filters, search URLs, or job-detail URLs. Export title, employer, city, contacts, contract type, salary notes, full description, and application links. Fast HTTP API — no browser.
Pricing
from $0.60 / 1,000 job listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
21 hours ago
Last modified
Categories
Share
Arbeitsagentur Jobs Scraper — Bundesagentur für Arbeit / Germany Jobsuche
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by Bundesagentur für Arbeit or its affiliates. Data is read from publicly accessible pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
Contact-data controls: Phone/WhatsApp/fax and email fields are omitted from the dataset by default. Enable
includePhonesand/orincludeEmailsonly for contacts already published on public pages and only when you have a lawful basis. Any contact-field examples below assume that explicit opt-in; otherwise those fields are absent.
Scrape German job listings from the official Arbeitsagentur / Bundesagentur für Arbeit Jobsuche portal — a practical Arbeitsagentur API alternative. Search by keyword (was), location (wo), advanced filters, portal search start URLs, or job-detail URLs. Export structured JSON with title, employer, city, occupation, contract type, salary notes, application email/phone when published, full description, home-office flags, and external application URLs — fast HTTP Jobsuche API scraping, no headless browser. Use from Python, Node.js, cURL, or Apify MCP / AI assistants.
Ideal for Germany job board aggregation, labor-market research, recruiting intelligence, employer lead generation, and BA Jobbörse data pipelines.
Crawloop DACH Jobs Suite — BA public Jobsuche + Kununu employer intelligence + Stepstone commercial board.
| Arbeitsagentur (BA) | Kununu (employer intel) | Stepstone (commercial board) |
|---|---|---|
| Arbeitsagentur Jobs Scraper ◄── you are here | Kununu Scraper | Stepstone Jobs Scraper |
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 or a job-detail URL (
/jobsuche/jobdetail/{refnr}) - Parsed salary —
salaryMin/salaryMax/salaryPeriodfrom the portal range (gehaltsspanne), fixed pay, apprenticeship year pay, or amounts in the description. Tariff text such as TV-L stays a note, not a fake number - Ausbildung fields — training type, required education, study form/program, and pay for apprenticeship years 1–4 when the portal publishes them
- Full job details — optional detail fetch for Stellenbeschreibung, employer website/industry/size, and contacts when published
- Flattened location + contacts —
city/ PLZ in the dataset table; email/phone from the API or the description text when published - Multi-site workplaces —
locationslists every office;cityis the first one (not always the search city) - Monitor mode — scheduled runs emit new, updated, or removed
refnr. Removed is emitted only after a full scan of that same query (not cut off bymaxItems). The first complete scan is the baseline - 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 |
| Scheduled monitoring | monitorMode on an Apify Schedule — only new or changed listings after the baseline run |
| 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 (
monitorModefor deltas)
When not to use this Actor
- Resume/CV database or candidate profiles — this Actor reads public job/employer listings only and does not collect resumes.
- Non-German job portals — this Actor covers Arbeitsagentur / Bundesagentur für Arbeit only
- Guaranteed email or phone — contacts are extracted when the API or description publishes them; many listings still omit them and only have
externalApplicationUrl - Historical archives — only currently published Jobsuche results
- Private / authenticated BA services — public Jobsuche listings only
Quick Start
Keyword + city:
{"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:
{"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"}}
Single job-detail URL:
{"startUrls": [{"url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12117-YF-48852-YF-S"}],"fetchDetails": true}
Scheduled monitor (new + updated only):
{"position": "Pflegefachkraft","location": "Berlin","maxItems": 200,"fetchDetails": true,"monitorMode": true,"monitorStoreName": "ba-pflege-berlin","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 and/or job-detail URLs (/jobsuche/jobdetail/{refnr}) |
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) |
publishedWithinHours | Integer | — | Same day-grained portal filter. 1–24 hours means the last day. The tighter of hours and days wins |
bundesland | String | — | Federal state, used as location only when location is empty |
entryFrom | String | — | Start month YYYY-MM, mapped to the portal entry-date bucket |
excludeExternalJobs | Boolean | false | Drop partner-board syndications |
remoteOnly | Boolean | false | Only 100% home-office jobs (homeoffice=prozentual_100) |
remotePercentageMin | Integer | — | 50 or 100. Ignored when remoteOnly is true |
searches | Array | — | Several {position, location, radiusKm} pairs in one run |
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 |
careerChangeSuitable | Boolean | false | Only career-change suitable listings (quereinstieg) |
sort | String | relevance | relevance, date (newest), distance |
monitorMode | Boolean | false | Emit new, updated, or removed jobs. Removed needs a full scan (maxItems 0 or above the result count) |
monitorStoreName | String | arbeitsagentur-jobs-monitor | Named KV store for seen refnr + dates |
resetMonitorState | Boolean | false | Wipe the monitor cache (new baseline) |
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 |
employerWebsite | String | Employer homepage when the portal publishes it (often empty) |
employerIndustry / employerFirmSize | String | Branche and Betriebsgröße from details when present |
city / postalCode / region | String | First workplace on the listing (not always the search city) |
latitude / longitude | Number | Primary workplace coordinates |
occupation | String | Primary occupation (Hauptberuf) |
alternativeOccupations | Array | Related occupation labels |
offerType / offerTypeLabel | String | Portal code and English label, e.g. ARBEIT / Employment |
contractType / contractTypeLabel | String | e.g. BEFRISTET / Fixed-term |
contractMonths | Integer | Fixed-term length in months (if present) |
salaryNote | String | Portal salary code (JAHRESGEHALT, STUNDENLOHN, KEINE_ANGABEN, …) |
salaryMin / salaryMax / salaryCurrency / salaryPeriod | Number / String | Parsed range. salaryPeriod is year, month, hour, week, day, or tariff |
salary | Object | Same values as original, min, max, currency, period |
trainingType / apprenticeshipPay | String / Object | Ausbildung type and pay for years 1–4 |
requiredEducation / requiredEducationLabel | String | Portal education code and English label |
studyForm / studyProgram | String | Study form and program when published |
homeOfficePercent | Number | Home-office share when the portal publishes it |
publishedAt / modifiedAt / startDate / validUntil | String | Portal dates. validUntil is the end of the publication window when present |
externalApplicationUrl | String | External apply link when provided |
applicationEmail / applicationPhone | String | First published contact. Also applicationEmails / applicationPhones for every match. Omitted unless includeEmails / includePhones is on. contactName follows the same opt-in |
homeOfficePossible / homeOfficeType | Boolean / String | Remote-work flags |
workingTime | Object | Full-time / part-time / shift flags |
location / locations | Object / Array | First workplace object, plus every office on multi-site ads |
isTemporaryAgency / isPrivatePlacement / isMiniJob | Boolean | Listing flags |
searchWas / searchWo | String | Search keywords / location used |
changeType | String | new, updated, or removed when monitorMode is on |
distanceKm | Number | Distance from the search place when the portal sends it |
scrapedAt | String | ISO timestamp |
Output Example
{"refnr": "12117-YF-48852-YF-S","url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12117-YF-48852-YF-S","title": "Softwareentwickler (m/w/d)","employer": "bayoonet AG","employerWebsite": null,"city": "München","postalCode": "80331","region": "BAYERN","occupation": "Softwareentwickler/in","offerType": "ARBEIT","contractType": "KEINE_ANGABE","salaryNote": "JAHRESGEHALT","salaryMin": 42000,"salaryMax": 60000,"salaryCurrency": "EUR","salaryPeriod": "year","offerTypeLabel": "Employment","publishedAt": "2026-08-19","applicationEmail": "jobs@bayoo.net","applicationPhone": "+49 (0) 61 518618-333","externalApplicationUrl": "https://www.yourfirm.de/job/detail/YF-48852/","homeOfficePossible": false,"workingTime": {"fullTime": true,"partTimeMorning": false,"partTimeAfternoon": false,"partTimeEvening": false,"partTimeFlexible": false,"shiftNightWeekend": false},"locations": [{ "city": "München", "postalCode": "80331", "region": "BAYERN" },{ "city": "Köln", "postalCode": "50667", "region": "NORDRHEIN_WESTFALEN" },{ "city": "Berlin", "postalCode": "10115", "region": "BERLIN" }],"searchWas": "Softwareentwickler","searchWo": "Berlin","scrapedAt": "2026-08-24T14:23:23+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. When the listing publishes them (API field or description text), they appear as applicationEmail / applicationPhone. Many ads only expose externalApplicationUrl. employerWebsite is often empty.
Why isn’t city the same as my search location?
city is the first workplace on the ad. Multi-site listings put every office in locations — a Berlin search can return a job whose first city is München if Berlin is still in locations. searchWo is the query you ran.
Can I paste a job-detail URL?
Yes. A /jobsuche/jobdetail/{refnr} start URL fetches that one listing instead of running a keyword search (searchWas / searchWo stay empty on that path).
What is monitor mode?
With monitorMode: true, each refnr plus its modification (or publish) date is stored in a named Key-Value store. The first complete scan of a query is the baseline (changeType: new). Later scheduled runs push new and updated listings. A listing that disappeared is changeType: removed, and only when that run scanned the whole portal result for the same filters. Set maxItems to 0 (or above the result count) so the scan is not cut off. An empty response does not mark the previous watch as removed. Use a distinct monitorStoreName per watch. resetMonitorState clears the cache.
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).
Why did a run succeed with 0 jobs?
The filters matched nothing, or the first proxy IP was blocked and retries still found zero listings. Empty searches succeed (they are not Actor failures). Broaden keywords or location if you expected results.
Limitations
- Unofficial use of the public Jobsuche API; endpoints may change
- Result volume per query can be capped by the portal
- Many ads still publish no euro amount (
salaryNotestaysKEINE_ANGABENandsalaryMinis empty). Tariff lines such as Entgeltgruppe TV-L are labeledsalaryPeriod: tariffand are not turned into a number. Contract type may still beKEINE_ANGABE employerWebsiteis frequently empty; preferexternalApplicationUrland description contactscityis the first listed workplace, not a guarantee it equalslocation/searchWo
Integration examples
Node.js
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
from apify_client import ApifyClientclient = 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
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. 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, city, applicationEmail, 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"
- "Scrape Arbeitsagentur Pflege Berlin, take unique employers, enrich via Kununu Scraper"
- "Run Arbeitsagentur Jobs Scraper daily in monitorMode for Pflegefachkraft in Berlin and return only new or updated jobs"
Suite next step
Enrich discovered employers with Kununu Scraper (scores, reviews, salaries, jobs-with-score). For commercial DACH board volume beyond BA, use Stepstone Jobs Scraper. For DACH B2B company directories (suppliers, not job ads), see WLW Scraper or Europages Scraper.
Related Actors
| Actor | Focus |
|---|---|
| Arbeitsagentur Jobs Scraper ◄── you are here | Germany BA Jobsuche job listings |
| LinkedIn Jobs Scraper | Public LinkedIn job listings |
| Upwork Jobs Scraper | Freelance job listings and monitor |
| Seek Jobs Scraper | Australia and New Zealand jobs |
| Kununu Scraper | DACH employer scores / reviews / salaries / jobs-with-score |
| Stepstone Jobs Scraper | Commercial DACH Stepstone listings |
| WLW Scraper | DACH B2B supplier directory |
| Europages Scraper | European B2B company directory |