德國聯邦就業局 Jobsuche API:用 Python 搜尋超過 100 萬個德國職位(v6 端點)
The Arbeitsagentur Jobsuche API in 2026: search 1 million German jobs with Python (v6 endpoint)
德國聯邦就業局 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 * sizeabove 10,000 returns HTTP 400. Split big searches by location or date. -
There's no home office search parameter in v6. Filter on
homeofficemoeglich == Trueyourself.
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