Upwork Talent Scraper — Freelancers, Rates & Earnings
Under maintenancePricing
$19.00 / 1,000 freelancer profiles
Upwork Talent Scraper — Freelancers, Rates & Earnings
Under maintenanceScrape public Upwork freelancer profiles into clean JSON: name, title, hourly rate, EXACT lifetime earnings, total hours, hourly/fixed job split, top-rated flags, granular location, and skills. Search by keyword, no login or API key.
Pricing
$19.00 / 1,000 freelancer profiles
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
11 hours ago
Last modified
Categories
Share
Turn Upwork's public talent directory into clean, analysis-ready JSON. Search by keyword (or paste a filtered search URL) and get one structured record per freelancer — name, title, hourly rate, exact lifetime earnings, total hours, the hourly-vs-fixed job split, top-rated status, granular location, and a clean skills array. No login, no cookies, no API key.
This actor reads only the public, logged-out Upwork talent-search page — the same page any visitor sees — and parses the data Upwork itself ships in that page. It does not log in, solve a paywall, or touch private data.
Why this scraper
Most Upwork talent scrapers fall into one of two traps, and we fixed both:
- The "rich but wrong" trap. Some scrapers expose lots of fields but get the
important numbers wrong — returning
0lifetime earnings for clearly established, top-rated freelancers, or a broken job-success value. A market or rate analysis built on those numbers is quietly corrupted. - The "clean but thin" trap. Others return correct values but only coarse
buckets — a
"$400K+ earned"string instead of a number, a single"Philippines"location string with no city or timezone, and no job-type split.
This actor ships the precise figure — total_earnings_usd is the exact
number Upwork serves (e.g. 179240.68), not a bucket and not a zero — plus
granular location (country / state / city / region / timezone) and the
hourly/fixed/completed job-count split. Numbers you can actually sort, filter,
and model on.
What you get — output fields
One row per freelancer:
| Field | Description |
|---|---|
freelancer_id, ciphertext, profile_url | Stable identity + public profile link |
title, first_name, last_name, short_name, description | Headline + bio |
hourly_rate_usd, currency | Listed hourly rate |
total_earnings_usd | Exact lifetime earnings (the precise number, not a bucket) |
earnings_hidden | true if the freelancer hides earnings (then the figure is withheld by Upwork) |
total_hours | Lifetime tracked hours |
total_hourly_jobs, total_fixed_jobs, total_completed_jobs | Job-count split |
job_success_flag | Coarse job-success flag as shipped in the search payload (1/0, not a precise %) |
is_top_rated, is_top_rated_plus, top_rated_status | Reputation badges |
country, state, city, region, subregion, timezone | Granular location |
skills, skills_count | Clean skill names (e.g. "Data Scraping", not a slug) |
total_portfolio_items | Portfolio size |
offers_consultations, is_diversity_certified | Profile flags |
portrait_url | Avatar image URL |
search_query, search_rank | Which query surfaced this profile, and its position |
scraped_at | UTC timestamp |
Honesty note on job-success: Upwork's public search payload exposes job-success only as a coarse flag, not the precise 0–100 Job Success Score shown on the full profile page. We surface it as
job_success_flagand never dress it up as a percentage. The headline reputation signals you can trust here are the exact earnings, hours, job counts, and the top-rated badges.
Input
| Input | Description |
|---|---|
searchQueries | List of keywords, e.g. "python developer", "shopify expert". Each is searched and paginated. |
searchUrls | Optional. Full talent-search URLs from the Upwork UI (with your skill/location/rate filters). Pagination is automatic. |
maxProfiles | Ceiling on total freelancers returned (cost safety). Default 50. Upwork returns 10 per page. |
country | Two-letter managed-access exit country. Default us. |
Provide keywords, URLs, or both. Example:
{"searchQueries": ["python developer", "react developer"],"maxProfiles": 100}
Pricing
This actor is pay-per-result: you are charged once per profile-result
(one freelancer record). You only pay for the freelancers actually returned. The
managed-access layer that reaches Upwork reliably is included in the price — you
supply no proxy and no external key.
maxProfiles is a hard ceiling, so your spend is always bounded by the number of
results you ask for.
Use cases
- Rate & market intelligence. "What do top-rated Python developers actually charge, and how much have they earned?" Sort by exact earnings and rate to benchmark a skill's market.
- Recruiting / sourcing. Build a shortlist of freelancers for a skill, filtered by location/timezone for overlap with your team, ranked by hours and job count.
- Agency competitive analysis. Track which freelancers in your niche are winning the most work and at what rates.
- Talent-supply signals. Feed a dataset of available freelancers per skill into your own pricing or staffing model.
How it works
Upwork's talent-search page renders its data into an embedded state blob. This actor reaches the public page through a managed-access service (the top rung of our access ladder, included as our cost — you pay nothing extra), parses the embedded freelancer state with a real JavaScript engine, and emits one clean, flat row per freelancer. A managed-access browser is used as an automatic fallback if the request path is ever challenged.
Notes & limitations
- Only public profile data that Upwork serves to logged-out visitors is returned. No private contact details, no login-gated fields.
- Freelancers who hide their earnings or job-success on Upwork will have those
fields returned empty (
earnings_hidden: true) — we never fabricate a value. - Upwork shows up to ~1,000 pages of results per query; very deep pagination is
bounded by
maxProfiles. - Field availability follows what Upwork exposes; if Upwork changes its page, the parser is built on structure (not brittle CSS class names) to stay resilient.
Legal
This actor collects only publicly available information from Upwork's logged-out talent-search pages. You are responsible for using the data in compliance with Upwork's terms and all applicable laws (including data-protection rules such as GDPR/CCPA where relevant). Do not use the data for spam or unlawful profiling.