
Upwork Scraper | $2.5 / 1k | Fast & Reliable
Pricing
Pay per event

Upwork Scraper | $2.5 / 1k | Fast & Reliable
Extract job listings from Upwork by keyword, category, or date range. Collects titles, budgets, skills, and descriptions in clean structured format. Useful for market research, lead generation and competitor analysis.
5.0 (1)
Pricing
Pay per event
2
6
6
Last modified
6 hours ago
Slug: fatihtahta/upwork-scraper
Price: $2.50 per 1,000 saved jobs
Extract structured job listing data from Upwork.
Point this actor at a keyword search, category URL, or specific filters, and it will return normalized job data directly from Upwork.
π What This Actor Delivers
-
Fast & reliable job search
Uses Upworkβs GraphQL surface (visitorJobSearch
) when available. Falls back to HTML capture to ensure nothing is missed. -
Flexible targeting
Provide search keywords, paste Upwork category/list URLs, or filter by job type, categories, and date range. -
Structured, clean output Each job is normalized with friendly fields such as
id
,jobTitle
,jobUrl
,contractType
,budget
,postedAt
,skills[]
, and richcount*
metrics derived from Upwork's search facets. -
Optional authenticated mode
Avoid Cloudflare roadblocks by providing either:UPWORK_COOKIES_JSON
(full cookie export in JSON format), orUPWORK_SESSION_ID
(Bearer token)
This ensures stable access with the same results you see when logged in.
-
Raw HTML snapshots
Captures the HTML page alongside API results so you can verify exactly what Upwork showed at scrape time.
π§ Typical Use Cases
- Market research: Track hiring trends, job volumes, and budgets in a niche.
- Lead generation: Find potential clients posting jobs matching your skills or tools.
- Competitor analysis: Monitor what kinds of projects are in demand across categories.
- Portfolio positioning: See how jobs are described and priced before pitching.
π₯ Input Configuration
-
queries
(array, optional) β Keywords to search for on Upwork. Ignored ifcategoryUrls
are provided.
Example:["web scraping", "typescript"]
-
categoryUrls
(array, optional) β Direct Upwork listing URLs. These overridequeries
.
Example:["https://www.upwork.com/freelance-jobs/web-development/"]
-
limit
(integer, required, default 100) β Max jobs to return. Range:1β10000
. -
fromDate
/toDate
(string, optional) β Posted after / before. SupportsYYYY-MM-DD
, ISO datetime, or relative (7 days
,30 days
). -
jobCategories
(array, optional) β List of Upwork category names. Case-insensitive.
Example:["Web Development", "UI/UX Design"]
-
jobType
(enum, optional) β Contract type filter. Options:"any"
,"fixed"
,"hourly"
. -
clientHires
(multi-select, optional) β Client's past hires. Options:"0"
(no hires),"1-9"
,"10-"
(10+ hires). -
contractToHire
(multi-select, optional) β Contract-to-hire filter. Options:"true"
(only contract-to-hire roles),"false"
(hide contract-to-hire postings). -
contractorTiers
(multi-select, optional) β Upwork experience tiers. Options:"1"
(Entry level),"2"
(Intermediate),"3"
(Expert). -
durationV3
(multi-select, optional) β Project length buckets. Options:"week"
(Less than 1 month),"month"
(1β3 months),"semester"
(3β6 months),"semester_plus"
(More than 6 months),"ongoing"
(Ongoing project). -
workload
(multi-select, optional) β Hours per week expectations. Options:"as_needed"
(open to offers),"as_needed_part_time"
(as needed, part-time),"part_time"
(less than 30 hrs/week),"full_time"
(30+ hrs/week). -
Environment variables for auth (optional):
UPWORK_COOKIES_JSON
β JSON array of cookies exported from your browser.UPWORK_SESSION_ID
β Bearer token from network inspector.
π¦ Output (Fields & Format)
Each dataset item represents a single job listing. The core schema surfaces friendly names alongside the original aliases for compatibility:
id
,jobTitle
,jobUrl
,description
contractType
(e.g.,fixed
,hourly
,weekly_retainer
when present)budget
andbudgetCurrency
postedAt
(ISO string, preferringpublishTime
)engagementDuration
,experienceLevel
(Entry
/Intermediate
/Expert
)categories[]
,skills[]
(deduplicated)- Flattened facet counters such as
countJobTypeFixed
,countWorkloadAsNeededPartTime
,countClientHires10plus
,countBudget5000plus
,countExperienceTier3Expert
,countContractToHireTrue
, etc. - Raw pointers for downstream processing:
rawRelevance
,rawCiphertext
metadata
retains the originalrelevanceEncoded
,ontologySkills
, structuredjobDetails
, and unflattenedfacets
For backward compatibility the legacy keys (id
, title
, url
, jobType
) mirror the friendly fields so existing automations keep working.
π§ͺ Example Input
{"queries": ["web scraping", "typescript"],"limit": 50,"fromDate": "2025-01-01","jobType": "any"}
π€ Example Output Item
{"jobTitle": "Create and Publish Product Hunt Review Scraper on Apify","jobUrl": "https://www.upwork.com/jobs/~021968987130295233525","description": "We are looking to scrape reviews from Product Hunt...","contractType": "fixed","budget": 250,"budgetCurrency": "USD","postedAt": "2025-09-19T10:34:48.975Z","engagementDuration": "Less than 1 month","experienceLevel": "Expert","categories": [],"skills": ["API Integration","Automation","Data Mining","Data Extraction","Data Scraping","API"],"countJobTypeFixed": 55,"countJobTypeHourly": 103,"countWorkloadPartTime": 124,"countWorkloadAsNeededPartTime": 128,"countClientHires10plus": 88,"countDurationMonth": 110,"countBudget100to499": 28,"countExperienceTier3Expert": 57,"countContractToHireFalse": 124,"rawRelevance": "{\"position\":\"0\"}","rawCiphertext": "~021968987130295233525","metadata": {"relevanceEncoded": "{\"position\":\"0\"}","jobDetails": {"id": "1968987130295233525","ciphertext": "~021968987130295233525","jobType": "fixed","fixedPriceAmount": {"isoCurrencyCode": "USD","amount": 250},"fixedPriceEngagementDuration": {"label": "Less than 1 month"},"publishTime": "2025-09-19T10:34:48.975Z"},"facets": {"jobType": [{ "key": "fixed", "value": 55 },{ "key": "hourly", "value": 103 }]}},"id": "1968987130295233525","title": "Create and Publish Product Hunt Review Scraper on Apify","url": "https://www.upwork.com/jobs/~021968987130295233525","jobType": "fixed"}
π° Pricing (Simple & Transparent)
$2.50 per 1,000 saved jobs. You only pay for successfully saved results. Example: 10,000 jobs = (10,000 / 1,000) Γ $2.50 = $25.00. Legal & Responsible Use This actor extracts publicly available job listing data from Upwork. It does not access private profiles or client details. You are responsible for ensuring lawful use of the data (e.g., GDPR/CCPA compliance) and respecting Upworkβs terms of service.
β Support
Questions or issues? Open an issue in the Issues tab on the actor page in Apify Console and it will be resolved around the clock.
Happy Scraping, Fatih