Upwork Freelancers Scraper - Hourly Rate & Earnings avatar

Upwork Freelancers Scraper - Hourly Rate & Earnings

Pricing

from $16.99 / 1,000 result items

Go to Apify Store
Upwork Freelancers Scraper - Hourly Rate & Earnings

Upwork Freelancers Scraper - Hourly Rate & Earnings

Scrapes Upwork freelancer profiles by skill keyword. Returns a flat row with title, hourly rate, total earnings, job success score, and location.

Pricing

from $16.99 / 1,000 result items

Rating

5.0

(1)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

2

Bookmarked

402

Total users

70

Monthly active users

3 days ago

Last modified

Share

ParseForge

Upwork Freelancers Scraper

Scrape Upwork freelancer profiles by skill, keyword, location, or a pasted Upwork search URL. Each profile returns a permanent freelancer ID, the title, hourly rate, total earnings, job success score, hours and jobs worked, location, intro video link, and agency. No login or API key. Export to CSV, JSON, Excel, or XML.

Pay only for results: there is no start fee today, only a price per freelancer. From 3 October 2026 a run also carries the standard Apify start fee of $0.005 per GB of run memory, which is $0.005 per run at the default 1 GB.

Upwork's official API requires a developer account and restricts the depth of freelancer data you can pull. This actor reads the public search results directly, filtering by earned amount (including new freelancers with no earnings yet), hourly rate, job success, hours billed, Top Rated and Rising Talent badges, or specific countries and regions, and returns each matching profile in one consistent schema. Build a talent pipeline, analyze competitor skill sets, or populate a recruitment database without writing a single line of code.

Who uses itWhat they scrape Upwork for
Recruitment agenciesBuild a searchable database of pre-vetted freelance talent for specific skill sets.
Market analystsTrack the supply and hourly rates of freelancers in a given niche over time.
Sales teamsIdentify and qualify independent contractors who may need complementary tools or services.
Aspiring freelancersBenchmark their own rates and skills against top earners in their category.

What it does

This Actor collects Upwork freelancer profiles by skill keyword and returns each one as a flat row with their title, rate, earnings, and location.

  • ๐Ÿ”— Search URL input: build a search on upwork.com, paste its address, and the actor applies the same keyword and filters.
  • ๐ŸŒฑ Earned amount filter: find new freelancers with no earnings yet, or only those past $1, $100, $1k or $10k earned.
  • ๐Ÿ’ฒ Rate, job success and hours: set a minimum or maximum hourly rate, a minimum Job Success Score, or a minimum of hours billed.
  • โญ Badge filters: restrict results to Top Rated, Top Rated Plus, or Rising Talent freelancers.
  • ๐ŸŒ Location targeting: filter by continent, sub-region, or a specific country to find local talent.
  • ๐Ÿ” No repeats across runs: turn on "Skip freelancers from earlier runs" and a repeated search returns only profiles you have not collected yet.
  • ๐Ÿ†” Stable freelancer ID: every row carries Upwork's ~01... freelancer ID, which stays the same when a freelancer changes the username in their profile link.
  • ๐Ÿข Agency details: freelancers who belong to an agency come with the agency ID, name and page URL, plus every agency they are in.
  • ๐ŸŽฌ Intro video: the YouTube link from the profile's video introduction, when the freelancer has one.
  • ๐Ÿ”ข Volume control: set a precise maximum number of profiles to collect. Upwork shows at most 10,000 results per search, so larger pulls use several keywords in one run.
  • ๐Ÿ™ˆ Honest nulls: when a freelancer hides their earnings, Upwork reports $0. The actor returns totalEarnings: null instead of a false $0, with earningsHidden: true when the profile's hours, Job Success Score or badge prove the earnings are hidden. A missing Job Success Score is null, not 0.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

What you can do with Upwork data

๐Ÿ” Build a talent pipeline.

A recruiter runs the actor daily for 'react developer' and filters by Top Rated Plus to maintain a fresh list of elite candidates.

๐Ÿ“Š Analyze freelance market rates.

A market analyst scrapes 'python developer' across different regions to compare average hourly rates and inform a pricing report.

๐ŸŒŽ Find local contractors.

A project manager sets the country filter to 'Canada' and the skill to 'technical writer' to find nearby freelancers for an on-site contract.

๐ŸŒฑ Reach new freelancers first.

A tool vendor pastes https://www.upwork.com/nx/search/talent/?q=copywriting&loc=united-states&revenue=0 to list US copywriters who have not landed a paid job yet, and offers them an onboarding deal.

๐Ÿ” Work through a talent pool in batches.

An outreach team pulls 1,000 new copywriters on Monday and another 1,000 on Tuesday with the same search and history name. Tuesday's run leaves out everyone Monday already delivered, so nobody gets contacted twice.

๐Ÿ“ˆ Monitor competitor skills.

A freelancer scrapes their own niche to see which complementary skills top earners list and updates their own profile accordingly.

Why choose this scraper

What you get
No API registrationAccess public freelancer data without a developer account or OAuth tokens.
Fixed flat schemaEvery profile is normalized into the same columns for easy analysis.
Flexible location filtersTarget freelancers by continent, sub-region, or a single country.
Quality signalsFilter by Top Rated and Top Rated Plus badges to isolate high-quality talent.

How it compares

This actor focuses exclusively on freelancer profiles, while the competitors listed below are designed for scraping Upwork job postings.

FeatureParseForgeUpwork Job ScraperUpwork Job Extractor โšกUpwork Jobs
Scrapes freelancer profilesYesNot listedNot listedNot listed
Scrapes job postingsNot listedYesYesYes
Filter by Top Rated statusYesNot listedNot listedNot listed
Filter by freelancer locationYesNot listedNot listedNot listed
Returns freelancer hourly rateYesNot listedNot listedNot listed

Configure the run

Drive the Actor with a skill or job title keyword, and apply Top Rated and location filters as each profile is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

{
"searchQuery": "python developer",
"maxItems": 10
}

Several keywords at once: separate them with commas. Each keyword is searched on its own and the results are merged, so every freelancer is returned once even when two keywords both match them.

{
"searchQuery": "full stack developer, frontend developer, software engineer",
"maxItems": 100
}

Paste a search you built on upwork.com. Keyword (q), location (loc), earned amount (revenue), hourly rate (hourly_rate), job success (nss), hours billed (hours) and the Top Rated, Top Rated Plus and Rising Talent badges carry over:

{
"searchUrl": "https://www.upwork.com/nx/search/talent/?q=copywriting&loc=united-states&revenue=0",
"maxItems": 100
}

Or set the same filters by hand:

{
"searchQuery": "copywriting",
"country": "United States",
"earnings": "none",
"maxItems": 100
}

Run the same search again later without getting anyone twice. Every run that uses the same history name skips the freelancers earlier runs delivered:

{
"searchUrl": "https://www.upwork.com/nx/search/talent/?q=copywriting&loc=united-states&revenue=0",
"maxItems": 1000,
"skipPreviouslyScraped": true,
"historyName": "us-copywriters-new"
}

A larger pull:

{
"searchQuery": "python developer",
"maxItems": 200
}

Pricing

Pay-per-result: you pay only for the freelancer profiles written to your dataset. The price per result depends on your Apify plan:

Apify planPrice per result1,000 results
Free$0.02266$22.66
Starter (Bronze)$0.02078$20.78
Scale (Silver)$0.01888$18.88
Business (Gold) and above$0.01699$16.99

Optional extras (from 3 October 2026)

A run now carries the standard Apify start fee, charged once per gigabyte of run memory. The price per freelancer is unchanged.

EventPriceCharged when
apify-actor-start$0.005 per GB of run memory ($0.005 per run at the default 1 GB). Bronze $0.0046, Silver $0.0042, Gold and above $0.0038 per GBthe run starts

New Apify accounts start with $5 in free credit.

Free users

Free-plan runs return up to 100 results as a preview. Upgrade your Apify plan to lift that cap.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Upwork Freelancers Scraper.
  3. Set your inputs and any filters, then click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to Upwork through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/upwork-freelancers-scraper"

Then prompt it in plain language to run the scraper and read back the results.

Troubleshooting

Why am I getting no results?

Check that your searchQuery is spelled correctly and is a common term on Upwork. Also, try disabling the Top Rated or location filters, as they may be too restrictive for your chosen keyword. The run's status message says which search came back empty, and a run that ends with a warning instead of rows always names the reason.

I pasted a freelancer's profile link and got no data.

upwork.com/freelancers/~01... is one person's profile page, not a search. This Actor reads Upwork's talent directory, so paste a talent search address (https://www.upwork.com/nx/search/talent/?q=...) or type the skill in "Skill or job title keyword". The run says so in its status message rather than failing.

Why is the actor running slowly?

The actor respects Upwork's pages to avoid blocks. If you are collecting a very large number of profiles, the run will naturally take longer. Try reducing the maxItems for a faster test.

Why did the log say some search URL filters were skipped?

Upwork only offers some filters to signed-in clients, English level (english) among them. The actor reads the public search, so it applies every filter the public search supports, skips the rest, and lists the skipped ones in the log.

Why does an earned amount search take longer?

Upwork does not filter by earnings for visitors, so the actor reads the matching profiles in order and keeps the ones in your bracket. New freelancers tend to sit deeper in the results. You pay only for the profiles that match; a narrower keyword or location finishes faster.

Why did a run with "Skip freelancers from earlier runs" return fewer profiles than I asked for?

The history leaves out everyone earlier runs with the same history name already delivered. Once most matches have been collected, few new ones are left, and Upwork shows at most 10,000 results per search. Broaden the keyword or location, or use a new history name to start over.

Why are my location filters being ignored?

Only one location filter can be used at a time. If you set a country, the region and sub-region filters are ignored. The 'US Only' checkbox is also ignored when any other location filter is set.

Why do some profiles have missing data fields?

Not all freelancers make their full profile public. When a freelancer hides their earnings, Upwork's search still sends $0, so the actor returns totalEarnings: null and earningsHidden: true (about 1 in 5 experienced freelancers in our tests). totalEarnings is also null, with earningsHidden: false, when Upwork reports $0 for a freelancer who has jobs but no billed hours, because the search cannot tell an unpaid first job from hidden earnings. jobSuccessScore is null for freelancers who have no score yet or hide it. Other fields are null when Upwork sends nothing for them.

I am getting an error about the input schema.

Ensure your maxItems is a whole number between 1 and 1,000,000. Also, verify that any country or region name you entered matches the exact spelling from the dropdown list.

FAQ

QuestionAnswer
Can I scrape freelancers by a specific skill?Yes. The searchQuery input accepts any skill or job title keyword, such as 'python developer', 'web scraping', or 'react'.
How do I filter for only US-based freelancers?Enable the 'US Only' checkbox. This filter is ignored if you also set a region, sub-region, or country.
What is the difference between Top Rated and Top Rated Plus?Top Rated is a badge for proven freelancers. Top Rated Plus is a higher tier for top earners on large contracts. You can filter by either or both.
Can I combine location filters?No. Only one location filter can be active at a time. Choose either a region, a sub-region, or a specific country.
Does this actor scrape job postings?No. This actor scrapes freelancer profiles. A separate ParseForge actor for Upwork job postings is in preparation. For job postings on company career sites and job boards, see the jobs actors under Related actors.
How many profiles can I collect in one run?You can set the maximum from 1 up to 1,000,000 profiles per run using the maxItems input.
Can I paste an Upwork search URL?Yes. Put the address of a talent search from upwork.com in the searchUrl input. Its keyword, location, earned amount, hourly rate, job success, hours billed and badge filters replace the matching fields.
How do I find new freelancers with no earnings?Set Earned amount to 'No earnings yet', or paste a search URL that has revenue=0. Upwork reports $0 both for new freelancers and for those who hide their earnings. Freelancers with no work history come back with totalEarnings: 0. Profiles with hidden or unknown earnings come back with totalEarnings: null, so keep only the rows where totalEarnings is 0 if you want strictly new freelancers.
How do I avoid duplicates between runs?Turn on "Skip freelancers from earlier runs" and keep the same history name. The actor saves the ID of every freelancer it delivers in a key-value store in your Apify account and leaves them out of later runs. You are charged only for new profiles.
Can every run use the same history name?Yes, that is how it is meant to be used. Keep the same name on every run and each one skips everyone the earlier runs delivered. Use a different name only when you want a separate list.
How do I reset the history?Use a new history name, or delete the key-value store with that name under Storage in Apify Console.
Can I filter by English level?Not yet. Upwork only offers the English level filter to signed-in clients, so it is skipped and noted in the log.
Do I need an Upwork account to use this?No. The actor reads publicly available search results and does not require a login or API key.
What data fields does the actor return?It returns a flat row of 36 fields for each freelancer, including their freelancer ID, name, title, description, hourly rate, total earnings, job success score, hours and jobs worked, Top Rated status, skills, city, country and timezone, intro video link, and agency.
How is the Job Success Score written?jobSuccessScore is Upwork's own 0 to 1 fraction (1 means 100%, 0.97 means 97%), and jobSuccessPercent is the same score as the whole percent shown on Upwork. Both are null when the freelancer has no score or hides it.
Which field should I use as a key?freelancerId (the ~01... ID). The username in profileUrl can change; the ID does not. personId is Upwork's numeric ID for the same person, sent as text so no digits are lost.
What agency data is included?agencyId (~01...), agencyOrgId (numeric), agencyName and agencyUrl for the freelancer's first agency, and an agencies list with the ID, name, URL, tagline and logo of each agency they belong to. Freelancers without an agency have these empty.
Where is the YouTube video?In videoUrl: the link a freelancer added as their profile's video introduction. It is empty when they have none. Links written inside the description text stay in description.
Can I export the results to Excel?Yes. The dataset can be exported in CSV, JSON, Excel, or XML formats directly from Apify.
How do I avoid getting blocked?The actor runs on the Apify platform with built-in proxy rotation to help ensure reliable data collection.

Next step

Each row carries the fields that these ParseForge jobs Actors take as input:

  • Salaries for the same skill. Look up a job title from title in Levels.fyi Salary Scraper to compare freelance hourlyRate with base, stock and bonus pay at tech companies.
  • Full-time demand for the same skill. Put a skill from skills into searchQuery of Indeed Jobs Scraper to set freelance hourlyRate against the salary ranges employers post for that skill.
  • Companies hiring that skill in-house. Put the same skill into searchTerms of Career Site Jobs Scraper to find employers with open roles for it on their own career sites.

Other ParseForge jobs actors:

A separate ParseForge actor for Upwork job postings is in preparation.

Browse the full ParseForge collection for more scrapers.

๐Ÿ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

โš ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Upwork Global Inc. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.