Upwork Jobs Scraper - Most Comprehensive avatar

Upwork Jobs Scraper - Most Comprehensive

Pricing

from $0.08 / 1,000 jobs

Go to Apify Store
Upwork Jobs Scraper - Most Comprehensive

Upwork Jobs Scraper - Most Comprehensive

🔥 ~$0.1/1K jobs 🔥 Collect public Upwork job search results by keyword or filtered search URL. Fetch known jobs by URL, optionally add public job details, and export fixed structured records without an Upwork account.

Pricing

from $0.08 / 1,000 jobs

Rating

0.0

(0)

Developer

Kai

Kai

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

11 days ago

Last modified

Share

Upwork Jobs Scraper

Collect public Upwork job listings as structured dataset records. No Upwork account, API key, or cookies are required.

Each job can include its public identity and posting time, description, location rule, hourly or fixed-price budget, experience level, project duration, weekly hours, skills, proposal activity, public client summary, and collection context.

For a first search, set a keyword and maxItems. Turn on fetchDetails when you need full descriptions, job activity, and client fields. After the job finishes, open the default Dataset to view or export the results.

Search public jobs

Start with a keyword

Enter a keyword and set fetchDetails to true when you need full job details:

{
"keyword": "typescript developer",
"maxItems": 20,
"fetchDetails": true
}

You can leave all search fields empty to browse public jobs.

Choose an input mode

ModeSelect it withDetail behaviour
Filter searchkeyword, Advanced Search text, public filters, or no search fields.Search-page data is included. fetchDetails: true adds the full job fields.
Saved public searchsearchUrlsThe saved URL controls the search. maxItems and fetchDetails still apply.
Direct lookupjobUrlsFull details are always collected. Search fields cannot be combined with direct lookup.

What public search can and cannot filter

The Actor uses Upwork's public job search. It does not use an Upwork account, private cookies, or signed-in search settings.

Public search does not apply signed-in filters such as proposal count, previous clients, verified payment, or account-location matching. Upwork can leave these parameters in a copied URL, but they do not change anonymous results.

How filters combine

  • Values in one multi-select field use OR. Most different fields use AND.
  • Client locations and client time zones use OR.
  • An hourly-rate limit selects hourly jobs. A fixed-price value selects fixed-price jobs.
  • Fixed-price presets and one custom fixed-price range use OR.
  • Project length and weekly hours apply only to hourly jobs.
  • Either end of an hourly or fixed-price range can be omitted. When both ends are present, the maximum must be greater than the minimum.

Input examples

Use the examples below for the three input modes and their filters. You can combine compatible filter examples. Do not combine keyword with the Advanced Search text fields. Keep searchUrls and jobUrls as separate modes.

{
"keyword": "typescript developer",
"sort": "recency",
"maxItems": 20,
"fetchDetails": true
}
{
"allWords": "typescript api",
"anyWords": "node deno",
"excludedWords": "wordpress php",
"exactPhrase": "long term",
"titleWords": "backend developer"
}

Skills and categories

{
"skillIds": ["1031626773660942336"],
"categoryIds": ["531770282580668418"],
"subcategoryIds": ["531770282584862733"]
}

Get these numeric IDs from the ontology_skill_uid, category2_uid, and subcategory2_uid parameters in a filtered public Upwork search URL.

Hourly jobs

{
"jobTypes": ["hourly"],
"hourlyRateMin": 25,
"hourlyRateMax": 75,
"experienceLevels": ["intermediate", "expert"]
}

Fixed-price jobs

{
"jobTypes": ["fixed"],
"fixedPriceRanges": ["500-999", "1000-4999"],
"fixedPriceMin": 250,
"fixedPriceMax": 900
}

Client filters

{
"clientHistory": ["1-9", "10-"],
"clientLocations": ["United States"],
"clientTimezones": ["America/New_York"],
"contractToHire": true
}

Hourly project filters

{
"jobTypes": ["hourly"],
"projectLengths": ["month", "semester"],
"hoursPerWeek": ["as_needed", "full_time"],
"pageSize": "20"
}
{
"searchUrls": [
"https://www.upwork.com/nx/search/jobs/?q=typescript&t=0&contractor_tier=2&sort=recency"
]
}

The Actor keeps the query parameters in each saved search URL. During pagination, it changes only the page parameter.

Direct job URL template

The URL below is a format template. It is not a saved public job. Replace it with a current Upwork job URL.

{
"jobUrls": [
"https://www.upwork.com/jobs/Example-job_~022087000000000000001/"
]
}

Direct lookup gets job details automatically.

You can also paste the short public form, such as https://www.upwork.com/jobs/~02.... The Actor accepts the optional frkscc tracking value and saves the canonical job URL.

Input reference

FieldTypeDefaultDescription
keywordstringemptyJob title, skill, or phrase. Maximum 200 characters.
sortstringrelevancerelevance or recency. Ignored when searchUrls is set.
allWordsstringemptyRequire all words. Maximum 200 characters.
anyWordsstringemptyRequire one or more words. Maximum 200 characters.
excludedWordsstringemptyExclude these words. Maximum 200 characters.
exactPhrasestringemptyRequire this exact phrase. Maximum 200 characters.
titleWordsstringemptyRequire these words in the title. Maximum 200 characters.
skillIdsstring[]noneUp to 50 numeric skill IDs, each 6 to 30 digits.
categoryIdsstring[]noneUp to 12 numeric category IDs, each 6 to 30 digits.
subcategoryIdsstring[]noneUp to 50 numeric subcategory IDs, each 6 to 30 digits.
jobTypesstring[]nonehourly, fixed, or both.
hourlyRateMinnumbernoneMinimum hourly rate, from 0 through 99,999 USD.
hourlyRateMaxnumbernoneMaximum hourly rate, from 0 through 100,000 USD. It must be greater than the minimum.
fixedPriceRangesstring[]noneOne or more of 0-99, 100-499, 500-999, 1000-4999, and 5000-.
fixedPriceMinnumbernoneCustom minimum fixed price, from 0 through 99,999 USD.
fixedPriceMaxnumbernoneCustom maximum fixed price, from 0 through 100,000 USD. It must be greater than the minimum.
experienceLevelsstring[]noneentry, intermediate, expert, or a combination.
clientHistorystring[]none0, 1-9, 10-, or a combination.
clientLocationsstring[]noneUp to 50 public region, subregion, or country names. Each value can contain at most 100 characters.
clientTimezonesstring[]noneUp to 50 public time-zone values. Each value can contain at most 100 characters.
projectLengthsstring[]noneweek, month, semester, ongoing, or a combination. Hourly jobs only.
hoursPerWeekstring[]noneas_needed, full_time, or both. Hourly jobs only.
contractToHirebooleanfalseKeep only contract-to-hire jobs.
pageSizestring10Jobs per Upwork page: 10, 20, or 50.
searchUrlsstring[]noneUp to 20 public https://www.upwork.com/nx/search/jobs/ URLs. Each URL can contain at most 2,048 characters.
maxItemsinteger20Maximum unique jobs for the entire run. Range: 1 through 5,000.
jobUrlsstring[]noneUp to 5,000 public Upwork job URLs with a ~02 job ID. Each URL can contain at most 2,048 characters.
fetchDetailsbooleanfalseAdd the full description, location rule, activity, and public client summary.

Output example

Each dataset item is one job. No saved public job record is available here. The syntax-only object below shows field placement. Its values do not belong to one real job; use the typed reference for the output contract.

Output reference

FieldTypeDescription
idstringUpwork job ID.
titlestringJob title.
urlstringCanonical public job URL.
postedTextstring | nullPosting time or source date text.
descriptionobjectsnippet, text, and html are strings or null. Full values need fetchDetails.
locationEligibilitystring | nullPublic location rule, such as Worldwide.
contractobjecttype is hourly, fixed, or unknown. experienceLevel, duration, and weeklyHours are strings or null.
contract.hourlyRateobject | nullmin and max are numbers; currency is a string. Null for fixed-price jobs or when no range is shown.
contract.fixedPriceobject | nullamount is a number; currency is a string. Null for hourly jobs or when no budget is shown.
skillsstring[]Public skill labels.
activityobjectproposals is a string or null; interviewing, invitesSent, and unansweredInvites are numbers or null.
clientobjectpaymentVerified is boolean or null; location, time, membership, spend, hire, and hour fields are strings or null; rating and reviewCount are numbers or null.
metaobjectsourceUrl and scrapedAt are strings; page and position are numbers or null; detailStatus is listed below. Page and position are null for direct lookup.

meta.detailStatus has these meanings:

  • not_requested: The item contains search-page data only.
  • fetched: Full job details were added.
  • unavailable: The job closed or became unavailable before the detail request.
  • failed: The search item was saved, but the optional detail request failed.

Limits

  • Search URL mode accepts at most 20 URLs. Direct lookup accepts at most 5,000 job URLs. maxItems limits the complete run, not each URL.
  • Each search source stops after 500 public result pages, even when maxItems is higher.
  • The Actor makes one scraper request for the full input. The request times out after 310 seconds (about five minutes). Large result sets, especially with fetchDetails: true, can make the run fail before it reaches maxItems.
  • Advanced text cannot be used with keyword. Direct lookup cannot be used with search fields.
  • Project length and weekly-hours filters apply only to hourly jobs.
  • Upwork does not show every field for every job. Missing scalar values are null; missing skills are [].
  • Closed or unavailable jobs in direct lookup are skipped.