Upwork Job Scraper
Pricing
from $5.00 / 1,000 job returneds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
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-scraperto 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
- Open the Actor on Apify Console and click Try for free.
- 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. - Set Max jobs to return (default 50). Add filters: job type, experience level, payment-verified, min hourly rate, min client spend.
- Click Save & Start. The Actor pushes each job to the dataset as it finds one and bills per result.
- 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"}
| Field | Type | Description |
|---|---|---|
searchQueries | string[] | Keyword queries to run through Upwork search. |
startUrls | url[] | Direct Upwork search URLs to crawl as-is. |
maxResults | int | Hard cap on jobs pushed and charged. Default 50, max 1000. |
maxPagesPerQuery | int | Pages per query (50 jobs/page). Default 3. |
sortBy | enum | recency (default) or relevance. |
jobType | enum | all, hourly, or fixed. |
experienceLevel | enum | all, entry, intermediate, or expert. |
paymentVerified | bool | Filter to payment-verified clients only. |
minHourlyRate | int | Min $/hr for hourly jobs. |
minClientSpend | enum | any, 1k, or 10k. |
proxyConfiguration | object | Defaults 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
| Field | Type | Description |
|---|---|---|
jobId | string | Upwork ciphertext ID (~021...). |
title | string | Job posting title. |
jobUrl | string | Public posting URL. |
description | string | Snippet / description. |
jobType | string | Hourly or Fixed. |
budget | string | Raw budget text. |
hourlyRange | object | { min, max, currency }. |
fixedPrice | object | { amount, currency }. |
experienceLevel | string | Entry / Intermediate / Expert. |
postedAt | string | ISO 8601 timestamp. |
skills | array | Skill tags. |
clientCountry | string | Client country. |
clientPaymentVerified | bool | Payment method verified. |
clientSpend | number | Total historical spend (USD). |
clientRating | number | 0-5 rating. |
clientHires | int | Past hires. |
Pricing
Pay-Per-Event (PPE) — you only pay for what the Actor produces:
| Event | Price |
|---|---|
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: recencyfor monitoring — pairs with Apify Schedules to fire every 15-30 min and pipe new jobs into Slack/Sheets. - Stack filters for signal —
paymentVerified: 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 > broad —
langchain agent developerreturns 5 highly relevant jobs;developerreturns 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).