Upwork Jobs Scraper avatar

Upwork Jobs Scraper

Pricing

from $1.50 / 1,000 job scrapeds

Go to Apify Store
Upwork Jobs Scraper

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

Gio

Maintained by Community

Actor stats

1

Bookmarked

148

Total users

37

Monthly active users

5 days ago

Last modified

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 clientCountry and clientTotalSpent, 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, contractType and experienceLevel across hundreds of postings to set competitive rates.
  • 🤖 Application automation — feed each job's full description plus 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, clientVerified and clientTotalSpent before a notification reaches you.

What data does it extract?

FieldDescription
jobIdUnique Upwork job ID (use for deduplication)
titleJob title
descriptionFull job description text
contractTypeContract type (Hourly, Fixed-price)
budgetBudget for fixed-price jobs
experienceLevelRequired experience (Entry, Intermediate, Expert)
durationEstimated project duration and weekly hours
postedOnTime since posting
skillsArray of required skills
extraSkillsCount of additional skills beyond those listed
proposalsProposal-count bucket (Less than 5, 10 to 15, …)
clientCountryClient country
clientTotalSpentClient lifetime spend on Upwork
clientVerifiedWhether the client's payment method is verified
urlDirect 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.

FieldTypeDescription
queryStringRequired. Keywords to search for on Upwork (e.g. "google ads specialist", "python developer", "react frontend"). Default web scraping.
max_jobsIntegerMaximum 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 in contractType / duration instead).
  • skills / extraSkills: skills lists the named skills shown on the listing; extraSkills is 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: true when the client's payment method is verified — a strong signal that they actually pay.
  • title, jobId, description and url are 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-items endpoint 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, experienceLevel or proposals to 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.

Building a job-data or lead-gen pipeline? Pair Upwork Jobs Scraper with:


⭐ 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.