# Upwork Jobs Scraper (`josrade/upwork-jobs-scraper`) Actor

Search public Upwork job postings by keyword and filters, then write normalized jobs with budgets, hourly ranges, skills, proposal counts, visible client history, and direct job URLs to the dataset.

- **URL**: https://apify.com/josrade/upwork-jobs-scraper.md
- **Developed by:** [jts](https://apify.com/josrade) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 1 total users, 0 monthly users, 50.0% runs succeeded, NaN 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/platform/actors/running/actors-in-store#pay-per-usage

## 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

<!-- Generated by npm run sync:marketplace. Do not edit manually. -->

## Upwork Jobs Scraper

### What this Actor does

Search public Upwork job postings by keyword and filters, then write normalized jobs with budgets, hourly ranges, skills, proposal counts, visible client history, and direct job URLs to the dataset.

### What data can you get?

Each run writes structured Upwork job result rows to the Apify dataset. Common fields include:

| Field | What it means |
|---|---|
| `jobId` | Upwork job ciphertext or public id. |
| `title` | Job title. |
| `paymentType` | fixed or hourly. |
| `budget` | Fixed-price budget object. |
| `hourlyRange` | Hourly min/max range. |
| `experienceLevel` | Normalized experience level. |
| `clientCountry` | Visible client country. |
| `skills` | Required skills. |
| `proposalsCount` | Visible proposal/applicant count. |
| `jobUrl` | Direct Upwork job URL. |
| `result` | Full normalized job result. |

### How to use Upwork Jobs Scraper

1. Open this Actor in Apify Console.
2. Paste the input JSON below or fill the form fields in the Input tab.
3. Click Start and wait for the run to finish.
4. Open the Dataset tab to preview rows, then export JSON, CSV, Excel, XML, or HTML.
5. For production, schedule the Actor or call it from the Apify API, SDKs, webhooks, or MCP server.

### When to use this

- Public job-market and skill-demand research on Upwork postings
- Freelancer lead monitoring at conservative request rates
- Internal recruiting and sales prospecting where you comply with Upwork terms

### When NOT to use this

- Bypassing Upwork access controls, captcha, or login walls
- Bulk proposal blasting, spam, or harassment
- Collecting freelancer or client private account data

### Input example

```json
{
  "q": "typescript",
  "paymentType": "hourly",
  "experienceLevel": "expert",
  "limit": 25
}
````

### Input fields

Provide one query or an array of search requests. Optional filters include category, budget range, payment type, experience level, limit, and offset.

- `q` (string, user input): Public Upwork job search phrase, for example "typescript api".
- `category` (string, user input): Optional category label or Upwork occupation id.
- `paymentType` (string, user input): Optional fixed or hourly filter.
- `experienceLevel` (string, user input): Optional entry, intermediate, or expert filter.
- `budgetMin` (integer, user input): Optional minimum fixed-price budget.
- `budgetMax` (integer, user input): Optional maximum fixed-price budget.
- `limit` (integer, user input): Results per query, 1-50.
- `searches` (array, user input): Optional array of query strings or search objects. Overrides the top-level query when provided.
- `apiBaseUrl` (string, optional override): Override of the upstream API base URL. Defaults to runtime.baseUrl from service.json.

### Output dataset

Each dataset item is one normalized Upwork job result.

- `jobId`: Upwork job ciphertext or public id.
- `title`: Job title.
- `paymentType`: fixed or hourly.
- `budget`: Fixed-price budget object.
- `hourlyRange`: Hourly min/max range.
- `experienceLevel`: Normalized experience level.
- `clientCountry`: Visible client country.
- `skills`: Required skills.
- `proposalsCount`: Visible proposal/applicant count.
- `jobUrl`: Direct Upwork job URL.
- `result`: Full normalized job result.

### Sample output

<details><summary>3 example dataset items</summary>

```json
[
  {
    "jobId": "01a4bd73c2891e3041",
    "title": "Senior TypeScript engineer for Next.js SaaS platform",
    "description": "Looking for a senior TypeScript engineer to extend our Next.js + tRPC platform...",
    "postedAt": "2026-04-28T09:14:00Z",
    "budget": {
      "amount": null,
      "currency": null
    },
    "hourlyRange": {
      "min": 70,
      "max": 110,
      "currency": "USD"
    },
    "paymentType": "hourly",
    "experienceLevel": "expert",
    "clientCountry": "United States",
    "clientHistory": {
      "totalHires": 42,
      "totalPostedJobs": 88,
      "totalReviews": 29,
      "totalFeedback": 27,
      "hasFinancialPrivacy": false
    },
    "skills": [
      "TypeScript",
      "Next.js",
      "PostgreSQL",
      "tRPC"
    ],
    "proposalsCount": 14,
    "jobUrl": "https://www.upwork.com/jobs/~01a4bd73c2891e3041",
    "category": "Web, Mobile & Software Dev",
    "subcategory": "Web Development"
  },
  {
    "jobId": "01b9221c4810e5a210",
    "title": "TypeScript + GraphQL backend rebuild (long term)",
    "description": "Need to modernize an existing API stack and improve throughput.",
    "postedAt": "2026-04-27T18:42:11Z",
    "budget": {
      "amount": null,
      "currency": null
    },
    "hourlyRange": {
      "min": 60,
      "max": 90,
      "currency": "USD"
    },
    "paymentType": "hourly",
    "experienceLevel": "expert",
    "clientCountry": "Germany",
    "clientHistory": {
      "totalHires": 17,
      "totalPostedJobs": 25,
      "totalReviews": 14,
      "totalFeedback": 13,
      "hasFinancialPrivacy": false
    },
    "skills": [
      "TypeScript",
      "GraphQL",
      "Node.js"
    ],
    "proposalsCount": 8,
    "jobUrl": "https://www.upwork.com/jobs/~01b9221c4810e5a210",
    "category": "Web, Mobile & Software Dev",
    "subcategory": "Backend Development"
  },
  {
    "input": "{\"q\":\"typescript\",\"paymentType\":\"hourly\",\"experienceLevel\":\"expert\"}",
    "error": {
      "type": "blocked_by_target",
      "message": "Upwork returned an anti-bot challenge.",
      "details": {
        "upstream_status": "403"
      },
      "retry_after_seconds": null
    }
  }
]
```

</details>

### How can you use the Upwork Jobs Scraper data?

- Monitor new Upwork jobs for a target skill or service niche
- Rank freelance leads by budget, experience level, proposal count, and client history
- Track skill demand across public Upwork job postings
- Enrich CRM workflows with direct Upwork job URLs and normalized budget fields
- Build alerts for high-value hourly or fixed-price opportunities
- Analyze freelance market trends without maintaining a custom scraper
- Normalize upstream jobs & freelance data data into one Apify dataset contract.

### API, integrations, and MCP

- Run this Actor from Apify Console, schedules, webhooks, REST API, or the Apify SDKs.
- Connect the Actor to AI agents through the Apify MCP server.
- Export dataset items to JSON, CSV, Excel, XML, HTML, Google Sheets, S3, or downstream BI tools.
- Use the generated `INPUT.example.json` as the baseline payload for API calls and scheduled runs.

### FAQ

#### How much does it cost to use this Actor?

Pay-per-call: $0.0005 per actor start, $0.001 per job item. A 25-job search costs ~$0.03; daily monitoring on 30 search profiles stays under $25/month — priced relative to one closed lead.

#### Can I use this Actor with the Apify API?

Yes. Use the same input JSON shown above with Apify's REST API, JavaScript SDK, Python SDK, schedules, or webhooks.

#### Can I use this Actor through an MCP server?

Yes. Add this Actor to the Apify MCP server so AI agents can run it and consume the resulting dataset.

#### Is it legal to use this data?

Use this Actor only for the allowed use cases: Public job-market research, freelance lead monitoring at conservative request rates, internal sourcing workflows, skill-demand analytics, and CRM enrichment where the caller complies with Upwork terms and applicable law. Do not use it for prohibited workflows: Bypassing Upwork access controls, captcha, login walls, or rate limits; high-volume extraction that violates Upwork terms; collecting account-only or private Upwork data; automated spam, proposal blasting, harassment, credential collection, or resale of raw Upwork data as a standalone dataset.

### Pricing

Pay-per-call: $0.0005 per actor start, $0.001 per job item. A 25-job search costs ~$0.03; daily monitoring on 30 search profiles stays under $25/month — priced relative to one closed lead.

### Developer notes

Set `UPWORK_JOBS_SCRAPER_API_KEY` as an Apify secret environment variable. The Actor forwards it as `X-API-Key` to the upstream API.
Use `apiBaseUrl` only for local or staging QA. Production runs default to the deployed API base URL from service.json.
For advanced testing, a `requests` array can call explicit API paths; normal users should use the service-specific fields above.

### Run locally

```bash
apify run
```

### Deploy

```bash
apify push
```

### Changelog

- 0.1.0 (2026-04-30) — Initial release: query + paymentType/experienceLevel filters, batch endpoint.

# Actor input Schema

## `q` (type: `string`):

Public Upwork job search phrase, for example "typescript api".

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

Optional category label or Upwork occupation id.

## `paymentType` (type: `string`):

Optional fixed or hourly filter.

## `experienceLevel` (type: `string`):

Optional entry, intermediate, or expert filter.

## `budgetMin` (type: `integer`):

Optional minimum fixed-price budget.

## `budgetMax` (type: `integer`):

Optional maximum fixed-price budget.

## `limit` (type: `integer`):

Results per query, 1-50. Use this to narrow the Actor run without changing the default output shape.

## `searches` (type: `array`):

Optional array of query strings or search objects. Overrides the top-level query when provided.

## `apiBaseUrl` (type: `string`):

Override of the upstream API base URL. Defaults to runtime.baseUrl from service.json.

## Actor input object example

```json
{
  "q": "typescript",
  "category": "web-mobile-software-dev",
  "paymentType": "hourly",
  "experienceLevel": "expert",
  "budgetMin": 100,
  "budgetMax": 5000,
  "limit": 25,
  "searches": [
    {}
  ]
}
```

# 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 = {
    "q": "typescript",
    "category": "web-mobile-software-dev",
    "paymentType": "hourly",
    "experienceLevel": "expert",
    "budgetMin": 100,
    "budgetMax": 5000,
    "limit": 25,
    "searches": [
        {}
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("josrade/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 = {
    "q": "typescript",
    "category": "web-mobile-software-dev",
    "paymentType": "hourly",
    "experienceLevel": "expert",
    "budgetMin": 100,
    "budgetMax": 5000,
    "limit": 25,
    "searches": [{}],
}

# Run the Actor and wait for it to finish
run = client.actor("josrade/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 '{
  "q": "typescript",
  "category": "web-mobile-software-dev",
  "paymentType": "hourly",
  "experienceLevel": "expert",
  "budgetMin": 100,
  "budgetMax": 5000,
  "limit": 25,
  "searches": [
    {}
  ]
}' |
apify call josrade/upwork-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upwork Jobs Scraper",
        "description": "Search public Upwork job postings by keyword and filters, then write normalized jobs with budgets, hourly ranges, skills, proposal counts, visible client history, and direct job URLs to the dataset.",
        "version": "0.1",
        "x-build-id": "aDqhXFvvZ9Mkt3J3c"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/josrade~upwork-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-josrade-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/josrade~upwork-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-josrade-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/josrade~upwork-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-josrade-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",
                "properties": {
                    "q": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Public Upwork job search phrase, for example \"typescript api\".",
                        "default": "typescript api"
                    },
                    "category": {
                        "title": "Category",
                        "type": "string",
                        "description": "Optional category label or Upwork occupation id."
                    },
                    "paymentType": {
                        "title": "Payment type",
                        "type": "string",
                        "description": "Optional fixed or hourly filter."
                    },
                    "experienceLevel": {
                        "title": "Experience level",
                        "type": "string",
                        "description": "Optional entry, intermediate, or expert filter."
                    },
                    "budgetMin": {
                        "title": "Minimum budget",
                        "type": "integer",
                        "description": "Optional minimum fixed-price budget."
                    },
                    "budgetMax": {
                        "title": "Maximum budget",
                        "type": "integer",
                        "description": "Optional maximum fixed-price budget."
                    },
                    "limit": {
                        "title": "Limit",
                        "type": "integer",
                        "description": "Results per query, 1-50. Use this to narrow the Actor run without changing the default output shape.",
                        "default": 10
                    },
                    "searches": {
                        "title": "Searches",
                        "type": "array",
                        "description": "Optional array of query strings or search objects. Overrides the top-level query when provided.",
                        "items": {
                            "type": "object"
                        }
                    },
                    "apiBaseUrl": {
                        "title": "API base URL",
                        "type": "string",
                        "description": "Override of the upstream API base URL. Defaults to runtime.baseUrl from service.json."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
