Upwork Jobs Scraper API – Clients, Budgets & Contacts
Pricing
from $0.99 / 1,000 upwork jobs
Upwork Jobs Scraper API – Clients, Budgets & Contacts
Find current Upwork jobs by keyword, URL or job ID. Extract descriptions, budgets, skills, client spend and hiring signals, activity, qualifications, questions and public contacts. Rank opportunities and export JSON, CSV or Excel.
Pricing
from $0.99 / 1,000 upwork jobs
Rating
0.0
(0)
Developer
Kelopr_bk
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
14
Monthly active users
12 days ago
Last modified
Categories
Share
Upwork Jobs Scraper — Clients, Budgets & Contacts
Turn current Upwork job searches into structured opportunity data. Find jobs by keyword, enrich known listings, compare budgets, inspect public client hiring signals, extract contacts explicitly published in job text, and rank the best opportunities with explainable scores.
Current jobs · Full descriptions · Budgets & skills · Client intelligence · Job activity · Qualifications · Screening questions · Public contacts · Application insights
What can this Actor do?
| Workflow | Best for | Output |
|---|---|---|
SEARCH | Fast market and opportunity scans | Job identity, description, budget, skills, experience, duration, timestamps and search rank |
SEARCH_FULL | Lead qualification and bid research | Search data plus available client, activity, qualification, attachment and screening-question fields |
DETAIL | Enrich known jobs | Full public record for supplied Upwork job URLs or numeric job IDs |
Every workflow deduplicates by Upwork job ID, keeps matched search terms, applies filters, extracts public contacts and adds explainable opportunity intelligence.
Quick start
Find recent Python jobs
{"mode": "SEARCH","queries": ["python developer"],"sourceSort": "recency","maxResults": 25,"resultsPerQuery": 25}
Search and add full job intelligence
{"mode": "SEARCH_FULL","queries": ["web scraping", "data extraction"],"maxResults": 20,"resultsPerQuery": 30,"includeContacts": true,"sortResultsBy": "OPPORTUNITY_SCORE"}
Enrich known Upwork jobs
{"mode": "DETAIL","startUrls": [{"url": "https://www.upwork.com/jobs/~022094813107468472052"}],"jobIds": ["2094725460191723809"],"maxResults": 10}
What data will you receive?
Job identity and timing
jobId, ciphertext, url, title, description, status, closeReason, createdAt, publishedAt, scrapedAt, detailFetched, detailStatus, detailSource, warnings.
Contract and budget
jobType, experienceLevel, hourlyRateMin, hourlyRateMax, weeklyRetainerBudget, fixedBudget, fixedBudgetMax, budgetMin, budgetMax, budgetDisplay, currencyCode, engagementType, durationLabel, durationWeeks, workload, workArrangement, personsToHire, premium, enterpriseJob, contractStartDate, contractEndDate, onSiteType.
Skills and classification
skills, skillIds, highlightedSkills, technicalStack, inferredSkills, category, categorySlug, categoryGroup, categoryGroupSlug, subcategory, occupation, tags.
Client intelligence
When Upwork publishes the values, full records can include:
clientCountry, clientCity, clientState, clientTimezone, clientIndustry, clientCompanySize, clientPaymentVerified, clientRating, clientReviewCount, clientTotalSpent, clientJobsPosted, clientHireRate, clientOpenJobs, clientTotalHires, clientActiveHires, clientAverageHourlyRate, clientTotalHours, clientMemberSince, clientCanHire.
Job activity
totalApplicants, invitesSent, totalInvitedToInterview, totalHired, totalOffers, unansweredInvites, lastClientActivity, personsToHire, canReceiveProposals.
Qualifications and application requirements
preferredCountries, preferredStates, preferredRegions, preferredTimezones, localMarket, requiredEnglishProficiency, requiredJobSuccessScore, requiredHoursWorked, portfolioRequired, risingTalentPreferred, coverLetterRequired, screeningQuestions, screeningQuestionCount, attachmentNames, attachmentCount.
Public contacts
The Actor finds only contacts explicitly published in the job text:
- email addresses;
- phone numbers;
- external websites;
- public messaging handles.
Contacts are saved to a separate dataset with the job ID, job title, source context and job URL. contactCount and hasPublicContacts stay on the job record.
Application Intelligence
Every job receives transparent, locally calculated signals:
opportunityScoreandopportunityBand;applyRecommendation;riskFlagsandriskFlagCount;freshnessMinutes;competitionLevel;clientConfidenceScore;applicationEffort;technicalStackandinferredSkills;applicationRequirements;clientIntentSignals;proposalTips;agencyPreference;antiBotPhrasewhen the client publishes a proposal instruction;jobFingerprintfor stable downstream deduplication.
Scores never replace source data. The jobScoreBreakdownJson field explains the components used for ranking.
Filters
| Input | Purpose |
|---|---|
jobType | Any, hourly or fixed-price work |
experienceLevel | Entry level, intermediate or expert |
maxAgeDays | Keep only jobs published within N days |
minBudget, maxBudget | Normalized budget bounds |
minHourlyRate, maxHourlyRate | Hourly-rate range |
includeSkills | Every listed skill must be present |
excludeKeywords | Drop jobs containing a phrase in title or description |
onlyWithContacts | Keep jobs with public contact data |
paymentVerifiedOnly | Keep jobs whose client has a verified billing method |
minClientSpend | Keep clients who have paid at least this much |
minClientRating | Keep clients rated at least this high |
minClientHireRate | Keep clients who hire on at least this share of jobs |
maxApplicants | Keep jobs where competition is still low |
clientCountries, excludeClientCountries | Filter by the client's country |
sortResultsBy | Source order, newest, opportunity score or budget |
maxResults | Maximum unique jobs saved across the run |
The seven client filters read the job page's own client data, which is fetched
in Search + details and Direct jobs. In a plain Search there is no
client block to test, so they are ignored and the run notes this in
inputWarnings. A job whose client data is missing is kept rather than dropped,
so filtering never hides a job over absent data.
Filtered and duplicate candidates do not count as saved results.
Every run reports which filter removed what: filteredOut is the total,
filterBreakdown counts the drops per setting, and filterHint names the
costliest one in plain words, for example "310 of 420 job(s) were removed by
your filters, 280 of them by minBudget. To keep more, lower minBudget." A run
that saves nothing repeats that sentence as its status message, so an empty
dataset never leaves you guessing.
What the public source does not publish
Upwork shows a client's economics to signed-in users, not to visitors. I checked this rather than assumed it: the visitor GraphQL API refuses clientCompanyPublic on a permission error and does not define totalApplicants at all, the job page itself answers a challenge instead of HTML on nine different TLS profiles, and the JSON endpoints behind that page answer the same way. So lifetime spend, hire rate, payment verification, client rating, reviews, location and proposal counts cannot be collected from a public run, and this Actor does not pretend otherwise - those columns and the client view they lived in have been removed rather than shipped empty.
Everything the source does publish is collected: the full description, budgets including the fixed-price amount and currency, hourly range and budget type, skills, category, experience level, duration, screening questions, qualifications, client activity timestamps, invitations, interviews, hires and offers, and any contact the client typed into the job text.
Output views
| View | Designed for |
|---|---|
| Best matches | Scores, recommendations, freshness, competition and risk |
| Jobs | Full descriptions and core job records |
| Client intelligence | Spend, hire rate, reviews, payment and company signals |
| Application intelligence | Questions, qualifications, requirements and proposal tips |
| Job activity | Applicants, invites, interviews, hires and offers |
| Budgets | Hourly, fixed, retainer and normalized budget fields |
| Skills | Source skills, IDs, detected stack and query matches |
| Public contacts | Contacts explicitly published in job text |
| Errors | Skipped sources and actionable run issues |
| Run summary | Saved, filtered, duplicate and source-request counters |
Source coverage
Public Upwork job surfaces do not expose the same fields for every posting. Search rows can be lighter than full records, and some job pages restrict client or activity information. Missing values remain null; the Actor does not invent budgets, client history, contacts or application statistics.
Use detailStatus, detailSource, warnings and the run summary to distinguish complete, search-only and unavailable fields.
Export and integrations
Download results as JSON, JSONL, CSV, Excel, XML, RSS or an HTML table. Use the Apify API, webhooks, Make, Zapier, Google Sheets, Airbyte, your CRM, an AI agent or your own application.
Save a configured input as an Apify task when you want to reuse the same search and filters.
Performance
Measured on 512 MB:
| Workflow | Jobs | Time |
|---|---|---|
SEARCH | 20 | ~27 s |
DETAIL | 20 | ~78 s |
SEARCH_FULL | 5 | ~78 s |
Results appear in the dataset as each job is read, so you can open the first rows while the run continues.
Pricing
- Every saved job is one result.
- A job saved with its client block (spend, rating, reviews, hires, country, applicants) adds a Client details charge. That happens only in
SEARCH_FULLandDETAIL, and only when the client block was actually received. PlainSEARCHnever adds it. - Jobs that are open to signed-in Upwork users only are saved from their search card, without the client block and without the extra charge.
The exact rates for your plan are shown in the pricing panel.
Cost control
For a small first run:
- Choose
SEARCH. - Use one query.
- Set
maxResultsandresultsPerQueryto 5. - Inspect the fields and filters you need.
- Switch to
SEARCH_FULLonly when client and application details are useful.
Set Maximum charge per run in Apify Console for a hard budget ceiling.
Frequently asked questions
Does the Actor require an Upwork account?
No. Provide keywords, public job URLs or numeric job IDs.
Why are some client fields empty?
Upwork publishes different detail levels across jobs. Empty fields mean the value was not available in the selected public source.
Can I combine several search phrases?
Yes. Add one phrase per row in queries. Duplicate jobs are merged and matchedQueries keeps every matching phrase.
Can I extract contact details?
Yes, when a client explicitly included them in the public job description. The Actor does not generate or guess contacts.
What makes the opportunity score explainable?
It uses published freshness, budget, skills, client signals, applicant competition and explicit risk phrases. The breakdown travels with each row.
Can I enrich jobs from another dataset?
Export or map the job URLs/IDs into startUrls or jobIds, then use DETAIL.
Tags: upwork scraper · upwork jobs · freelance jobs · client intelligence · job leads · budget data · contact extraction · proposal research · opportunity scoring