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

11

Total users

6

Monthly active users

10 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 run 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.Basic job fields are 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 the search can and cannot filter

Some Upwork filters need a signed-in account. The Actor does not apply them. These filters include proposal count, previous clients, verified payment, and account-location matching. Upwork can leave these parameters in a copied URL, but they do not change the 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.
  • Upwork applies clientLocations. The Actor does not check that each saved job matches it. Set fetchDetails: true to read client.location where Upwork shows it.
  • 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 all filters and settings in each saved search URL.

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 date text, as Upwork shows it.
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 the basic job fields only.
  • fetched: Full job details were added.
  • unavailable: The job closed or became unavailable before its full details were collected.
  • failed: The job was saved with the basic fields only, because its full details could not be collected.

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 stops after 500 Upwork result pages, even when maxItems is higher.
  • A run that does not finish collecting jobs within 15 minutes fails. 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.