Upwork Scraper - Freelance Job Listings with Client Intel
Pricing
from $1.00 / 1,000 results
Upwork Scraper - Freelance Job Listings with Client Intel
Scrape Upwork jobs with full client intelligence — country, total spent, payment-verified, rating, reviews, and exact applicant count. 14 filters and incremental mode that emits only new or changed listings across runs.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(4)
Developer
Black Falcon Data
Maintained by CommunityActor stats
3
Bookmarked
301
Total users
140
Monthly active users
a day ago
Last modified
Categories
Share
What does Upwork Scraper do?
Upwork Scraper extracts structured job data from upwork.com with the full client-quality panel — client country, total spent, payment-verified status, rating, review count — plus the exact number of applicants per job (not tier-buckets) and engagement metadata. Works out of the box with no cookies or login. Paste an Upwork search URL or configure 14 filters directly. Incremental mode emits only new or changed listings on recurring runs.
How to use this actor
- 👉 Register for a free Apify account — no credit card required.
- 🎉 Just click Sign up free on Apify → and complete a quick signup.
- 💰 A free Apify account includes $5 in monthly credits — enough to test this actor.
- ⏳ Scrape during the free trial, with no commitment or upfront payment required.
Key features
- 🏦 Client intelligence panel — every job carries client country, lifetime spend, payment-verified flag, rating, and review count — qualify leads before spending a single Connect, with one-click minimum-spend, minimum-rating, and minimum-review filters.
- 💸 Connects-aware filter — combine the
proposalsfilter with incremental mode to surface low-competition listings the moment they're posted — before proposal counts (and Connect costs) climb. - 🔗 Paste-mode — paste any upwork.com URL straight from your browser — single-listing pages, search-results URLs, or category SEO URLs. Mix freely with keyword and IDs in the same run; results dedupe by ID.
- 🎯 Batch searches — pass
["term1", "term2"]for query, location, or city to batch multiple searches in one run — shared dedup state, single dataset, one Actor-Start charge instead of N. - 📋 Detail enrichment — toggle two-stage scraping: first collect listings, then enrich each with full description + detail-page-only fields. Off by default to keep runs fast; flip on when you need the deep payload.
- ♻️ Incremental mode — recurring runs emit only new or changed projects since your last run — paste a
stateKey, run hourly, never get the same lead twice. Saves 80–95% vs full re-scrapes. - 🔔 Notifications — push new-project alerts to Telegram / Slack / Discord / WhatsApp / webhook within seconds of posting — combine with incremental to never get duplicate alerts.
- 📦 Compact mode — skinny output for outreach pipelines — just the fields your CRM or email tool reads. Drop straight into a Sheet without dragging unused columns.
- ✂️ Description truncation — cap description length with
descriptionMaxLengthto control LLM prompt cost and dataset size — set 0 for full descriptions, or any char-limit to trim. - 📤 Export anywhere — Download the dataset as JSON, CSV, or Excel from the Apify Console, or stream live via the Apify API and integrations (Make, Zapier, Google Sheets, n8n, …).
- 🔌 MCP connectors — export your results into Notion via Apify's MCP connectors — a clean run-summary page, no glue code. Opt-in via the App connector field; deterministic field-mapping, no AI. Built on Apify's connector framework, so more destinations open up as their catalog grows.
What data can you extract from upwork.com?
Each result includes Core listing fields (jobId, title, jobType, experienceLevel, budgetAmount, budgetCurrency, hourlyBudgetMin, and hourlyBudgetMax, and more) and detail fields when enrichment is enabled (description, descriptionHtml, descriptionMarkdown, and skillsDetailed). In standard mode, all fields are always present — unavailable data points are returned as null, never omitted. In compact mode, only core fields are returned.
Input
The main inputs are a search keyword, an optional location filter, and a result limit. Additional filters and options are available in the input schema.
Key parameters:
query— Job search keywords. Leave empty to browse all jobs.searchUrl— Paste a full Upwork search URL (https://www.upwork.com/nx/search/jobs/?q=...). Filters in the URL are auto-parsed; explicitly set input fields override URL values.jobType— Filter by payment type.experienceLevel— Filter by required experience.workload— Filter by time commitment.sort— How to sort results. (default:"recency")category— Upwork category name (e.g. "Web Development") or category2 UID, or an array of either.location— Countries, regions, or structured entries. Accepts: country name ("United States"), ISO code ("US"), region name ("europe", "north_america", "english_speaking"), or {"type": "COUNTRY"|"REGION", "value": "..."}.excludeLocations— Countries or regions to exclude. Same format as location.budget— Filter fixed-price jobs by amount range (USD).hourlyRate— Filter hourly jobs by rate (USD/hr). Format: "min-max", open-ended with trailing dash ("50-").duration— Filter by expected length.- ...and 38 more parameters
Input examples
Basic search — Keyword-driven search with a result cap.
→ Full payload per result — all standard fields populated where the source provides them.
{"query": "python developer","maxResults": 50}
Filtered search — Narrow results with advanced filters — only matching jobs are returned.
→ Same field set as basic search; fewer, more relevant rows.
{"query": "python developer","jobType": "hourly","experienceLevel": "EntryLevel","category": ["Web Development"],"maxResults": 100}
Incremental tracking — Only emit jobs that changed since the previous run with this stateKey.
→ First run builds the baseline state. Subsequent runs emit only records that are new or whose tracked content changed. Set emitUnchanged: true to include unchanged records as well.
{"query": "python developer","maxResults": 200,"incrementalMode": true,"stateKey": "python-developer-tracker"}
Compact filtered output — Combine filters with compact mode for a lightweight AI-agent or MCP data source.
→ Core fields only — ideal for piping into LLMs or downstream tools without token overhead.
{"query": "python developer","jobType": "hourly","experienceLevel": "EntryLevel","maxResults": 50,"compact": true}
Output
Each run produces a dataset of structured job records. Results can be downloaded as JSON, CSV, or Excel from the Dataset tab in Apify Console.
Example job record
{"jobId": "2047620102105297516","title": "Full Stack Software Engineer Needed for Contract Work","description": "Contract Software Engineer (AI Applications / High-Velocity Builder)\nLocation: Remote\nCompensation: $40–100/hour (contract)\nType: Project-based (20–60 hrs/week)\n\nAbout Us\nWe are a stealth AI company b...","descriptionHtml": null,"descriptionMarkdown": "Contract Software Engineer (AI Applications / High-Velocity Builder)\nLocation: Remote\nCompensation: $40–100/hour (contract)\nType: Project-based (20–60 hrs/week)\n\nAbout Us\nWe are a stealth AI company b...","contentHash": "f6a9bbdcc53a7a571effa9c32e1d9008bea5c96d766c0d881b0818711568177a","jobType": "HOURLY","experienceLevel": "ExpertLevel","budgetAmount": null,"budgetCurrency": null,"hourlyBudgetMin": 40,"hourlyBudgetMax": 100,"weeklyRetainerBudget": null,"engagementType": "FULL_TIME","engagementDuration": "3 to 6 months","engagementDurationWeeks": 18,"skills": ["JavaScript","React","Python","API","Web Development"],"skillsDetailed": [{"uid": "996364628025274383","parentSkillUid": null,"name": "JavaScript","highlighted": false},{"uid": "1031626773660942336","parentSkillUid": null,"name": "React","highlighted": false},{"uid": "996364628025274386","parentSkillUid": null,"name": "Python","highlighted": false},{"uid": "1110580482322976768","parentSkillUid": null,"name": "API","highlighted": false},{"uid": "1031626795211276288","parentSkillUid": null,"name": "Web Development","highlighted": false}],"publishTime": "2026-04-24T10:15:12.253Z","createTime": "2026-04-24T10:14:10.307Z","sourcingTimestamp": null,"totalApplicants": 58,"personsToHire": 50,"enterpriseJob": false,"premium": false,"clientCountry": "United States","clientCountryCode": "USA","clientTotalSpent": 5160.99,"clientSpentCurrency": "USD","clientPaymentVerified": true,"clientRating": 5,"clientReviewCount": 4,"clientHasFinancialPrivacy": false,"customJobScore": 3.45,"url": "https://www.upwork.com/jobs/~022047620102105297516","portalUrl": "https://www.upwork.com/jobs/~022047620102105297516","scrapedAt": "2026-04-24T10:27:07.636Z","source": "upwork.com","changeType": null,"isRepost": false,"repostOfId": null,"repostDetectedAt": null}
Incremental fields
When incremental mode is on, each record also carries:
changeType— one ofNEW,UPDATED,UNCHANGED,REAPPEARED,EXPIRED.isRepost,repostOfId,repostDetectedAt— populated when a new listing matches the tracked content of a previously expired one. SetskipReposts: trueto drop detected reposts from the output.
How to scrape upwork.com
- Go to Upwork Scraper in Apify Console.
- Enter a search keyword and optional location filter.
- Set
maxResultsto control how many results you need. - Click Start and wait for the run to finish.
- Export the dataset as JSON, CSV, or Excel.
Use cases
- Extract job data from upwork.com for market research and competitive analysis.
- Monitor new and changed listings on scheduled runs without processing the full dataset every time.
- Feed structured data into AI agents, MCP tools, and automated pipelines using compact mode.
- Export clean, structured data to dashboards, spreadsheets, or data warehouses.
- Analyze skill demand across listings using structured skill tags.
- Collect ratings and reviews for reputation monitoring and benchmarking.
How much does it cost to scrape upwork.com?
Upwork Scraper uses pay-per-event pricing. You pay a small fee when the run starts and then for each result that is actually produced.
- Run start: $0.001 per run
- Per job (primary event): $0.001
You are billed only for the events your run actually triggers. Prices below are the Free plan tier.
| Event | Price (Free tier) | Charged when |
|---|---|---|
| Actor Start | $0.001 (one-time) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| Result (primary) | $0.001 | Single result in the default dataset. |
| Detail Enrichment (addon) | $0.003 | Per-job detail page fetch that adds ~30 enriched fields (client timezone, industry, company size, total hires, activity panel, questions, attachments, work history, allowed countries). Requires sessionToken + enrichDetails=true. Only charged when detail data is successfully returned. |
Example costs (primary event only — other events above add cost when they fire):
- 10 results: $0.011
- 25 results: $0.026
- 100 results: $0.1
- 200 results: $0.2
- 500 results: $0.5
Example: recurring monitoring savings
These examples compare full re-scrapes with incremental runs at different churn rates. Churn is the share of listings that are new or whose tracked content changed since the previous run. Actual churn depends on your query breadth, source activity, and polling frequency — the scenarios below are examples, not predictions.
Example setup: 200 results per run, daily polling (30 runs/month). Event-pricing examples scale linearly with result count.
Numbers below are for the primary Result event. Other events (Detail Enrichment (addon)) are billed separately when they fire.
| Churn rate | Full re-scrape run cost | Incremental run cost | Savings vs full re-scrape | Monthly cost after baseline |
|---|---|---|---|---|
| 5% — stable niche query | $0.20 | $0.01 | $0.19 (95%) | $0.33 |
| 15% — moderate broad query | $0.20 | $0.03 | $0.17 (85%) | $0.93 |
| 30% — high-volume aggregator | $0.20 | $0.06 | $0.14 (70%) | $1.83 |
Full re-scrape monthly cost at daily polling: $6.03. First month with incremental costs $0.52 / $1.10 / $1.97 for the 5% / 15% / 30% scenarios because the first run builds baseline state at full cost before incremental savings apply.
FAQ
How many results can I get from upwork.com?
The number of results depends on the search query and available listings on upwork.com. Use the maxResults parameter to control how many results are returned per run.
Does Upwork Scraper support recurring monitoring?
Yes. Enable incremental mode to only receive new or changed listings on subsequent runs. This is ideal for scheduled monitoring where you want to track changes over time without re-processing the full dataset.
Can I integrate Upwork Scraper with other apps?
Yes. Upwork Scraper works with Apify's integrations to connect with tools like Zapier, Make, Google Sheets, Slack, and more. You can also use webhooks to trigger actions when a run completes.
Can I use Upwork Scraper with the Apify API?
Yes. You can start runs, manage inputs, and retrieve results programmatically through the Apify API. Client libraries are available for JavaScript, Python, and other languages.
Can I use Upwork Scraper through an MCP Server?
Yes. Apify provides an MCP Server that lets AI assistants and agents call this actor directly. Use compact mode, descriptionMaxLength, a single descriptionFormat, and excludeEmptyFields to keep payloads manageable for LLM context windows.
Is it legal to scrape upwork.com?
This actor extracts publicly available data from upwork.com. Web scraping of public information is generally considered legal, but you should always review the target site's terms of service and ensure your use case complies with applicable laws and regulations, including GDPR where relevant.
Your feedback
If you have questions, need a feature, or found a bug, please open an issue on the actor's page in Apify Console. Your feedback helps us improve.
You might also like
- Actiris Brussels Job Scraper — Scrape all active job listings from actiris.brussels — official Brussels public employment service..
- AMS Austria Job Scraper — Austrian Public Employment Service — Scrape jobs.ams.at — Austria's official AMS public employment portal, branded "alle jobs" ("all.
- APEC.fr Scraper - French Executive Jobs — Scrape apec.fr - French executive job listings with salary ranges, company, location, skills,.
- Arbeitsagentur Jobs Feed — German Federal Employment Agency — Scrape arbeitsagentur.de — Germany's official public employment portal with over 1 million live job.
- Arbetsformedlingen Job Scraper — Scrape arbetsformedlingen.se (Platsbanken) — Sweden's official employment portal. Returns 84.
- Bayt.com Scraper — MENA Jobs with Salary & Skills Filter — Scrape bayt.com — the leading Middle East job board spanning UAE, Saudi Arabia, Qatar, Egypt.
- Bumeran Scraper — LATAM Jobs across 7 Countries & 8 Brands — Scrape Bumeran Group's job boards across LATAM — Argentina (bumeran.com.ar + zonajobs), Chile.
- Cadremploi Scraper — French Executive & Management Jobs — Scrape cadremploi.fr — France's leading job board for executives and managers (cadres). Salary.
Getting started with Apify
New to Apify? Create a free account with $5 credit — no credit card required.
- Sign up — $5 platform credit included
- Open this actor and configure your input
- Click Start — export results as JSON, CSV, or Excel
Need more later? See Apify pricing.