Upwork Jobs Scraper: Search, Contacts & Monitoring
Pricing
from $0.99 / 1,000 upwork jobs
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
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
- Select Live search β fresh job listings.
- Enter one or more search phrases, such as
python developerorweb scraping. - Set Maximum saved jobs to the number you need.
- Click Start.
- Open Output β Best matches or Output β Jobs.
flowchart LRA["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
| Mode | Best for | Input |
|---|---|---|
| β‘ Live search | Fast research and lead discovery | Search phrases |
| β¨ Search + details | Verifying each selected job and its current status | Search phrases |
| π Direct jobs | Known listings | Upwork URLs or numeric job IDs |
| π Monitor | Repeated searches and alerts | Search phrases + stable monitor name |
Live search
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.
| Input | Purpose |
|---|---|
jobType | Any, hourly, or fixed-price jobs |
experienceLevel | Entry level, intermediate, or expert |
maxAgeDays | Only recently published jobs |
minBudget / maxBudget | Normalized budget range |
minHourlyRate / maxHourlyRate | Hourly-rate range |
includeSkills | Require every selected structured skill |
excludeKeywords | Remove unwanted words or phrases |
onlyWithContacts | Keep 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_descriptionunpaid_work_requestoff_platform_contact_or_paymentpromotional_language
π¦ Output datasets
| Output tab | Contents |
|---|---|
| Best matches | Score, budget, skills, freshness, risks, and URL |
| Jobs | Complete normalized job records |
| Budgets | Hourly and fixed-price fields for comparison |
| Skills | Structured skills and matched searches |
| Public contacts | One clean row per detected contact |
| Monitoring changes | New, updated, and removed jobs |
| Errors | Only actionable run issues; never mixed with jobs |
| Run summary | Counts, 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.