跳到正文
DEV Community· Gleanery Works·· 2 小時前AI 評分52

德國聯邦就業局 Jobsuche API:用 Python 搜尋超過 100 萬個德國職位(v6 端點)

The Arbeitsagentur Jobsuche API in 2026: search 1 million German jobs with Python (v6 endpoint)

AI 導讀

德國聯邦就業局 Jobsuche API 可搜尋超過 100 萬個公開職位,文中提供 Python 範例,示範呼叫 /pc/v6/jobs。每次查詢最多返回 10,000 筆結果;職位詳情仍須使用 /pc/v4/jobdetails,並以 base64 編碼參考編號,v6 則沒有遙距工作搜尋參數。

正文

The job board of Germany's Federal Employment Agency (Bundesagentur für Arbeit, arbeitsagentur.de/jobsuche) lists over 1 million open jobs: the largest job database in Germany, covering everything from nurses and electricians to software developers and apprenticeships. Its frontend talks to a JSON API that is open to everyone with a fixed public key.

Many tutorials and wrappers still use the old /pc/v4/jobs search endpoint, which now returns HTTP 403. Here's what works today (checked October 2026).

Search: /pc/v6/jobs

import requests

API = "https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc"
HEADERS = {"X-API-Key": "jobboerse-jobsuche", "Accept": "application/json"}

r = requests.get(f"{API}/v6/jobs", headers=HEADERS, params={
    "was": "Softwareentwickler",   # what: job title or keyword
    "wo": "Berlin",                # where: city or postal code
    "umkreis": 25,                 # radius in km
    "size": 100, "page": 1,
})
data = r.json()
print(data["maxErgebnisse"], "matching jobs")
for job in data["ergebnisliste"]:
    print(job["stellenangebotsTitel"], "|", job.get("firma"), "|", job["stellenlokationen"][0]["adresse"].get("ort"))

Each result has the title, employer (firma), workplace address with coordinates, working-time flags, contract type (vertragsdauer), home office flag (homeofficemoeglich), publication date and the reference number (referenznummer).

Parameters that work

Parameter Values Meaning
was text job title or keyword
wo, umkreis city/PLZ, km location and radius
angebotsart 1 job, 2 self-employment, 4 apprenticeship, 34 internship offer type
arbeitszeit vz, tz, snw, mj, joined with ; full-time, part-time, shift/night/weekend, mini job
befristung 1 fixed-term, 2 permanent contract
veroeffentlichtseit 0, 1, 7, 14, 28 published within N days (other values are ignored)
zeitarbeit false exclude temp agencies (Zeitarbeit)
pav false exclude private placement agencies
arbeitgeber exact employer name one employer
page, size size up to 100 pagination

Two gotchas:

  • 10,000 results max per query. page * size above 10,000 returns HTTP 400. Split big searches by location or date.
  • There's no home office search parameter in v6. Filter on homeofficemoeglich == True yourself.

The response also contains facetten (facet counts per occupation, city, employer, working time…), which is handy for labor-market statistics without downloading jobs.

Salaries

About a quarter of listings state pay:

for job in data["ergebnisliste"]:
    if "gehaltsspanneVon" in job:          # range
        print(job["gehaltsspanneVon"], "-", job["gehaltsspanneBis"], job["verguetungsangabe"])
    elif "festgehalt" in job:              # fixed amount
        print(job["festgehalt"], job["verguetungsangabe"])

verguetungsangabe is the unit: JAHRESGEHALT (yearly), STUNDENLOHN (hourly) or KEINE_ANGABEN (none).

Details: still /pc/v4/jobdetails, base64-encoded

The full description is on a separate endpoint. Unlike search, it's still v4, and it wants the reference number base64-encoded:

import base64

ref = data["ergebnisliste"][0]["referenznummer"]
enc = base64.b64encode(ref.encode()).decode()
detail = requests.get(f"{API}/v4/jobdetails/{enc}", headers=HEADERS).json()
print(detail["stellenangebotsBeschreibung"][:500])
print(detail.get("istArbeitnehmerUeberlassung"), detail.get("allianzpartnerName"))

The details add the description, the temp-agency and private-recruiter flags, and allianzpartnerName/allianzpartnerUrl. Careful: the "Allianzpartner" is whoever delivered the posting, which is often a partner job board (jobvector, yourfirm…) and not the employer, so don't treat its URL as the company website unless the names match.

The public job page is https://www.arbeitsagentur.de/jobsuche/jobdetail/{referenznummer}.

Skip the plumbing

If you'd rather not handle pagination, the 10k cap, detail requests, salary normalization and English field names yourself, I packaged all of this as an Apify actor: Arbeitsagentur Jobs Scraper. It returns flat JSON (title, companyName, city, salaryMin, salaryMax, salaryInterval, remote, isTempAgency…), adds filters like remoteOnly, minSalaryYearly and excludeTempAgencies, and has a monitoring mode for daily feeds. It costs $2 per 1,000 jobs.

For AI agents

It's also callable as an MCP tool, for example from Claude or Cursor:

https://mcp.apify.com?tools=gleanery_actors/arbeitsagentur-jobs-scraper

Ask "find part-time nursing jobs in Hamburg posted this week, direct employers only" and the agent fills in the input. More job and B2B data tools for agents: github.com/gleanery-works/job-and-supplier-data-mcp.

來源:DEV Community · dev.to