Upwork Scraper - Freelance Jobs & Client Intel avatar

Upwork Scraper - Freelance Jobs & Client Intel

Pricing

from $3.30 / 1,000 job listings

Go to Apify Store
Upwork Scraper - Freelance Jobs & Client Intel

Upwork Scraper - Freelance Jobs & Client Intel

Scrape Upwork freelance jobs: title, description, fixed or hourly budget, experience level, workload, duration and skills. Client intelligence adds payment verified, total spend, hire rate, rating, country and the proposal count. Paste any Upwork search, category or job URL.

Pricing

from $3.30 / 1,000 job listings

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Upwork Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Upwork" is referenced only to describe the publicly available website this Actor collects data from.

Scrape Upwork freelance jobs into a clean dataset: title, full description, fixed-price budget or hourly range, experience level, workload, duration, required skills and the exact posting timestamp.

Then turn on client intelligence and every row also tells you who is hiring and whether they are worth a proposal: payment method verified, total spend, hire rate, star rating, jobs posted, open jobs, hours billed, country and city — plus that job's proposal count and interview count.

Why this Upwork scraper?

  • Client intelligence is the product, not a footnote. clientPaymentVerified, clientTotalSpend, clientHireRate, clientRating, clientReviews, clientTotalJobsPosted, clientCountry. Filter to only verified clients who have spent over $10,000 and you have a proposal shortlist instead of a job list.
  • proposals on every enriched row. How many freelancers have already applied is the single best signal of whether a job is worth your time, and it is on the record as a number.
  • Budgets as numbers, routed correctly. budgetAmount for fixed-price work and hourlyMin / hourlyMax for hourly — never mixed, because a $75/hour rate reported as a "$75 budget" is worse than no number at all.
  • Three surfaces, one record shape. Search URLs (followed page by page), Upwork's own category pages (one block of ~30 richer jobs) and single job URLs all produce the same columns.
  • Monitor mode returns only jobs posted since your last run — pair it with a Schedule and be early to the ones that matter.

Use cases

  • Freelancers & agencies — build a filtered pipeline of jobs from verified, high-spend clients in your skills, and see the competition before you spend a Connect.
  • Lead generation — a client posting repeatedly is a buyer. Country, spend and hire rate on every row.
  • Market & rate research — what a skill actually pays, by level, type and category.
  • Recruitment & talent intelligence — which skills are in demand and what the market pays for them.
  • AI agents & pipelines — a structured, machine-readable feed of the largest freelance marketplace.

How to use

  1. Enter search terms, category slugs, or paste Upwork URLs straight from your browser.
  2. Narrow with job type, experience level, budget band, skills or title text.
  3. Turn on client intelligence (or set any client filter, which turns it on for you).
  4. Set Maximum jobs and run.

Input

{
"searchQueries": ["python"],
"jobTypes": ["Hourly"],
"experienceLevels": ["Expert"],
"minBudget": 50,
"includeClientDetails": true,
"paymentVerifiedOnly": true,
"minClientSpend": 10000,
"maxResults": 100
}
  • searchQueries — one term per line; each is searched separately and results merged.
  • startUrls / urlsFromFile — any Upwork search, category or single-job URL. Every filter already in a pasted URL is kept. Type them, upload a file, or link a remote .txt / .csv / Google Sheet.
  • categories — Upwork's own /freelance-jobs/<slug>/ pages such as data-science or website-development. Each returns one block of about 30 jobs with richer fields than search — the exact posting timestamp, workload and duration come already filled in, which makes it the cheapest way to sweep a discipline. Upwork does not page these landing pages, so reach for a search term when you want more than ~30 jobs from one discipline.
  • jobTypes (Fixed price · Hourly), experienceLevels (Entry · Intermediate · Expert) — pick-lists, so a filter cannot silently fail.
  • minBudget / maxBudget, titleQuery, skillsAny, excludeKeywords.
  • includeClientDetails + maxDetailRecords — see below.
  • paymentVerifiedOnly, minClientSpend, minClientRating, clientCountries — client-quality filters. Each one switches client details on automatically, because the filter cannot be applied without them.
  • maxPagesPerUrl, maxResults, monitorMode / monitorKey.

Tip: run with nothing set and you get a 10-job sample rather than a full sweep, so an exploratory or agent-issued call is never an expensive surprise.

Output

Four dataset views: Jobs · Client intelligence · Newest first · By skill.

{
"recordType": "job",
"ciphertext": "~022047808109244543596",
"title": "Desarrollador python para actualizar programa de python 2 a python 3.",
"url": "https://www.upwork.com/jobs/~022047808109244543596",
"jobType": "Fixed price",
"experienceLevel": "Intermediate",
"budgetAmount": 400,
"hourlyMin": null,
"hourlyMax": null,
"workload": "Less than 30 hrs/week",
"duration": "More than 6 months",
"category": "Web Development",
"occupation": "Back-End Development",
"skills": ["Python", "Python Script"],
"description": "…the full job post…",
"postedAt": "2026-04-24T22:41:14.665Z",
"proposals": 22,
"interviewing": 0,
"clientPaymentVerified": true,
"clientTotalSpend": 400,
"clientRating": 0,
"clientReviews": 0,
"clientTotalJobsPosted": 1,
"clientJobsWithHires": 1,
"clientHireRate": 100,
"clientOpenJobs": 1,
"clientCountry": "ESP",
"clientCity": "Usurbil",
"clientLastActive": "2026-08-10T21:21:55.538Z"
}

Client intelligence — includeClientDetails

Off by default because it costs one extra request per job. Turn it on and each job's own page is read to add the buyer's record and the job's competition. maxDetailRecords caps how many are enriched, so a broad search cannot become a large bill by accident — jobs past the cap are still returned, just without the client record.

clientHireRate is derived for you (jobsWithHires ÷ jobsPosted), because "posts a lot, hires rarely" is exactly the client you want to filter out.

What to expect (field coverage)

Field groupCoverage
Title, URL, job type, experience level, description, skills~100%
Budget (fixed) or hourly rangepresent according to the contract type — a fixed-price job has no hourly range and vice versa
Workload, durationon category-page and enriched records
postedAt (exact timestamp)category-page and enriched records; search-page rows carry Upwork's relative postedText instead
Client fields, proposalsonly with client intelligence on
clientRating, clientReviews0 for genuinely new clients who have not been reviewed yet — that is a real signal, not a gap

Monitor mode

Turn on monitorMode and the actor remembers every job already returned under that key and emits only new ones, tagged monitorEvent: "new". It is orthogonal to Apify Schedules: the Schedule sets the cadence, monitor mode decides what is new.

A note on reliability

Upwork is heavily protected — it refuses ordinary datacenter and residential proxies outright. This actor reaches it through a commercial unlocking layer, which is why it returns data where simpler scrapers return empty pages. That layer occasionally serves a partial render; the actor detects short pages and refetches them, and any run that still comes up empty says so plainly on the run card rather than blaming your input.

How much does it cost to scrape Upwork?

This Actor uses Apify's pay-per-event pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

  • Job listing - One Upwork job: title, full description, fixed-price budget or hourly range, experience level, workload, duration, required skills, category and the posting time.
  • Client intelligence - One job's own page fetched through the unlocker to add the buyer's record: payment-method verified, total spend, jobs posted, jobs with hires, derived hire rate, star rating and review count, open jobs, hours billed, country, city and timezone - plus that job's proposal, interview and invite counts and its exact posting timestamp.

The current price of each event is shown on the Pricing tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

Automate & schedule

Schedules, webhooks, and one-click integrations for Google Sheets, Slack, Airtable, Make and Zapier.

Integrate with any app

JSON, CSV, Excel, XML and RSS through the Dataset API; start it from the API or any client library.

Use with AI assistants (MCP)

Exposed through the Apify MCP server, so Claude, ChatGPT, Cursor and any MCP client can call it as a tool — "find expert-level Python jobs from payment-verified clients who have spent over $10k, posted this week" becomes one tool call.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More job & hiring scrapers from scrapesage

More scrapers from scrapesage

Related Actors in the same category:

FAQ

Do I need an Upwork account or API key? No. This reads only public job pages.

Why is proposals missing on some rows? Proposal counts live on a job's own page, so they appear only when client intelligence is on and the job was within maxDetailRecords.

Search page or category page — which should I use? Category pages return one block of about 30 jobs with the exact posting timestamp, workload and duration already included, so they are cheaper per job - but Upwork does not page them, so ~30 is all a category can give. Use search terms when you need depth, a specific query, or want to reuse a filtered URL from your browser; search pages carry about 10 jobs each and are followed for as many pages as you ask for.

What does clientHireRate mean? The share of that client's posted jobs that ended in a hire, as a percentage. A client with 40 jobs posted and 4 hires has a 10% hire rate — usually a sign to skip.

Can I get freelancer profiles too? Not in this actor — it covers jobs and the clients posting them.

Are budgets in USD? Upwork publishes in USD and the numeric fields are plain USD amounts. The currency code is kept where Upwork provides one.

Data & lawful use

This Actor reads only what Upwork publishes to logged-out visitors: it does not log in, use cookies or session tokens, create accounts, or reach anything behind a sign-in. Names, handles, bios and engagement figures are public, but they relate to identifiable people, so treat the output as personal data. If you are in the EU or UK you are the data controller for what you do with it: have a lawful basis (usually legitimate interest for research, marketing analytics or B2B prospecting), honour access and deletion requests, and do not use the output for spam or unsolicited messaging.

Under Apify's Standard Actor Contract, which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Upwork Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

"Upwork" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Upwork product, is not authorised or certified by Upwork Inc., and does not distribute Upwork software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

Need help?

Open an issue on the actor's Issues tab with your input and the run ID and it will be looked at.


This actor collects publicly available job postings for research and market-analysis purposes. It is not affiliated with, endorsed by, or sponsored by Upwork. Upwork is a trademark of its respective owner.