Upwork Jobs Scraper
Pricing
from $1.50 / 1,000 job scrapeds
Upwork Jobs Scraper
Scrape job listings from Upwork search results. Returns title, description, budget, skills, experience level, duration, and posting time. Bypasses Cloudflare automatically — no proxy needed.
Pricing
from $1.50 / 1,000 job scrapeds
Rating
5.0
(4)
Developer
Gio
Maintained by CommunityActor stats
1
Bookmarked
148
Total users
37
Monthly active users
5 days ago
Last modified
Categories
Share
Upwork Jobs Scraper — Jobs, Budgets, Skills & Client Intelligence
Upwork Jobs Scraper extracts freelance job listings from Upwork by search query: title, full description, budget, contract type, experience level, required skills, proposal count and client intelligence (country, total spend, payment-verified status). It works with any keyword Upwork supports — google ads specialist, python developer, react frontend, copywriter — with no login, no cookies and no setup.
Export to JSON, CSV or Excel, pull it through the API, schedule it, or feed it straight to an AI agent. Think of it as an Upwork API for job and client data the official one doesn't give you.
What can you do with it?
- 🎯 Lead generation for freelancers & agencies — find clients hiring for the services you offer, filter on
clientCountryandclientTotalSpent, and target accounts worth direct outreach. - 📊 Skills & market analysis — track which skills, niches and project types are in demand; measure volume by query over time.
- 💰 Pricing & rate research — benchmark
budget,contractTypeandexperienceLevelacross hundreds of postings to set competitive rates. - 🤖 Application automation — feed each job's full
descriptionplus client data into an AI proposal pipeline that scores fit and drafts tailored proposals before competitors fill the queue. - 🔔 Job alerting — run on a schedule and filter noise on
proposals,clientVerifiedandclientTotalSpentbefore a notification reaches you.
What data does it extract?
| Field | Description |
|---|---|
jobId | Unique Upwork job ID (use for deduplication) |
title | Job title |
description | Full job description text |
contractType | Contract type (Hourly, Fixed-price) |
budget | Budget for fixed-price jobs |
experienceLevel | Required experience (Entry, Intermediate, Expert) |
duration | Estimated project duration and weekly hours |
postedOn | Time since posting |
skills | Array of required skills |
extraSkills | Count of additional skills beyond those listed |
proposals | Proposal-count bucket (Less than 5, 10 to 15, …) |
clientCountry | Client country |
clientTotalSpent | Client lifetime spend on Upwork |
clientVerified | Whether the client's payment method is verified |
url | Direct link to the job |
Input
Provide a search query (and optionally a cap on the number of jobs). Any keyword you can type into Upwork's search bar works.
| Field | Type | Description |
|---|---|---|
query | String | Required. Keywords to search for on Upwork (e.g. "google ads specialist", "python developer", "react frontend"). Default web scraping. |
max_jobs | Integer | Maximum number of jobs to return. Default 50, min 1, max 200. Pagination is handled automatically. |
Tip: Upwork supports search operators inside
query(e.g."python developer location:United States"). For more than 200 jobs, schedule multiple runs with different keywords.
Output
One record per job:
{"jobId": "022069215058129172988","title": "Surplus Funds Virtual Assistant","description": "Hello, I'm looking for a Virtual Assistant for my Surplus Funds Business. I'm looking to work with someone as I try to scale my business. The specific tasks I would like to outsource are as follows: I will provide the leads and need someone to: 1. Skip Trace 2. Begin the initial contact phase (phone calls, emails, texts) 3. Set up a call time with me...","contractType": "Hourly","budget": "","experienceLevel": "Intermediate","duration": "Less than 1 month, Hours to be determined","postedOn": "Posted 1 hour ago","skills": ["Appointment Scheduling", "Data Mining", "Report", "Lead Generation"],"extraSkills": 4,"clientVerified": false,"clientCountry": "","proposals": "","clientTotalSpent": "","url": "https://www.upwork.com/jobs/~022069215058129172988"}
Field notes
jobId: the canonical Upwork ID. Store it to deduplicate against your database or sheet and skip jobs you've already seen on subsequent runs.budget: populated for fixed-price jobs; empty for hourly contracts (the rate lives incontractType/durationinstead).skills/extraSkills:skillslists the named skills shown on the listing;extraSkillsis the count of additional skills beyond those displayed.clientCountry/clientTotalSpent/proposals: some postings genuinely lack these (brand-new clients without spend history, jobs with no proposals yet) and come back empty for that row.clientVerified:truewhen the client's payment method is verified — a strong signal that they actually pay.title,jobId,descriptionandurlare always populated for valid jobs.
Integrations
- API — start runs and fetch the dataset via the Apify API (REST/JSON) or the JS/Python clients. The
run-sync-get-dataset-itemsendpoint returns the dataset directly, no polling. An Upwork API for the data the official one doesn't expose. - Schedule & monitor — run on a schedule for recurring job alerting and market tracking; get notified on failures.
- AI agents / MCP — expose this actor to ChatGPT, Claude and other assistants through the Apify MCP server so an AI can pull live Upwork jobs and draft proposals on demand.
- No-code — pipe results into Make, Zapier, n8n, Google Sheets, Slack or your database with Apify integrations and webhooks. Branch by
clientCountry,experienceLevelorproposalsto filter ruthlessly.
FAQ
How does Upwork Jobs Scraper work? It searches Upwork exactly as a freelancer would, opens each job result, copies the visible job and client data and organizes it into a structured dataset — only much faster, and at scale. Newest jobs first.
Is it legal to scrape Upwork? The actor collects only publicly available job-posting information (no login, no personal data). As with any scraping, you are responsible for how you use the data and for complying with applicable laws and terms. See Is web scraping legal?
Do I need an Upwork account or login? No. No account, cookies or credentials. Proxy and Cloudflare unblocking are handled automatically with a real browser fingerprint.
Can I filter by location, rate or category?
Use the query field with Upwork's own search operators (e.g. "react budget:$1000+" or "python developer location:United States"). Anything you can type into Upwork's search bar works here. You can also branch downstream on clientCountry, experienceLevel, proposals and clientTotalSpent.
What happens if a field is empty?
Some Upwork postings genuinely lack a field — older fixed-price jobs without a budget, brand-new clients without spend history, jobs with no proposals yet. Those come back empty for the affected rows. title, jobId, description and url are always populated for valid jobs.
Can I deduplicate runs?
Yes. jobId is the canonical Upwork ID — store it and skip duplicates on later runs.
Can I get the data through an API or connect it to AI? Yes — run it via the Apify API/clients, or expose it to AI assistants through the Apify MCP server. See Integrations above.
How much does it cost?
You pay only for the jobs you scrape on a paid Apify plan; the Starter plan's monthly credits cover thousands of jobs. Bump max_jobs up to 200 per run, and schedule multiple runs with different keywords for more.
Related Actors
Building a job-data or lead-gen pipeline? Pair Upwork Jobs Scraper with:
- Google Jobs Scraper — job listings aggregated from across the web via Google Jobs.
- Workana Scraper — freelance project listings from Workana.
- Glassdoor Scraper — jobs, salaries and company reviews from Glassdoor.
- Wellfound Jobs Scraper — startup jobs and roles from Wellfound (AngelList).
⭐ Like this actor?
Trusted by thousands of runs. If it saved you time, please take 30 seconds to leave a review on the Apify Store — it's the single biggest way to support continued development.