DEV Community

Fast Data
Fast Data

Posted on

Germany's job board has a free JSON API: 821,306 open jobs and what its facets reveal

If you build anything around jobs in Germany (a job alert, a recruiting dashboard, a labour-market chart), the largest source is the Bundesagentur für Arbeit (Federal Employment Agency) and its Jobsuche. What many people don't know is that the web app runs on a JSON API you can call directly, and that every response includes facet counts for the whole result set.

I queried it on 24 October 2026. Below: how to call it, and what the numbers say.

Disclosure: I built the Job Search API actor on Apify, which uses this endpoint among other sources. You don't need it for anything in this post; plain Python is enough.

The endpoint

GET https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc/v6/jobs
Header: X-API-Key: jobboerse-jobsuche
Enter fullscreen mode Exit fullscreen mode

The key is the public client ID that the official Jobsuche web app sends. It's not a secret, and the community project bundesAPI/jobsuche-api documents the parameters. Useful ones:

Parameter Meaning
was Keyword, e.g. Softwareentwickler, Python, Pflegefachkraft
wo / umkreis Place and radius in km, e.g. Berlin / 25
angebotsart Offer type. 1 = regular jobs (other codes cover apprenticeships, internships and self-employment)
veroeffentlichtseit Published in the last N days (max 100)
page / size Pagination, up to 100 results per page

A minimal call:

import requests

URL = "https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc/v6/jobs"
HEADERS = {"X-API-Key": "jobboerse-jobsuche"}

def search(**params):
    params = {"angebotsart": 1, "size": 100, **params}
    r = requests.get(URL, params=params, headers=HEADERS, timeout=30)
    r.raise_for_status()
    return r.json()

data = search(was="Softwareentwickler", wo="München", umkreis=25)
print(data["maxErgebnisse"])                 # total matches
for job in data["ergebnisliste"][:5]:
    print(job["stellenangebotsTitel"], "|", job["firma"])
Enter fullscreen mode Exit fullscreen mode

Each job has the title, employer, location with coordinates, publish date, a reference number (referenznummer) and, when the employer states one, a salary range (gehaltsspanneVon / gehaltsspanneBis). The detail page is https://www.arbeitsagentur.de/jobsuche/jobdetail/<referenznummer>.

The part most people skip: facets

Next to the results, each response has a facetten object with counts for the whole result set: employers, cities, occupations, working time, temp agency or not, salary stated or not. Ask for size=1 and you get labour-market statistics in one request.

f = search(size=1)["facetten"]
print(f["zeitarbeit"]["counts"])          # temp agency yes/no
print(f["veroeffentlichtseit"]["counts"]) # new in last 1/7/14/28 days
Enter fullscreen mode Exit fullscreen mode

Here's what that showed on 24 October 2026.

1. 821,306 open jobs, about 17,000 new per day

Published within Jobs
last day 17,448
last 7 days 86,127
last 28 days 316,370
all open 821,306

So roughly 2% of the stock is new each day. If you build an alert, polling once a day with veroeffentlichtseit=1 is enough and keeps requests small.

2. One in four jobs is with a temp agency

The zeitarbeit facet marks 214,738 of 821,306 jobs (26%) as temporary agency work. The employer facet shows the same thing: the top employers by open postings are Netto (15,029), TimePartner (13,381), Randstad (9,620), Sanovetis (9,434) and PerZukunft (7,703). At least three of those five are staffing or placement firms.

If you count "hiring companies" from this data, filter out agency postings first. Otherwise a few staffing firms swamp your numbers.

3. Only about a quarter state a salary

The verguetung facet counts jobs with a stated pay figure: 152,586 hourly and 65,735 yearly, together 218,321 (27%). It is similar within fields:

  • Softwareentwickler: 812 of 3,345 (24%) state pay, almost all as a yearly figure
  • Pflegefachkraft (registered nurse): 5,245 of 23,263 (23%)

So the salary fields are useful, but don't treat a missing value as "unpaid" or "low". Three quarters of postings simply don't say.

4. Software jobs: Munich beats Berlin within 25 km

Search Open jobs
Softwareentwickler, all Germany 3,345
… within 25 km of München 241
… within 25 km of Berlin 189
… published in the last 7 days 444
Python, all Germany 2,307
Pflegefachkraft, all Germany 23,263

Across all occupations Berlin has by far the most postings (35,344, against 15,854 for München). For software developers within a 25 km radius, Munich comes out ahead. Nursing has about seven times as many open postings as software development.

In a sample of 100 Python jobs, 20 had homeofficemoeglich: true, and Baden-Württemberg (23) and Bayern (21) led the regions.

Gotchas

  • Keyword search is broad. was=Python also matches jobs where Python is just one skill among many. Filter titles afterwards if you need precision.
  • Totals move during the day. Postings are added and removed all the time, so store the timestamp with any number you publish.
  • Deduplicate by referenznummer, not by title. The same title appears hundreds of times (Verkäufer/in alone has 37,138 postings).
  • The detail endpoint (full description) is a separate call per job, so only fetch it for jobs you keep.
  • Be polite. It's a public service. Cache results, use the facets instead of paging through everything, and don't hammer it.

When to use a ready-made actor instead

For one script, the code above is all you need. My Job Search API is for when you want the Bundesagentur results merged with other open sources in one deduplicated list: Arbeitnow (Germany and Europe), Remote OK and Himalayas (remote jobs), plus company career pages on Greenhouse, Lever, Ashby and SmartRecruiters. All results share one schema (title, company, location, remote, salary, posted date, URL, source), and it runs on a schedule without a server. It costs $2.50 per 1,000 jobs.

If you're watching specific companies rather than keywords, the Career Site Jobs API can return only postings that are new since the last run.

Takeaways

  1. Germany's biggest job board has a JSON API. One header, no signup.
  2. Use size=1 and the facetten object to get market statistics in a single request.
  3. Before drawing conclusions, account for temp agencies (26% of postings) and missing salaries (73%).

All numbers are from queries on 24 October 2026, around 07:00 UTC.

Top comments (0)