Skip to content

Upwork Job Scraper

Try for free

Scrape public Upwork job search results: titles, descriptions, budgets, skills, and client stats. No account login.

🧑‍💻 Upwork Job Scraper

Save public Upwork job posts into a clean dataset: title, description, budget or hourly range, skills, experience level, and the client stats shown on the job. Search by keyword or paste an Upwork search URL, filter by budget, experience, and client history, and export to JSON, CSV, or Excel. No Upwork login needed.

✨ Why use Upwork Job Scraper?

  • 🔓 No login — it reads the public job search as a visitor.
  • 🎛️ Real Upwork filters — experience level, hourly or fixed, payment verified, hourly and fixed price ranges, client hire history, and client location.
  • 🕒 Fresh jobs — sort by newest and drop anything older than a window you choose, such as 24 hours.
  • 🧩 Custom rules — keep only jobs whose fields include, exclude, or equal the values you set.
  • 🔗 Paste a search URL — set up a search on Upwork once and paste the link to reuse every filter.
  • 👤 Client signals — client location, rating, and total spent when they are shown on the job.

🎯 Use cases

  • 🔔 New-contract alerts — watch a keyword and schedule the run to catch new jobs.
  • 💵 Rate benchmarking — compare hourly and fixed budgets for a skill.
  • 🎯 Lead lists — pull client country, spend, and rating to prioritize who to pitch.
  • 📊 Market research — see which skills show up most in the jobs for a topic.
  • 🤖 Automation feeds — send filtered jobs to a spreadsheet, CRM, or bot through the API.

🚀 How to use

  1. Enter a query (for example web scraping), or paste an Upwork search URL in rawUrl.
  2. Set maxResults (default 10, no upper limit).
  3. Add filters: experience, job type, budget, client history, location, or max job age.
  4. Click Start.
  5. Export to JSON, CSV, Excel, or HTML, or read the dataset through the API.

📥 Input

FieldTypeWhat it does
querystringKeywords, as you would type them into Upwork search.
rawUrlstringAn upwork.com/nx/search/jobs URL. Replaces the keyword and filters.
maxResultsintegerJobs to save. Default 10.
experienceLevelarrayentry, intermediate, expert. Empty means every level.
jobTypearrayhourly, fixed. Empty means both.
paymentVerifiedselectany, verified, or unverified.
minHourlyRate, maxHourlyRatenumberHourly range in USD.
minFixedPrice, maxFixedPricenumberFixed-price range in USD.
clientHistoryarraynoHires, 1to9Hires, 10+Hires.
locationarrayCountries or regions as Upwork writes them, such as United States.
sortselectnewest or relevance.
pageintegerStart page. Default 1.
maxJobAgeobjectDrop older jobs, for example {"value": 24, "unit": "hours"}.
customFiltersarrayRules on saved fields. Operators: includes, notIncludes, equals, notEquals.
proxyConfigurationobjectDatacenter proxy by default.
{
  "query": "web scraping",
  "maxResults": 10,
  "sort": "newest",
  "paymentVerified": "verified",
  "maxJobAge": { "value": 24, "unit": "hours" }
}

includes matches a substring, or any value in a list. equals matches the whole value, including null.

📤 Output

One dataset row per job.

FieldDescription
id, subId, urlUpwork job ids and the link to the job.
title, descriptionJob title and description.
budgetFixed budget or hourly range text.
jobType, experienceLevelFixed or Hourly, and the experience level.
relativeDate, absoluteDateWhen the job was posted.
tagsSkills attached to the job.
clientLocation, clientRating, clientTotalSpentClient signals, when shown.
paymentVerifiedPayment verification, or unknown when not shown.
proposals, clientName, questionsPresent as keys but usually empty, see Limits.
{
  "id": "2110149616222361215",
  "subId": "~022110149616222361215",
  "title": "County Data Scraping to Excel",
  "description": "Need a freelancer to scrape county-level data from public website and organize the info...",
  "url": "https://www.upwork.com/jobs/County-Data-Scraping-to-Excel_~022110149616222361215/",
  "budget": "$50.00",
  "relativeDate": "Posted 29 minutes ago",
  "absoluteDate": "2026-10-13T23:24:37.836000Z",
  "jobType": "Fixed",
  "experienceLevel": "Intermediate",
  "clientLocation": "Worldwide",
  "paymentVerified": "unknown",
  "clientRating": 4.9,
  "clientTotalSpent": 15000,
  "tags": ["Data Scraping", "Web Crawling"]
}

The example is trimmed: the description and URL are shortened, and empty keys are left out.

💰 Pricing

$0.0001 per job saved, which is $0.10 per 1,000 jobs, plus platform usage. Upwork puts public search behind a challenge, so every run opens a short browser session, and that browser usage is the main cost of a run.

Worked example: a 10-job run measured about $0.07 in total (the job fee of $0.001 plus platform usage, mostly browser time). Larger runs spread the browser session over more jobs.

❓ FAQ

Is it legal to scrape Upwork? The actor reads public job search pages without logging in. You are responsible for how you use the data and for following local law and Upwork's terms.

Do I need an Upwork login or my own proxy? No. A proxy is configured by default.

How many jobs can I get? As many as the search returns. The run pages through the results until it reaches maxResults or the last page.

Why are some fields empty? Client name, proposal counts, screening questions, and hire rate are not shown on the public job and stay empty. Client rating and spend appear only when they are on the page.

What happens with a bad URL? A URL that is not an Upwork job search fails the run with an explanation. A search that matches nothing finishes with an empty dataset.

Can I schedule it or use the API? Yes, through schedules in the console or the API.

⚠️ Limits

  • Public data only. Client name, name confidence, proposal counts, screening questions, hire rate, and payment verification are shown only to signed-in users, so those fields stay empty here.
  • Upwork challenges both datacenter and residential connections, so each run uses a browser session. Runs take about 2 to 5 minutes for 10 jobs, and a 200-job run about 12 to 15 minutes. Raise the run timeout for big runs.
  • If Upwork rate-limits the run (HTTP 429) or the run nears its timeout, the remaining jobs are saved without job-page details.
  • The payment-verified filter is ignored because Upwork hides it from logged-out visitors.
  • Client stats come from the job page when Upwork shows them, so they can be missing on some jobs.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.