Upwork Rate & Market Intelligence — Freelance Skill Rates avatar

Upwork Rate & Market Intelligence — Freelance Skill Rates

Pricing

from $475.30 / 1,000 skill benchmarks

Go to Apify Store
Upwork Rate & Market Intelligence — Freelance Skill Rates

Upwork Rate & Market Intelligence — Freelance Skill Rates

Benchmark Upwork job-search data by skill. Get a row per skill with demand, rates, experience mix, freshness, engagement lengths, and adjacent skills. Run with skills and sampleSize; no Upwork login. Pricing: $0.49 per skill-benchmark event on Free.

Pricing

from $475.30 / 1,000 skill benchmarks

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

4

Monthly active users

4 days ago

Last modified

Categories

Features

Limited permissions

Share

Upwork Rate Benchmark & Market Intelligence

Extract public Upwork job-search data for each skill and get one benchmark row with demand, rates, experience mix, freshness, engagement length, and adjacent skills. On Free, pay $0.49 per skill-benchmark event and $0.00005 per apify-actor-start event.

  • Compare median, p25, and p75 rates before setting a freelance price.
  • Scope agency services with demand, experience mix, budgets, and engagement lengths.
  • Benchmark contractor cost using one row per skill.
  • Track freshness and adjacent skills for positioning or recurring analysis.
  • Run it from your Apify account without an Upwork login or credentials.

What you get

Each skill is processed independently and produces one aggregated benchmark row. The Actor queries Upwork's public job search through its visitor API, samples recent postings, computes statistics, and does not request client-account or applicant data.

FieldWhat it tells you
skillSkill or keyword used.
demand_open_jobsSearch-wide open-job total.
sample_sizeSampled postings used for statistics.
hourly_median_usdMedian hourly rate from hourly postings.
fixed_median_usdMedian fixed-price budget from fixed postings.
hourly_rate_usdHourly distribution: count, median, p25, p75, min, max, mean.
hourly_min_usdDistribution of lower hourly-band edges.
hourly_max_usdDistribution of upper hourly-band edges.
fixed_budget_usdFixed-price distribution with the same statistics.
job_type_splitHourly/fixed counts and hourly_share/fixed_share.
experience_mixentry, intermediate, and expert counts plus expert_share.
expert_shareShare classified as expert-level.
freshnessCounts and shares for 24 hours, 7 days, and 30 days, ages, and estimated posts per day.
posted_7dSampled postings published within 7 days.
engagement_weeksProject-length distribution where stated.
adjacent_skillsUp to 15 co-occurring skills with count and share.
scraped_atISO timestamp for the run.

Hourly rates use a posting's band midpoint when both edges are available. Fixed-price statistics use fixed budgets; p25–p75 shows the middle of the sampled market. freshness and adjacent_skills describe the sample, while demand_open_jobs is search-wide.

Sample output

This sample omits the remaining 12 adjacent_skills items; the other fields are copied from one dataset record.

{
"skill": "python developer",
"demand_open_jobs": 1087, "sample_size": 100,
"hourly_median_usd": 35, "fixed_median_usd": 120,
"expert_share": 0.41, "posted_7d": 100,
"hourly_rate_usd": {"count":50,"median":35,"p25":21.5,"p75":41.88,"min":5,"max":400,"mean":44.99},
"hourly_min_usd": {"count":50,"median":25,"p25":13,"p75":30,"min":3,"max":300,"mean":33.26},
"hourly_max_usd": {"count":50,"median":40,"p25":30,"p75":51.75,"min":7,"max":500,"mean":56.72},
"fixed_budget_usd": {"count":31,"median":120,"p25":35,"p75":475,"min":10,"max":3500,"mean":491.39},
"job_type_split": {"hourly":69,"fixed":31,"hourly_share":0.69,"fixed_share":0.31},
"experience_mix": {"entry":12,"intermediate":47,"expert":41,"expert_share":0.41},
"freshness": {"sampled_with_date":100,"posted_24h":23,"posted_7d":100,"posted_30d":100,"share_7d":1,"newest_age_hours":0.4,"oldest_age_hours":82.7,"est_posts_per_day":29.2},
"engagement_weeks": {"count":100,"median":9,"p25":3,"p75":18,"min":3,"max":52,"mean":17.19},
"adjacent_skills": [{"skill":"Python","count":85,"share":0.85},{"skill":"JavaScript","count":29,"share":0.29},{"skill":"API","count":19,"share":0.19}],
"scraped_at": "2026-10-12T01:00:20.753214+00:00"
}

Pricing

This Actor uses pay-per-event billing. One fully computed benchmark for one skill is one skill-benchmark event; a skill with no live postings is not charged. The Actor also has an apify-actor-start event.

Planapify-actor-start per eventskill-benchmark per event
Free$0.00005 on Free$0.49 on Free
Bronze$0.0000495 on Bronze$0.4851 on Bronze
Silver$0.000049 on Silver$0.4802 on Silver
Gold$0.0000485 on Gold$0.4753 on Gold
Platinum$0.000048 on Platinum$0.4704 on Platinum
Diamond$0.0000475 on Diamond$0.4655 on Diamond

On Free, 1,000 skill-benchmark events cost $490 and 10,000 cost $4900; 1,000 apify-actor-start events cost $0.05 and 10,000 cost $0.5.

For one Actor Start event and three successfully benchmarked skills, 3 results = $1.47005 on Free: three skill-benchmark events at $0.49 on Free plus one apify-actor-start event at $0.00005 on Free.

Apify Free plan includes $5 of monthly platform usage credit. At the Free-plan prices above, the supplied calculation gives 10 skill-benchmark events after one Actor Start event. The credit is subject to other account usage.

Compute, Apify Proxy traffic including residential traffic, and storage are included in the event prices and paid by the Actor developer.

How to use

  1. Enter one or more skills or keywords in skills. Each runs independently.
  2. Choose a sampleSize from 10 to 500; demand remains the full search-wide total.
  3. Keep the default proxyConfiguration for reliable Upwork access. It uses Apify RESIDENTIAL with US country selection.
  4. Run the Actor from your Apify account. No Upwork login, cookies, or credentials are requested.
  5. Inspect dataset rows for demand, rates, contract type, experience, freshness, engagement length, and adjacent skills.
  6. Repeat runs through Apify Schedules; daily is a starting point for tracking benchmarks.
{
"skills": ["python developer", "react", "copywriting"],
"sampleSize": 100,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

Input parameters

ParameterWhat it doesDefault
skillsArray of skill or keyword strings; each is processed independently.Not set
sampleSizeRecent postings sampled per skill for rate, freshness, engagement, and adjacency calculations. Accepted range: 10–500.100
proxyConfigurationApify proxy configuration used to reach Upwork.useApifyProxy: true, apifyProxyGroups: ["RESIDENTIAL"], apifyProxyCountry: "US"
disableUsageStatsDisables the usage statistics below when true.false

Limits and edge cases

ConditionWhat you seeWhat to do
skills is omitted or has no usable stringsNo dataset rows; {"error":"no_skills"} is stored in OUTPUT.Provide a non-empty skill or keyword.
sampleSize is below 10 or above 500Runtime bounds it to 10–500.Use 10 to 500 explicitly.
No live postings and demand is zeroNo row; skill is recorded as no_results; no skill-benchmark event is charged.Try another keyword or run later.
A rate category has no positive observationsIts distribution can have count: 0 and null statistics.Interpret the available category using its count.
Fewer postings exist than requestedsample_size can be lower than requested.Treat it as the number actually sampled.
A later page is challengedPagination stops and a partial sample can be returned.Check sample_size and rerun if needed.
Upwork access fails before the first pageNo benchmark row; failure information is recorded in OUTPUT.Keep the default residential proxy and review the run log.
A run has no input skillsThe Actor exits without benchmarking.Add values to skills and start a new run.

The collector requests pages of up to 50 postings, and the sample size is capped at 500. Engagement statistics use postings with an available duration.

FAQ

How much does it cost to scrape Upwork?

Billing is per skill-benchmark and apify-actor-start event; see Pricing for the plan-labelled prices and worked example. A skill with no live postings is not charged.

What happens when a skill has no live postings?

The Actor produces no row when both the sampled posting count and demand count are zero. It records no_results and does not charge a skill-benchmark event for that skill.

What should I do if the run cannot access Upwork?

Keep the default Apify RESIDENTIAL proxy configuration, then review the run log and OUTPUT failure information.

Does this need my Upwork login?

No. The Actor uses Upwork's public job search and does not request a login, cookies, or credentials.

The Actor collects public job-posting data from Upwork's public job search. Whether a use is allowed depends on Upwork's source terms and applicable law for your use case; review those requirements yourself. This README does not provide a legal guarantee.

Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.

To opt out, set disableUsageStats to true in the input. Nothing is sent then.

Full list of collected fields