Upwork Talent Scraper — Freelancers, Rates & Earnings avatar

Upwork Talent Scraper — Freelancers, Rates & Earnings

Under maintenance

Pricing

$19.00 / 1,000 freelancer profiles

Go to Apify Store
Upwork Talent Scraper — Freelancers, Rates & Earnings

Upwork Talent Scraper — Freelancers, Rates & Earnings

Under maintenance

Scrape 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

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

11 hours ago

Last modified

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 0 lifetime 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 figuretotal_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:

FieldDescription
freelancer_id, ciphertext, profile_urlStable identity + public profile link
title, first_name, last_name, short_name, descriptionHeadline + bio
hourly_rate_usd, currencyListed hourly rate
total_earnings_usdExact lifetime earnings (the precise number, not a bucket)
earnings_hiddentrue if the freelancer hides earnings (then the figure is withheld by Upwork)
total_hoursLifetime tracked hours
total_hourly_jobs, total_fixed_jobs, total_completed_jobsJob-count split
job_success_flagCoarse job-success flag as shipped in the search payload (1/0, not a precise %)
is_top_rated, is_top_rated_plus, top_rated_statusReputation badges
country, state, city, region, subregion, timezoneGranular location
skills, skills_countClean skill names (e.g. "Data Scraping", not a slug)
total_portfolio_itemsPortfolio size
offers_consultations, is_diversity_certifiedProfile flags
portrait_urlAvatar image URL
search_query, search_rankWhich query surfaced this profile, and its position
scraped_atUTC 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_flag and 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

InputDescription
searchQueriesList of keywords, e.g. "python developer", "shopify expert". Each is searched and paginated.
searchUrlsOptional. Full talent-search URLs from the Upwork UI (with your skill/location/rate filters). Pagination is automatic.
maxProfilesCeiling on total freelancers returned (cost safety). Default 50. Upwork returns 10 per page.
countryTwo-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.

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.