Upwork Jobs Scraper API – Clients, Budgets & Contacts avatar

Upwork Jobs Scraper API – Clients, Budgets & Contacts

Pricing

from $0.99 / 1,000 upwork jobs

Go to Apify Store
Upwork Jobs Scraper API – Clients, Budgets & Contacts

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

Kelopr_bk

Maintained by Community

Actor stats

0

Bookmarked

24

Total users

14

Monthly active users

12 days ago

Last modified

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?

WorkflowBest forOutput
SEARCHFast market and opportunity scansJob identity, description, budget, skills, experience, duration, timestamps and search rank
SEARCH_FULLLead qualification and bid researchSearch data plus available client, activity, qualification, attachment and screening-question fields
DETAILEnrich known jobsFull 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:

  • opportunityScore and opportunityBand;
  • applyRecommendation;
  • riskFlags and riskFlagCount;
  • freshnessMinutes;
  • competitionLevel;
  • clientConfidenceScore;
  • applicationEffort;
  • technicalStack and inferredSkills;
  • applicationRequirements;
  • clientIntentSignals;
  • proposalTips;
  • agencyPreference;
  • antiBotPhrase when the client publishes a proposal instruction;
  • jobFingerprint for stable downstream deduplication.

Scores never replace source data. The jobScoreBreakdownJson field explains the components used for ranking.

Filters

InputPurpose
jobTypeAny, hourly or fixed-price work
experienceLevelEntry level, intermediate or expert
maxAgeDaysKeep only jobs published within N days
minBudget, maxBudgetNormalized budget bounds
minHourlyRate, maxHourlyRateHourly-rate range
includeSkillsEvery listed skill must be present
excludeKeywordsDrop jobs containing a phrase in title or description
onlyWithContactsKeep jobs with public contact data
paymentVerifiedOnlyKeep jobs whose client has a verified billing method
minClientSpendKeep clients who have paid at least this much
minClientRatingKeep clients rated at least this high
minClientHireRateKeep clients who hire on at least this share of jobs
maxApplicantsKeep jobs where competition is still low
clientCountries, excludeClientCountriesFilter by the client's country
sortResultsBySource order, newest, opportunity score or budget
maxResultsMaximum 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

ViewDesigned for
Best matchesScores, recommendations, freshness, competition and risk
JobsFull descriptions and core job records
Client intelligenceSpend, hire rate, reviews, payment and company signals
Application intelligenceQuestions, qualifications, requirements and proposal tips
Job activityApplicants, invites, interviews, hires and offers
BudgetsHourly, fixed, retainer and normalized budget fields
SkillsSource skills, IDs, detected stack and query matches
Public contactsContacts explicitly published in job text
ErrorsSkipped sources and actionable run issues
Run summarySaved, 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:

WorkflowJobsTime
SEARCH20~27 s
DETAIL20~78 s
SEARCH_FULL5~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_FULL and DETAIL, and only when the client block was actually received. Plain SEARCH never 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:

  1. Choose SEARCH.
  2. Use one query.
  3. Set maxResults and resultsPerQuery to 5.
  4. Inspect the fields and filters you need.
  5. Switch to SEARCH_FULL only 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