Arbeitsagentur Jobs: German Job Board Search by City & Radius
Pricing
from $0.70 / 1,000 job ad returneds
Arbeitsagentur Jobs: German Job Board Search by City & Radius
Job ads from Germany's federal employment agency board as rows: reference, title, occupation, employer, city, postcode, region, coordinates, start date, publication and update dates, ad URL. Filter by occupation, place and radius, home office, part time, apprenticeships, publication window.
Pricing
from $0.70 / 1,000 job ad returneds
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Share
Job ads from Germany's federal employment agency board as rows: reference, title, occupation, employer, city, postcode, region, coordinates, start date, publication and update dates, ad URL. Filter by occupation, place and radius, home office, part time, apprenticeships, publication window.
Every row is one open position on the public job search of the Bundesagentur für Arbeit, Germany's federal employment agency — the board where employers, public bodies and regional institutions publish their vacancies themselves. Search it by occupation and commuting radius and get a table instead of a browser tab: reference number, title, occupation, employer, city, postcode, federal state, coordinates, distance, working time, contract, start date, first publication and last edit, plus the ad page. No API key, no proxy, no browser — the actor reads the same pages a visitor gets.
Need it tailored to your workflow? Missing a field, a filter, another source or a different output format? Open an issue and describe what you need — we read every request and adapt the actor.
Use cases
- Regional sourcing by occupation: all nursing, driving or engineering ads within a commute of one city, with distance per row, so a recruiter works one market at a time.
- Ausbildung places for schools and portals: set the kind of position to apprenticeship and get the dual-training market of a region — a category an ordinary job search never shows.
- Home-office segment of a city: keep only ads the employer marked as home office possible, instead of guessing from keywords in the title.
- Direct employers only: switch staffing agencies and private placement off and see which share of a shortage occupation is hired for in house.
- A daily feed of new ads for a region: no occupation, one city, a one-day publication window,
onlyNewon and a schedule — every run reports the ads added since the last one. - Re-checking a saved shortlist: paste the reference numbers you collected and see which ads are still open; a filled or withdrawn ad comes back with
found: false.
Input
Nothing is required: an empty input reads the newest ordinary job ads in all of Germany.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
what | string | empty | Occupation, job title or free term, handed to the board's own search exactly as typed (Krankenpfleger, Berufskraftfahrer). German terms find far more than English ones. Empty = every occupation. |
referenceNumbers | string[] | empty | Up to 50 board reference numbers (10001-1003891446-S); a whole ad URL is reduced to its number. Turns the run into a shortlist re-check and switches the search filters off. |
where | string | empty | City, district, postcode or federal state (Hamburg, München, 10115, Nordrhein-Westfalen). Empty = all of Germany, and then the radius is ignored. See Places. |
radiusKm | integer | 25 | 0–200 km around the place, passed to the board as it stands. 0 keeps the place itself. A radius returns the whole commuting area. |
offerType | string | job | One of job, training, internship, selfEmployment — see Kind of position. Strict list. |
workingTime | string[] | empty | Any of fullTime, partTime, homeOffice, shiftNightWeekend, miniJob — see Working time. Several values widen the result. Strict list. |
contractType | string | any | any, permanent, temporary — see Contract. Strict list. |
employer | string | empty | Keep only one employer's ads. The board matches the full registered name (Da Vinci Engineering GmbH), not a part of it. |
includeTempAgencies | boolean | true | false removes ads placed by temporary staffing firms (Zeitarbeit). |
includePrivateRecruiters | boolean | true | false removes ads placed by private placement agencies on behalf of an unnamed client. |
publishedWithinDays | integer | empty | 0–100: keep only ads first published within that many days. The window moves with every run, so a scheduled task never needs editing. |
onlyNew | boolean | false | Remember what this input returned and write only new or edited ads next time. The first run writes everything. |
includeDescription | boolean | false | Add description (the advert text) and employerAddress by reading each ad's own page — one extra request per row. |
sort | string | newest | newest, relevance, startDate, distance — see Sort orders. Decides which ads the row cap keeps. Strict list. |
maxItems | integer | 50 | 1–1000 rows. The board serves 25 ads per request, so 50 rows are two requests and 1,000 rows forty. |
fields | string[] | all | Keep only these columns, in this order; refnr, title, found, url and fetchedAt are always kept (first, unless you list them, and then they stay where you put them). An unknown name is reported in the run status. |
Reference
Kind of position
One run reads one kind, because the board files them in separate categories.
| Value | What it means |
|---|---|
job | Ordinary employment (Arbeit) — the default. |
training | Apprenticeship or dual study place (Ausbildung). |
internship | Internship or trainee position (Praktikum/Trainee). |
selfEmployment | An offer for self-employed work (Selbständigkeit). |
Working time
The marks the employer set on the ad. Picking several of them widens the result; empty means every working time.
| Value | What it means |
|---|---|
fullTime | Vollzeit. |
partTime | Teilzeit, in any of the board's shapes (morning, afternoon, evening, flexible). |
homeOffice | The board's own "Homeoffice möglich" mark — remote work is possible, not necessarily full remote. |
shiftNightWeekend | Shift, night or weekend work. |
miniJob | Marginal employment (Minijob). |
Contract
| Value | What it means |
|---|---|
any | Do not filter on the contract — the default, and the widest. |
permanent | Only ads marked unbefristet. |
temporary | Only ads marked befristet. |
Many ads leave the contract unset and drop out of the result as soon as you choose anything but any.
Sort orders
| Value | What it means |
|---|---|
newest | Newest first publication first — the feed order, and the default. |
relevance | The board's own ranking for your search term and place; it shifts through the day. |
startDate | Earliest start date first. |
distance | Nearest to the place first; needs where. |
offerType, workingTime, contractType and sort are strict lists: the platform refuses a value outside the list before the run even starts, with the allowed values in the error message. There is no spelling correction for them, and none is needed.
Places
where is free text and the board resolves it itself — a city, a district, a postcode or a federal state. Write it the way it is written in Germany; the ASCII spelling of an umlaut is tried in its German form as well (Muenchen is read as München, Koeln as Köln), and the spelling that was actually used is named in the run status. Any other place the board does not know stops the run with a message naming it, never a wider search. A radius always returns the commuting area: 25 km around Hamburg also brings Norderstedt and Pinneberg, so judge a row's location by its city and distanceKm.
Radius
Any whole number from 0 to 200 km is sent as it stands. The board's own interface offers 10, 15, 25, 50, 100 and 200 km, and those are the sizes most searches want: 25 km is a city plus its suburbs, 50 km a region, 100 km a federal state.
Examples
Nursing vacancies around Hamburg, newest first
{ "what": "Krankenpfleger", "where": "Hamburg", "radiusKm": 25, "sort": "newest", "maxItems": 25 }
Home-office software jobs near Berlin, published in the last two weeks
{ "what": "Softwareentwickler", "where": "Berlin", "radiusKm": 50, "workingTime": ["homeOffice"], "publishedWithinDays": 14, "maxItems": 25 }
IT apprenticeship places (Ausbildung) in Munich
{ "what": "Fachinformatiker", "where": "München", "radiusKm": 25, "offerType": "training", "maxItems": 25 }
Everything published in the last day around Frankfurt am Main — put this on a schedule
{ "where": "Frankfurt am Main", "radiusKm": 25, "publishedWithinDays": 1, "onlyNew": true, "maxItems": 100 }
Engineering jobs near Stuttgart, direct employers only, with the advert text
{ "what": "Ingenieur", "where": "Stuttgart", "radiusKm": 50, "includeTempAgencies": false, "includePrivateRecruiters": false, "includeDescription": true, "maxItems": 20 }
Re-check a saved shortlist, four columns only
{ "referenceNumbers": ["10001-1003891446-S", "14751-63A6802-S"], "fields": ["title", "employer", "publishedAt"] }
Output
One row per ad. A real row from the cloud run DfyUaw8QqM1Sue0UY (21 October 2026):
{"refnr": "10001-1003893745-S","title": "Fachkrankenpfleger (m/w/d) Intensivstation / Anästhesie | ab 5.344 € brutto","found": true,"url": "https://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003893745-S","occupation": "Pflegefachmann/-frau (Gesundheits- und Krankenpflege)","employer": "RAN Experts GmbH","city": "Hamburg","postalCode": null,"region": "Hamburg","country": "Deutschland","latitude": 53.546048219,"longitude": 10.039313698,"distanceKm": 4,"employmentType": "Vollzeit, Schicht/Nacht/Wochenende","contractType": "permanent","startDate": "2026-10-21","publishedAt": "2026-10-21","modifiedAt": "2026-10-21T16:38:08.728Z","offerType": "job","isTempAgency": null,"externalUrl": null,"fetchedAt": "2026-10-21T22:27:28.927Z"}
| Field | Type | When it is filled |
|---|---|---|
refnr | string | Always — the board's reference number, also the end of the ad URL. |
title | string | Always for an ad the board serves; null on a found: false row. |
found | boolean | Always. false means the board no longer serves this reference number. |
url | string | Always — the ad page on the board. |
occupation | string | Normally — the occupation the ad is filed under. |
employer | string | Normally; empty when the employer publishes anonymously through an agency. |
city, postalCode | string | Normally; some ads carry the city without a postcode. |
region | string | Normally — the federal state, in German spelling. |
country | string | Normally (Deutschland; the board also carries a few cross-border ads). |
latitude, longitude | number | Normally — the coordinates the board geocoded the workplace to. |
distanceKm | number | When a place was given — whole kilometres from it. |
employmentType | string | When the employer set a working-time mark, in the board's own words (Vollzeit, Teilzeit, Schicht/Nacht/Wochenende, Homeoffice möglich, Minijob). |
contractType | string | When the ad carries a contract mark: permanent or temporary. |
startDate | string | When the ad names one — date (UTC). |
publishedAt | string | Normally — the first publication date (UTC). |
modifiedAt | string | Normally — the employer's last edit, ISO 8601 UTC. |
offerType | string | Always for an ad: the kind of position the board filed it under. |
isTempAgency | boolean | Only with includeDescription — whether the ad is placed by a temporary staffing firm (only the ad page carries this mark). |
externalUrl | string | When the employer publishes the ad on its own site or an application portal too. |
description | string | Only with includeDescription — the advert text as the employer wrote it. |
employerAddress | string | Only with includeDescription — street and town of the workplace, when the ad names them. |
fetchedAt | string | Always — when this row was read, ISO 8601 UTC. |
Contact persons, telephone numbers and e-mail addresses are never written to the dataset, in any setting. Rows are built from a fixed list of columns, so nothing else from the board's records can leak into them.
Dataset views: Job ads (ad, employer, place, dates), Location and commute (coordinates, federal state, distance), New and changed ads (publication, last edit, start, kind, staffing mark, found).
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~arbeitsagentur-jobs/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"what":"Krankenpfleger","where":"Hamburg","radiusKm":25,"maxItems":25}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/arbeitsagentur-jobs').call({ what: 'Fachinformatiker', where: 'München', offerType: 'training', maxItems: 25 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/arbeitsagentur-jobs").call(run_input={"where": "Frankfurt am Main", "publishedWithinDays": 1, "maxItems": 50})items = client.dataset(run["defaultDatasetId"]).list_items().items
fields decides the columns and their order: {"fields": ["title", "employer", "city"]} gives refnr, found, url, fetchedAt, title, employer, city — the always-kept columns you did not name come first, then yours exactly as you listed them.
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/arbeitsagentur-jobs tool with the same JSON input.
Pricing
Pay per event: $0.001 per run start + $0.001 per job ad written to the dataset. Every run is charged the start event, also a run that finds nothing. Every row counts, including a found: false marker row for a reference number the board no longer serves — a marker row is a dataset item and is billed like any other.
| Run | Cost |
|---|---|
| 10 ads | $0.001 + 10 × $0.001 = $0.011 |
| 50 ads (the default cap) | $0.001 + 50 × $0.001 = $0.051 |
| 1,000 ads (the largest run) | $0.001 + 1,000 × $0.001 = $1.001 |
Apify's subscription tiers discount the row price (Bronze −10 %, Silver −20 %, Gold and above −30 %); the start event is flat.
A run never spends more than the Maximum cost per run you set on the platform: it stops as soon as the next row would pass that limit, keeps every row you already paid for and says so in its status ("Stopped at your spending limit: N rows delivered").
Limits & FAQ
- Speed and what fits into one run. Measured in the Apify cloud on 21 October 2026: the actor keeps itself to one request per second and one request brings 25 ads, so paging runs at roughly 1,400 ads per minute — the 50-row default finished in 6 seconds and the 1,000-row maximum takes about 40 seconds, both far inside the 15-minute default run timeout. With
includeDescriptionon, every row costs one more request: 42 rows with their advert text in 45 seconds (44 requests), so about 58 rows per minute, and a 1,000-row run with the advert text would need some 17 minutes — more than the default timeout, so it stops early with the rows it has. Raise the run timeout or lowermaxItemsfor that combination. - The actor stops before its run timeout instead of being killed. When the time is nearly up it stops starting new work, keeps every row already read and ends with "Stopped before the run timeout: N rows saved". The same happens at your maximum cost per run. You never lose paid rows to a timeout.
- Request pace and the source. The board's robots.txt allows everything and sets no crawl delay, and no rate limit is documented (both read 21 October 2026), so the actor paces itself at 1 request/s with a burst of 2 and halves that whenever the board answers 429 or starts timing out. Larger runs simply take longer; they do not go faster. If the board refuses this server on the very first request — Apify servers share their addresses with other customers — the run fails fast with a message saying to start again in a few minutes, instead of burning the run.
- Coverage. The board holds the ads that employers published there. It is the largest single job board in Germany and the only place many public-sector and regional employers advertise, but it is not every German vacancy, and an ad can appear here days after it went live on the employer's own site.
- Ads with missing marks. Contract, start date, working time, postcode and coordinates are what the employer filled in. Ads that leave a mark empty disappear from the filter that uses it — that is why
contractTypedefaults toany. - A radius is a commuting area, not a city. Filter per row on
cityordistanceKmif you need the city itself, or useradiusKm: 0. - Ads disappear. A position that is filled or withdrawn stops being served: it drops out of searches, and a reference-number lookup returns
found: false. That marker row is the point of the shortlist mode — and it is billed like any row. - Search in German. The board matches your term against the ad title, the occupation and the ad text.
Softwareentwicklerfinds many times more thansoftware developer. - The advert text is opt-in. Rows carry structured facts by default. The agency's terms restrict reusing its content, and complete pages may not be republished, so the actor writes facts, adds the employer's own advert text only when you ask for it, and never republishes a page. Name the Bundesagentur für Arbeit as the source when you publish anything built from these rows.
- Questions or problems: open an issue on the Issues tab of this actor.
Made by Yadroo. Sibling actors: hh-kz-vacancies, greenhouse-jobs, workable-jobs, himalayas-remote-jobs, osm-geocode.