DEV Community

Gleanery Works
Gleanery Works

Posted on Edited on

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

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"))
Enter fullscreen mode Exit fullscreen mode

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"])
Enter fullscreen mode Exit fullscreen mode

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"))
Enter fullscreen mode Exit fullscreen mode

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 $0.40 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
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)