Arbeitsagentur Jobs: German Job Board Search by City & Radius avatar

Arbeitsagentur Jobs: German Job Board Search by City & Radius

Pricing

from $0.70 / 1,000 job ad returneds

Go to Apify Store
Arbeitsagentur Jobs: German Job Board Search by City & Radius

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

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

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, onlyNew on 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.

FieldTypeDefaultAllowed values / notes
whatstringemptyOccupation, 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.
referenceNumbersstring[]emptyUp 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.
wherestringemptyCity, district, postcode or federal state (Hamburg, München, 10115, Nordrhein-Westfalen). Empty = all of Germany, and then the radius is ignored. See Places.
radiusKminteger250–200 km around the place, passed to the board as it stands. 0 keeps the place itself. A radius returns the whole commuting area.
offerTypestringjobOne of job, training, internship, selfEmployment — see Kind of position. Strict list.
workingTimestring[]emptyAny of fullTime, partTime, homeOffice, shiftNightWeekend, miniJob — see Working time. Several values widen the result. Strict list.
contractTypestringanyany, permanent, temporary — see Contract. Strict list.
employerstringemptyKeep only one employer's ads. The board matches the full registered name (Da Vinci Engineering GmbH), not a part of it.
includeTempAgenciesbooleantruefalse removes ads placed by temporary staffing firms (Zeitarbeit).
includePrivateRecruitersbooleantruefalse removes ads placed by private placement agencies on behalf of an unnamed client.
publishedWithinDaysintegerempty0–100: keep only ads first published within that many days. The window moves with every run, so a scheduled task never needs editing.
onlyNewbooleanfalseRemember what this input returned and write only new or edited ads next time. The first run writes everything.
includeDescriptionbooleanfalseAdd description (the advert text) and employerAddress by reading each ad's own page — one extra request per row.
sortstringnewestnewest, relevance, startDate, distance — see Sort orders. Decides which ads the row cap keeps. Strict list.
maxItemsinteger501–1000 rows. The board serves 25 ads per request, so 50 rows are two requests and 1,000 rows forty.
fieldsstring[]allKeep 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.

ValueWhat it means
jobOrdinary employment (Arbeit) — the default.
trainingApprenticeship or dual study place (Ausbildung).
internshipInternship or trainee position (Praktikum/Trainee).
selfEmploymentAn 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.

ValueWhat it means
fullTimeVollzeit.
partTimeTeilzeit, in any of the board's shapes (morning, afternoon, evening, flexible).
homeOfficeThe board's own "Homeoffice möglich" mark — remote work is possible, not necessarily full remote.
shiftNightWeekendShift, night or weekend work.
miniJobMarginal employment (Minijob).

Contract

ValueWhat it means
anyDo not filter on the contract — the default, and the widest.
permanentOnly ads marked unbefristet.
temporaryOnly 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

ValueWhat it means
newestNewest first publication first — the feed order, and the default.
relevanceThe board's own ranking for your search term and place; it shifts through the day.
startDateEarliest start date first.
distanceNearest 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"
}
FieldTypeWhen it is filled
refnrstringAlways — the board's reference number, also the end of the ad URL.
titlestringAlways for an ad the board serves; null on a found: false row.
foundbooleanAlways. false means the board no longer serves this reference number.
urlstringAlways — the ad page on the board.
occupationstringNormally — the occupation the ad is filed under.
employerstringNormally; empty when the employer publishes anonymously through an agency.
city, postalCodestringNormally; some ads carry the city without a postcode.
regionstringNormally — the federal state, in German spelling.
countrystringNormally (Deutschland; the board also carries a few cross-border ads).
latitude, longitudenumberNormally — the coordinates the board geocoded the workplace to.
distanceKmnumberWhen a place was given — whole kilometres from it.
employmentTypestringWhen the employer set a working-time mark, in the board's own words (Vollzeit, Teilzeit, Schicht/Nacht/Wochenende, Homeoffice möglich, Minijob).
contractTypestringWhen the ad carries a contract mark: permanent or temporary.
startDatestringWhen the ad names one — date (UTC).
publishedAtstringNormally — the first publication date (UTC).
modifiedAtstringNormally — the employer's last edit, ISO 8601 UTC.
offerTypestringAlways for an ad: the kind of position the board filed it under.
isTempAgencybooleanOnly with includeDescription — whether the ad is placed by a temporary staffing firm (only the ad page carries this mark).
externalUrlstringWhen the employer publishes the ad on its own site or an application portal too.
descriptionstringOnly with includeDescription — the advert text as the employer wrote it.
employerAddressstringOnly with includeDescription — street and town of the workplace, when the ad names them.
fetchedAtstringAlways — 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 ApifyClient
client = 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.

RunCost
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 includeDescription on, 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 lower maxItems for 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 contractType defaults to any.
  • A radius is a commuting area, not a city. Filter per row on city or distanceKm if you need the city itself, or use radiusKm: 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. Softwareentwickler finds many times more than software 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.