Arbeitsagentur Jobs Scraper: Germany's Federal Job Board
Pricing
from $0.65 / 1,000 jobs
Arbeitsagentur Jobs Scraper: Germany's Federal Job Board
Scrape jobs, apprenticeships and internships from the Bundesagentur für Arbeit job board (Jobsuche) by keyword, city and radius: title, employer, address with coordinates, pay when published, working time, contract, dates, link and optional full description. No login.
Pricing
from $0.65 / 1,000 jobs
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Why choose this actor?
- Germany's largest job board, read through its own public API. The Bundesagentur für Arbeit Jobsuche listed 1,023,322 offers on 6 October 2026 (829,510 jobs and 176,084 apprenticeships among them), from big employers, small firms and staffing agencies alike. Our final test run returned 400 of 400 jobs (nurses and electricians in Hamburg and Munich) in 10 seconds, every request answered on the first try.
- Pay, place and contract as data, not prose. Every row has the employer, town, postcode, state and map coordinates; the pay in numbers when the ad publishes it (39% of rows in our test, hourly or yearly); the working time, contract type, start date and publication date.
- No login, no cookies, nothing to set up, and you only pay for jobs you receive. A search with no results, a job already delivered for another keyword in the same run and, with
onlyNewJobs, a job an earlier run already gave you are never charged.
Part of The Mine Works Jobs and hiring family: Foundit Monster India Jobs, Hirist Jobs Scraper, India Jobs MCP, Naukri Jobs Scraper, Shine.com Jobs Scraper, Internshala Scraper.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns 20 software developer jobs in Berlin in a few seconds:
{"keywords": ["Softwareentwickler"],"locations": ["Berlin"],"maxJobs": 20}
keywords takes job titles or skills, one per line, in German or English as you would type them on the job board (Pflegefachkraft, Elektriker, Data Scientist). locations takes towns, postcodes or regions (Hamburg, 80331, Köln); each keyword is searched in each location within radiusKm. Leave locations empty for all of Germany, or keywords empty for every offer in a place.
On Apify's free plan every run returns the first 10 results as a preview, so you can check the data and the fields before you pay. A paid Apify plan returns every result: https://apify.com/pricing?fpr=ymnoit
Copy to your AI assistant
themineworks/arbeitsagentur-jobs-scraper on Apify. Scrapes jobs, apprenticeships and internships from the German Federal Employment Agency job board (Bundesagentur für Arbeit Jobsuche), one row per offer with title, employer, town, postcode, state, coordinates, pay in numbers when published, working time, contract type, start and publication dates and link, with an optional full description. Call ApifyClient("TOKEN").actor("themineworks/arbeitsagentur-jobs-scraper").call(run_input={"keywords": ["Pflegefachkraft"], "locations": ["Hamburg"], "maxJobs": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: none (default keywords ["Softwareentwickler"], all of Germany). Optional: keywords (list; empty list = every offer), locations (list of towns, postcodes or regions; empty = all of Germany), radiusKm (default 25, 0 to 200), offerType ("job" default, "apprenticeship", "internship", "self_employment", "any"), workingTime (list of "full_time", "part_time", "shift_night_weekend", "minijob"), contractType ("any", "permanent", "fixed_term"), postedWithinDays (0 to 100), employer (exact employer name), excludeTempAgencies (default false), excludePrivateRecruiters (default false), maxJobs (default 100, 20 to 10000 per search), includeDescription (default false), onlyNewJobs (default false). Full spec: GET https://api.apify.com/v2/acts/themineworks~arbeitsagentur-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- 45 fields per offer, 7 more with descriptions: reference number, title, employer and anonymous employer key, main and all occupations, offer type, town, postcode, district, street, state, country and coordinates, distance from your location, pay text with minimum, maximum, currency, period and type, apprenticeship pay per training year, working time, contract type and length, home office, career changers welcome, start date, publication and change dates, anonymous ad code, the partner site link and the job page link.
- Full description on demand: switch on
includeDescriptionfor the complete ad text, the email addresses and web links the ad publishes for applications, whether a temporary staffing agency or a private recruiter placed it, and the site it came from. - Every filter of the job board: offer type (jobs, apprenticeships and dual study, internships and trainee programmes, self employment), radius from 0 to 200 km, working time, permanent or fixed term, days since publication, one employer, and no temp agencies or no private recruiters.
- From 20 to 10,000 offers per search, 100 per page. Each keyword in each location is its own search; three run at a time. Our depth test read 1,000 sales jobs across Germany in 26 seconds.
- Only new jobs on a schedule: with
onlyNewJobs, a daily run returns and charges only offers it has not delivered before. - A run summary you can audit: the
OUTPUTrecord lists every search's status, the total the job board reports, pages read, attempts, duplicates and the success rate of every request type.
How to use it
Basic: one keyword in one city
{"keywords": ["Elektriker"],"locations": ["Hamburg"],"maxJobs": 100}
Several keywords in several cities
Each keyword runs in each location: this input is 4 searches of up to 100 offers, 400 jobs in all (our final test run, 10 seconds):
{"keywords": ["Pflegefachkraft", "Elektriker"],"locations": ["Hamburg", "München"],"maxJobs": 100}
Job: daily new job alerts
Offers published today or yesterday, only those not delivered before. Save it as a task and add a daily schedule (Console > Schedules); each run returns and charges only the new offers. In our test, a second run of a cook search in Leipzig (published within 7 days) found the same 16 offers as the first, delivered none and charged no job.
{"keywords": ["Koch"],"locations": ["Leipzig"],"postedWithinDays": 1,"onlyNewJobs": true,"maxJobs": 200}
Job: apprenticeship and dual study places for a school or career portal
offerType: "apprenticeship" returns Ausbildung and duales Studium places, with training_type, study_form, the degree programme and the apprenticeship pay per training year when the employer publishes it:
{"keywords": ["Kaufmann", "Mechatroniker"],"locations": ["Köln"],"radiusKm": 30,"offerType": "apprenticeship","maxJobs": 200}
Job: direct employers only, with the full ad text and application emails
Leave out temporary staffing agencies and private recruiters, and read the whole ad. contact_emails holds the addresses the ad itself publishes for applications (44% of the 100 ads in our description test):
{"keywords": ["Buchhalter"],"locations": ["Berlin"],"excludeTempAgencies": true,"excludePrivateRecruiters": true,"includeDescription": true,"maxJobs": 100}
Job: hiring activity of one employer, or in one region
Leave keywords empty and name an employer, then count by location or occupation. Or name a region and count by company:
{"keywords": [],"employer": "Deutsche Bahn AG","offerType": "any","maxJobs": 5000}
Job: part time and minijob offers near a postcode
{"keywords": ["Verkäufer"],"locations": ["50667"],"radiusKm": 10,"workingTime": ["part_time", "minijob"],"maxJobs": 300}
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
keywords | array of strings | ["Softwareentwickler"] | Job titles or skills, one per line. Each is its own search in every location. An empty list returns every offer that matches the other filters. |
locations | array of strings | empty | Towns, postcodes or regions, one per line. Each is its own search within radiusKm. Empty means all of Germany (the board also lists some offers abroad). |
radiusKm | integer | 25 | Distance around each location, 0 to 200 km. Ignored without a location. |
offerType | string | job | job, apprenticeship (Ausbildung and duales Studium), internship (Praktikum and trainee), self_employment or any. |
workingTime | array | any | Any of full_time, part_time, shift_night_weekend, minijob. |
contractType | string | any | any, permanent or fixed_term. Ads that do not say are left out by either choice. |
postedWithinDays | integer | any | Offers published in the last N days, 0 to 100 (0 is today). |
employer | string | empty | Only offers from this employer, written as the job board shows it. |
excludeTempAgencies | boolean | false | Leave out temporary staffing agencies (Zeitarbeit). |
excludePrivateRecruiters | boolean | false | Leave out offers placed by private recruitment agencies. |
maxJobs | integer | 100 | Upper limit per search (one keyword in one location), 20 to 10,000. The job board serves the first 10,000 results of a search. |
includeDescription | boolean | false | Adds the full ad text, application emails and links, the temp agency and private recruiter flags and the source site. One extra request per offer. |
onlyNewJobs | boolean | false | Skips offers an earlier run of this actor in your account already delivered. For schedules. |
What data do you get?
One row per offer. An offer found by two keywords or in two locations is delivered once.
The offer: job_id (the board's reference number), title, company, employer_id, occupation, occupations, offer_type, training_type, study_form, study_program, anonymous_ad_code, external_url, job_url.
Where: location, postal_code, district, street, region (German state or Austrian province), country, country_code, latitude, longitude, locations (every workplace when there are several), distance_km (from your location).
Pay: salary_text, salary_min, salary_max, salary_currency, salary_period (hour, month or year), salary_type (range, fixed or apprenticeship_pay), training_pay_per_year.
Terms and dates: working_time, contract_type, contract_months, remote_possible, remote_type, career_changers_welcome, start_date, posted_at, published_until, updated_at.
With includeDescription: description (the ad text as the employer wrote it), contact_emails, links_in_description, temp_agency, private_recruiter, partner_site, partner_url, and description_error on the rare row whose details could not be read.
The search: search_keyword, search_location, search_rank, scraped_at.
How full the fields were in our final test runs (400 jobs in Hamburg and Munich; descriptions for 100 jobs in Berlin):
| Field | Filled | Why not always |
|---|---|---|
job_id, title, company, occupation, offer_type, location, region, country, latitude, longitude, start_date, posted_at, job_url | 100% | |
working_time | 97% | A few ads give no working time. |
postal_code | 90% | Some ads name only the town. |
employer_id | 75% | Offers fed in from partner sites often carry none. |
contract_type | 69% | Many ads do not say permanent or fixed term. |
street | 42% | Only when the employer publishes the workplace address. |
salary_text, salary_min, salary_max, salary_period | 39% | Only when the ad states pay. |
remote_possible | 33% | Only when the ad says whether home office is possible. |
external_url | 24% | Offers that live on an employer or partner site. |
anonymous_ad_code | 18% | Anonymous (Chiffre) ads. |
description, partner_site | 100% of 100 | With includeDescription on. |
private_recruiter, temp_agency | 85%, 72% of 100 | With includeDescription on, when the board knows. |
contact_emails | 44% of 100 | Only when the ad text gives an email address. |
Stable fields for automations
These fields were present in every row of our test runs and their names will not change:
| Field | Meaning |
|---|---|
job_id | Reference number of the offer, for example 10001-1003644689-S |
title | Title as published |
company | Employer as published |
occupation | Main occupation the offer is filed under |
occupations | Every occupation the offer is filed under |
offer_type | job, apprenticeship, internship or self_employment |
country | Country of the workplace, for example Germany |
country_code | DE, AT and so on |
start_date | Earliest start date, YYYY-MM-DD |
posted_at | Date first published, YYYY-MM-DD |
updated_at | Last change to the offer |
job_url | The offer on arbeitsagentur.de |
search_rank | Position of the offer in its search |
scraped_at | When the offer was read, ISO 8601 UTC |
Output examples
Real rows from our test runs on 6 October 2026; long texts are trimmed.
An electrician job in Hamburg with a yearly salary:
{"job_id": "12382-2026-97340002-S","title": "Elektriker (m/w/d)","company": "Dahmen GmbH Hamburg","employer_id": "fUvb4vHaVdR6c948dRDfUvk2VkuNDmlepTM1J5EVA9k=","occupation": "Bauelektriker/in","occupations": ["Bauelektriker/in"],"offer_type": "job","location": "Hamburg","postal_code": "22761","street": "Bahrenfelder Marktplatz","region": "Hamburg","country": "Germany","country_code": "DE","latitude": 53.5642585,"longitude": 9.9001742,"distance_km": 6,"salary_text": "EUR 44,000 per year","salary_min": 44000,"salary_max": 44000,"salary_currency": "EUR","salary_period": "year","salary_type": "fixed","working_time": ["full_time"],"contract_type": "permanent","remote_possible": false,"career_changers_welcome": false,"start_date": "2026-10-01","posted_at": "2026-09-01","updated_at": "2026-10-01T13:41:39.124","anonymous_ad_code": "9734-2","job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/12382-2026-97340002-S","search_keyword": "Elektriker","search_location": "Hamburg","search_rank": 13,"scraped_at": "2026-10-05T21:41:34.458Z"}
An apprenticeship near Cologne with pay for each training year:
{"job_id": "10001-1003634235-S","title": "Mechatroniker (m/w/d)","company": "Rhein-Erft Akademie GmbH","occupation": "Mechatroniker/in","offer_type": "apprenticeship","training_type": "apprenticeship","location": "Hürth, Rheinland","postal_code": "50354","street": "Industriestr. 149","region": "Nordrhein-Westfalen","country": "Germany","country_code": "DE","latitude": 50.8637398,"longitude": 6.872226,"distance_km": 12,"salary_text": "EUR 1,229 / 1,343 / 1,418 / 1,515 per month (training year 1 to 4)","salary_min": 1229,"salary_max": 1515,"salary_currency": "EUR","salary_period": "month","salary_type": "apprenticeship_pay","training_pay_per_year": [1229, 1343, 1418, 1515],"working_time": ["full_time"],"start_date": "2027-08-01","posted_at": "2026-09-01","job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003634235-S","search_keyword": "Mechatroniker","search_location": "Köln","search_rank": 4}
A bookkeeping job in Berlin with includeDescription on (the description is trimmed here; the row holds all of it):
{"job_id": "10000-1207636788-S","title": "Buchhalter/in (m/w/d)","company": "Aurum GmbH & Co. KG","occupation": "Buchhalter/in","occupations": ["Buchhalter/in", "Finanzbuchhalter/in", "Steuerfachangestellte/r"],"offer_type": "job","location": "Berlin","postal_code": "10719","street": "Joachimsthaler Str. 12","region": "Berlin","country_code": "DE","working_time": ["full_time", "part_time_morning", "part_time_afternoon"],"contract_type": "permanent","remote_possible": true,"remote_type": "by_arrangement","start_date": "2026-09-29","posted_at": "2026-08-24","job_url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10000-1207636788-S","description": "Wir sind eine mittelgroße Steuerberatungsgesellschaft mit Sitz am Kurfürstendamm in Berlin und beschäftigen gegenwärtig rund 20 Mitarbeiter in den Bereichen Steuerberatung und Unternehmensberatung. ...","contact_emails": ["info@aurum-steuer.de"],"links_in_description": ["https://www.aurum-steuer.de"],"temp_agency": false,"private_recruiter": false,"partner_site": "arbeitsagentur.de","partner_url": "http://www.arbeitsagentur.de"}
Pricing
Pay per event: you pay for the job rows you receive, plus a flat $0.005 per run, whatever memory you choose.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
job-scraped | Once per offer row stored in your dataset | $0.65 per 1,000 | $0.65 per 1,000 | $0.65 per 1,000 | $0.65 per 1,000 |
run-start | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |
The price per single offer is the price per 1,000 divided by 1,000. An offer with the full description costs the same as one without.
Free plan runs return up to 10 results each; paid plans have no cap.
Never charged:
- search pages the job board did not answer;
- searches with no results;
- an offer already delivered earlier in the same run (found by another keyword or in another location);
- with
onlyNewJobs, an offer an earlier run already delivered to you; - the info row at the end of a run;
- anything past your "Max cost per run": the actor stops delivering when your limit is reached instead of sending rows for free.
FAQ
What exactly does this actor read?
The Jobsuche of the Bundesagentur für Arbeit (Federal Employment Agency), Germany's public job board at arbeitsagentur.de. It reads the same public search and job details the job board's own pages load, through the agency's public REST API, with the public key the job board itself sends. Nothing is read behind a login.
How many offers can I get?
Up to 10,000 per search (one keyword in one location), 100 per page; the job board does not serve results past the first 10,000 of a search. For more, split a search by location, by offerType or by postedWithinDays. Each keyword in each location is its own search.
What do I get on the free plan?
Every run on Apify's free plan returns the first 10 results, so you can check the data and the fields before you pay. A paid Apify plan returns every result, up to the limit you set.
How long does a run take?
Without descriptions, one request brings up to 100 offers: 400 jobs from 4 searches took 10 seconds in our final test, and 1,000 sales jobs from one search took 26 seconds. With descriptions each offer needs one more request, eight at a time: 100 offers took 16 seconds.
How fresh is the data?
Every run reads the job board live. posted_at is the day the offer was first published and updated_at its last change. Use postedWithinDays for recent offers only, and onlyNewJobs with a schedule for alerts.
Which offers does it cover?
Everything the Jobsuche lists: jobs (Arbeit), apprenticeships and dual study places (Ausbildung, duales Studium), internships and trainee programmes, and self employment offers. Many offers come in from partner job sites; those rows carry an external_url and, with descriptions on, the partner_site they came from. A small share of offers are in Austria or other countries; country_code tells you where.
Does it give employer contact details?
Only what the ad itself publishes for applications. With includeDescription on, contact_emails lists the email addresses written in the ad text (usually an application inbox such as bewerbung@ or jobs@) and links_in_description the web links in it. The contact panel the job board shows behind a CAPTCHA is not read, and the actor never solves a CAPTCHA.
How is the pay read?
From the job board's own pay fields, not from the ad text: a range (salary_type: "range"), a single figure (fixed) or, for apprenticeships, the monthly pay per training year (apprenticeship_pay, with every year in training_pay_per_year). salary_period says whether the amount is per hour, month or year, as the employer entered it. Ads without pay fields have no pay columns.
Do I need an account, cookies or a proxy?
No account, no cookies and nothing to set up. The actor reads the public API over Apify's datacenter proxy. In our test runs all 143 requests (23 search pages and 120 job details) were answered on the first try.
What if an offer is taken down while the run reads it?
The row is still delivered with everything from the search, and description_error says the details could not be read. In our description test all 100 of 100 were read.
Can I monitor new offers over time?
Yes. Turn on onlyNewJobs, set postedWithinDays to 1 or 2, save the input as a task and add a daily schedule. Each run delivers and charges only offers no earlier run of this actor in your account has delivered. The list of delivered offers is kept in a key value store in your account.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and an HTML table, from the run's dataset in Console or through the API.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
- Connector URL: https://mcp.apify.com/?tools=themineworks/arbeitsagentur-jobs-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http arbeitsagentur-jobs-scraper "https://mcp.apify.com/?tools=themineworks/arbeitsagentur-jobs-scraper"
Is it legal to scrape the Arbeitsagentur job board?
The actor reads only offers the job board shows publicly to anyone, through the public API its own pages use. Ads can name a contact person or an address; you are responsible for how you use the data, for the job board's terms and for data protection law such as the GDPR (DSGVO) and the CCPA. If in doubt, ask a lawyer about your use case.
Integrations
- Google Sheets: send each run's rows to a sheet with Apify's Google Sheets integration, or import the CSV link of the dataset.
- Make, Zapier and n8n: start the actor and read its dataset with the Apify apps and nodes, for example "new nursing jobs in Hamburg to Slack every morning".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
Jobs and hiring
- Foundit Monster India Jobs
- Hirist Jobs Scraper
- India Jobs MCP
- Naukri Jobs Scraper
- Shine.com Jobs Scraper
- Internshala Scraper
- Indeed Jobs Scraper
- Instahyre Jobs Scraper
- Apna Jobs Scraper
- CutShort Jobs Scraper
- LinkedIn Jobs Scraper
- Recruiting & Jobs MCP
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a search that should return offers and does not? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For another job site, a new source or a field you need, email dmineworks@gmail.com.
Search Germany's federal job board by keyword, place, radius and every filter it offers, and get each job, apprenticeship or internship back as a clean row with its pay, place and dates as data.

