# Upwork Jobs & Freelancer Scraper - API & Data Export (`sian.agency/upwork-jobs-scraper`) Actor

Scrape Upwork jobs and freelancers into structured datasets. Pull job listings, full job detail with client spend and hire-rate intelligence, freelancer profiles, JSS and badges. Bulk export to JSON, CSV and Excel for lead generation, recruiting, bid research and market analysis.

- **URL**: https://apify.com/sian.agency/upwork-jobs-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Jobs, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 job listings

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

## Upwork Jobs & Freelancer Scraper — API & Data Export 💼

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Jobs Search API](https://img.shields.io/badge/Store-Jobs%20Search%20API-1AE392)](https://apify.com/sian.agency/jsearch-jobs-scraper?fpr=sian) [![Store-Zillow Agent Scraper](https://img.shields.io/badge/Store-Zillow%20Agent%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-agent-scraper?fpr=sian) [![Store-Property Skip Tracing](https://img.shields.io/badge/Store-Property%20Skip%20Tracing-1AE392)](https://apify.com/sian.agency/property-skip-tracing?fpr=sian)

#### 🎉 Jobs **and** freelancers in one actor — plus client spend & hire-rate intelligence no jobs-only scraper gives you
##### Built for lead-gen teams, recruiters, agencies, and market researchers working the Upwork marketplace

---

### 📋 Overview

**Scrape the entire Upwork marketplace — both sides of it — into clean structured datasets.** Where most Upwork tools only pull job listings, this actor adds **freelancer search & profiles** and **client intelligence** (total spend, hire rate, payment-verified status, applicant counts) so you can find who's hiring *and* who's available, and qualify both before you reach out.

**Why teams choose this actor:**
- ✅ **Both market sides in one tool**: jobs (who's hiring) and freelancers (who's available) — most scrapers do only one
- ⚡ **Client intelligence built in**: job detail returns client total spend, hire rate, payment-verified status, and applicant counts — first-class, not a hidden paid add-on
- 🎯 **Freelancer trust signals**: Job Success Score (JSS), badge (Top Rated / Plus / Rising Talent), hourly rate, total hours and jobs
- 💰 **Pay only for rows you keep**: transparent pay-per-result pricing, with a job-listing rate matched to the market
- 💎 **Real pagination**: search multiple pages per keyword for deep, deduplicated coverage
- ✨ **Clean export**: JSON, CSV, and Excel straight from the Apify dataset — no account or API key needed

---

### ✨ Features

- 🔎 **Search Jobs**: find open jobs by keyword — title, budget, type, skills, posted date, and link
- 📑 **Job Detail**: full record for any job URL with **client intelligence** — spend, hire rate, payment-verified, applicants, invites, interviews
- 👥 **Search Freelancers**: find freelancers by keyword — title, location, hourly rate, JSS, badge, and skills
- 👤 **Freelancer Profile**: full profile for any freelancer URL — stats, portfolios, and skills
- 📄 **Paginated search**: pull multiple pages per keyword for broad coverage
- 🏷️ **Structured skills**: skill tags split into clean arrays for filtering
- 🧾 **Unified dataset**: jobs and freelancers in one schema, split by `recordType` / `_operation`
- 📊 **HTML run report**: success/error counts and run details, written even on a fatal error

---

### 🎬 Quick Start

Pick an operation, give it search terms or URLs, and press **Start**. Results stream into the dataset.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~upwork-jobs-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "searchJobs", "queries": ["python developer"], "maxPages": 3}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose an operation

Pick **Search Jobs**, **Job Detail**, **Search Freelancers**, or **Freelancer Profile**.

#### Step 2: Provide input

Search operations take a list of **search terms**. Detail operations take a list of **URLs** (the ones the search ops return are ready to paste).

#### Step 3: Run and export

Press **Start**, then download the dataset as JSON, CSV, or Excel.

**That's it! In under a minute, you'll have:**

- A clean dataset of Upwork jobs or freelancers
- Client spend & hire-rate intelligence on every job detail row
- Freelancer JSS, badges, and rates for sourcing

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| operation | string | Yes | `searchJobs`, `jobDetail`, `searchFreelancers`, or `freelancerProfile` |
| queries | array | For search ops | Keywords to search (e.g. `python developer`, `shopify expert`) |
| urls | array | For detail ops | Job or freelancer URLs to enrich |
| maxPages | integer | No | Pages per search term (default 3, max 50) |

**Search example:**

```json
{
  "operation": "searchJobs",
  "queries": ["react native", "seo specialist"],
  "maxPages": 3
}
```

**Detail example:**

```json
{
  "operation": "jobDetail",
  "urls": ["https://www.upwork.com/jobs/~021234567890123456789"]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **50+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| recordType | string | `job` or `freelancer` |
| recordTitle | string | Job title or freelancer headline |
| recordUrl | string | Upwork job or freelancer URL |
| budgetInfo | string | Raw budget/rate string from the listing |
| skills | array | Skill tags |
| clientSpending | string | Client lifetime spend (job detail) |
| clientPaymentVerified | boolean | Client payment-verified status (job detail) |
| applications | number | Number of applicants (job detail) |
| hourlyRate | number | Freelancer hourly rate (freelancers) |
| jss | number | Freelancer Job Success Score (freelancers) |
| badge | string | Freelancer badge (Top Rated / Plus / Rising Talent) |

**Example (job detail):**

```json
{
  "recordType": "job",
  "recordTitle": "Python Developer",
  "jobType": "hourly",
  "minHourlyRate": 25,
  "maxHourlyRate": 47,
  "skills": ["Python", "PostgreSQL"],
  "clientSpending": "$6.8K",
  "clientPaymentVerified": true,
  "applications": 242,
  "clientHires": 34,
  "_operation": "jobDetail"
}
```

***

### 💼 Use Cases & Examples

#### 1. Lead Generation & Client Prospecting

**Agencies and freelancers building outreach lists of buyers actively hiring.**

**Input:** Search Jobs for your niche, then Job Detail on the results
**Output:** Jobs with client spend, hire rate, payment-verified status, and applicant counts
**Use:** Qualify and prioritize the highest-value clients before you pitch.

#### 2. Agency Bid Research

**Teams that want the freshest, best-fit projects.**

**Input:** Search Jobs for your skills with multiple pages
**Output:** Budgets, project types, required skills, posted times
**Use:** Bid early on jobs that match your rate and expertise.

#### 3. Freelancer & Talent Sourcing

**Recruiters and agencies sourcing vetted talent.**

**Input:** Search Freelancers by skill
**Output:** JSS, badges, hourly rates, total hours, and profiles
**Use:** Build shortlists of Top Rated freelancers for roles or subcontracting.

#### 4. Rate & Market Benchmarking

**Analysts setting pricing or studying the market.**

**Input:** Search Jobs and Search Freelancers across roles
**Output:** Hourly and fixed budgets, rates by region
**Use:** Benchmark rates and track how the gig economy shifts.

#### 5. Gig-Economy Trend Analysis

**Researchers and investors mapping demand.**

**Input:** Scheduled searches across skills and categories
**Output:** Job and freelancer datasets over time
**Use:** Analyze demand by skill, category, and geography.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/upwork-jobs-scraper').call({
  operation: 'searchJobs',
  queries: ['python developer'],
  maxPages: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/upwork-jobs-scraper').call(
    run_input={'operation': 'searchFreelancers', 'queries': ['shopify expert'], 'maxPages': 2}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~upwork-jobs-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "jobDetail", "urls": ["https://www.upwork.com/jobs/~021234567890123456789"]}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a CRM, notify your team, or enrich a sheet

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- Full feature access — every operation, same data quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- Unlimited rows per run
- Pay-per-result: charged only for the rows you keep
- Job-listing rate matched to the market

💰 **Cheap-per-row job search, premium client-intelligence enrichment.**

🔗 [View current pricing](https://apify.com/sian.agency/upwork-jobs-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Can I scrape both jobs and freelancers?**
A: Yes — that's the whole point. Use Search Jobs / Job Detail for the demand side and Search Freelancers / Freelancer Profile for the supply side.

**Q: What is the client intelligence in Job Detail?**
A: For each job URL, you get the client's total spend, average spend per hire, hire count, payment-verified status, rating, reviews, and the job's applicant/invite/interview counts.

**Q: Do I need an Upwork account or API key?**
A: No. Just provide your search terms or URLs.

**Q: What output formats are available?**
A: JSON, CSV, and Excel — export directly from the Apify dataset.

**Q: How many pages can I fetch per search term?**
A: Up to 50 pages per term (default 3). Each page returns about 10 rows.

**Q: How do I tell jobs from freelancers in the dataset?**
A: Filter on `recordType` (`job` / `freelancer`) or `_operation`.

**Q: Is this legal?**
A: We only extract publicly available data. See the legal section below.

***

### 🐛 Troubleshooting

**No results returned**

- Check the operation matches the input: search ops need `queries`, detail ops need `urls`
- Broaden the search term, or confirm the URL is a valid Upwork job/freelancer link

**A detail row came back as an error**

- The URL may be expired or removed on Upwork; verify it opens in a browser

**Want more rows per term**

- Increase `maxPages` (up to 50)

***

### ⚠️ Trademark Disclaimer

This actor is an independent tool and is **not** affiliated with, endorsed by, or sponsored by Upwork Global Inc. "Upwork" and all related names, marks, and logos are trademarks of their respective owners and are used here for descriptive purposes only. This tool accesses only publicly available information.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's Issues tab
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

🎯 **PICK ONE OPERATION PER RUN.** Each run produces one clean dataset matching the chosen mode.

- **🔎 Search Jobs** — find open jobs by keyword; title, budget, type, skills, posted date & link (paginated)
- **📑 Job Detail** — full record for a job URL, including **client intelligence**: total spend, hire rate, payment-verified status, applicant & invite counts
- **👥 Search Freelancers** — find freelancers by keyword; title, location, hourly rate, JSS, badge & skills (paginated)
- **👤 Freelancer Profile** — full profile for a freelancer URL, including stats, portfolios & skills

💡 **TIP:** Run **Search Jobs** to discover URLs, then feed those URLs into **Job Detail** for the client-intelligence enrichment.

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

🔢 **Keywords to search.** Used by **Search Jobs** and **Search Freelancers** — each term is searched and its results are saved to the dataset.

Examples: `python developer`, `shopify expert`, `react native`, `seo specialist`.

Add as many terms as you like.

⚠️ **Ignored** for the **Job Detail** and **Freelancer Profile** operations (which use the URLs field below).

## `urls` (type: `array`):

🔗 **Upwork URLs to enrich.** Used by **Job Detail** (job URLs) and **Freelancer Profile** (freelancer URLs).

- Job URL example: `https://www.upwork.com/jobs/~021234567890123456789`
- Freelancer URL example: `https://upwork.com/freelancers/~01abcdef0123456789`

The job & freelancer URLs returned by the Search operations are ready to paste here.

⚠️ **Ignored** for the Search operations (which use the search terms above).

## `maxPages` (type: `integer`):

📄 **Applies to Search Jobs and Search Freelancers** — ~10 results per page, per term. Detail operations ignore this.

💡 Start small (1–3 pages) to preview, then scale up. ⚠️ Hard cap: 50 pages.

## Actor input object example

```json
{
  "operation": "searchJobs",
  "queries": [
    "python developer"
  ],
  "urls": [],
  "maxPages": 3
}
```

# Actor output Schema

## `output` (type: `string`):

Upwork job listings, job detail with client intelligence, freelancer listings, or freelancer profiles — one flat row per item with curated camelCase fields (recordTitle, budgetInfo, skills, clientSpending, jss, badge, hourlyRate, …).

## `report` (type: `string`):

HTML report with run status, success/error row counts, success rate, upstream calls, duration, and the inputs used — written even on fatal crash.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/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"] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/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"
  ]
}' |
apify call sian.agency/upwork-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upwork Jobs & Freelancer Scraper - API & Data Export",
        "description": "Scrape Upwork jobs and freelancers into structured datasets. Pull job listings, full job detail with client spend and hire-rate intelligence, freelancer profiles, JSS and badges. Bulk export to JSON, CSV and Excel for lead generation, recruiting, bid research and market analysis.",
        "version": "1.0",
        "x-build-id": "e9BYtjQrembRtUrDU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~upwork-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-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/sian.agency~upwork-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-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/sian.agency~upwork-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-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",
                "required": [
                    "operation"
                ],
                "properties": {
                    "operation": {
                        "title": "🎯 Operation — what do you want to do?",
                        "enum": [
                            "searchJobs",
                            "jobDetail",
                            "searchFreelancers",
                            "freelancerProfile"
                        ],
                        "type": "string",
                        "description": "🎯 **PICK ONE OPERATION PER RUN.** Each run produces one clean dataset matching the chosen mode.\n\n- **🔎 Search Jobs** — find open jobs by keyword; title, budget, type, skills, posted date & link (paginated)\n- **📑 Job Detail** — full record for a job URL, including **client intelligence**: total spend, hire rate, payment-verified status, applicant & invite counts\n- **👥 Search Freelancers** — find freelancers by keyword; title, location, hourly rate, JSS, badge & skills (paginated)\n- **👤 Freelancer Profile** — full profile for a freelancer URL, including stats, portfolios & skills\n\n💡 **TIP:** Run **Search Jobs** to discover URLs, then feed those URLs into **Job Detail** for the client-intelligence enrichment.",
                        "default": "searchJobs"
                    },
                    "queries": {
                        "title": "🔢 Search terms (Search operations)",
                        "type": "array",
                        "description": "🔢 **Keywords to search.** Used by **Search Jobs** and **Search Freelancers** — each term is searched and its results are saved to the dataset.\n\nExamples: `python developer`, `shopify expert`, `react native`, `seo specialist`.\n\nAdd as many terms as you like.\n\n⚠️ **Ignored** for the **Job Detail** and **Freelancer Profile** operations (which use the URLs field below).",
                        "default": [
                            "python developer"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "urls": {
                        "title": "🔗 Job or freelancer URLs (Detail operations)",
                        "type": "array",
                        "description": "🔗 **Upwork URLs to enrich.** Used by **Job Detail** (job URLs) and **Freelancer Profile** (freelancer URLs).\n\n- Job URL example: `https://www.upwork.com/jobs/~021234567890123456789`\n- Freelancer URL example: `https://upwork.com/freelancers/~01abcdef0123456789`\n\nThe job & freelancer URLs returned by the Search operations are ready to paste here.\n\n⚠️ **Ignored** for the Search operations (which use the search terms above).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPages": {
                        "title": "📄 Max pages to fetch (Search operations)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "📄 **Applies to Search Jobs and Search Freelancers** — ~10 results per page, per term. Detail operations ignore this.\n\n💡 Start small (1–3 pages) to preview, then scale up. ⚠️ Hard cap: 50 pages.",
                        "default": 3
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
