Arbeitsagentur Jobs Scraper: Bundesagentur Jobbörse avatar

Arbeitsagentur Jobs Scraper: Bundesagentur Jobbörse

Pricing

from $1.00 / 1,000 result items

Go to Apify Store
Arbeitsagentur Jobs Scraper: Bundesagentur Jobbörse

Arbeitsagentur Jobs Scraper: Bundesagentur Jobbörse

Scrape arbeitsagentur jobs from the Bundesagentur für Arbeit Jobbörse: search by keyword, place and radius, filter by job type and publication date, get one flat row per posting with employer, location, coordinates, dates and the full description. Monitor mode alerts on new postings.

Pricing

from $1.00 / 1,000 result items

Rating

0.0

(0)

Developer

Viktor Dubnytskiy

Viktor Dubnytskiy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

Scrape the Bundesagentur für Arbeit job board (arbeitsagentur.de/jobsuche) — Germany's largest job database with well over a million public postings. Search by keyword, place and radius, filter by offer type and publication date, and get one flat row per posting: employer, address, coordinates, dates, salary range and, optionally, the full description.

What you get

One row per posting: id (= refnr), url, title, occupation, employer, employerHash, city, zip, region, country, lat, lon, publishedAt, firstPublishedAt, startsAt, modifiedAt, jobType, trainingType, fullTime, homeOffice, homeOfficeType, contractDuration, salaryFrom, salaryTo, salaryFixed, salaryUnit, salaryUnitRaw, salaryCurrency, apprenticeshipSalaryYear1, apprenticeshipSalaryYear2, apprenticeshipSalaryYear3, externalUrl, distanceKm, otherLocations, query, page, rank, source, scrapedAt.

Salary always carries its unit. salaryUnit is hour, month, year or apprenticeship_month (salaryUnitRaw keeps the source code, e.g. STUNDENLOHN), salaryCurrency is EUR, and an employer who published one fixed amount instead of a range gets it in salaryFixed and on both ends of salaryFrom/salaryTo, so a numeric filter works on either shape. Apprenticeships list their monthly pay per training year.

With fetchDetails: true each row also carries description, employerDescription, employerSize, employerHq, employerWebsite and benefits.

Employer-level facts only. Postings that name a contact person are not mined for that person: no names, no personal phone numbers, no personal e-mail addresses.

Example output

Real rows from the example dataset (search {"was": "python", "wo": "Berlin"}):

FieldExample value
id / refnr10001-1003356732-S
urlhttps://www.arbeitsagentur.de/jobsuche/jobdetail/10001-1003356732-S
titleAI Lead, Python Tools (m/f/d)
employer / occupationJetBrains GmbH / Software-Architect
city / zip / regionBerlin / 10997 / BERLIN
lat / lon52.499898 / 13.4472735
publishedAt / modifiedAt2026-07-09 / 2026-09-14T00:10:43.373
jobType / homeOfficeARBEIT / true
employerSize / employerHq1000+ / München (with fetchDetails)

Salary, as published: a yearly range comes back as salaryFrom: 34000, salaryTo: 52000, salaryUnit: "year", salaryCurrency: "EUR"; an hourly fixed rate as salaryFixed: 17.25, salaryFrom: 17.25, salaryTo: 17.25, salaryUnit: "hour"; an apprenticeship as apprenticeshipSalaryYear1..3: 1625 with salaryUnit: "apprenticeship_month".

Use cases

  • Build a German job feed for one keyword and region and refresh it daily.
  • Watch a search and get a webhook or Telegram alert the moment a new posting appears.
  • Map hiring by employer, occupation and postcode — every row carries coordinates.
  • Pull apprenticeships (jobType: AUSBILDUNG) or internships (PRAKTIKUM) for a school or university job wall.

Input

FieldMeaningDefault
searches[{"was": "python", "wo": "Berlin"}]; a plain string is taken as was[{"was": "python", "wo": "Berlin"}]
radiusKmRadius around wo in km25
jobTypeany, ARBEIT, AUSBILDUNG, PRAKTIKUM, SELBSTAENDIGKEITany
publishedSinceDaysOnly postings published in the last N daysempty
maxPagesPerSearchResult pages per search (25 postings each)3
fetchDetailsOpen each posting for description and employer factsfalse
maxItemsStop after this many rows100
modescrape or monitor (only new/changed since last run)scrape
monitorKey, webhookUrl, telegramBotToken, telegramChatIdMonitor-mode state key and alert targetsempty

Monitor mode for new postings

Run the actor as a saved task with mode: monitor on a schedule. Each run compares the current result set against the previous one and returns only new postings and postings whose title, employer or modification date changed, optionally pushing a summary to a webhook or a Telegram chat. You are charged a monitor-check event per run plus a change event per changed posting — never for unchanged rows.

Pricing

EventPrice
result$0.001 per posting ($1 per 1,000)
monitor-check$0.005 per monitor run
change$0.001 per new or changed posting

Charged only for rows actually pushed. A run that finds nothing costs nothing: no rows, no result events.

How it works

  1. Each search is turned into a public Jobbörse search URL (was, wo, umkreis, angebotsart, veroeffentlichtseit, page) and read from the server-rendered page, which carries the same structured objects the site's own front end uses — so the rows are the source's own fields, not scraped label text.
  2. Pagination stops at the last page of the result set, so a search with 30 hits costs two pages, not maxPagesPerSearch.
  3. fetchDetails opens each posting for the description and the employer's business profile. A posting removed between the list and the detail page keeps its search row instead of disappearing.
  4. No proxy tier is needed; the board answers plain requests from a German exit.

Limits

  • Result pages hold 25 postings each; the board itself caps a search result set, so very broad searches are best split by place or occupation.
  • hashId (the id of the mobile REST API) is not published on the web pages and stays empty; refnr is the stable id and the one the detail URL uses.
  • Salary is only present when the employer published one (most German postings do not); when it is absent, salaryUnit and salaryCurrency stay empty too, so a missing salary is never readable as 0 EUR.
  • Descriptions are the employer's own text, in German unless the employer wrote in another language.

FAQ

Is this the official API? No. The Jobbörse REST API needs a key and refused platform traffic when this actor was built (403), so the actor reads the public web pages and the structured payload they embed.

Does it return contact persons? No. Only employer-level facts. Postings that print a contact person are not mined for personal data.

What happens when a search has no hits? No rows are pushed and no result events are charged. The RUN_SUMMARY record in the run's key-value store carries emptyReason: no_matches, which is kept strictly apart from blocked — an empty dataset never hides a refusal.

Can I search all of Germany? Yes — leave wo out of the search object.

Changelog

  • 0.1: initial release — keyword/place search with radius, offer-type and freshness filters, optional detail pages with employer facts, monitor mode.

If this actor saved you time, a short review on its Store page genuinely helps other people find it. Found a bug or need a field that is missing? Open a ticket on the Issues tab.