Upwork Rate & Market Intelligence — Freelance Skill Rates
Pricing
from $475.30 / 1,000 skill benchmarks
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
4
Monthly active users
4 days ago
Last modified
Features
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.
| Field | What it tells you |
|---|---|
skill | Skill or keyword used. |
demand_open_jobs | Search-wide open-job total. |
sample_size | Sampled postings used for statistics. |
hourly_median_usd | Median hourly rate from hourly postings. |
fixed_median_usd | Median fixed-price budget from fixed postings. |
hourly_rate_usd | Hourly distribution: count, median, p25, p75, min, max, mean. |
hourly_min_usd | Distribution of lower hourly-band edges. |
hourly_max_usd | Distribution of upper hourly-band edges. |
fixed_budget_usd | Fixed-price distribution with the same statistics. |
job_type_split | Hourly/fixed counts and hourly_share/fixed_share. |
experience_mix | entry, intermediate, and expert counts plus expert_share. |
expert_share | Share classified as expert-level. |
freshness | Counts and shares for 24 hours, 7 days, and 30 days, ages, and estimated posts per day. |
posted_7d | Sampled postings published within 7 days. |
engagement_weeks | Project-length distribution where stated. |
adjacent_skills | Up to 15 co-occurring skills with count and share. |
scraped_at | ISO 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.
| Plan | apify-actor-start per event | skill-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
- Enter one or more skills or keywords in
skills. Each runs independently. - Choose a
sampleSizefrom 10 to 500; demand remains the full search-wide total. - Keep the default
proxyConfigurationfor reliable Upwork access. It uses ApifyRESIDENTIALwith US country selection. - Run the Actor from your Apify account. No Upwork login, cookies, or credentials are requested.
- Inspect dataset rows for demand, rates, contract type, experience, freshness, engagement length, and adjacent skills.
- 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
| Parameter | What it does | Default |
|---|---|---|
skills | Array of skill or keyword strings; each is processed independently. | Not set |
sampleSize | Recent postings sampled per skill for rate, freshness, engagement, and adjacency calculations. Accepted range: 10–500. | 100 |
proxyConfiguration | Apify proxy configuration used to reach Upwork. | useApifyProxy: true, apifyProxyGroups: ["RESIDENTIAL"], apifyProxyCountry: "US" |
disableUsageStats | Disables the usage statistics below when true. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
skills is omitted or has no usable strings | No dataset rows; {"error":"no_skills"} is stored in OUTPUT. | Provide a non-empty skill or keyword. |
sampleSize is below 10 or above 500 | Runtime bounds it to 10–500. | Use 10 to 500 explicitly. |
| No live postings and demand is zero | No 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 observations | Its distribution can have count: 0 and null statistics. | Interpret the available category using its count. |
| Fewer postings exist than requested | sample_size can be lower than requested. | Treat it as the number actually sampled. |
| A later page is challenged | Pagination stops and a partial sample can be returned. | Check sample_size and rerun if needed. |
| Upwork access fails before the first page | No benchmark row; failure information is recorded in OUTPUT. | Keep the default residential proxy and review the run log. |
| A run has no input skills | The 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.
Is it legal to extract public Upwork job data?
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.
Related actors
- Upwork Talent Scraper — Freelancers, Rates & Earnings — related Upwork data about freelancers, rates, and earnings.
- Indeed Employer Intelligence — Reviews, Interviews & Dossier — related employer and job-market intelligence from Indeed.
- Levels.fyi Salary Scraper — Real Tech Comp Data | No Login — related technology compensation data from Levels.fyi.
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.