Upwork Jobs Scraper: Search, Contacts & Monitoring avatar

Upwork Jobs Scraper: Search, Contacts & Monitoring

Pricing

from $0.99 / 1,000 upwork jobs

Go to Apify Store
Upwork Jobs Scraper: Search, Contacts & Monitoring

Upwork Jobs Scraper: Search, Contacts & Monitoring

Find fresh Upwork jobs by keyword or direct URL. Extract full descriptions, budgets, skills, client hiring signals, public contacts, opportunity scores, and listing changes. Fast HTTP-only scraping for lead generation, freelance research, and job monitoring.

Pricing

from $0.99 / 1,000 upwork jobs

Rating

0.0

(0)

Developer

Blynx

Blynx

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

πŸ’Ό Upwork Jobs Scraper: Search, Contacts & Monitoring

Turn fresh Upwork job listings into clean, analysis-ready datasets. Search several niches at once, collect full descriptions and normalized budgets, detect public contact details, rank opportunities, and monitor new or changed jobs.

✨ What you get

  • ⚑ Live multi-query search with duplicate removal
  • πŸ“ Full job descriptions, titles, dates, URLs, and contract types
  • πŸ’΅ Normalized budgets for hourly and fixed-price jobs
  • 🧩 Structured skills and query-match information
  • 🎯 Opportunity scores with clear risk flags
  • πŸ“‡ Public contacts explicitly included in job text
  • πŸ”” Monitoring changes for new, updated, and removed listings
  • πŸ“Š Separate, readable Output tabs instead of one oversized table

πŸš€ Quick start

  1. Select Live search β€” fresh job listings.
  2. Enter one or more search phrases, such as python developer or web scraping.
  3. Set Maximum saved jobs to the number you need.
  4. Click Start.
  5. Open Output β†’ Best matches or Output β†’ Jobs.
flowchart LR
A["Search phrases or job URLs"] --> B["Collect public jobs"]
B --> C["Deduplicate and normalize"]
C --> D["Contacts, scores, and filters"]
D --> E["Jobs dataset"]
D --> F["Contacts dataset"]
D --> G["Monitoring changes"]

🎯 Scraping modes

ModeBest forInput
⚑ Live searchFast research and lead discoverySearch phrases
✨ Search + detailsVerifying each selected job and its current statusSearch phrases
πŸ”— Direct jobsKnown listingsUpwork URLs or numeric job IDs
πŸ”” MonitorRepeated searches and alertsSearch phrases + stable monitor name

Search several phrases in one run. A job matching multiple phrases is saved once, with all matching queries preserved in matchedQueries.

{
"mode": "SEARCH",
"queries": ["python developer", "web scraping"],
"resultsPerQuery": 30,
"maxResults": 50,
"sourceSort": "recency",
"sortResultsBy": "OPPORTUNITY_SCORE",
"includeContacts": true
}

Search + details

Use this when current job status matters more than raw speed.

{
"mode": "SEARCH_FULL",
"queries": ["shopify developer"],
"maxResults": 20,
"includeContacts": true
}

Direct jobs

Provide public Upwork URLs, numeric job IDs, or both.

{
"mode": "DETAIL",
"startUrls": [
{"url": "https://www.upwork.com/jobs/~022077479055407476346"}
],
"jobIds": ["2077478012886342230"],
"maxResults": 10,
"includeContacts": true
}

Monitor jobs

The first clean run creates a baseline. Later runs with the same monitorKey save changes to Monitoring changes.

{
"mode": "MONITOR",
"queries": ["ai automation"],
"maxResults": 100,
"monitorKey": "ai-automation-daily"
}

πŸ”Ž Filters

Filters run before the global result limit, so maxResults controls the final clean dataset.

InputPurpose
jobTypeAny, hourly, or fixed-price jobs
experienceLevelEntry level, intermediate, or expert
maxAgeDaysOnly recently published jobs
minBudget / maxBudgetNormalized budget range
minHourlyRate / maxHourlyRateHourly-rate range
includeSkillsRequire every selected structured skill
excludeKeywordsRemove unwanted words or phrases
onlyWithContactsKeep only jobs with a detected public contact

Example: recent hourly Python jobs paying at least $25/hour:

{
"mode": "SEARCH",
"queries": ["python backend"],
"jobType": "HOURLY",
"experienceLevel": "INTERMEDIATE",
"maxAgeDays": 7,
"minHourlyRate": 25,
"includeSkills": ["python"],
"maxResults": 50
}

πŸ“‡ Public contacts

When enabled, the Actor looks only at information the client deliberately placed in the public job title or description. It can save:

  • Email addresses
  • Phone numbers
  • Company websites
  • Telegram, WhatsApp, Skype, and Discord handles

Contacts are linked back to their job through jobId and jobUrl. Nothing is guessed or generated.

🎯 Opportunity score

opportunityScore is an explainable 0–100 ranking based on freshness, budget visibility, description quality, skill detail, and risk indicators. It is a research aid, not a guarantee that a job or client is safe.

Possible riskFlags include:

  • short_description
  • unpaid_work_request
  • off_platform_contact_or_payment
  • promotional_language

πŸ“¦ Output datasets

Output tabContents
Best matchesScore, budget, skills, freshness, risks, and URL
JobsComplete normalized job records
BudgetsHourly and fixed-price fields for comparison
SkillsStructured skills and matched searches
Public contactsOne clean row per detected contact
Monitoring changesNew, updated, and removed jobs
ErrorsOnly actionable run issues; never mixed with jobs
Run summaryCounts, coverage, retries, filters, and budget statistics

Example job record

{
"recordType": "job",
"jobId": "2077478012886342230",
"ciphertext": "~022077478012886342230",
"title": "Azure Data Engineer (Python, SQL, ETL)",
"description": "We're looking for an experienced Azure Data Engineer...",
"url": "https://www.upwork.com/jobs/~022077478012886342230",
"jobType": "HOURLY",
"experienceLevel": "Intermediate",
"hourlyRateMin": 18,
"hourlyRateMax": 28,
"budgetMin": 18,
"budgetMax": 28,
"budgetDisplay": "$18-$28/hr",
"durationWeeks": 18,
"durationLabel": "3 to 6 months",
"skills": ["Python", "ETL Pipeline", "SQL"],
"matchedQueries": ["python developer"],
"opportunityScore": 78,
"opportunityBand": "Strong",
"riskFlagCount": 0,
"publishedAt": "2026-07-15T19:40:54.404Z"
}

Example contact record

{
"recordType": "contact",
"jobId": "2077478012886342230",
"jobTitle": "Azure Data Engineer",
"contactType": "email",
"value": "hiring@example.com",
"sourceField": "description",
"context": "Please send your portfolio to hiring@example.com and include availability.",
"jobUrl": "https://www.upwork.com/jobs/~022077478012886342230"
}

πŸ“€ Export and automation

Every dataset can be downloaded as JSON, CSV, Excel, XML, or RSS from Apify. You can also connect runs to schedules, webhooks, Make, Zapier, Google Sheets, or your own API workflow.

❓ FAQ

Why did a search return fewer jobs than requested?

Duplicate removal and your filters run before the final limit. The source may also have fewer matching public jobs at that moment. Check sourceTotalsByQuery, duplicatesRemoved, and filteredOut in Run summary.

Are contacts private data?

No. The Actor saves only contact information explicitly published in public job text.

Will a temporary source issue fail my entire run?

Independent queries and details are isolated. Successful jobs are preserved, skipped requests are listed in Errors, and input mistakes finish cleanly with a helpful status message.