# Upwork Jobs Scraper: Search, Contacts & Monitoring (`trakk/upwork-jobs-scraper`) Actor

Find fresh Upwork jobs by keyword or direct URL. Extract full descriptions, budgets, skills, client hiring signals, public contacts, opportunity scores, and listing changes. Fast HTTP-only scraping for lead generation, freelance research, and job monitoring.

- **URL**: https://apify.com/trakk/upwork-jobs-scraper.md
- **Developed by:** [Blynx](https://apify.com/trakk) (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 $0.99 / 1,000 upwork jobs

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## 💼 Upwork Jobs Scraper: Search, Contacts & Monitoring

Turn fresh Upwork job listings into clean, analysis-ready datasets. Search several niches at once, collect full descriptions and normalized budgets, detect public contact details, rank opportunities, and monitor new or changed jobs.

### ✨ What you get

- ⚡ **Live multi-query search** with duplicate removal
- 📝 **Full job descriptions**, titles, dates, URLs, and contract types
- 💵 **Normalized budgets** for hourly and fixed-price jobs
- 🧩 **Structured skills** and query-match information
- 🎯 **Opportunity scores** with clear risk flags
- 📇 **Public contacts** explicitly included in job text
- 🔔 **Monitoring changes** for new, updated, and removed listings
- 📊 Separate, readable Output tabs instead of one oversized table

### 🚀 Quick start

1. Select **Live search — fresh job listings**.
2. Enter one or more search phrases, such as `python developer` or `web scraping`.
3. Set **Maximum saved jobs** to the number you need.
4. Click **Start**.
5. Open **Output → Best matches** or **Output → Jobs**.

```mermaid
flowchart LR
    A["Search phrases or job URLs"] --> B["Collect public jobs"]
    B --> C["Deduplicate and normalize"]
    C --> D["Contacts, scores, and filters"]
    D --> E["Jobs dataset"]
    D --> F["Contacts dataset"]
    D --> G["Monitoring changes"]
````

### 🎯 Scraping modes

| Mode | Best for | Input |
|---|---|---|
| ⚡ **Live search** | Fast research and lead discovery | Search phrases |
| ✨ **Search + details** | Verifying each selected job and its current status | Search phrases |
| 🔗 **Direct jobs** | Known listings | Upwork URLs or numeric job IDs |
| 🔔 **Monitor** | Repeated searches and alerts | Search phrases + stable monitor name |

#### Live search

Search several phrases in one run. A job matching multiple phrases is saved once, with all matching queries preserved in `matchedQueries`.

```json
{
  "mode": "SEARCH",
  "queries": ["python developer", "web scraping"],
  "resultsPerQuery": 30,
  "maxResults": 50,
  "sourceSort": "recency",
  "sortResultsBy": "OPPORTUNITY_SCORE",
  "includeContacts": true
}
```

#### Search + details

Use this when current job status matters more than raw speed.

```json
{
  "mode": "SEARCH_FULL",
  "queries": ["shopify developer"],
  "maxResults": 20,
  "includeContacts": true
}
```

#### Direct jobs

Provide public Upwork URLs, numeric job IDs, or both.

```json
{
  "mode": "DETAIL",
  "startUrls": [
    {"url": "https://www.upwork.com/jobs/~022077479055407476346"}
  ],
  "jobIds": ["2077478012886342230"],
  "maxResults": 10,
  "includeContacts": true
}
```

#### Monitor jobs

The first clean run creates a baseline. Later runs with the same `monitorKey` save changes to **Monitoring changes**.

```json
{
  "mode": "MONITOR",
  "queries": ["ai automation"],
  "maxResults": 100,
  "monitorKey": "ai-automation-daily"
}
```

### 🔎 Filters

Filters run before the global result limit, so `maxResults` controls the final clean dataset.

| Input | Purpose |
|---|---|
| `jobType` | Any, hourly, or fixed-price jobs |
| `experienceLevel` | Entry level, intermediate, or expert |
| `maxAgeDays` | Only recently published jobs |
| `minBudget` / `maxBudget` | Normalized budget range |
| `minHourlyRate` / `maxHourlyRate` | Hourly-rate range |
| `includeSkills` | Require every selected structured skill |
| `excludeKeywords` | Remove unwanted words or phrases |
| `onlyWithContacts` | Keep only jobs with a detected public contact |

Example: recent hourly Python jobs paying at least $25/hour:

```json
{
  "mode": "SEARCH",
  "queries": ["python backend"],
  "jobType": "HOURLY",
  "experienceLevel": "INTERMEDIATE",
  "maxAgeDays": 7,
  "minHourlyRate": 25,
  "includeSkills": ["python"],
  "maxResults": 50
}
```

### 📇 Public contacts

When enabled, the Actor looks only at information the client deliberately placed in the public job title or description. It can save:

- Email addresses
- Phone numbers
- Company websites
- Telegram, WhatsApp, Skype, and Discord handles

Contacts are linked back to their job through `jobId` and `jobUrl`. Nothing is guessed or generated.

### 🎯 Opportunity score

`opportunityScore` is an explainable 0–100 ranking based on freshness, budget visibility, description quality, skill detail, and risk indicators. It is a research aid, not a guarantee that a job or client is safe.

Possible `riskFlags` include:

- `short_description`
- `unpaid_work_request`
- `off_platform_contact_or_payment`
- `promotional_language`

### 📦 Output datasets

| Output tab | Contents |
|---|---|
| **Best matches** | Score, budget, skills, freshness, risks, and URL |
| **Jobs** | Complete normalized job records |
| **Budgets** | Hourly and fixed-price fields for comparison |
| **Skills** | Structured skills and matched searches |
| **Public contacts** | One clean row per detected contact |
| **Monitoring changes** | New, updated, and removed jobs |
| **Errors** | Only actionable run issues; never mixed with jobs |
| **Run summary** | Counts, coverage, retries, filters, and budget statistics |

#### Example job record

```json
{
  "recordType": "job",
  "jobId": "2077478012886342230",
  "ciphertext": "~022077478012886342230",
  "title": "Azure Data Engineer (Python, SQL, ETL)",
  "description": "We're looking for an experienced Azure Data Engineer...",
  "url": "https://www.upwork.com/jobs/~022077478012886342230",
  "jobType": "HOURLY",
  "experienceLevel": "Intermediate",
  "hourlyRateMin": 18,
  "hourlyRateMax": 28,
  "budgetMin": 18,
  "budgetMax": 28,
  "budgetDisplay": "$18-$28/hr",
  "durationWeeks": 18,
  "durationLabel": "3 to 6 months",
  "skills": ["Python", "ETL Pipeline", "SQL"],
  "matchedQueries": ["python developer"],
  "opportunityScore": 78,
  "opportunityBand": "Strong",
  "riskFlagCount": 0,
  "publishedAt": "2026-07-15T19:40:54.404Z"
}
```

#### Example contact record

```json
{
  "recordType": "contact",
  "jobId": "2077478012886342230",
  "jobTitle": "Azure Data Engineer",
  "contactType": "email",
  "value": "hiring@example.com",
  "sourceField": "description",
  "context": "Please send your portfolio to hiring@example.com and include availability.",
  "jobUrl": "https://www.upwork.com/jobs/~022077478012886342230"
}
```

### 📤 Export and automation

Every dataset can be downloaded as JSON, CSV, Excel, XML, or RSS from Apify. You can also connect runs to schedules, webhooks, Make, Zapier, Google Sheets, or your own API workflow.

### ❓ FAQ

#### Why did a search return fewer jobs than requested?

Duplicate removal and your filters run before the final limit. The source may also have fewer matching public jobs at that moment. Check `sourceTotalsByQuery`, `duplicatesRemoved`, and `filteredOut` in **Run summary**.

#### Are contacts private data?

No. The Actor saves only contact information explicitly published in public job text.

#### Will a temporary source issue fail my entire run?

Independent queries and details are isolated. Successful jobs are preserved, skipped requests are listed in **Errors**, and input mistakes finish cleanly with a helpful status message.

# Actor input Schema

## `mode` (type: `string`):

Search is fastest. Search + details verifies each selected job. Direct jobs accepts known URLs or IDs. Monitor compares repeated searches.

## `queries` (type: `array`):

One query per row. Results are merged and duplicates are removed while preserving every matched query.

## `sourceSort` (type: `string`):

Choose whether Upwork should return the newest or most relevant matches first.

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

Direct jobs mode only. Add public Upwork job URLs. Numeric job IDs can be added below instead.

## `jobIds` (type: `array`):

Direct jobs mode only. Example: 2077479055407476346.

## `maxResults` (type: `integer`):

Global limit after duplicate removal, contact extraction, filters, scoring, and sorting.

## `resultsPerQuery` (type: `integer`):

Maximum source rows collected for each keyword before all queries are merged.

## `jobType` (type: `string`):

Keep all jobs, hourly contracts, or fixed-price projects.

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

Filter by the experience level requested by the client.

## `maxAgeDays` (type: `integer`):

Keep only jobs published within this many days. Use 0 for any age.

## `minBudget` (type: `number`):

Minimum fixed budget or hourly range ceiling.

## `maxBudget` (type: `number`):

Maximum fixed budget or hourly range floor.

## `minHourlyRate` (type: `number`):

Keep hourly jobs whose range reaches at least this value.

## `maxHourlyRate` (type: `number`):

Keep hourly jobs whose range starts at or below this value.

## `includeSkills` (type: `array`):

Every entered value must appear in the job's skill list.

## `excludeKeywords` (type: `array`):

Jobs containing any entered phrase in the title or description are removed.

## `includeContacts` (type: `boolean`):

Save emails, phones, websites, and public messaging handles explicitly included in job text to the Contacts output.

## `onlyWithContacts` (type: `boolean`):

Discard jobs where no public email, phone, website, or messaging handle was found. This automatically enables contact extraction.

## `sortResultsBy` (type: `string`):

Applied after deduplication, enrichment, filters, and scoring.

## `monitorKey` (type: `string`):

Monitor mode only. Use the same name on repeated runs, for example python-hourly-us.

## `resetMonitor` (type: `boolean`):

Store the current results as a new baseline without returning changes.

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

Number of independent queries or details processed at once. The default favors reliability.

## `maxRetries` (type: `integer`):

Fresh-session retries for temporary network or source interruptions.

## `requestTimeoutSeconds` (type: `integer`):

Maximum time for one source request.

## `proxyConfiguration` (type: `object`):

Residential access is recommended for reliable Upwork results. The default is ready to run.

## Actor input object example

```json
{
  "mode": "SEARCH",
  "queries": [
    "python developer",
    "web scraping"
  ],
  "sourceSort": "recency",
  "startUrls": [],
  "jobIds": [],
  "maxResults": 20,
  "resultsPerQuery": 20,
  "jobType": "ANY",
  "experienceLevel": "ANY",
  "maxAgeDays": 0,
  "includeSkills": [],
  "excludeKeywords": [],
  "includeContacts": true,
  "onlyWithContacts": false,
  "sortResultsBy": "SOURCE",
  "monitorKey": "",
  "resetMonitor": false,
  "maxConcurrency": 4,
  "maxRetries": 8,
  "requestTimeoutSeconds": 35,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}
```

# Actor output Schema

## `bestMatches` (type: `string`):

No description

## `jobs` (type: `string`):

No description

## `budgets` (type: `string`):

No description

## `skills` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `runSummary` (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 = {
    "queries": [
        "python developer",
        "web scraping"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CA"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/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 = {
    "queries": [
        "python developer",
        "web scraping",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CA",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("trakk/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 '{
  "queries": [
    "python developer",
    "web scraping"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}' |
apify call trakk/upwork-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upwork Jobs Scraper: Search, Contacts & Monitoring",
        "description": "Find fresh Upwork jobs by keyword or direct URL. Extract full descriptions, budgets, skills, client hiring signals, public contacts, opportunity scores, and listing changes. Fast HTTP-only scraping for lead generation, freelance research, and job monitoring.",
        "version": "0.1",
        "x-build-id": "LZitSL1si05o5b3K0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trakk~upwork-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trakk-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/trakk~upwork-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trakk-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/trakk~upwork-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trakk-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": {
                    "mode": {
                        "title": "🎯 What do you want to collect?",
                        "enum": [
                            "SEARCH",
                            "SEARCH_FULL",
                            "DETAIL",
                            "MONITOR"
                        ],
                        "type": "string",
                        "description": "Search is fastest. Search + details verifies each selected job. Direct jobs accepts known URLs or IDs. Monitor compares repeated searches.",
                        "default": "SEARCH"
                    },
                    "queries": {
                        "title": "🔎 Search keywords",
                        "type": "array",
                        "description": "One query per row. Results are merged and duplicates are removed while preserving every matched query.",
                        "default": [
                            "python developer"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sourceSort": {
                        "title": "Source ordering",
                        "enum": [
                            "recency",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "Choose whether Upwork should return the newest or most relevant matches first.",
                        "default": "recency"
                    },
                    "startUrls": {
                        "title": "🔗 Upwork job URLs",
                        "type": "array",
                        "description": "Direct jobs mode only. Add public Upwork job URLs. Numeric job IDs can be added below instead.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "jobIds": {
                        "title": "🔢 Numeric job IDs",
                        "type": "array",
                        "description": "Direct jobs mode only. Example: 2077479055407476346.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "🎁 Maximum saved jobs",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Global limit after duplicate removal, contact extraction, filters, scoring, and sorting.",
                        "default": 20
                    },
                    "resultsPerQuery": {
                        "title": "Results per search query",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum source rows collected for each keyword before all queries are merged.",
                        "default": 20
                    },
                    "jobType": {
                        "title": "💼 Contract type",
                        "enum": [
                            "ANY",
                            "HOURLY",
                            "FIXED"
                        ],
                        "type": "string",
                        "description": "Keep all jobs, hourly contracts, or fixed-price projects.",
                        "default": "ANY"
                    },
                    "experienceLevel": {
                        "title": "Experience level",
                        "enum": [
                            "ANY",
                            "ENTRY_LEVEL",
                            "INTERMEDIATE",
                            "EXPERT"
                        ],
                        "type": "string",
                        "description": "Filter by the experience level requested by the client.",
                        "default": "ANY"
                    },
                    "maxAgeDays": {
                        "title": "Maximum job age",
                        "minimum": 0,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Keep only jobs published within this many days. Use 0 for any age.",
                        "default": 0
                    },
                    "minBudget": {
                        "title": "Minimum budget",
                        "minimum": 0,
                        "type": "number",
                        "description": "Minimum fixed budget or hourly range ceiling."
                    },
                    "maxBudget": {
                        "title": "Maximum budget",
                        "minimum": 0,
                        "type": "number",
                        "description": "Maximum fixed budget or hourly range floor."
                    },
                    "minHourlyRate": {
                        "title": "Minimum hourly rate",
                        "minimum": 0,
                        "type": "number",
                        "description": "Keep hourly jobs whose range reaches at least this value."
                    },
                    "maxHourlyRate": {
                        "title": "Maximum hourly rate",
                        "minimum": 0,
                        "type": "number",
                        "description": "Keep hourly jobs whose range starts at or below this value."
                    },
                    "includeSkills": {
                        "title": "🧩 Required skills",
                        "type": "array",
                        "description": "Every entered value must appear in the job's skill list.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeKeywords": {
                        "title": "🚫 Excluded words or phrases",
                        "type": "array",
                        "description": "Jobs containing any entered phrase in the title or description are removed.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeContacts": {
                        "title": "📇 Extract public contacts",
                        "type": "boolean",
                        "description": "Save emails, phones, websites, and public messaging handles explicitly included in job text to the Contacts output.",
                        "default": true
                    },
                    "onlyWithContacts": {
                        "title": "Keep only jobs with a public contact",
                        "type": "boolean",
                        "description": "Discard jobs where no public email, phone, website, or messaging handle was found. This automatically enables contact extraction.",
                        "default": false
                    },
                    "sortResultsBy": {
                        "title": "↕️ Final result ordering",
                        "enum": [
                            "SOURCE",
                            "NEWEST",
                            "OPPORTUNITY_SCORE",
                            "BUDGET_HIGH",
                            "BUDGET_LOW"
                        ],
                        "type": "string",
                        "description": "Applied after deduplication, enrichment, filters, and scoring.",
                        "default": "SOURCE"
                    },
                    "monitorKey": {
                        "title": "🔑 Monitor name",
                        "type": "string",
                        "description": "Monitor mode only. Use the same name on repeated runs, for example python-hourly-us.",
                        "default": ""
                    },
                    "resetMonitor": {
                        "title": "♻️ Replace the saved baseline",
                        "type": "boolean",
                        "description": "Store the current results as a new baseline without returning changes.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "⚡ Parallel tasks",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of independent queries or details processed at once. The default favors reliability.",
                        "default": 4
                    },
                    "maxRetries": {
                        "title": "🔄 Retry attempts",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Fresh-session retries for temporary network or source interruptions.",
                        "default": 8
                    },
                    "requestTimeoutSeconds": {
                        "title": "⏱️ Request timeout",
                        "minimum": 10,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time for one source request.",
                        "default": 35
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Connection settings",
                        "type": "object",
                        "description": "Residential access is recommended for reliable Upwork results. The default is ready to run.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "CA"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
