Upwork Jobs Scraper - Most Comprehensive
Pricing
from $0.08 / 1,000 jobs
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
11 days ago
Last modified
Categories
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
| Mode | Select it with | Detail behaviour |
|---|---|---|
| Filter search | keyword, Advanced Search text, public filters, or no search fields. | Search-page data is included. fetchDetails: true adds the full job fields. |
| Saved public search | searchUrls | The saved URL controls the search. maxItems and fetchDetails still apply. |
| Direct lookup | jobUrls | Full 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 search
{"keyword": "typescript developer","sort": "recency","maxItems": 20,"fetchDetails": true}
Advanced text search
{"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"}
Saved public search
{"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
| Field | Type | Default | Description |
|---|---|---|---|
keyword | string | empty | Job title, skill, or phrase. Maximum 200 characters. |
sort | string | relevance | relevance or recency. Ignored when searchUrls is set. |
allWords | string | empty | Require all words. Maximum 200 characters. |
anyWords | string | empty | Require one or more words. Maximum 200 characters. |
excludedWords | string | empty | Exclude these words. Maximum 200 characters. |
exactPhrase | string | empty | Require this exact phrase. Maximum 200 characters. |
titleWords | string | empty | Require these words in the title. Maximum 200 characters. |
skillIds | string[] | none | Up to 50 numeric skill IDs, each 6 to 30 digits. |
categoryIds | string[] | none | Up to 12 numeric category IDs, each 6 to 30 digits. |
subcategoryIds | string[] | none | Up to 50 numeric subcategory IDs, each 6 to 30 digits. |
jobTypes | string[] | none | hourly, fixed, or both. |
hourlyRateMin | number | none | Minimum hourly rate, from 0 through 99,999 USD. |
hourlyRateMax | number | none | Maximum hourly rate, from 0 through 100,000 USD. It must be greater than the minimum. |
fixedPriceRanges | string[] | none | One or more of 0-99, 100-499, 500-999, 1000-4999, and 5000-. |
fixedPriceMin | number | none | Custom minimum fixed price, from 0 through 99,999 USD. |
fixedPriceMax | number | none | Custom maximum fixed price, from 0 through 100,000 USD. It must be greater than the minimum. |
experienceLevels | string[] | none | entry, intermediate, expert, or a combination. |
clientHistory | string[] | none | 0, 1-9, 10-, or a combination. |
clientLocations | string[] | none | Up to 50 public region, subregion, or country names. Each value can contain at most 100 characters. |
clientTimezones | string[] | none | Up to 50 public time-zone values. Each value can contain at most 100 characters. |
projectLengths | string[] | none | week, month, semester, ongoing, or a combination. Hourly jobs only. |
hoursPerWeek | string[] | none | as_needed, full_time, or both. Hourly jobs only. |
contractToHire | boolean | false | Keep only contract-to-hire jobs. |
pageSize | string | 10 | Jobs per Upwork page: 10, 20, or 50. |
searchUrls | string[] | none | Up to 20 public https://www.upwork.com/nx/search/jobs/ URLs. Each URL can contain at most 2,048 characters. |
maxItems | integer | 20 | Maximum unique jobs for the entire run. Range: 1 through 5,000. |
jobUrls | string[] | none | Up to 5,000 public Upwork job URLs with a ~02 job ID. Each URL can contain at most 2,048 characters. |
fetchDetails | boolean | false | Add 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
| Field | Type | Description |
|---|---|---|
id | string | Upwork job ID. |
title | string | Job title. |
url | string | Canonical public job URL. |
postedText | string | null | Posting time or source date text. |
description | object | snippet, text, and html are strings or null. Full values need fetchDetails. |
locationEligibility | string | null | Public location rule, such as Worldwide. |
contract | object | type is hourly, fixed, or unknown. experienceLevel, duration, and weeklyHours are strings or null. |
contract.hourlyRate | object | null | min and max are numbers; currency is a string. Null for fixed-price jobs or when no range is shown. |
contract.fixedPrice | object | null | amount is a number; currency is a string. Null for hourly jobs or when no budget is shown. |
skills | string[] | Public skill labels. |
activity | object | proposals is a string or null; interviewing, invitesSent, and unansweredInvites are numbers or null. |
client | object | paymentVerified is boolean or null; location, time, membership, spend, hire, and hour fields are strings or null; rating and reviewCount are numbers or null. |
meta | object | sourceUrl 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.
maxItemslimits the complete run, not each URL. - Each search source stops after 500 public result pages, even when
maxItemsis 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 reachesmaxItems. - 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.