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
11
Total users
6
Monthly active users
10 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 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
| Mode | Select it with | Detail behaviour |
|---|---|---|
| Filter search | keyword, Advanced Search text, public filters, or no search fields. | Basic job fields are 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 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. SetfetchDetails: trueto readclient.locationwhere 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 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 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
| 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 date text, as Upwork shows it. |
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 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.
maxItemslimits the complete run, not each URL. - Each search stops after 500 Upwork result pages, even when
maxItemsis 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 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.