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
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"])
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
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=Pythonalso 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
- Germany's biggest job board has a JSON API. One header, no signup.
- Use
size=1and thefacettenobject to get market statistics in a single request. - 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)