Upwork Jobs Scraper (Job Alerts, Client Stats, No Login)
Pricing
from $0.55 / 1,000 jobs
Upwork Jobs Scraper (Job Alerts, Client Stats, No Login)
Scrape new Upwork jobs with no login: title, budget in USD, skills, experience level, proposals band and full description, plus the client's public stats (payment verified, total spent, hires, rating, country). Client filters and only-new mode make a job alert feed. $1 per 1,000 jobs.
Pricing
from $0.55 / 1,000 jobs
Rating
0.0
(0)
Developer
locaihost data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Get new Upwork jobs as rows, each with budget in USD, skills, experience level, proposals band and the full description, plus the numbers you check before you bid: the client's payment verification, total spent, hires, rating, reviews and country. From Upwork's public job search and job pages; no Upwork account needed.
- Run a job alert: schedule a saved search every 15 to 60 minutes and get only jobs you haven't seen.
- Skip weak clients: keep only payment-verified clients who have spent and hired before.
- Bid early: keep only jobs with few proposals so far.
- Study the market: budgets, skills and client spend across a category, newest first.
- Feed your own tools: send each new job to a sheet, Slack or n8n with Apify's integrations.
Quick start
Paste this into the JSON tab of the input and click Start:
{"searchQueries": ["python"], "maxJobsPerSearch": 10, "proxyConfiguration": {"useApifyProxy": true}}
You get the 10 newest matching jobs in about a minute: most of that is opening an Upwork visitor session, after which each job takes about a second. onlyNew is on by default, so running the same search again returns only jobs posted since.
A typical alert set-up, saved as a task and scheduled:
{"searchQueries": ["python", "web scraping"],"onlyNew": true,"paymentVerifiedOnly": true,"minClientSpendUsd": 1000,"maxProposals": 15}
What data can I get?
| Group | Fields |
|---|---|
| Job | jobId, title, url, postedAt, postedMinutesAgo, description, skills, category, categoryGroup, occupation |
| Budget and terms | jobType, budgetText (such as "$30-$60/hr"), fixedBudgetUsd, hourlyMinUsd, hourlyMaxUsd, experienceLevel, duration, workload |
| Activity | proposals (band such as "5 to 10"), interviewing, invitesSent, hired, positionsToHire, clientLastViewedAt |
| Client | clientCountry, clientPaymentVerified, clientTotalSpentUsd, clientHires, clientActiveHires, clientHoursBilled, clientRating, clientReviews, clientMemberSince, clientSpendPerHireUsd (total spent divided by hires), clientStatsAvailable |
| Preferences | freelancerCountries, freelancerRegions, preferredJobSuccessScore |
| Run | searchQuery, scrapedAt |
Every row has the same columns. A value Upwork didn't show is null.
One real row (run on 2026-10-18, shortened):
{"jobId": "~022111660249868354735","title": "Senior Big Data Engineer Needed to Troubleshoot and Fix Apache Spark Data Load Issue","url": "https://www.upwork.com/freelance-jobs/apply/Senior-Big-Data-Engineer-Needed-to-Troubleshoot-and-Fix-Apache-Spark-Data-Load-Issue_~022111660249868354735/","postedAt": "2026-10-18T03:27:06.251Z","jobType": "fixed","fixedBudgetUsd": 100,"budgetText": "$100 fixed","experienceLevel": "expert","duration": "Less than 1 month","category": "Data Mining & Management","skills": ["Apache Hadoop", "Python", "Machine Learning", "Algorithm Development"],"proposals": "Less than 5","interviewing": 0,"clientCountry": "United States","clientPaymentVerified": true,"clientTotalSpentUsd": 16366,"clientHires": 10,"clientHoursBilled": 513,"clientRating": 5,"clientReviews": 6,"clientMemberSince": "2026-02-22","clientSpendPerHireUsd": 1637,"clientStatsAvailable": true}
The dataset has three views (Jobs, Client quality, Budget and details) and exports to JSON, CSV, Excel or HTML. The run's SUMMARY record lists jobs returned and skipped, with the reasons.
How much does it cost?
You pay per job returned, with client stats included. There is no charge for Apify platform usage on top, and the residential proxy is included.
| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Job | $1.00 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |
Plus $0.00005 per run start. Apify's free $5 monthly credit covers about 5,000 jobs. Free-plan runs stop at 1,000 jobs each; any paid Apify plan removes the cap.
What's free: a job found by two of your searches (returned and charged once), jobs skipped by onlyNew, jobs your client, budget or proposal filters leave out, and runs that can't open Upwork or find nothing. To cap a run's spend, set Maximum cost per run in the run options.
Limits, stated up front
- Logged-out only. It reads what Upwork shows a visitor without an account: the public job search and public job pages. It never logs in and never asks for your cookies.
- Upwork sits behind Cloudflare. The Actor reads Upwork in a real browser over residential IPs and handles the "Verify you are human" check when it appears. Opening that session is the slow part of a run. If it can't be opened, the run stops and nothing is charged.
- Not shown to logged-out visitors, so not here: the client's name or company, jobs posted, hire rate, open jobs, average hourly rate paid, and connects price.
- About 1 job in 10 has a client box Upwork shows to registered users only. Those jobs still come back with their search data and
clientStatsAvailable: false; when a client filter is on, they are left out. - Client filters are applied by the Actor. Upwork's own search sends them to the login page, so
paymentVerifiedOnly,minClientSpendUsd,minClientRating,minClientHires,maxProposals,minHourlyRateUsdandminFixedBudgetUsdare checked on the public data. Budget filters are checked before a job page is opened. - About 5,000 results per search is Upwork's own cap. Split broad searches by category or job type.
- Budgets are in USD as Upwork lists them. A job with no budget given says so in
budgetText. - Time limit: if a run nears its timeout, it stops, keeps what it found and says so in the status message.
Only new since last run, and schedules
onlyNew is on by default. The Actor remembers which jobs each saved search already returned, so a schedule becomes an alert feed and you never pay twice for the same job. Results are newest first, and a run stops reading as soon as it reaches jobs an earlier run returned. Add postedWithinHours (for example 24) to cap how far back a first run goes, and turn onlyNew off to get every matching job again. Set up a schedule under Schedules in Apify Console.
Integrations: API, n8n, Make and AI agents
API. Run it and get the rows back in one call:
curl -X POST "https://api.apify.com/v2/acts/locaihost~upwork-jobs/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["shopify"], "maxJobsPerSearch": 20, "paymentVerifiedOnly": true}'
Apify's API clients for Python and JavaScript work the same way.
n8n, Make, Zapier, Google Sheets, Slack, webhooks. Apify's built-in integrations send each run's dataset wherever you need it, so every scheduled run can post its new jobs to a channel.
AI agents (MCP). Add this Actor to Claude, Cursor or any MCP client with https://mcp.apify.com/?tools=locaihost/upwork-jobs, then ask something like "Show me new fixed-price Shopify jobs from payment-verified clients who have spent over $1,000."
FAQ
How much does it cost to scrape Upwork jobs?
$1 per 1,000 jobs on the Free and Starter plans, client stats included, and less on Scale and Business. Apify's free $5 monthly credit covers about 5,000 jobs.
Can I use it through the API or from Python?
Yes. Use the run-sync-get-dataset-items call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.
Can I use it from an AI agent?
Yes. Through the Apify MCP server (https://mcp.apify.com/?tools=locaihost/upwork-jobs) any MCP client can run a search and read the jobs back.
Is it legal to scrape Upwork jobs?
The Actor reads only Upwork's public job search and job pages, what anyone sees without an account. It never logs in. Upwork's own terms restrict automated access, so weigh that for your use. Client data stays at public business stats and country: no names, companies or cities. Email addresses, phone numbers and WhatsApp or Telegram links typed into descriptions are removed. Use the data to find work and study the market, not to contact people outside Upwork. You are responsible for how you use the results.
Which search syntax works?
Upwork's own: quotes for a phrase, AND, OR, NOT (for example "react native" OR flutter). categories, jobType, experienceLevel and clientLocations are sent to Upwork's search too. With no query, a category search returns the newest jobs in the whole category.
Why are some fields empty?
Jobs whose client box is for registered users only have clientStatsAvailable: false and empty client fields. New clients have no rating or spend yet, and some jobs give no budget, duration or workload.
More from locaihost data
- LinkedIn Jobs Scraper: full-time and contract jobs from LinkedIn, no login.
- Google Jobs Scraper: jobs from many boards at once, with every apply link.
- Careers Page Jobs Scraper: open roles straight from company career pages.
Did it help?
If this saved you time, a quick rating on the Store helps other people find it.
Support
Something not working, or a field you need? Open an issue on the Issues tab: we answer issues within 24 hours.