Upwork Scraper | $2.5 / 1k | Fast & Reliable avatar
Upwork Scraper | $2.5 / 1k | Fast & Reliable

Pricing

Pay per event

Go to Apify Store
Upwork Scraper | $2.5 / 1k | Fast & Reliable

Upwork Scraper | $2.5 / 1k | Fast & Reliable

Developed by

Fatih Tahta

Fatih Tahta

Maintained by Community

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 rich count* 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), or
    • UPWORK_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 if categoryUrls are provided.
    Example: ["web scraping", "typescript"]

  • categoryUrls (array, optional) – Direct Upwork listing URLs. These override queries.
    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. Supports YYYY-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 and budgetCurrency
  • postedAt (ISO string, preferring publishTime)
  • 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 original relevanceEncoded, ontologySkills, structured jobDetails, and unflattened facets

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