Upwork Jobs Scraper (Job Alerts, Client Stats, No Login) avatar

Upwork Jobs Scraper (Job Alerts, Client Stats, No Login)

Pricing

from $0.55 / 1,000 jobs

Go to Apify Store
Upwork Jobs Scraper (Job Alerts, Client Stats, No Login)

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

locaihost data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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?

GroupFields
JobjobId, title, url, postedAt, postedMinutesAgo, description, skills, category, categoryGroup, occupation
Budget and termsjobType, budgetText (such as "$30-$60/hr"), fixedBudgetUsd, hourlyMinUsd, hourlyMaxUsd, experienceLevel, duration, workload
Activityproposals (band such as "5 to 10"), interviewing, invitesSent, hired, positionsToHire, clientLastViewedAt
ClientclientCountry, clientPaymentVerified, clientTotalSpentUsd, clientHires, clientActiveHires, clientHoursBilled, clientRating, clientReviews, clientMemberSince, clientSpendPerHireUsd (total spent divided by hires), clientStatsAvailable
PreferencesfreelancerCountries, freelancerRegions, preferredJobSuccessScore
RunsearchQuery, 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.

RowFree and StarterScaleBusiness
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, minHourlyRateUsd and minFixedBudgetUsd are 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.

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

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.