Upwork Job Scraper avatar

Upwork Job Scraper

Pricing

from $5.00 / 1,000 job returneds

Go to Apify Store
Upwork Job Scraper

Upwork Job Scraper

Scrape Upwork public job search results — title, budget, skills, client country/spend/verified status. Keyword or URL input. MCP-ready, no login required. Honest-fail on Cloudflare blocks.

Pricing

from $5.00 / 1,000 job returneds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

Scrape Upwork public job search results — title, budget, skills, client country, payment-verified status, client spend, and posted timestamp. No login required, MCP-ready, honest-fail on Cloudflare blocks. Built for freelancers monitoring new jobs, agencies sourcing pipeline, and researchers tracking the freelance market.

What does Upwork Job Scraper do?

This Actor scrapes Upwork.com public job search results by keyword query or by direct search URL. For each job posting it returns a structured record with title, snippet description, budget (parsed into hourly range or fixed price), required skills, client country, payment-verified status, total client spend, average client rating, hire count, and posted timestamp (raw and ISO 8601). The Actor runs on Apify infrastructure with proxy rotation, browser fingerprinting, and session management to bypass Upwork's Cloudflare protection. Use the Apify Console, Apify API, MCP, schedules, or integrations (Zapier, Make, Slack) to drive it.

Why use Upwork Job Scraper?

  • Freelancers — set up a recurring run every 30 minutes to surface fresh jobs in your niche before the proposal flood.
  • Agencies / lead-gen teams — pipe verified, payment-verified, high-budget jobs into your CRM as leads.
  • Researchers / journalists — track salary trends, skill demand shifts, and freelance market dynamics.
  • AI agents — call the MCP tool apify--upwork-job-scraper to surface live Upwork opportunities into an LLM-driven workflow.
  • Niche monitoring — keyword + filter combos (payment-verified + $10K+ spend + expert tier) give clean signal vs raw search noise.

How to use Upwork Job Scraper

  1. Open the Actor on Apify Console and click Try for free.
  2. Enter one or more keyword queries in Search keywords (e.g. react developer, shopify expert). Or paste a filtered Upwork search URL into Upwork search URLs.
  3. Set Max jobs to return (default 50). Add filters: job type, experience level, payment-verified, min hourly rate, min client spend.
  4. Click Save & Start. The Actor pushes each job to the dataset as it finds one and bills per result.
  5. Download the dataset as JSON, CSV, Excel, HTML, RSS, or XML from the Output tab, or pull via API.

Input

All input fields are optional except that you must provide either searchQueries or startUrls (or both).

{
"searchQueries": ["react developer", "shopify expert"],
"maxResults": 100,
"sortBy": "recency",
"jobType": "hourly",
"experienceLevel": "expert",
"paymentVerified": true,
"minHourlyRate": 40,
"minClientSpend": "10k"
}
FieldTypeDescription
searchQueriesstring[]Keyword queries to run through Upwork search.
startUrlsurl[]Direct Upwork search URLs to crawl as-is.
maxResultsintHard cap on jobs pushed and charged. Default 50, max 1000.
maxPagesPerQueryintPages per query (50 jobs/page). Default 3.
sortByenumrecency (default) or relevance.
jobTypeenumall, hourly, or fixed.
experienceLevelenumall, entry, intermediate, or expert.
paymentVerifiedboolFilter to payment-verified clients only.
minHourlyRateintMin $/hr for hourly jobs.
minClientSpendenumany, 1k, or 10k.
proxyConfigurationobjectDefaults to Apify proxy BUYPROXIES94952 (US).

Output

One record per unique Upwork job:

{
"jobId": "~021782314050491478016",
"title": "Senior React Developer for SaaS Dashboard",
"jobUrl": "https://www.upwork.com/jobs/senior-react-developer-for-saas-dashboard_~021782314050491478016/",
"description": "We need an experienced React dev to rebuild our analytics dashboard...",
"jobType": "Hourly",
"budget": "$40-$80/hr",
"hourlyRange": { "min": 40, "max": 80, "currency": "USD" },
"fixedPrice": null,
"experienceLevel": "Expert",
"duration": "3 to 6 months",
"engagement": "Less than 30 hrs/week",
"postedAtRaw": "2 hours ago",
"postedAt": "2026-06-20T10:17:00.000Z",
"skills": ["React", "TypeScript", "Tailwind CSS", "Node.js"],
"proposalsRange": "5 to 10",
"connects": 16,
"clientCountry": "United States",
"clientCity": "Austin",
"clientPaymentVerified": true,
"clientSpend": 45782,
"clientRating": 4.92,
"clientHires": 23,
"clientReviewsCount": 18
}

Export the dataset as JSON, CSV, Excel, HTML, RSS, or XML.

Data table

FieldTypeDescription
jobIdstringUpwork ciphertext ID (~021...).
titlestringJob posting title.
jobUrlstringPublic posting URL.
descriptionstringSnippet / description.
jobTypestringHourly or Fixed.
budgetstringRaw budget text.
hourlyRangeobject{ min, max, currency }.
fixedPriceobject{ amount, currency }.
experienceLevelstringEntry / Intermediate / Expert.
postedAtstringISO 8601 timestamp.
skillsarraySkill tags.
clientCountrystringClient country.
clientPaymentVerifiedboolPayment method verified.
clientSpendnumberTotal historical spend (USD).
clientRatingnumber0-5 rating.
clientHiresintPast hires.

Pricing

Pay-Per-Event (PPE) — you only pay for what the Actor produces:

EventPrice
apify-actor-start$0.00005 per run (covers init)
job-found$0.005 per unique job returned

Typical cost: 50 jobs = $0.25 per run. 1,000 jobs/day = $5.00/day. No subscription, no setup fee.

Also enabled: Pay-Per-Usage (compute + proxy passthrough) for power users running massive jobs. Pick at run time.

Tips

  • Use sortBy: recency for monitoring — pairs with Apify Schedules to fire every 15-30 min and pipe new jobs into Slack/Sheets.
  • Stack filters for signalpaymentVerified: true + minClientSpend: "10k" + experienceLevel: "expert" removes 80% of noise.
  • Direct URLs win — build the perfect filter in the Upwork UI, paste into startUrls. Avoids translating filter combos.
  • Niche keywords > broadlangchain agent developer returns 5 highly relevant jobs; developer returns 5000 noisy ones.

Limitations & reliability disclosure

Upwork is protected by Cloudflare Enterprise with behavioral bot detection. This Actor uses Apify datacenter-class proxies (BUYPROXIES94952 group) + Crawlee browser fingerprinting + session pooling. It does NOT guarantee 100% bypass:

  • Expect ~60-80% success rate per page in typical conditions.
  • On hard blocks, the actor honest-fails (Actor.fail()) rather than silently returning empty data. You only pay for jobs actually delivered, plus the start fee.
  • Detail-page enrichment (full description, all attachments, full client history) requires Upwork login and is NOT scraped here.
  • For 99%+ reliability on Upwork at scale, look for actors that use in-house Upwork account pools + premium proxies (priced higher).

FAQ

Is scraping Upwork legal? Scraping public web pages is generally legal under cases like hiQ v. LinkedIn. You are responsible for your own use. Do not scrape behind login, do not republish copyrighted job descriptions verbatim, and respect Upwork's Terms of Service. This Actor scrapes only public search results.

Do I need an Upwork account / cookies? No. The Actor uses no login and reads only Upwork's public job search pages.

Why did the run fail with "Cloudflare blocked all pages"? Upwork's anti-bot rotated against the proxy pool. Retry — different proxy session typically clears. Or simplify queries / reduce maxPagesPerQuery.

Can I monitor a specific saved search? Yes — build the filtered search in the Upwork UI, copy the URL, paste into startUrls. Schedule the actor for recurring runs.

Does this work as an MCP tool for Claude / ChatGPT? Yes. Add khadinakbar/upwork-job-scraper to your MCP client (mcp.apify.com). The tool description is written for agent consumption.

Support

Open an issue on the Actor's Issues tab on Apify Console. For custom enrichment (detail-page scraping with cookies, multi-region rollup, CRM integration), contact me for a tailored build.


Built by khadinakbar. Part of the jobs scraper portfolio — pairs with linkedin-jobs-scraper, indeed-job-scraper, google-jobs-scraper, and jobs-scraper (multi-source).