# Upwork Freelancers & Jobs Scraper (`scrapers_lat/upwork-scraper`) Actor

Search Upwork talent and jobs. Extract freelancer profiles (hourly rate, total earned, job success, skills, location) and job posts (budget, type, skills). Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/upwork-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

<!-- actor-banner -->
[![Upwork Freelancers & Jobs Scraper](https://scrapers.lat/banners/upwork-scraper.png)](https://console.apify.com/actors/dJPfxLTQBSBNjOQa7/input)
<!-- /actor-banner -->

## Upwork Freelancers & Jobs Scraper

> Extract Upwork freelancer profiles and job posts from the public talent and job search, up to 191,000 freelancers per keyword.

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Global-blue)
![Maintained](https://img.shields.io/badge/Maintained-Yes-brightgreen)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)

<table><tr>
<td align="center"><strong>18 fields</strong><br>per record</td>
<td align="center"><strong>Global</strong><br>coverage</td>
<td align="center"><strong>JSON / CSV / Excel</strong><br>output formats</td>
<td align="center"><strong>Updated</strong><br>2026-07-03</td>
</tr></table>

<br>

### What you get

Pick a search type: freelancer profiles (talent search) or job posts (job search), then a keyword. Each record is one freelancer or one job.

Freelancer fields:

- **imageUrl**: freelancer profile photo
- **name**: freelancer display name
- **title**: professional headline
- **url**: link to the public Upwork profile
- **hourlyRate**: advertised hourly rate
- **currency**: currency of the rate
- **jobSuccess**: Job Success Score as a percentage
- **totalEarned**: lifetime earnings on Upwork
- **topRatedStatus**: Top Rated, Top Rated Plus or Rising Talent badge
- **totalHours**: total hours billed
- **totalJobs**: number of jobs worked
- **country**: freelancer country
- **city**: freelancer city
- **description**: full profile overview text
- **portfolioItemCount**: number of portfolio items
- **skills**: list of skills on the profile

Job fields:

- **title**: job title
- **url**: link to the public job post
- **type**: Fixed or Hourly
- **description**: full job description
- **budgetAmount**: fixed-price budget
- **hourlyMin**: low end of the hourly range
- **hourlyMax**: high end of the hourly range
- **currency**: currency of the budget
- **duration**: expected project length
- **engagement**: workload such as Part Time or As Needed
- **experienceLevel**: Entry, Intermediate or Expert
- **premium**: whether the post is a featured job
- **skills**: skills requested on the job
- **createdOn**: when the job was created
- **postedAt**: when the job was published

Both record types include **observedAt**, when the record was last seen by the scraper.

### Who is it for

| Use case | Who benefits |
|---|---|
| Source vetted freelancers by skill, rate and job success | Agencies and recruiters |
| Track hourly rates and earnings by skill and country | Market researchers |
| Monitor live job demand for a niche or technology | Freelancers and consultants |
| Build a talent pool for outreach and lead generation | Sales and staffing teams |
| Benchmark budgets and required skills across job posts | Product and pricing teams |

### Frequently Asked Questions

**Which Upwork data can this scraper collect?**
It reads two public surfaces: the talent search (freelancer profiles) and the job search (job posts). Set the search type, enter a keyword, and it returns clean records with rates, earnings, job success, skills, budgets and more.

**How many results can I get per keyword?**
Popular keywords return tens of thousands of freelancers and thousands of jobs. The talent search exposes up to about 191,000 profiles per keyword. Use the Max Items input to cap how many records you collect.

**Do I need an Upwork login or cookies?**
No. The scraper only reads publicly available search pages and needs no account, cookie or token from you.

**Why are some job budgets or hourly ranges empty?**
Some hourly jobs are posted with an open budget and some client details are hidden on public posts, so those values come through empty. Every field that is always empty on public data is left out of the output entirely.

**Can I search freelancers and jobs in the same run?**
Each run collects one type. Run the actor once with the search type set to freelancers and again with it set to jobs, or schedule two separate tasks.

<!-- example-tasks -->
### Example use cases

Ready-to-run example tasks, each preconfigured for a common scenario. Open one and press run, or use it as a template:

- [Logo Design Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/logo-design-freelancers): Scrape Upwork logo design freelancer profiles with hourly rate, job success score, skills, location and reviews for hiring a designer.
- [Shopify Developer Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/shopify-developer-freelancers): Scrape Upwork Shopify developer profiles with hourly rate, job success score, skills and reviews to hire an ecommerce store expert.
- [Video Editing Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/video-editing-freelancers): Scrape Upwork video editing freelancer profiles with hourly rate, job success score, skills, portfolio and reviews for your project.
- [WordPress Developer Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/wordpress-developer-freelancers): Scrape Upwork WordPress developer profiles with hourly rate, job success score, skills, location and reviews to hire a web developer.
- [Social Media Manager Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/social-media-manager-freelancers): Scrape Upwork social media manager profiles with hourly rate, job success score, skills and reviews to hire a marketing specialist.
- [Python Developer Freelancers on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/python-developer-freelancers): Scrape Upwork Python developer profiles with hourly rate, job success score, skills, location and reviews to hire a Python engineer.
- [React Developer Jobs on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/react-developer-jobs): Scrape Upwork React developer job posts with budget, hourly rate, required skills, client history and description for remote work.
- [Virtual Assistant Jobs on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/virtual-assistant-jobs): Scrape Upwork virtual assistant job posts with budget, hourly rate, required skills, client details and description for remote gigs.
- [Content Writer Jobs on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/content-writer-jobs): Scrape Upwork content writer job posts with budget, hourly rate, required skills, client history and description for freelance writing.
- [Data Entry Jobs on Upwork](https://apify.com/scrapers_lat/upwork-scraper/examples/data-entry-jobs): Scrape Upwork data entry job posts with budget, hourly rate, required skills, client details and description for remote data work.

<!-- /example-tasks -->

<!-- x402 -->
### Export, API and AI agents (x402 + MCP)

Export the scraped data to **JSON, CSV or Excel**, pull it as a **dataset** through the Apify **API**, or wire it into your app with **no code**. This web scraper and data extractor also works for bulk data extraction and scheduled runs.

For AI agents: this Actor is available on **x402**, Apify's agentic payment standard built with Coinbase. An AI agent can discover, pay for and run it on its own with a funded wallet and a single HTTP request: no account, no subscription, no API key and no human in the loop. It also runs as an **MCP** tool inside Claude, Cursor and other AI clients out of the box. Learn more about [x402 agentic payments on Apify](https://docs.apify.com/platform/integrations/x402).
<!-- /x402 -->

<!-- related-actors -->
### Related scrapers

Need data from the same space? Here are other scrapers we build and maintain:

- [Freelancer Projects, Budgets & Bids Scraper](https://apify.com/scrapers_lat/freelancer-scraper): freelance projects, budgets and bid stats from Freelancer.com
- [RemoteOK Remote Jobs & USD Salary Scraper](https://apify.com/scrapers_lat/remoteok-scraper): remote job posts with USD salary ranges and tags
- [LinkedIn Jobs, Company & Seniority Scraper](https://apify.com/scrapers_lat/linkedin-jobs-scraper): job posts with company, seniority and location
- [Dice Tech Jobs, Salary & Skills Scraper](https://apify.com/scrapers_lat/dice-jobs-scraper): US tech job posts with salary and required skills
- [Talent.com Job Listings & Salary Scraper](https://apify.com/scrapers_lat/talent-jobs-scraper): job listings and salary estimates across markets
- [Computrabajo Job Listings & Salary Scraper (LATAM)](https://apify.com/scrapers_lat/computrabajo-scraper): Latin American job listings and salary data

<!-- /related-actors -->

<!-- scrapers-lat-cta -->
### More scrapers at scrapers.lat

This actor is built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for Latin American and US public platforms: real estate, jobs, e-commerce, company registries and government data. Browse the full catalog, see live sample output for each one, or ask us for a custom scraper at [scrapers.lat](https://scrapers.lat).

---

> This actor is an independent tool and has no affiliation with Upwork. It only accesses data that is publicly available on the platform. Use it in accordance with Upwork's terms of service.
<!-- /scrapers-lat-cta -->

# Actor input Schema

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

Maximum number of freelancers or jobs to collect. Optional.
## `searchType` (type: `string`):

Choose what to scrape: Upwork freelancer profiles (talent search) or job posts (job search).
## `searchQuery` (type: `string`):

Keyword to search, e.g. "python developer", "logo design", "virtual assistant".

## Actor input object example

```json
{
  "maxItems": 10,
  "searchType": "freelancers",
  "searchQuery": "python developer"
}
````

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "maxItems": 10,
    "searchQuery": "python developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/upwork-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 = {
    "maxItems": 10,
    "searchQuery": "python developer",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/upwork-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 '{
  "maxItems": 10,
  "searchQuery": "python developer"
}' |
apify call scrapers_lat/upwork-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upwork Freelancers & Jobs Scraper",
        "description": "Search Upwork talent and jobs. Extract freelancer profiles (hourly rate, total earned, job success, skills, location) and job posts (budget, type, skills). Export to JSON, CSV or Excel.",
        "version": "0.1",
        "x-build-id": "LUhZEenYjTa6j8RVB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapers_lat~upwork-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapers_lat-upwork-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/scrapers_lat~upwork-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapers_lat-upwork-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/scrapers_lat~upwork-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapers_lat-upwork-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": [
                    "searchQuery"
                ],
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Maximum number of freelancers or jobs to collect. Optional."
                    },
                    "searchType": {
                        "title": "Search Type",
                        "enum": [
                            "freelancers",
                            "jobs"
                        ],
                        "type": "string",
                        "description": "Choose what to scrape: Upwork freelancer profiles (talent search) or job posts (job search).",
                        "default": "freelancers"
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Keyword to search, e.g. \"python developer\", \"logo design\", \"virtual assistant\"."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
