Upwork Jobs Scraper - No Login, Client Intel, $0.0015/Job avatar

Upwork Jobs Scraper - No Login, Client Intel, $0.0015/Job

Pricing

from $1.50 / 1,000 job scrapeds

Go to Apify Store
Upwork Jobs Scraper - No Login, Client Intel, $0.0015/Job

Upwork Jobs Scraper - No Login, Client Intel, $0.0015/Job

Scrape Upwork job listings by keyword: title, full description, budget, contract type, experience level, skills, proposal count and client intel (country, spend, verified). No login needed. $0.0015/job.

Pricing

from $1.50 / 1,000 job scrapeds

Rating

5.0

(4)

Developer

Gio

Gio

Maintained by Community

Actor stats

1

Bookmarked

258

Total users

20

Monthly active users

12 days ago

Last modified

Share

Scrape freelance job postings from Upwork by search query: title, full description, budget, contract type, experience level, skills, proposal count and client intelligence (country, lifetime spend, payment-verified status). No login, no cookies, no browser extension to install.

Why use this scraper

Upwork does not expose a public API for job listings, so anyone doing lead generation, market research or rate benchmarking on Upwork is stuck copy-pasting from search results by hand, or paying for a tool that only returns the title and budget and drops the client signals that actually matter (spend history, verification status, proposal count).

This actor searches Upwork exactly the way a freelancer would, then structures every visible field on the result, job page and client card into one dataset row. You get the data needed to qualify a lead or price a job before you ever click into Upwork itself.

Overview

The actor takes a search query, the same kind you would type into Upwork's own search bar, and returns one row per job posting it finds, up to the cap you set. A typical batch of 50 jobs completes in a couple of minutes. Every record combines the job listing itself with the client-side signals Upwork shows next to it: country, total historic spend and payment verification, plus the proposal-count bucket that tells you how much competition a posting already has.

Supported inputs

  • Keyword search - query accepts any keyword or phrase Upwork's own search bar accepts, for example "python developer" or "google ads specialist".
  • Upwork search operators inside the query - Upwork's own operators work unmodified, for example location: or budget:, so "react developer location:United States" filters at the source.
  • Result cap - max_jobs caps how many jobs are returned and billed in a single run (1 to 200); pagination through Upwork's result pages is handled automatically up to that cap.

For more than 200 jobs on one topic, run the actor multiple times with different query variants rather than raising the cap, since Upwork itself paginates search results in batches.

Use cases

  • Freelancers and agencies doing lead generation - filter results on clientCountry and clientTotalSpent to prioritize outreach to clients who have a track record of paying well.
  • Rate and pricing research - pull hundreds of postings for a skill (e.g. "shopify developer") and compare budget, contractType and experienceLevel to set a competitive rate.
  • Market and demand analysis - run the same query on a schedule to track how posting volume and required skills shift for a given niche over weeks or months.
  • AI-assisted proposal pipelines - feed each job's description and client fields into an LLM that scores fit and drafts a first-pass proposal before the queue fills up with competing bids.

How it works

The actor issues the same search Upwork's own site handles, walks the result pages up to the requested cap, and opens each job's page and client card to pull the fields that are not shown in the results list itself: full description, skills, proposal-count bucket and client spend/verification. No login or session cookie is used at any point, since job listings and the client summary card are public information on Upwork.

Input configuration

Search by keyword, default cap:

{
"query": "python developer",
"max_jobs": 50
}

Filtered by location using Upwork's own operator:

{
"query": "react developer location:United States",
"max_jobs": 100
}

Niche query with a small cap for a quick check:

{
"query": "shopify developer budget:$1000+",
"max_jobs": 20
}

Output sample

Real output from a production run against Upwork (description trimmed for readability; the actor does not truncate it):

[
{
"jobId": "022102064185225514117",
"title": "Senior AI Engineer / AI Developer",
"description": "We are specifically looking for someone who has worked inside large, mature enterprise development environments. This is not an entry-level AI role...",
"contractType": "Hourly: $70.00 - $100.00",
"budget": "$70.00 - $100.00",
"experienceLevel": "Expert",
"duration": "1 to 3 months, Less than 30 hrs/week",
"postedOn": "Posted 16 minutes ago",
"skills": ["AI App Development", "Artificial Intelligence", "Jira", "Enterprise Architecture"],
"extraSkills": 0,
"clientVerified": false,
"clientCountry": "",
"proposals": "",
"clientTotalSpent": "",
"url": "https://www.upwork.com/jobs/~022102064185225514117"
}
]

clientCountry, proposals and clientTotalSpent come back empty on some postings, that is Upwork's own client card not showing that data for the client in question, not a scraping gap.

Key output fields

FieldTypeDescription
jobIdstringCanonical Upwork job ID, use it to deduplicate across runs
titlestringJob title
descriptionstringFull job description text
contractTypestringHourly with rate range, or Fixed-price
budgetstringBudget for fixed-price jobs, empty for hourly
experienceLevelstringEntry, Intermediate or Expert
durationstringEstimated project duration and weekly hours
postedOnstringRelative time since posting, as shown by Upwork
skillsarray of stringSkills listed on the posting
extraSkillsintegerCount of additional skills beyond those listed
proposalsstringProposal-count bucket shown by Upwork, when available
clientCountrystringClient's country, when shown
clientTotalSpentstringClient's lifetime spend on Upwork, when shown
clientVerifiedbooleanTrue when the client's payment method is verified
urlstringDirect link to the job posting

Pricing

Pay-per-result pricing, no subscription:

EventPrice
Job scraped$0.0015 per job
Actor start$0.00005 per GB of memory (one-time per run)

1,000 jobs costs $1.50 plus a negligible per-run start fee.

What makes this richer than the competition

Compared to two of the larger Upwork job scrapers on the Store:

  • neatrat/upwork-job-scraper returns the core job fields but does not surface client spend history (clientTotalSpent) as a structured field, which is the single strongest signal for qualifying a lead before you pitch.
  • blackfalcondata/upwork-scraper advertises client intelligence too, but does not expose Upwork's own search operators (like location: or budget:) as documented input behavior, so filtering happens after the fact instead of at the source.

This actor accepts Upwork's own search operators directly in query, so you only pay for jobs that already match your filter, and every client-side signal Upwork shows (country, spend, verification, proposal bucket) comes through as its own field instead of being buried in a description blob.

Notes & limitations

  • clientCountry, clientTotalSpent and proposals are only as complete as what Upwork itself displays on the client card; brand-new clients or postings with no proposals yet come back empty on those fields.
  • budget is populated for fixed-price jobs only; for hourly contracts the rate range lives in contractType instead.
  • Coverage matches what Upwork's own search returns for the query given; very broad queries may need to be split into narrower variants to get past 200 results.
  • This actor does not submit proposals, message clients, or interact with Upwork beyond reading public listings.

FAQ

Do I need an Upwork account to use this? No. The actor reads public job listings and public client summary cards; no login or cookies are required.

Can I use Upwork's own search operators? Yes. Anything you can type into Upwork's search bar works in the query field, including operators like location: and budget:.

Why are some client fields empty? Upwork itself does not always show spend history, country or proposal count for every client, most often for brand-new accounts. The actor returns exactly what Upwork displays.

How do I get more than 200 jobs for one topic? Run the actor again with a narrower or different query variant rather than raising max_jobs past the per-run cap.

Can I deduplicate results across scheduled runs? Yes, store jobId and skip rows you have already seen on later runs.

Is it legal to scrape Upwork? The actor collects only publicly available job-posting and client-summary information. You are responsible for how you use the data and for complying with Upwork's terms and applicable law.

For AI Agents & LLM Apps

This actor is available over the Apify MCP server for direct use inside Claude, ChatGPT and other MCP-compatible agents, or via the Apify API for a synchronous call that returns dataset items in one request:

curl "https://api.apify.com/v2/acts/gio21~upwork-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "python developer", "max_jobs": 20}'

The response is a JSON array of job objects, ready to feed into an agent's context or a proposal-drafting pipeline without any extra parsing step.

Disclaimer

Upwork is a trademark of its respective owner. This actor is an independent tool that reads publicly available Upwork job listings; it is not affiliated with, endorsed by, or sponsored by Upwork.

SEO Keywords

Upwork scraper, Upwork API, Upwork jobs scraper, Upwork job listings, Upwork lead generation, freelance job scraper, Upwork client data, Upwork data extraction, Upwork search scraper, Upwork jobs by keyword.