Tony Wang6 Min. LesezeitUpwork scrapen in 2026 (API & Python)
Upwork-Jobs, Budgets und Freelancer-Profile 2026 scrapen — warum die API genehmigungspflichtig ist, plus eine strukturierte Alternative.
Upworks Freelance-Job-Feed und Freelancer-Profile sind öffentliche Webseiten, aber sie im großen Maßstab abzurufen ist nicht so einfach wie eine offene API aufzurufen. Upwork betreibt eine offizielle OAuth-basierte API, aber sie ist genehmigungspflichtig — du bewirbst dich, Upwork prüft die Anfrage anhand deines Kontos, und die typische Prüfung dauert etwa eine Woche. Dieser Guide behandelt, was dieser Prozess tatsächlich beinhaltet, warum DIY-Scraping an Upworks Anti-Bot-Haltung scheitert, und wie du stattdessen Jobsuche-, Job-Detail- und Freelancer-Profil-Daten über eine strukturierte API abrufst.
Warum Upwork-Daten scrapen?
- Freelance-Marktpreisrecherche — verfolge Stunden- und Festpreise nach Skill, Kategorie und Erfahrungslevel über aktive Job-Posts hinweg.
- Gig-Economy-Analysen — miss Posting-Volumen und Nachfragetrends für bestimmte Skills (Python, Design, Copywriting) über die Zeit.
- Wettbewerbs- und Agentur-Monitoring — sieh, zu welchen Sätzen und Konditionen konkurrierende Agenturen oder Top-Freelancer Aufträge gewinnen.
- AI-/LLM-Pipelines — speise normalisierte Freelance-Marktdaten in Modelle ein, die Arbeit bepreisen oder Talente zu Briefings matchen.
- Talent-Sourcing — finde Freelancer nach Skill und Track Record für Outbound-Recruiting, ohne auf Upworks eigene Such-UI angewiesen zu sein.
Ist es legal, Upwork zu scrapen?
Option 1: DIY in Python (und warum es scheitert)
Eine einzelne Job-Seite oder ein Profil lässt sich leicht manuell abrufen:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.upwork.com/freelance-jobs/apply/Python-full-stack-developer_~022085006288356888767/",
headers={"User-Agent": "Mozilla/5.0"},
)
soup = BeautifulSoup(resp.text, "html.parser")
title = soup.select_one("h1")
Das funktioniert genau einmal, dann verschlechtert es sich schnell:
- Starkes clientseitiges Rendering. Job- und Profilseiten hydratisieren via JavaScript, sodass ein einfacher
requests-Call oft nur eine Hülle ohne Budget-, Client-History- oder Feedback-Daten liefert, die du eigentlich willst — du brauchst einen Headless-Browser, um das gerenderte DOM zu bekommen. - Bot-Erkennung und Rate-Limiting. Upwork verteidigt sich aktiv gegen nicht-menschlichen Traffic; wiederholte oder schnelle Requests von einer IP werden gedrosselt oder blockiert, und Upworks eigene Bot-Policy besagt, dass dies "selbst mit einem API-Key" für Massenerfassung außerhalb genehmigter Nutzung gilt.
- Die Suche erfordert Session-State. Der Job-Suchfeed hängt von Filtern, Pagination-Tokens und Cookies ab, die von der clientseitigen App gesetzt werden — sie nachzubilden bedeutet, eine Schnittstelle zurückzuentwickeln, die sich ohne Vorwarnung ändert.
- Kein Login, kein zuverlässiger Zugriff auf gesperrte Felder. Manche clientseitigen Details (vollständige Kontakthistorie, Invite-only-Jobs) liegen hinter einer authentifizierten Session, und einen Bot einzuloggen riskiert das Konto.
Option 2: No-Code / vorgefertigte Tools
Generische Point-and-Click-Scraper können eine einzelne Upwork-Job- oder Profilseite abrufen, aber sie stoßen auf dieselbe JavaScript-Rendering- und Rate-Limiting-Mauer wie ein DIY-Skript — ein visueller Scraper muss weiterhin Headless-Rendering und Bot-Erkennung lösen, er versteckt nur den Code. Für alles über eine Handvoll Seiten hinaus ist ein gepflegtes Backend, das Rendering und Normalisierung bereits übernimmt, weniger fragil als ein generisches Tool gegen eine Seite zu konfigurieren, die ihr Markup und ihre Abwehrmaßnahmen regelmäßig ändert.
Option 3: Eine strukturierte Upwork API
Crawloras Upwork API verpackt Jobsuche-, Job-Detail- und Freelancer-Profilseiten hinter drei Endpoints und liefert normalisiertes JSON zurück — keine Browser-Automatisierung oder Session-Verwaltung auf deiner Seite.
Freelance-Jobs nach Schlüsselwort suchen:
curl "https://api.crawlora.net/api/v1/upwork/search?q=python%20developer&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/upwork"
search = requests.get(f"{base}/search", headers=h, params={"q": "python developer", "page": 1}).json()["data"]
for job in search["jobs"]:
print(job["title"], job.get("budget_text"))
Response-Struktur (echtes Beispiel):
{
"code": 200,
"msg": "OK",
"data": {
"query": "python developer",
"page": 1,
"jobs": [
{
"id": "2085006288356888767",
"title": "Python full stack developer, python automation",
"url": "https://www.upwork.com/jobs/span-class-highlight-Python-span-full-stack-developer_~022085006288356888767/",
"posted_at": "Posted 2 days ago",
"budget_type": "hourly",
"budget_text": "Hourly: $60.00 - $75.00",
"experience_level": "Expert",
"duration": "1 to 3 months, 30+ hrs/week",
"skills": ["Python", "Django", "Flask"]
}
]
}
}
Das vollständige Detail für einen Job per id abrufen:
job = requests.get(f"{base}/job/022085006288356888767", headers=h).json()["data"]
print(job["hourly_min"], job["hourly_max"], job["client"]["total_spent"])
Das liefert Budget-Spanne, Client-History (Mitglied-seit-Datum, Gesamtausgaben, Anzahl Einstellungen, Branche, Unternehmensgröße), Anzahl Angebote und Länder der Bewerber — die Felder, die Upworks eigene Job-Seite zeigt, ein Suchergebnis aber nicht.
Ein Freelancer-Profil per id nachschlagen:
freelancer = requests.get(f"{base}/freelancer/0157e03059a690281f", headers=h).json()["data"]
print(freelancer["hourly_rate"], freelancer["job_success_score"], freelancer["total_jobs"])
Das liefert Stundensatz, Job-Success-Score, Bewertung, Anzahl Reviews, Gesamtzahl an Jobs und geleisteten Stunden sowie aktuelle Feedback-Einträge.
Was du sammeln kannst
- Job-Posts — Titel, Beschreibung, Veröffentlichungsdatum, Budgettyp und -spanne, Erfahrungslevel, Dauer, Projektart, Anzahl Angebote und benötigte Skills.
- Client-Signal — Mitglied-seit-Datum, Land, Gesamtausgaben, Anzahl Einstellungen, gebuchte Stunden, Branche und Unternehmensgröße, jeweils an den Job geknüpft.
- Freelancer-Profile — Name, Titel, Stundensatz, Verifizierungsstatus, Übersicht, Bewertung, Anzahl Reviews, Job-Success-Score, Standort, Gesamtzahl an Jobs und Stunden sowie aktuelles Feedback mit Datum und Bewertung.
Einschränkungen
- Nur öffentliche Daten. Das deckt ab, was auf öffentlichen Job- und Profilseiten sichtbar ist — kein login-gesperrtes Messaging, keine Invite-only-Jobs, keine Kontaktdaten.
- IDs, kein offenes Crawling. Job- und Freelancer-Endpoints benötigen eine bestimmte id; entdecke IDs zuerst über die Suche und rufe dann das Detail für die benötigten ab.
- Suchergebnis-Felder sind schlanker als Job-Detail. Der Such-Endpoint liefert eine Zusammenfassung (Titel, Budget-Text, Skills); ziehe den Job-Detail-Endpoint für Client-History und exakte Budgetzahlen.
- Freelance-Markt-Momentaufnahmen, keine Echtzeit-Gebotsdaten. Anzahl der Angebote und Sätze spiegeln die Seite zum Abrufzeitpunkt wider — Upwork stellt keine live Bid-für-Bid-Daten über öffentliche Seiten bereit.
Wo das eingesetzt wird
- Freelance-Rate-Benchmarking — aggregiere Stunden- und Festpreise nach Skill-Kategorie, um eigene oder Kundenarbeit zu bepreisen.
- Gig-Economy-Marktforschung — verfolge Posting-Volumen und Nachfrage nach Skill über die Zeit.
- Talent-Sourcing-Pipelines — screene Freelancer-Profile nach Job-Success-Score, Bewertung und Track Record vor der Kontaktaufnahme.
- AI-/LLM-Trainings- und Matching-Daten — normalisierte Job- und Skill-Daten für Modelle, die Freelance-Arbeit bepreisen oder Briefings zu Talenten matchen.
Sources
Loslegen mit dem Sammeln
Probier es zuerst kostenlos: 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 Such-, Job- und Freelancer-Endpoints im Playground, prüfe das Schema in den API docs, und sieh dir die pricing an. Upwork ist das Gig-Work-Pendant zu den Jobbörsen, die in how to scrape job postings behandelt werden — kombiniere beide, wenn du sowohl klassisches Hiring als auch Freelance-Nachfrage für dieselben Skills verfolgst. Wenn du eine breitere Talent-Sourcing-Pipeline aufbaust, behandelt how to scrape GitHub, wie man Entwickler anhand ihrer öffentlichen Aktivität und Repos findet, und how to scrape Indeed deckt die klassische Jobbörsen-Seite ab. Für den rechtlichen Rahmen dahinter siehe is web scraping legal.
Häufig gestellte Fragen
Hat Upwork eine offizielle öffentliche API?
Ja. Upwork betreibt eine OAuth-2.0-API, dokumentiert unter developer.upwork.com, aber sie ist nicht self-serve — du beantragst Client-Zugangsdaten im API Center, und Upwork prüft die Bewerbung anhand eines verifizierten Kontos, wobei die Prüfung typischerweise etwa eine Woche dauert.
Ist es legal, Upwork-Job-Posts und Freelancer-Profile zu scrapen?
Job-Posts und öffentliche Freelancer-Profile sind ohne Login sichtbar, aber Upworks Trust & Safety Policy definiert Bots breit und besagt, dass Massenerfassung von Job-Feeds oder Profilen außerhalb genehmigter Nutzung nicht autorisiert ist, selbst mit einem API-Key. Das ist keine Rechtsberatung — prüfe Upworks Nutzungsbedingungen und konsultiere einen Anwalt für deinen konkreten Use Case.
Kann ich Upwork ohne API-Key scrapen?
Technisch sind die Seiten öffentlich, aber Upwork erkennt und blockiert aktiv nicht-menschliche Traffic-Muster, und die Bot-Policy gilt unabhängig davon, ob du einen API-Key besitzt. Ein DIY-Scraper muss zudem clientseitiges Rendering und session-basierte Suche lösen, was häufig scheitert.
Welche Daten bekomme ich aus Upwork-Job-Posts?
Titel, Beschreibung, Veröffentlichungsdatum, Budgettyp und -spanne, Erfahrungslevel, Projektdauer, Anzahl Angebote, benötigte Skills sowie Client-Signal wie Mitglied-seit-Datum, Gesamtausgaben, Anzahl Einstellungen, Branche und Unternehmensgröße.
Welche Daten bekomme ich aus Upwork-Freelancer-Profilen?
Name, Titel, Stundensatz, Verifizierungsstatus, Übersicht, Bewertung, Anzahl Reviews, Job-Success-Score, Standort, Gesamtzahl an Jobs und geleisteten Stunden sowie aktuelle Feedback-Einträge mit Datum und Bewertung.
Wie lange dauert Upworks API-Genehmigungsprozess?
Upworks eigene Support-Dokumentation besagt, dass die Prüfung typischerweise etwa eine Woche dauert, nachdem du die Bewerbung im API Center eingereicht hast, wobei die meisten Ablehnungen an fehlenden oder unverifizierten Kontodetails liegen, nicht am Use Case selbst.
Wie unterscheidet sich eine strukturierte Upwork API von Upworks eigener offizieller API?
Eine strukturierte Drittanbieter-API wie die von Crawlora liefert normalisiertes JSON für Jobsuche, Job-Detail und Freelancer-Profilseiten, ohne dass du Upworks Konto-Verifizierungs- und Genehmigungsprozess durchlaufen musst — nützlich, wenn du öffentliche Job- oder Profildaten brauchst, ohne dich für direkten Plattformzugriff zu bewerben.