
Upwork Jobs Scraper
hipersoft/upwork-scraper
Scrape Upwork job listings by keyword: title, description, hourly range or fixed budget, experience level, duration, workload, skills and posting date. Filter by type, level and location. Export to JSON, CSV or Excel.
Total users
2Monthly users
1Total runs
7Per job scraped
$0.002Last rebuilt
Nov 4, 2026Overview
Upwork Jobs Scraper extracts public freelance job listings from Upwork by keyword: title, description, hourly range or fixed budget, experience level, project length, workload, skills and posting date. Filter by job type, level, length and client location, then export to JSON, CSV or Excel.

What does Upwork Jobs Scraper do?
It runs your Upwork job searches and returns one clean row per job. Run several searches at once; a job found by two searches is delivered and charged once. A test run collected 1,168 unique jobs across five searches in about two minutes.
Client details aren't included. This actor returns the job listing itself, not client spend, reviews or payment verification.
What data can you scrape from Upwork?
| Data | Fields |
|---|---|
| Job | jobId, title, description, url, publishedAt |
| Pay | jobType, hourlyMin, hourlyMax, fixedBudget |
| Requirements | experienceLevel, skills, duration, workload |
| Context | searchQuery, collectedAt |
Use cases
- Freelancers and agencies: catch new jobs that match your skills, on a schedule.
- Rate research: see what clients offer for a skill.
- Skill demand: track which tools and skills clients ask for.
- Lead generation: spot project demand in your niche.
- Job alerts: send new listings to Slack, Sheets or email with integrations.
How to scrape Upwork jobs
- Open Upwork Jobs Scraper.
- Add your job searches.
- Pick any filters.
- Click Start.
- Export to JSON, CSV, Excel or XML.
Input
{
"queries": ["react developer"],
"sort": "recency",
"jobType": "0",
"experienceLevel": ["2", "3"],
"workload": "full_time",
"minHourlyRate": 30,
"maxAgeHours": 720,
"maxResultsPerSearch": 40
}
| Field | Description |
|---|---|
queries |
What to search for. |
maxResultsPerSearch |
Jobs per search (default 100). |
sort |
recency (newest) or relevance. |
jobType |
any, 0 (hourly) or 1 (fixed price). |
experienceLevel |
1 entry, 2 intermediate, 3 expert. |
duration |
week, month, semester or ongoing. |
workload |
as_needed, part_time or full_time. |
locations |
Client regions or countries. |
clientHires |
0, 1-9 or 10-. |
minFixedBudget |
Drop fixed-price jobs below this (USD). |
minHourlyRate |
Drop hourly jobs whose top rate is below this (USD). |
maxAgeHours |
Only jobs posted in the last N hours. |
Output
A real row from a test run, with the description shortened.

{
"jobId": "2118006378163258089",
"title": "Seeking a Full-Stack Developer to Develop an AI-Based SaaS Product",
"url": "https://www.upwork.com/jobs/~022118006378163258089",
"jobType": "hourly",
"hourlyMin": 56,
"hourlyMax": 68,
"fixedBudget": null,
"experienceLevel": "Expert",
"duration": "More than 6 months",
"workload": "Full time",
"skills": [
"Next.js",
"Node.js",
"AI Development",
"API Integration",
"Web Development",
"PostgreSQL",
"AI Model Integration",
"Full-Stack Development",
"SaaS Development"
],
"description": "We are looking for an experienced Full-Stack Developer to build an AI-powered SaaS invoici…",
"publishedAt": "2026-11-04T15:45:47.099Z",
"searchQuery": "react",
"collectedAt": "2026-11-04T21:06:16.882481+00:00"
}
Output schema
| Field | Type | Description |
|---|---|---|
jobId |
string | Upwork job ID. |
title |
string | Job title. |
url |
string (URL) | Link to the job. |
jobType |
string | hourly or fixed. |
hourlyMin / hourlyMax |
number | Hourly range in USD, when the client set one. |
fixedBudget |
number | Fixed budget in USD, when set. |
experienceLevel |
string | Entry level, Intermediate or Expert. |
duration |
string | Project length. |
workload |
string | Hours per week. Not set on fixed-price jobs. |
skills |
array | Skills on the listing. |
description |
string | Job description. |
publishedAt |
string (ISO date) | When it was posted. |
searchQuery |
string | The search that found it. |
collectedAt |
string (ISO date) | When the row was collected. |
Need more freelance and job data?
- Google Jobs Scraper: jobs from many boards at once.
- ATS Jobs Scraper: company career sites.
FAQ
How much does it cost? You pay per job delivered, shown on the Pricing tab. Set a maximum cost per run and it stops cleanly at that limit, storing only what you paid for.
How many jobs can I get? That depends on the search. Popular searches returned 400 or more in testing, and narrower ones fewer. Run several searches for broader coverage.
Can I get only new jobs? Yes. Schedule a run with sort Newest and a Posted within window.
Can I connect this to other tools? Yes, through integrations on the Apify platform: Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API and webhooks.
Is it legal to scrape Upwork? It returns publicly listed jobs. You are responsible for how you use them, including Upwork's terms and privacy law.
Notes
Independent tool, not affiliated with Upwork. Returns only public data; you are responsible for how you use it.
Feedback
How did it go? Good or bad, a review helps other users decide and tells us what to improve. Something broken or missing? Open an issue and we'll look at it.
Input
| Field | Type | Description |
|---|---|---|
queriesJob searches | array | What to search for, one per line. |
maxResultsPerSearchMax jobs per search | integer | How many jobs to collect per search. Default: 100 |
sortSort | string · relevance, recency | Result order. Default: "recency" |
jobTypeJob type | string · any, 0, 1 | Hourly or fixed price. Default: "any" |
experienceLevelExperience level | array | Empty keeps all. |
durationProject length | string · any, week, month, semester, ongoing | How long the project runs. Default: "any" |
workloadWorkload | string · any, as_needed, part_time, full_time | Hours per week. Default: "any" |
locationsClient location | array | Regions or countries, such as Americas, Europe, Singapore. |
clientHiresClient hires | string · any, 0, 1-9, 10- | How many freelancers the client has hired. Default: "any" |
minFixedBudgetMinimum fixed budget | integer | Drop fixed-price jobs below this amount (USD). |
minHourlyRateMinimum hourly rate | integer | Drop hourly jobs whose top rate is below this (USD). |
maxAgeHoursPosted within (hours) | integer | Only jobs posted in the last N hours. Use with sort Newest. |
proxyConfigurationProxy | object | Optional. |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~upwork-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"queries": [
"python developer"
]
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/upwork-scraper").call(run_input={
"queries": [
"python developer"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/upwork-scraper').call({
"queries": [
"python developer"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Job scraped One job listing delivered. | $0.002 | $0.001 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Dribbble Shots Scraper
Scrape public design shots from Dribbble: title, high-res image, tags, likes, views and designer credit. Filter by category or sort, export JSON, CSV or Excel.
368 runs · 5 users · $0.003 / shot scrapedComputrabajo Scraper
Scrape Computrabajo job listings across Latin America (Mexico, Colombia, Argentina, Chile, Peru and more): title, company, location, salary, posted date and apply URL. Filter by country and keyword. No setup.
210 runs · 4 users · $0.002 / listing scrapedKraken Market Data Scraper
Fetch Kraken spot market data in bulk: ticker stats (ask, bid, last, 24h high/low/volume/vwap), OHLC candles for any interval, order book depth (top bids/asks), and tradable pair metadata. Fast, clean and cheap.
168 runs · 4 users · $0.001 / pair scrapedBayt Scraper
Scrape Bayt.com job listings across the Middle East (UAE, Saudi Arabia, Egypt, Qatar and more): title, company, location, posted date and apply URL. Filter by country and keyword.
136 runs · 4 users · $0.003 / job scrapedGitHub Scraper
Search GitHub and scrape repositories (stars, forks, language, topics, license, dates) or user profiles (name, company, location, bio, followers, public email, repos). Uses the GitHub REST API; optional token for higher rate limits. For developer lead generation, OSS research and recruiting.
134 runs · 7 users · $0.0008 / item scrapedHacker News Scraper
Scrape Hacker News stories, comments, Ask HN, Show HN, jobs and polls by keyword, points, comments and date range. Sort by relevance or newest. Title, URL, author, points, comment count, text and HN link. Fast clean HTTP via the HN Algolia API, no setup.
133 runs · 2 users · $0.004 / item scrapedSend the site and the fields. We build it and you get it first.