Upwork Jobs Scraper avatar

Upwork Jobs Scraper

Pricing

from $2.00 / 1,000 jobs

Go to Apify Store
Upwork Jobs Scraper

Upwork Jobs Scraper

The Upwork Jobs Scraper extracts job listings from Upwork, capturing titles, descriptions, hourly and fixed budgets, skills, experience level and duration, plus optional client spend, hire rate, rating and applicant counts — ideal for freelance lead generation and rate benchmarking.

Pricing

from $2.00 / 1,000 jobs

Rating

0.0

(0)

Developer

FalconScrape

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

4

Monthly active users

4 days ago

Last modified

Share

🚀 Upwork Jobs Scraper: Job Posts, Budgets and Client Data

Export Upwork job posts as clean JSON, CSV or Excel. The Upwork Jobs Scraper runs any Upwork job search and returns each job's title, full description, hourly rate range or fixed budget, skills, experience level, duration and posting date. Switch on client details to add the client's spend, hiring history, location and how many freelancers already applied. Use it for freelance lead generation, Upwork hourly rate research, or as a simple alternative to the Upwork API.

🎯 Use Cases

  • Upwork job search on autopilot: run your saved keywords every hour and get only fresh job posts, instead of refreshing the search page.
  • Upwork lead generation for agencies: find clients who post jobs in your niche, with their total spend and hire history, and prioritise the ones who actually hire.
  • Upwork hourly rates research: collect hourly rate ranges and fixed budgets per skill, such as Python jobs vs. Django jobs, to price your own services.
  • Job alerts in your own tools: push new Upwork job listings to Slack, Google Sheets or an n8n workflow now that Upwork no longer offers job RSS feeds.
  • Market research: track which skills, experience levels and project lengths clients ask for over time.

✨ Features

  • Complete job data: title, full description, job type, hourly rate range or fixed budget, experience level, project duration, workload, skills and posting dates.
  • Keyword search: any number of search terms per run, such as python developer, shopify or logo design.
  • Browse everything: leave the search empty to read the newest jobs across all categories.
  • Client details (optional): client country, city and timezone, payment verification, total spent, jobs posted, hires, hours billed, rating and review count, company size and industry, and whether the client is a top client.
  • Competition signals (optional): total applicants, freelancers hired, interview invitations, invitations sent, positions to hire and the client's last activity on the job.
  • No duplicates: a job found by several keywords in one run is saved once.
  • Fair billing: a job is billed at the client-details price only when those details were actually retrieved. Otherwise it is billed as a plain listing. The run stops cleanly at the maximum cost you set, and the status shows how many jobs were saved.

🛠️ How It Works

  1. Enter search queries: one or more keywords, or leave the field empty to browse all open jobs.
  2. Set Maximum jobs: the default is 50. Turn on Scrape client details if you need client and applicant data.
  3. Run the scraper and download the results, or fetch them through the Apify API.

⚙️ Input

FieldWhat it does
Search queriesKeywords to search Upwork jobs for, one per line. Empty = all open jobs. Default ["python developer"].
Maximum jobsMaximum number of jobs to save across all queries. Default 50.
Scrape client detailsAlso open each job for client and applicant data. Slower and billed at the higher rate. Default off.
{
"searchQueries": ["python developer", "data engineer"],
"maxItems": 100,
"scrapeJobDetails": false
}

💰 How Much Does It Cost to Scrape Upwork?

Pay only for the jobs you get. No monthly rental.

EventPriceWhat you get
Job$0.002 per job ($2.00 per 1,000)One job post with all listing fields
Job with client details$0.022 per job ($22.00 per 1,000)The same job plus client and applicant data
Actor start$0.00005 per runCharged once when the run starts.

Examples:

  • 50 job posts (the default input) = $0.10
  • 1,000 job posts for a rate study = $2.00
  • 100 jobs with full client details for lead generation = $2.20

Set a maximum cost on the run and the scraper stops before going over it.

📊 Sample Output Data

A real job saved with Scrape client details on (description shortened):

{
"id": "2110099034437902237",
"ciphertext": "~022110099034437902237",
"title": "Python Developer for Document Pipeline",
"description": "Task Duration 1 - 2 weeks. What we have: An interactive US map (a single self-contained HTML file) with about 236 water sites…",
"jobType": "Hourly",
"hourlyRateMin": 90,
"hourlyRateMax": 120,
"fixedBudget": null,
"currency": "USD",
"experienceLevel": "Expert",
"duration": "1 to 3 months",
"workload": "As needed",
"skills": ["Python", "Python Script", "Jinja2", "anthropic", "Claude Code", "Data Extraction", "ETL Pipeline"],
"isPremium": false,
"publishedAt": "2026-10-13T20:04:49.402Z",
"createdAt": "2026-10-13T20:03:08.647Z",
"renewedAt": null,
"clientCountry": "United States",
"clientPaymentVerified": true,
"clientTotalSpent": null,
"clientTotalReviews": 0,
"clientRating": 0,
"searchQuery": "python developer",
"url": "https://www.upwork.com/jobs/Python-Developer-for-Document-Pipeline_~022110099034437902237/",
"clientCity": null,
"clientTimezone": "America/Chicago (UTC-05:00)",
"clientTotalJobsPosted": 0,
"clientActiveJobs": 0,
"clientTotalHires": 0,
"clientTotalHours": 0,
"clientIndustry": null,
"clientCompanySize": null,
"clientAvgHourlyRatePaid": null,
"clientIsTopClient": false,
"totalApplicants": 87,
"totalHired": 0,
"totalInterviewing": 2,
"invitationsSent": 1,
"positionsToHire": 1,
"lastClientActivity": "2026-10-13T22:48:58.164Z",
"connectsRequired": null,
"occupation": "Back-End Development"
}

jobType is Hourly or Fixed price. Hourly jobs fill hourlyRateMin/hourlyRateMax, and fixed-price jobs fill fixedBudget. renewedAt is set when the client re-posted the job. searchQuery tells you which keyword found the job. With client details off, the row ends at url and its client fields are not filled in, so read clientPaymentVerified: false as unknown there. Client fields can also be null or 0 for new clients with no history yet, like the one above.

🔁 Schedule and Integrate

For job alerts, run the same search every hour or two with a small Maximum jobs (20–50). New posts appear at the top, and you can deduplicate on id across runs. For Upwork hourly rate research, a daily run builds a dated history. Set it up in Apify Schedules, then send results to Google Sheets, Slack, Zapier, Make, n8n or a webhook with Apify integrations.

🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (https://mcp.apify.com). An agent can call it with:

{ "searchQueries": ["n8n automation"], "maxItems": 20 }

❓ FAQ

Does Upwork have an official API? Yes. Upwork has a developer API, but it needs an Upwork account, an API key request and Upwork's approval, and it is built for apps that act on behalf of a signed-in user. This Actor needs no key or account. It reads the same public job posts a logged-out visitor sees and returns them as structured data, with client and applicant details on request.

Is there an Upwork RSS feed for new jobs? Upwork no longer offers job RSS feeds. Schedule this Actor with your keywords and send new jobs to Slack, email or Google Sheets through an Apify integration instead.

Do I need an Upwork account? No. The Actor reads only publicly visible job postings.

Why did I get fewer jobs than my Maximum jobs limit? Upwork shows logged-out visitors a limited number of results per search. In October 2026 that was around 80 jobs for python developer. Use several narrower keywords (python, django, fastapi) to cover more jobs. The log shows how many jobs were available for each query.

Why are client fields empty? Client fields are filled only when Scrape client details is on. Even then, new clients have no spend, rating or hiring history yet, so those fields are null or 0.

How do I find Upwork hourly rates for a skill? Search for the skill, export hourlyRateMin, hourlyRateMax and experienceLevel, and compare the ranges by experience level in a spreadsheet. Run it daily to see how rates move.

Is scraping Upwork legal? This Actor collects only publicly accessible job postings. You are responsible for how you use the data, including compliance with Upwork's terms and laws such as GDPR. If in doubt, seek legal advice.