Arbeitsagentur Jobs Scraper: Germany's Federal Job Board avatar

Arbeitsagentur Jobs Scraper: Germany's Federal Job Board

Pricing

from $0.65 / 1,000 jobs

Go to Apify Store
Arbeitsagentur Jobs Scraper: Germany's Federal Job Board

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

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

10 days ago

Last modified

Share

400 Arbeitsagentur jobs from Hamburg and Munich in 10 seconds

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.

Run it on Apify

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 includeDescription for 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 OUTPUT record 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

ParameterTypeDefaultWhat it does
keywordsarray 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.
locationsarray of stringsemptyTowns, 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).
radiusKminteger25Distance around each location, 0 to 200 km. Ignored without a location.
offerTypestringjobjob, apprenticeship (Ausbildung and duales Studium), internship (Praktikum and trainee), self_employment or any.
workingTimearrayanyAny of full_time, part_time, shift_night_weekend, minijob.
contractTypestringanyany, permanent or fixed_term. Ads that do not say are left out by either choice.
postedWithinDaysintegeranyOffers published in the last N days, 0 to 100 (0 is today).
employerstringemptyOnly offers from this employer, written as the job board shows it.
excludeTempAgenciesbooleanfalseLeave out temporary staffing agencies (Zeitarbeit).
excludePrivateRecruitersbooleanfalseLeave out offers placed by private recruitment agencies.
maxJobsinteger100Upper limit per search (one keyword in one location), 20 to 10,000. The job board serves the first 10,000 results of a search.
includeDescriptionbooleanfalseAdds the full ad text, application emails and links, the temp agency and private recruiter flags and the source site. One extra request per offer.
onlyNewJobsbooleanfalseSkips 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):

FieldFilledWhy not always
job_id, title, company, occupation, offer_type, location, region, country, latitude, longitude, start_date, posted_at, job_url100%
working_time97%A few ads give no working time.
postal_code90%Some ads name only the town.
employer_id75%Offers fed in from partner sites often carry none.
contract_type69%Many ads do not say permanent or fixed term.
street42%Only when the employer publishes the workplace address.
salary_text, salary_min, salary_max, salary_period39%Only when the ad states pay.
remote_possible33%Only when the ad says whether home office is possible.
external_url24%Offers that live on an employer or partner site.
anonymous_ad_code18%Anonymous (Chiffre) ads.
description, partner_site100% of 100With includeDescription on.
private_recruiter, temp_agency85%, 72% of 100With includeDescription on, when the board knows.
contact_emails44% of 100Only 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:

FieldMeaning
job_idReference number of the offer, for example 10001-1003644689-S
titleTitle as published
companyEmployer as published
occupationMain occupation the offer is filed under
occupationsEvery occupation the offer is filed under
offer_typejob, apprenticeship, internship or self_employment
countryCountry of the workplace, for example Germany
country_codeDE, AT and so on
start_dateEarliest start date, YYYY-MM-DD
posted_atDate first published, YYYY-MM-DD
updated_atLast change to the offer
job_urlThe offer on arbeitsagentur.de
search_rankPosition of the offer in its search
scraped_atWhen 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.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
job-scrapedOnce 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-startOnce 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"

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

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

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.