# Upwork Latest Jobs Scraper (`bytebrains/upwork-job-scraper`) Actor

Scrape the latest job listings from Upwork with powerful filters. Extract full job details including title, budget, client info, and skills. Supports login via cookies to access restricted jobs. Perfect for freelancers, agencies, and market researchers.

- **URL**: https://apify.com/bytebrains/upwork-job-scraper.md
- **Developed by:** [Louis Pham](https://apify.com/bytebrains) (community)
- **Categories:** Jobs, Automation
- **Features:** Full permissions
- **Stats:** 72 total users, 0 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Upwork Latest Jobs Scraper – Find and Extract the Latest Freelance Jobs

This Apify actor lets you **scrape job listings from Upwork** with advanced filtering and full detail extraction. Whether you're a freelancer tracking new job opportunities or a business doing **freelance job market research**, this tool helps you collect structured job data directly from **Upwork search results**.

### 🚀 Why Use This Actor?

- 🎯 **Discover Freelance Jobs Instantly**: Filter jobs by keywords, location, experience level, budget, hourly rate, and more
- 📊 **Analyze the Freelance Market**: Track client activity, hiring behavior, and industry trends
- 🧾 **Full Job Detail Extraction**: Access titles, descriptions, budgets, client history, required skills, and more
- ⚡ **No-Code Setup**: Just enter your filters and click "Run"
- 🔐 **Optional Login Support**: Scrape both public and restricted jobs by adding your Upwork cookies
- 🔄 **Reliable Scraping**: Built-in proxy support to avoid blocks and ensure consistent results

### 🧑‍💻 How It Works

#### Basic Usage

1. Go to the [actor page on Apify](https://apify.com/your-username/upwork-job-scraper)
2. Enter your search filters (see Input section below)
3. Click **Run** to begin scraping Upwork job posts
4. Download results in **JSON**, **CSV**, or **Excel**

#### Scrape Private/Restricted Jobs (Optional)

To unlock restricted jobs on Upwork:

1. Install the [Cookie-Editor extension](https://cookie-editor.com/)
2. Log in to your Upwork account
3. Export cookies as JSON
4. Paste them into the `cookies` input field

### 🔧 Input Parameters

Configure flexible filters to **target specific job listings**. Supports keyword search, location filters, client hire counts, contractor tiers, hourly/fixed budgets, project duration, and more.

| Parameter | Description | Example |
|-----------|-------------|---------|
| `search_query` | Keywords to search | "React developer" |
| `location` | Client countries | \["United States", "Canada"] |
| `timezone` | Client timezones | "America/New_York" |
| `duration_v3` | Project duration | \["week", "month"] |
| `workload` | Hours/week | \["as_needed", "full_time"] |
| `client_hires_min` | Minimum hires by client | 5 |
| `client_hires_max` | Maximum hires | 20 |
| `hourly_rate_min` | Minimum hourly rate | 20 |
| `hourly_rate_max` | Maximum hourly rate | 50 |
| `amount_min` | Min fixed budget | 500 |
| `amount_max` | Max fixed budget | 1000 |
| `contractor_tier` | Experience level | \["1", "2", "3"] |
| `category` | Job category ID | "531770282580668418" |
| `sort` | Sort order | "recency+desc" |
| `page` | Start page | 1 |
| `per_page` | Jobs per page | "10", "20", "50" |
| `max_pages` | Max pages to scrape | 50 |
| `cookies` | Upwork cookies | (JSON array) |
| `proxy` | Proxy configuration | See below |

#### Proxy Configuration

Using proxies is recommended when scraping Upwork to:

- Avoid IP blocking and rate limiting
- Access location-restricted content
- Enable parallel scraping at scale

By default, the actor uses Apify's proxy service. You can configure proxy options:

- **Apify Proxy**: Choose from datacenter, residential, or Google SERP proxies
- **Custom Proxies**: Configure your own proxy URLs in the format `http(s)://username:password@host:port`

For most use cases, the default settings with Apify's proxy work best.

### 📦 Output Data

This actor provides a **flattened job data structure** ideal for exporting to databases, spreadsheets, or APIs.

#### Key Job Fields

| Field | Description |
|-------|-------------|
| `job_id` | Unique ID |
| `title` | Job title |
| `job_url` | Direct Upwork job URL |
| `job_type` | Hourly or Fixed |
| `publish_time` | Posted timestamp |
| `description` | Full job description |

#### Budget & Scope

| Field | Description |
|-------|-------------|
| `budget_amount` | Fixed-price budget |
| `hourly_budget_min/max` | Hourly rate range |
| `engagement_duration` | Project length |
| `workload` | Expected hours/week |
| `experience_level` | Entry, Intermediate, Expert |

#### Client Info

| Field | Description |
|-------|-------------|
| `client_location_country` | Client country |
| `client_total_spent` | Total spent on Upwork |
| `client_total_hires` | Number of hires |
| `client_score` | Client rating |

#### Activity Stats

| Field | Description |
|-------|-------------|
| `client_activity_total_applicants` | Number of applicants |
| `client_activity_total_hired` | Hires made |
| `client_activity_last_buyer_activity` | Client's last activity date |

### 📤 Export & Integration

- Flat structure output for **CSV, Excel, JSON**
- Compatible with **Google Sheets**, **Airtable**, **Zapier**, **n8n**
- Easily integrated into any **automated workflow** using the Apify API

### ✅ Best Practices

- Use precise filters to reduce noise in results
- Include cookies to unlock more listings
- Scrape with delay to avoid rate limits
- Start with small page limits and scale up
- Utilize the proxy configuration to avoid IP blocking
- For best results with residential targets, use residential proxies

### ❓ Frequently Asked Questions

**Can I scrape without login?**\
Yes, but you'll see fewer job results. Use cookies for full access.

**Is this actor legal to use?**\
Yes, but respect Upwork's terms and avoid high-frequency scraping.

**How long does scraping take?**\
Roughly 2–3 minutes per page, depending on filters and network speed.

**Why does the actor require proxies?**\
Upwork has anti-scraping measures that can block IPs making too many requests. Proxies help bypass these limitations, reduce blocking, and provide consistent results. The actor includes Apify proxy by default.

### 🔎 Keywords (SEO)

upwork scraper, freelance job scraper, upwork job finder, upwork automation, scrape upwork jobs, apify upwork, job market research, upwork search scraper, latest jobs, job search automation, puppeteer, playwright, web scraping, freelancing, remote jobs

***

> 🧠 Built with precision by ByteBrains — focus on clean data, useful filters, and Upwork insights that matter.

# Actor input Schema

## `search_query` (type: `string`):

Search keyword for job titles

## `location` (type: `array`):

Select client location

## `timezone` (type: `array`):

Select client's timezone

## `duration_v3` (type: `array`):

Select project duration

## `workload` (type: `array`):

Select hours per week

## `client_hires` (type: `array`):

Number of hires by the client

## `hourly_rate_min` (type: `integer`):

Minimum hourly rate in USD

## `hourly_rate_max` (type: `integer`):

Maximum hourly rate in USD

## `amount_min` (type: `integer`):

Minimum fixed price in USD

## `amount_max` (type: `integer`):

Maximum fixed price in USD

## `contractor_tier` (type: `array`):

Select required experience level

## `category` (type: `string`):

Select job category or subcategory (optional)

## `sort` (type: `string`):

Select sorting method

## `page` (type: `integer`):

Page number to start scraping from

## `per_page` (type: `string`):

Number of results to show per page

## `max_pages` (type: `integer`):

Maximum number of pages to scrape

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

Paste your cookies as a JSON array

## `proxy` (type: `object`):

Enables loading the websites from IP addresses in specific geographies and to circumvent blocking.

## Actor input object example

```json
{
  "search_query": "scrape",
  "location": [],
  "timezone": [],
  "duration_v3": [],
  "workload": [],
  "client_hires": [],
  "contractor_tier": [],
  "category": "",
  "sort": "relevance+desc",
  "page": 1,
  "per_page": "10",
  "max_pages": 1,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bytebrains/upwork-job-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 = { "proxy": { "useApifyProxy": True } }

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

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

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

```

## CLI example

```bash
echo '{
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call bytebrains/upwork-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bytebrains/upwork-job-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pKaVD77J94GS5M5g6/builds/OkEO2KLaAE005hc8r/openapi.json
