# Upwork | Search |Job(s) | Scraper (No Cookies) (Richest output) (`memo23/upwork-jobs-scraper`)

Extract detailed Upwork job listings with our scraper. Get job descriptions, budgets, required skills, client history, and engagement terms in a structured format. Perfect for market research and competitive analysis.

- **URL**: https://beta-securitybyobscurity.apify.com/memo23/upwork-jobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://beta-securitybyobscurity.apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 34 total users, 10 monthly users, 99.8% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

$16.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.
You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

# README

## Upwork Jobs Scraper

Extract structured job listings from [Upwork.com](https://www.upwork.com/). Ideal for job seekers, recruiters, and market researchers looking to analyze job market trends, skills in demand, and competitive insights.

***

### Features

- **Comprehensive Job Scraping**:
  - Extract detailed job postings including titles, descriptions, budgets, and requirements.
  - Support for various job types (hourly, fixed-price) and experience levels.
- **Advanced Search Filters**:
  - Filter by location, job type, budget range, client history, and more.
  - Support for complex search queries with multiple parameters.
- **Performance Optimized**:
  - Configurable concurrency and retry settings for reliable scraping.
  - Built-in proxy rotation with residential IP support to avoid blocks.
- **Structured Data Output**:
  - Clean, normalized data in JSON format ready for analysis.
  - Consistent schema for easy integration with databases and analytics tools.

***

### Getting Started

#### Basic Usage

1. **Configure Input**:
   - Add Upwork job URLs to the `startUrls` array.
   - Set your preferred scraping limits and proxy settings.

2. **Run the Scraper**:
   - Execute the scraper via Apify platform or CLI.
   - Monitor progress through the Apify dashboard.

3. **Export Data**:
   - Download results in JSON, CSV, or other supported formats.
   - Use webhooks or API to integrate with your workflow.

#### Example Input

```json
{
    "startUrls": [
        { "url": "https://www.upwork.com/jobs/~0123456789abcdef" },
        { "url": "https://www.upwork.com/freelance-jobs/apply/Pitchbook-Data-Extraction-for-Paddle-Companies_~021933418908659249795/" },
        { "url": "https://www.upwork.com/nx/search/jobs/?q=web+development" }
    ],
    "maxItems": 100,
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

***

### Input Configuration

#### Input Fields Explained

| Parameter             | Description                                                                 | Default |
|-----------------------|-----------------------------------------------------------------------------|---------|
| **`startUrls`**       | Array of Upwork job URLs or search result pages to start scraping.          | `[]`    |
| **`maxItems`**        | Maximum number of job listings to scrape per run.                           | `100`   |
| **`maxConcurrency`**  | Maximum number of pages to process simultaneously.                         | `10`    |
| **`minConcurrency`**  | Minimum number of pages to keep in processing queue.                       | `1`     |
| **`maxRequestRetries`** | Number of times to retry failed requests before giving up.              | `100`   |
| **`proxy`**           | Proxy configuration for making requests. Residential proxies recommended.  | `Apify Proxy` |
| **`cookies`**         | (Optional) Authentication cookies if accessing protected content.          | `[]`    |

#### Supported URL Formats

##### 1. Job Search URLs

Search for jobs using Upwork's search functionality:

```
https://www.upwork.com/nx/search/jobs/?q=airbnb
```

##### 2. Individual Job Postings

Scrape specific job postings using these URL formats:

```
https://www.upwork.com/freelance-jobs/apply/Pitchbook-Data-Extraction-for-Paddle-Companies_~021933418908659249795/
https://www.upwork.com/jobs/~021897592604309915141
```

##### 3. Advanced Search with Filters

Use Upwork's advanced search parameters:

```
https://www.upwork.com/nx/search/jobs/?q=full+stack+data+scientist&sort=recency&location=Americas,Europe
```

***

### Advanced Search Parameters

The scraper supports various Upwork search parameters that can be included in your start URLs:

- **`q`**: Search query (e.g., `web+development`)
- **`sort`**: Sort order (`recency`, `relevance`)
- **`location`**: Filter by location (comma-separated values)
- **`t`**: Job type (`0` for hourly, `1` for fixed-price)
- **`amount`**: Budget range (e.g., `100-500`)
- **`client_hires`**: Client hiring history (e.g., `0,1-9,10-`)
- **`payment_verified`**: Show only verified payments (`1` for true)
- **`timezone`**: Filter by timezone (comma-separated values)

Example with multiple filters:

```
https://www.upwork.com/nx/search/jobs/?q=react&sort=recency&location=Americas,Europe&t=1&amount=100-500&payment_verified=1
```

***

### Output Structure

```json
{
    "hiredApplicantNames": null,
    "opening": {
        "job": {
            "status": "ACTIVE",
            "postedOn": "2025-06-22T08:27:45.795Z",
            "publishTime": "2025-06-22T08:27:46.991Z",
            "sourcingTime": null,
            "startDate": null,
            "deliveryDate": null,
            "workload": null,
            "contractorTier": "INTERMEDIATE",
            "description": "We are Nova9 Marketing, a fast-growing digital marketing startup based in Seychelles, focused on helping Airbnbs, boutique hotels, and short-term rentals grow their online presence and increase direct bookings.\n\nOur services range from OTA listing optimization and dynamic pricing to social media management, visual branding, and Meta (Facebook/Instagram) ads.\n\nWe’re now looking to bring on a Social Media Manager with strong experience in Instagram and Facebook content creation, especially for brands in hospitality, real estate, travel, or lifestyle.\n\nThis is a long-term, remote position with the opportunity to manage multiple client accounts as we grow. You’ll be working closely with our video editor, virtual assistant, and creative director to deliver premium social media experiences for our clients.\n\n🛠 What You’ll Be Responsible For:\n\t•\tCreating monthly content plans (feed + story + Reel structure)\n\t•\tWriting engaging, branded captions with CTAs and emojis\n\t•\tSelecting and suggesting photos or clips from client shoot folders\n\t•\tCoordinating 6 Reels/month (our editor will handle the video – you guide the direction)\n\t•\tScheduling content via Later, Metricool, or similar\n\t•\tMonitoring basic engagement (replying to DMs/comments 2–3 times per week)\n\t•\tDelivering monthly performance reports using in-platform analytics\n\n✅ Requirements:\n\t•\t1+ year experience managing Instagram and Facebook for clients (travel/hospitality preferred)\n\t•\tConfident writing engaging, on-brand captions in English\n\t•\tBasic understanding of Reels hooks, trends, and storytelling\n\t•\tComfortable using Canva, Later/Metricool/Buffer, and Google Drive\n\t•\tHighly organized and proactive communicator\n\t•\tBonus: Familiarity with TikTok and short-form video trends\n💼 Scope & Rate:\n\t•\tWe’re offering $250–$300/month to start per client\n\t•\tFirst project will be a trial month for 1 property account\n\t•\tIf successful, we’ll increase workload and scale you into multiple accounts\n\t•\tFlexible working hours – we care more about quality and reliability than timezone\n\n🌴 Why Work With Us:\n\t•\tWe’re a creative team building something big in a niche with global growth potential\n\t•\tYou’ll work with beautiful, high-quality content (tropical hotels, beach villas, aerial shots)\n\t•\tDirect line of communication with the founder – no corporate fluff\n\t•\tRemote, independent, outcome-driven environment\n\t•\tLong-term growth opportunities — we want team players, not gig hoppers",
            "info": {
                "ciphertext": "~021936702637394960044",
                "id": "1936702637394960044",
                "type": "FIXED",
                "access": "PUBLIC_INDEX",
                "title": "Social Media Manager for Airbnb & Hotels",
                "hideBudget": false,
                "createdOn": "2025-06-22T08:27:45.795Z",
                "notSureProjectDuration": false,
                "notSureFreelancersToHire": false,
                "notSureExperienceLevel": false,
                "notSureLocationPreference": false,
                "premium": false
            },
            "segmentationData": [
                {
                    "customValue": null,
                    "label": "Ongoing project",
                    "name": "Employment",
                    "sortOrder": 1,
                    "type": "EMPLOYMENT",
                    "value": "EMPLOYMENT_POSITION",
                    "skill": null
                }
            ],
            "sandsData": {
                "occupation": {
                    "freeText": null,
                    "ontologyId": "upworkOccupation:socialmediamarketing",
                    "prefLabel": "Social Media Marketing",
                    "id": "1017484851352698999",
                    "uid": "1017484851352698999"
                },
                "ontologySkills": [
                    {
                        "groupId": "1549040540813496320",
                        "id": "1045317701570953216",
                        "freeText": null,
                        "prefLabel": "Travel & Hospitality",
                        "groupPrefLabel": "Industry"
                    }
                ],
                "additionalSkills": [
                    {
                        "groupId": null,
                        "id": "1052162208978227208",
                        "freeText": null,
                        "prefLabel": "Facebook"
                    },
                    {
                        "groupId": null,
                        "id": "1052162208978227206",
                        "freeText": null,
                        "prefLabel": "Instagram"
                    },
                    {
                        "groupId": null,
                        "id": "1204836476859301888",
                        "freeText": null,
                        "prefLabel": "Social Media Content Creation"
                    },
                    {
                        "groupId": null,
                        "id": "1031626781101637632",
                        "freeText": null,
                        "prefLabel": "Social Media Management"
                    }
                ]
            },
            "category": {
                "name": "Digital Marketing",
                "urlSlug": "digital-marketing"
            },
            "categoryGroup": {
                "name": "Sales & Marketing",
                "urlSlug": "sales-marketing"
            },
            "budget": {
                "amount": 300,
                "currencyCode": "USD"
            },
            "annotations": {
                "tags": [
                    "jsi_contractToHire",
                    "contractToHireSet",
                    "searchable",
                    "C2HJobsOptInEducation"
                ]
            },
            "engagementDuration": {
                "label": "1 to 3 months",
                "weeks": 9
            },
            "extendedBudgetInfo": {
                "hourlyBudgetMin": null,
                "hourlyBudgetMax": null,
                "hourlyBudgetType": null
            },
            "attachments": [],
            "clientActivity": {
                "lastBuyerActivity": "2025-06-22T08:52:15.177Z",
                "totalApplicants": 20,
                "totalHired": 0,
                "totalInvitedToInterview": 0,
                "unansweredInvites": 0,
                "invitationsSent": 0,
                "numberOfPositionsToHire": 1
            }
        },
        "qualifications": {
            "countries": null,
            "earnings": null,
            "groupRecno": null,
            "languages": null,
            "localDescription": null,
            "localFlexibilityDescription": null,
            "localMarket": false,
            "minJobSuccessScore": 0,
            "minOdeskHours": 0,
            "onSiteType": null,
            "prefEnglishSkill": "ANY",
            "regions": null,
            "risingTalent": false,
            "shouldHavePortfolio": false,
            "states": null,
            "tests": null,
            "timezones": null,
            "type": "ANY",
            "locationCheckRequired": false,
            "group": null,
            "location": null,
            "locations": null
        },
        "questions": []
    },
    "buyer": {
        "enterprise": false,
        "isPaymentMethodVerified": false,
        "info": {
            "location": {
                "offsetFromUtcMillis": 0,
                "countryTimezone": "Etc/UTC (UTCZ)",
                "city": null,
                "country": "Seychelles"
            },
            "stats": {
                "totalAssignments": 0,
                "activeAssignmentsCount": 0,
                "hoursCount": 0,
                "feedbackCount": 0,
                "score": 0,
                "totalJobsWithHires": 0,
                "totalCharges": null
            },
            "company": {
                "name": null,
                "companyId": "1931041000145612262",
                "isEDCReplicated": null,
                "contractDate": "2025-06-06T00:00:00.000Z",
                "profile": {
                    "industry": "Travel & Hospitality",
                    "size": 1
                }
            },
            "jobs": {
                "openCount": 3,
                "postedCount": 3,
                "openJobs": [
                    {
                        "id": "1936712169910544263",
                        "uid": "1936712169910544263",
                        "isPtcPrivate": false,
                        "ciphertext": "~021936712169910544263",
                        "title": "Meta Ads Specialist for Airbnb & Boutique Hotels",
                        "type": "FIXED"
                    },
                    {
                        "id": "1936698126381745887",
                        "uid": "1936698126381745887",
                        "isPtcPrivate": false,
                        "ciphertext": "~021936698126381745887",
                        "title": "OTA Listing & Pricing Optimization Expert (Airbnb/Booking/VRBO)",
                        "type": "FIXED"
                    }
                ]
            },
            "avgHourlyJobsRate": null
        },
        "workHistory": []
    },
    "currentUserInfo": {
        "owner": false,
        "freelancerInfo": {
            "profileState": "AUTO_ACCEPTED",
            "applied": null,
            "devProfileCiphertext": "~01d7fa411418639c50",
            "hired": null,
            "application": null,
            "pendingInvite": null,
            "contract": null,
            "hourlyRate": {
                "amount": 99
            },
            "qualificationsMatches": {
                "matches": [
                    {
                        "clientPreferred": "all",
                        "clientPreferredLabel": "Any",
                        "freelancerValue": "IC",
                        "freelancerValueLabel": "Not Specified",
                        "qualification": "FreelancerType",
                        "qualified": true
                    },
                    {
                        "clientPreferred": "0",
                        "clientPreferredLabel": "At least 0%",
                        "freelancerValue": "0",
                        "freelancerValueLabel": "0%",
                        "qualification": "MinimumJobSuccessScore",
                        "qualified": true
                    },
                    {
                        "clientPreferred": "0",
                        "clientPreferredLabel": "Any",
                        "freelancerValue": "4",
                        "freelancerValueLabel": "Native Or Bilingual",
                        "qualification": "EnglishLevel",
                        "qualified": true
                    },
                    {
                        "clientPreferred": "0",
                        "clientPreferredLabel": "At least 0 hours",
                        "freelancerValue": "0",
                        "freelancerValueLabel": "0",
                        "qualification": "HoursBilled",
                        "qualified": true
                    },
                    {
                        "clientPreferred": "ANY",
                        "clientPreferredLabel": "Any",
                        "freelancerValue": "0.00",
                        "freelancerValueLabel": "0.00",
                        "qualification": "Earnings",
                        "qualified": true
                    },
                    {
                        "clientPreferred": "Any",
                        "clientPreferredLabel": null,
                        "freelancerValue": "en",
                        "freelancerValueLabel": "English",
                        "qualification": "Language",
                        "qualified": true
                    }
                ]
            }
        }
    },
    "similarJobs": [],
    "workLocation": {
        "onSiteCity": null,
        "onSiteCountry": null,
        "onSiteReason": null,
        "onSiteReasonFlexible": null,
        "onSiteState": null,
        "onSiteType": null
    },
    "phoneVerificationStatus": {
        "status": "VERIFIED"
    },
    "applicantsBidsStats": null,
    "specializedProfileOccupationId": "1017484851352698999",
    "applicationContext": {
        "freelancerAllowed": false,
        "clientAllowed": true
    },
    "basicInfo": {
        "id": "1936702637394960044",
        "title": "Social Media Manager for H^Airbnb^H & Hotels",
        "description": "We are Nova9 Marketing, a fast-growing digital marketing startup based in Seychelles, focused on helping Airbnbs, boutique hotels, and short-term rentals grow their online presence and increase direct bookings.\n\nOur services range from OTA listing optimization and dynamic pricing to social media management, visual branding, and Meta (Facebook/Instagram) ads.\n\nWe’re now looking to bring on a Social Media Manager with strong experience in Instagram and Facebook content creation, especially for brands in hospitality, real estate, travel, or lifestyle.\n\nThis is a long-term, remote position with the opportunity to manage multiple client accounts as we grow. You’ll be working closely with our video editor, virtual assistant, and creative director to deliver premium social media experiences for our clients.\n\n🛠 What You’ll Be Responsible For:\n\t•\tCreating monthly content plans (feed + story + Reel structure)\n\t•\tWriting engaging, branded captions with CTAs and emojis\n\t•\tSelecting and suggesting photos or clips from client shoot folders\n\t•\tCoordinating 6 Reels/month (our editor will handle the video – you guide the direction)\n\t•\tScheduling content via Later, Metricool, or similar\n\t•\tMonitoring basic engagement (replying to DMs/comments 2–3 times per week)\n\t•\tDelivering monthly performance reports using in-platform analytics\n\n✅ Requirements:\n\t•\t1+ year experience managing Instagram and Facebook for clients (travel/hospitality preferred)\n\t•\tConfident writing engaging, on-brand captions in English\n\t•\tBasic understanding of Reels hooks, trends, and storytelling\n\t•\tComfortable using Canva, Later/Metricool/Buffer, and Google Drive\n\t•\tHighly organized and proactive communicator\n\t•\tBonus: Familiarity with TikTok and short-form video trends\n💼 Scope & Rate:\n\t•\tWe’re offering $250–$300/month to start per client\n\t•\tFirst project will be a trial month for 1 property account\n\t•\tIf successful, we’ll increase workload and scale you into multiple accounts\n\t•\tFlexible working hours – we care more about quality and reliability than timezone\n\n🌴 Why Work With Us:\n\t•\tWe’re a creative team building something big in a niche with global growth potential\n\t•\tYou’ll work with beautiful, high-quality content (tropical hotels, beach villas, aerial shots)\n\t•\tDirect line of communication with the founder – no corporate fluff\n\t•\tRemote, independent, outcome-driven environment\n\t•\tLong-term growth opportunities — we want team players, not gig hoppers",
        "relevanceEncoded": "{\"position\":\"3\"}",
        "ontologySkills": [
            {
                "uid": "1045317701570953216",
                "parentSkillUid": null,
                "prefLabel": "Travel & Hospitality",
                "prettyName": "Travel & Hospitality",
                "freeText": null,
                "highlighted": false
            },
            {
                "uid": "1052162208978227208",
                "parentSkillUid": null,
                "prefLabel": "Facebook",
                "prettyName": "Facebook",
                "freeText": null,
                "highlighted": false
            },
            {
                "uid": "1052162208978227206",
                "parentSkillUid": null,
                "prefLabel": "Instagram",
                "prettyName": "Instagram",
                "freeText": null,
                "highlighted": false
            },
            {
                "uid": "1204836476859301888",
                "parentSkillUid": null,
                "prefLabel": "Social Media Content Creation",
                "prettyName": "Social Media Content Creation",
                "freeText": null,
                "highlighted": false
            },
            {
                "uid": "1031626781101637632",
                "parentSkillUid": null,
                "prefLabel": "Social Media Management",
                "prettyName": "Social Media Management",
                "freeText": null,
                "highlighted": false
            }
        ],
        "isSTSVectorSearchResult": false,
        "connectPrice": 8,
        "applied": false,
        "upworkHistoryData": {
            "client": {
                "paymentVerificationStatus": null,
                "country": "Seychelles",
                "totalReviews": 0,
                "totalFeedback": 0,
                "hasFinancialPrivacy": false,
                "totalSpent": null
            },
            "freelancerClientRelation": {
                "lastContractRid": null,
                "companyName": null,
                "lastContractTitle": null
            }
        },
        "jobTile": {
            "job": {
                "id": "1936702637394960044",
                "ciphertext": "~021936702637394960044",
                "jobType": "FIXED",
                "weeklyRetainerBudget": null,
                "hourlyBudgetMax": null,
                "hourlyBudgetMin": null,
                "hourlyEngagementType": null,
                "contractorTier": "IntermediateLevel",
                "sourcingTimestamp": null,
                "createTime": "2025-06-22T08:27:45.795Z",
                "publishTime": "2025-06-22T08:27:46.991Z",
                "enterpriseJob": false,
                "personsToHire": 1,
                "premium": false,
                "totalApplicants": 20,
                "hourlyEngagementDuration": null,
                "fixedPriceAmount": {
                    "isoCurrencyCode": null,
                    "amount": "300.0"
                },
                "fixedPriceEngagementDuration": {
                    "id": "474250516458926082",
                    "rid": 3,
                    "label": "1 to 3 months",
                    "weeks": 9,
                    "ctime": "2014-06-04T17:59:10.123Z",
                    "mtime": "2014-06-04T17:59:10.123Z"
                }
            }
        }
    }
}
```

#### Field Explanations

##### Job Opening Details

| Field | Type | Description | Example/Notes |
|-------|------|-------------|---------------|
| **`opening.job.status`** | String | Current status of the job posting | `ACTIVE`, `CLOSED`, etc. |
| **`opening.job.postedOn`** | String | When the job was originally posted | ISO 8601 format |
| **`opening.job.publishTime`** | String | When the job was published | ISO 8601 format |
| **`opening.job.description`** | String | Full job description including requirements and responsibilities | HTML/text content |
| **`opening.job.contractorTier`** | String | Experience level required | `INTERMEDIATE`, `EXPERT`, etc. |
| **`opening.job.workload`** | String | Expected workload | `FULL_TIME`, `PART_TIME`, etc. |
| **`opening.job.info.title`** | String | Job title | Plain text |
| **`opening.job.info.ciphertext`** | String | Encoded job identifier | Used in URLs |
| **`opening.job.info.type`** | String | Job type | `FIXED`, `HOURLY` |
| **`opening.job.budget.amount`** | Number | Budget amount | Currency specified in `budget.currencyCode` |
| **`opening.job.budget.currencyCode`** | String | Currency code | `USD`, `EUR`, etc. |
| **`opening.job.engagementDuration.weeks`** | Number | Expected project duration in weeks | |
| **`opening.job.engagementDuration.label`** | String | Human-readable duration | e.g., "1 to 3 months" |
| **`opening.job.clientActivity.totalApplicants`** | Number | Total number of applicants | |
| **`opening.job.clientActivity.totalHired`** | Number | Number of candidates hired | |
| **`opening.job.clientActivity.lastBuyerActivity`** | String | Timestamp of last buyer activity | ISO 8601 format |

##### Skills & Categories

| Field | Type | Description | Example/Notes |
|-------|------|-------------|---------------|
| **`opening.job.sandsData.occupation.prefLabel`** | String | Main job category | e.g., "Social Media Marketing" |
| **`opening.job.sandsData.occupation.ontologyId`** | String | Internal category ID | |
| **`opening.job.sandsData.ontologySkills[]`** | Array | Industry/topical skills | Array of skill objects |
| **`opening.job.sandsData.additionalSkills[]`** | Array | Specific skills/tools | Array of skill objects |
| **`opening.job.category.name`** | String | Job category | e.g., "Digital Marketing" |
| **`opening.job.categoryGroup.name`** | String | Category group | e.g., "Sales & Marketing" |

##### Client/Buyer Information

| Field | Type | Description | Example/Notes |
|-------|------|-------------|---------------|
| **`buyer.info.location.country`** | String | Client's country | |
| **`buyer.info.location.countryTimezone`** | String | Client's timezone | |
| **`buyer.info.stats.totalAssignments`** | Number | Total jobs posted by client | |
| **`buyer.info.stats.hoursCount`** | Number | Total hours worked by client | |
| **`buyer.info.stats.feedbackCount`** | Number | Number of feedback entries | |
| **`buyer.info.stats.score`** | Number | Client's rating score | |
| **`buyer.info.company.profile.industry`** | String | Client's industry | |
| **`buyer.info.company.profile.size`** | Number | Company size | |
| **`buyer.info.jobs.openCount`** | Number | Currently open jobs | |
| **`buyer.info.jobs.postedCount`** | Number | Total jobs posted | |
| **`buyer.info.jobs.openJobs[]`** | Array | List of client's other open jobs | Array of job objects |

##### Application & Engagement

| Field | Type | Description | Example/Notes |
|-------|------|-------------|---------------|
| **`currentUserInfo.freelancerInfo.profileState`** | String | Current user's application state | e.g., "AUTO\_ACCEPTED" |
| **`currentUserInfo.freelancerInfo.hourlyRate.amount`** | Number | User's hourly rate | |
| **`currentUserInfo.freelancerInfo.qualificationsMatches.matches[]`** | Array | How user matches job requirements | Array of qualification objects |
| **`applicationContext.freelancerAllowed`** | Boolean | If current user can apply | |
| **`applicationContext.clientAllowed`** | Boolean | If current user can manage the job | |

##### Job Metadata

| Field | Type | Description | Example/Notes |
|-------|------|-------------|---------------|
| **`basicInfo.id`** | String | Unique job ID | |
| **`basicInfo.title`** | String | Job title | |
| **`basicInfo.description`** | String | Full job description | |
| **`basicInfo.connectPrice`** | Number | Cost to apply (in Connects) | |
| **`basicInfo.ontologySkills[]`** | Array | Skills associated with the job | Array of skill objects |
| **`basicInfo.jobTile.job.jobType`** | String | Type of job | `FIXED`, `HOURLY` |
| **`basicInfo.jobTile.job.totalApplicants`** | Number | Number of applicants | |
| **`basicInfo.jobTile.job.fixedPriceAmount.amount`** | String | Fixed price amount | If job type is FIXED |
| **`basicInfo.jobTile.job.hourlyBudgetMin`** | Number | Minimum hourly rate | If job type is HOURLY |
| **`basicInfo.jobTile.job.hourlyBudgetMax`** | Number | Maximum hourly rate | If job type is HOURLY |
| **`basicInfo.jobTile.job.contractorTier`** | String | Required experience level | |

***

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/ctt9I7mcOMd3d9Pkc/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start with.

## `maxItems` (type: `integer`):

Maximum number of jobs to scrape per crawl.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `cookies` (type: `array`):

<p>Cookie used to authorize actor with skool.com. Install <a rel="noopener noreferrer nofollow" target="_blank" href="https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg" previewlistener="true">EditThisCookie</a> chrome extension. Login to your skool.com account. Click on the extension and export the skool.com cookies. Insert the contents here</p>
## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.upwork.com/jobs/~021901835348635351397"
    }
  ],
  "maxItems": 100,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "cookies": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.upwork.com/jobs/~021901835348635351397"
        }
    ],
    "cookies": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/upwork-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.upwork.com/jobs/~021901835348635351397" }],
    "cookies": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/upwork-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.upwork.com/jobs/~021901835348635351397"
    }
  ],
  "cookies": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/upwork-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/upwork-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upwork | Search |Job(s) | Scraper (No Cookies) (Richest output)",
        "description": "Extract detailed Upwork job listings with our scraper. Get job descriptions, budgets, required skills, client history, and engagement terms in a structured format. Perfect for market research and competitive analysis.",
        "version": "0.0",
        "x-build-id": "CJWBc0du4DISWcGQa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~upwork-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-upwork-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~upwork-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-upwork-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~upwork-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-upwork-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to start with.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max jobs to scrape per crawl (if search for jobs is supplied)",
                        "type": "integer",
                        "description": "Maximum number of jobs to scrape per crawl.",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 100
                    },
                    "cookies": {
                        "title": "Cookies",
                        "type": "array",
                        "description": "<p>Cookie used to authorize actor with skool.com. Install <a rel=\"noopener noreferrer nofollow\" target=\"_blank\" href=\"https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg\" previewlistener=\"true\">EditThisCookie</a> chrome extension. Login to your skool.com account. Click on the extension and export the skool.com cookies. Insert the contents here</p>"
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
