# 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
- **Stats:** 71 total users, 0 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.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/actors/running/actors-in-store.md#rental-actors

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# 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
