Tony Wang6 Min. LesezeitIndeed scrapen 2026 (API & Python)
Indeeds Publisher API ist eingestellt, die ToS verbieten Bots. Was 2026 zugänglich ist, die rechtliche Lage, und eine strukturierte API-Alternative.
Indeed bietet 2026 keine offene Developer-API mehr an — die alte Publisher API und der XML-Feed sind eingestellt, und was bleibt, ist ein partnergesteuertes Programm für Arbeitgeber und ATS-Anbieter, kein öffentlicher Signup. Dieser Guide zeigt, was sich aus Indeeds öffentlicher Jobsuche realistisch sammeln lässt, wie die rechtliche und technische Lage bei Eigenbau aussieht, und stellt eine strukturierte API vor, die Jobsuche, Job-Detail und Location-Daten als JSON zurückgibt.
Warum Indeed-Jobdaten scrapen?
- Hiring-Demand-Research — verfolgen, welche Rollen, Unternehmen und Standorte auf dem größten allgemeinen Jobportal aktiv ausschreiben.
- Jobbörsen-Aggregation — Stellenanzeigen in eine Meta-Suche oder ein Nischen-Jobportal einspeisen, ohne Indeeds eigenes Frontend nachzubauen.
- Gehalts-Benchmarking — veröffentlichte Gehaltsspannen nach Titel, Standort und Senioritätsstufe aggregieren.
- KI-/LLM-Pipelines — strukturierte Stellenanzeigen in ein Matching- oder Karriereberatungs-Tool einspeisen, statt rohes HTML zu scrapen.
- Recruiting-Tools — offene Stellen über mehrere Unternehmen hinweg in einem durchsuchbaren Feed neben anderen Sourcing-Signalen anzeigen.
Ist es legal, Indeed zu scrapen?
Option 1: DIY in Python (und warum es kaputtgeht)
Ein minimaler Scrape sieht wie ein gewöhnlicher Such-und-Parse-Job aus:
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
params = {"q": "software engineer", "l": "Austin, TX", "start": 0}
resp = requests.get("https://www.indeed.com/jobs", headers=headers, params=params)
soup = BeautifulSoup(resp.text, "html.parser")
for card in soup.select("div.job_seen_beacon"):
title = card.select_one("h2.jobTitle span")
company = card.select_one("span.companyName")
print(title.get_text(strip=True) if title else None, company.get_text(strip=True) if company else None)
Er läuft — einmal — dann kommt die übliche Liste zum Vorschein:
- Bot-Erkennung. Indeed liefert Interstitials und Blocks an Requests, die nicht wie eine echte Browser-Session aussehen; ein nackter
requests-Call ohne Cookies, ohne JS-Ausführung und ohne Residential-IP fliegt schnell auf, und man landet wieder bei einem Headless-Browser-plus-Proxy-Stack für eine "einfache" Listenseite. - Die einzelnen Job-Seiten sind genau der Teil, den robots.txt untersagt. Die Suchergebnisse selbst sind indexierbar, aber
/viewjob— wo die vollständige Beschreibung, das Gehalt und der Bewerbungslink liegen — ist für allgemeine Bots explizit ausgeschlossen. - Pagination ist begrenzt. Indeeds
start-Parameter durchläuft nur ein begrenztes Fenster an Ergebnissen pro Query; breite Marktabdeckung bedeutet, dieselbe Suche vielfach nach Standort und Keyword aufzuteilen, nicht bis zum Ende durchzupaginieren. - Markup-Drift. Klassennamen wie
job_seen_beaconundjobTitleändern sich ohne Ankündigung, und ein Selektor, der letztes Quartal funktioniert hat, liefert dieses Quartal stillschweigend nichts mehr zurück.
Option 2: No-Code / fertige Tools
Visuelle Scraping-Tools können einen Selektor per Klick auf Indeeds Suchergebnisse setzen, genau wie das Python-Skript — aber sie erben dieselben Probleme: Bot-Erkennung auf Request-Ebene, eine gesperrte Job-Detailseite und brüchige Selektoren, weil sich an der zugrunde liegenden Zugriffsmethode nichts geändert hat. Sie ersparen dir das Schreiben des Parsers, nicht das Anti-Bot- oder ToS-Problem darunter.
Option 3: Eine strukturierte Indeed-API
Crawloras Indeed-API gibt Jobsuche, Job-Detail und Location-Autocomplete als normalisiertes JSON mit einem Key zurück — kein HTML-Parsing, keine Session zu verwalten:
curl "https://api.crawlora.net/api/v1/indeed/search?q=software+engineer&l=Austin,+TX" \
-H "x-api-key: $CRAWLORA_API_KEY"
Derselbe Ablauf in Python — suchen, dann das vollständige Detail eines Jobs anhand seines job_key abrufen:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/indeed"
search = requests.get(f"{base}/search", headers=h, params={
"q": "software engineer", "l": "Austin, TX", "page": 1, "fromage": 7,
}).json()["data"]
job_key = search["jobs"][0]["job_key"]
job = requests.get(f"{base}/job", headers=h, params={"jk": job_key}).json()["data"]
/indeed/search nimmt q (erforderlich), l für den Standort, page (1-basiert), sort (relevance oder date), radius in Meilen und fromage, um Ergebnisse auf Anzeigen der letzten N Tage zu begrenzen. Antwortformat (gekürzt):
{
"code": 200,
"msg": "OK",
"data": {
"query": "software engineer",
"location": "Austin, TX",
"page": 1,
"total": 3040,
"jobs": [
{
"job_key": "5e52165ce276aa5a",
"title": "Staff HPC Applications Engineer",
"company": "NextSilicon",
"location": "Austin, TX",
"city": "Austin",
"state": "TX",
"posted_at": "2026-08-03T05:00:00Z",
"url": "https://www.indeed.com/viewjob?jk=5e52165ce276aa5a"
}
]
}
}
/indeed/job nimmt den jk (Job Key) aus einem Suchergebnis und gibt das vollständige Detail dieser Anzeige zurück — Beschreibung, Gehalt und Benefits, sofern Indeed sie veröffentlicht. Und da l bei /indeed/search einen gültigen Indeed-Location-String braucht, verwandelt /indeed/locations/suggest eine Teil-Query in einen solchen:
locations = requests.get(f"{base}/locations/suggest", headers=h, params={
"q": "Austin", "limit": 5,
}).json()["data"]
# {"query": "Austin", "suggestions": [{"name": "Austin, TX (Travis County)", "source": "PRECISELY"}, ...]}
Was du sammeln kannst
- Aus der Suche —
job_key, Titel, Unternehmen, Standort (Stadt/Bundesstaat/Postleitzahl), Gehaltsspanne und Währung, sofern veröffentlicht, Job-Typ(en), Remote-Flag, Sponsored-/Urgently-Hiring-Flags, ein Ergebnis-Snippet undposted_at. - Aus dem Job-Detail — vollständiges
description_text/description_html, Gehalt min/max/Zeitraum, Benefits-Liste, Anstellungsart, Remote-Flag,direct_apply, Unternehmensbewertung und Anzahl der Reviews sowievalid_through. - Aus dem Location-Suggest — normalisierte Location-Strings (mit Quelle, z. B.
PRECISELY), die du wieder inlbeim Search-Endpoint einspeisen kannst.
Limitierungen
- Keine Volltext- oder beliebige Filter über
q/l/radius/fromage/sorthinaus — Abdeckung entsteht durch mehrere gezielte Suchen (Keyword × Standort), nicht durch einen einzigen breiten Crawl. - Job-Detail-Felder hängen davon ab, was der Arbeitgeber gepostet hat. Gehalt, Benefits und Remote-Flags sind häufig leer, wenn Indeed selbst diese Daten nicht hat.
- Geschlossene Anzeigen werden nicht in Echtzeit markiert — ein
job_key, der bei/indeed/jobeinen 404 oder veraltete Daten liefert, bedeutet meist, dass die Anzeige geschlossen wurde; regelmäßig neu prüfen, statt anzunehmen, dass sie noch offen ist. - Das deckt nur öffentliche Such- und Detaildaten ab — keine login-geschützten Employer-Dashboards, Bewerberdaten oder Indeed-Apply-Flows.
Wo das eingesetzt wird
- Hiring-Demand- und Marktforschung — Anzeigen-Volumen und Gehaltstrends nach Rolle, Unternehmen und Metropolregion verfolgen.
- Meta-Jobsuche und Nischen-Jobbörsen-Produkte — Indeed-Anzeigen neben anderen Quellen in einem Feed aggregieren.
- Compensation-Benchmarking-Tools — veröffentlichte Gehaltsspannen über vergleichbare Titel und Standorte hinweg zusammenführen.
- Ergänzt sich mit dem Job-Postings-Datensatz und dem Job-Postings-Guide für ATS-Quellen-Rollen, die Indeed nicht führt.
Quellen
Leg los mit dem Sammeln
Probier es erst kostenlos aus: Jage eine beliebige öffentliche URL durch den Free Web Scraper, oder prüfe mit dem Anti-Bot-Checker, ob eine Seite Bots blockiert — ohne Anmeldung.
Teste die Search-, Job- und Location-Suggest-Endpoints im Playground, prüfe das Schema in den API-Docs und sieh dir die Preise an. Indeed ist eine Quelle in einem fragmentierten Hiring-Markt — wie du Stellenanzeigen scrapest deckt die 14 ATS-Plattformen ab, über die Unternehmen direkt ausschreiben, und wie du LinkedIn scrapest deckt die öffentlichen Unternehmensseiten der einstellenden Arbeitgeber ab. Speziell für Engineering-Team-Signale ist wie du GitHub scrapest ein nützlicher Begleiter. Für die rechtlichen Grenzen beim Scraping allgemein siehe ist Web Scraping legal.
Häufig gestellte Fragen
Hat Indeed 2026 eine öffentliche Developer-API?
Nein. Indeeds alte Publisher API und der XML-Job-Feed sind eingestellt — seit 2023–2024 wurden keine neuen Developer-Keys mehr ausgegeben. Was übrig bleibt, ist ein vertriebsgesteuertes Indeed-Apply-/Employer-ATS-Integrationsprogramm für Arbeitgeber und Bewerbermanagementsystem-Anbieter, kein offener Signup zum Lesen von Indeeds öffentlichem Job-Suchindex.
Ist es legal, Indeed-Stellenanzeigen zu scrapen?
Das ist keine Rechtsberatung, aber Indeeds Nutzungsbedingungen verbieten den Einsatz von Bots oder Scrapern für den Zugriff auf die Seite ohne Erlaubnis, und die robots.txt untersagt allgemeinen Bots das Crawlen einzelner Job-Detailseiten (/viewjob) sowie mehrerer Such-/API-Pfade, mit noch weiterreichenden Sperren für KI-Crawler. Öffentliche Suchergebnisseiten sind nicht login-geschützt, aber sowohl die Nutzungsbedingungen als auch die robots.txt schränken automatisierten Zugriff ein — prüfe beides und respektiere Rate-Limits, bevor du scrapst.
Was ist mit Indeeds XML-Job-Feed passiert?
Indeed hat seine Publisher API und das XML-Feed-Programm ab etwa 2023–2024 schrittweise abgeschaltet, und im März 2026 gewährte Indeed keine kostenlose Suchsichtbarkeit mehr für Jobs, die über Single-Source-XML-Feeds ohne ATS-Integration eingeliefert werden — das drängt Arbeitgeber und Integratoren stattdessen zu direkten ATS-Verbindungen.
Warum bricht DIY-Indeed-Scraping so oft ab?
Neben der rechtlichen Exposition stößt ein simpler requests-und-BeautifulSoup-Scraper auf Bot-Erkennung auf Request-Ebene, ein Pagination-Fenster, das begrenzt, wie viele Ergebnisse eine einzelne Query liefert, und CSS-Klassennamen auf Indeeds Such- und Job-Seiten, die sich ohne Ankündigung ändern — noch bevor man die einzelnen Job-Detailseiten anfasst, die robots.txt für allgemeine Crawler sperrt.
Welche Felder liefert eine strukturierte Indeed-API?
Suchergebnisse enthalten Job Key, Titel, Unternehmen, Standort, Gehaltsspanne sofern veröffentlicht, Job-Typ, Remote-Flag und Anzeigedatum. Das Job-Detail ergänzt die vollständige Beschreibung, Gehalt min/max/Zeitraum, Benefits, Anstellungsart und Unternehmensbewertung. Ein Location-Suggest-Endpoint verwandelt einen Stadtnamen-Ausschnitt in einen gültigen Location-String für die Suchanfrage.
Kann ich Gehaltsdaten von Indeed im großen Maßstab bekommen?
Ja, sofern Indeed selbst Gehaltsdaten an eine Anzeige angehängt hat — sowohl die Such- als auch die Job-Detail-Antworten enthalten salary_min, salary_max, salary_period und salary_currency, wenn der Arbeitgeber oder Indeeds eigene Schätzung sie befüllt hat. Die Abdeckung ist nicht flächendeckend; viele Anzeigen führen schlicht kein Gehaltsfeld.
Wie unterscheidet sich Indeed vom Scrapen ATS-gehosteter Jobbörsen wie Greenhouse oder Workday?
Indeed ist ein einzelner Aggregator mit einem Suchindex, aber restriktiven Nutzungsbedingungen und robots.txt-Regeln für einzelne Anzeigen. ATS-Plattformen wie Greenhouse, Lever und Workday sind das gegenteilige Problem — über ein Dutzend verschiedene öffentliche, meist unauthentifizierte JSON-Backends ohne einheitliches Schema. Indeed und ATS-Boards sind komplementäre Quellen, kein Ersatz füreinander.