# PeoplePerHour Scraper (`solidcode/peopleperhour-scraper`) Actor

\[💰 $3.0 / 1K] Extract freelance project and job postings from PeoplePerHour. Search by keyword, browse a category, or paste URLs, then filter by price type, experience level, and remote work. Get titles, budgets, currencies, categories, skills, posting dates, proposal counts, and client details.

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

## Pricing

from $3.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

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

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

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

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

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

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

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


# README

## PeoplePerHour Scraper

Pull live freelance project and job postings from PeoplePerHour at scale — titles, budgets in native currency, fixed vs hourly pricing, required skills, proposal counts, posting and expiry dates, and the hiring client's name and country. Built for agencies, lead-generation teams, and market researchers who need fresh freelance-demand data without manually clicking through marketplace listings page by page.

### Why This Scraper?

- **10 top-level categories, browseable by name** — Artificial Intelligence, Technology & Programming, Design, Digital Marketing, Writing & Translation, Social Media, Marketing/Branding/Sales, Video & Photography, Music & Audio, and Business. Pick one from a dropdown; no URL crafting.
- **Per-project native currency — GBP, USD, or EUR** — every budget keeps the currency the client actually posted in, not a converted home-IP estimate that distorts your pricing analysis.
- **Structured budget ranges** — separate `budgetMin` and `budgetMax` fields whenever a project advertises a range, plus a single headline `budget` figure.
- **Fixed vs Per-hour pricing filter** — limit a run to fixed-price projects or hourly contracts to match exactly the work model you sell.
- **Entry / Intermediate / Expert experience filter** — target only the seniority tier you compete in and skip the rest.
- **Proposal (bid) counts on every project** — `proposalCount` tells you how saturated each lead is before you spend time on a pitch.
- **Full project brief on every row, plus skills tags when available** — every row carries the complete project description, not just a truncated teaser; when a project's detail page is reachable we add the client's required-skills list on top.
- **Hiring-client details on every row** — client name and country, so you know who is posting and where they're based.
- **Deduplicated by project ID** — each project is returned once even when it surfaces across several keywords or pages, so your lead list has no repeats.

### Use Cases

**Lead Generation for Agencies & Freelancers**
- Build a daily feed of open projects matching your service keywords
- Prioritise leads by proposal count to find low-competition projects
- Filter to Expert-level briefs that match premium service offerings
- Pull client name and country to qualify and personalise outreach

**Market & Demand Research**
- Measure how many projects are posted per category over time
- Track which skills clients are requesting most across a category
- Spot emerging demand in the dedicated Artificial Intelligence category
- Map remote-only versus on-site demand for a given skill set

**Competitive Pricing Intelligence**
- Benchmark fixed-price budgets against hourly rates in your niche
- Compare native-currency budgets (GBP/USD/EUR) across regions
- Track budget ranges by experience level to position your quotes
- Identify under-priced versus premium project segments

**Talent Sourcing & Recruiting**
- Find the categories and skills with the highest open-project volume
- Gauge market rates before posting your own briefs
- Monitor client countries to understand where work originates
- Track posting and expiry dates to time outreach around fresh demand

### Getting Started

#### Simple Keyword Search

Search a single keyword and collect the latest matching projects:

```json
{
    "searchQueries": ["wordpress"],
    "maxResults": 100
}
````

#### Browse a Category

Collect every open project in one category, sorted by most recent:

```json
{
    "category": "design",
    "sortBy": "recent",
    "maxResults": 200
}
```

#### Full Filtered Run

Combine a keyword with pricing, experience, and remote filters:

```json
{
    "searchQueries": ["logo design", "brand identity"],
    "category": "design",
    "priceType": "fixed",
    "experienceLevel": "expert",
    "remoteOnly": true,
    "sortBy": "recent",
    "maxResults": 0,
    "includeDescription": true
}
```

#### Using PeoplePerHour URLs

Paste freelance-jobs URLs to scrape them exactly as shown on the site, including any filters baked into the link:

```json
{
    "startUrls": [
        "https://www.peopleperhour.com/freelance-jobs/technology-programming",
        "https://www.peopleperhour.com/freelance-jobs/design"
    ],
    "maxResults": 150
}
```

### Input Reference

#### Search & Targeting

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string\[] | `["wordpress"]` | Keywords or phrases to search for, such as "wordpress", "logo design", or "data entry". Each keyword runs its own search. Up to 50 keywords per run. Leave empty to use the category or collect the broadest project feed. |
| `category` | select | `Any category` | Browse a single category: Artificial Intelligence, Technology & Programming, Writing & Translation, Design, Digital Marketing, Social Media, Marketing/Branding/Sales, Video & Photography, Music & Audio, or Business. |
| `startUrls` | string\[] | `[]` | Paste full PeoplePerHour freelance-jobs URLs (a category page or a filtered search page) to scrape them exactly as shown. Filters baked into the URL are respected. Up to 50 URLs per run. |

#### Filters & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `priceType` | select | `Any price type` | Limit results to one pricing model: Fixed price or Per hour. |
| `experienceLevel` | select | `Any experience level` | Only return projects asking for this seniority: Entry, Intermediate, or Expert. |
| `remoteOnly` | boolean | `false` | Only return projects that can be done remotely. |
| `sortBy` | select | `Most recent` | Order results by Most recent (newest postings first) or Most relevant (best match to your search). |
| `maxResults` | integer | `100` | Maximum projects to collect per keyword, category, or start URL. Set to 0 to collect everything available. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `onlyUniqueProjects` | boolean | `true` | Return each project once even if it appears across several pages or searches. Deduplicates by project ID. |
| `includeDescription` | boolean | `true` | Include the full project description for each project, plus skills tags when they can be read. Turn off for lighter, faster records when you only need titles, budgets, categories, dates, and links. |

### Output

Each project posting is returned as one flat row. Here is a representative result with full descriptions enabled (the `skills` array shows a row whose detail page was reachable; see the field note below):

```json
{
    "projectId": "4239871",
    "title": "Build a custom WordPress plugin for booking management",
    "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming/wordpress/build-a-custom-wordpress-plugin-4239871",
    "description": "We need an experienced WordPress developer to build a booking management plugin with calendar sync, payment capture, and an admin dashboard...",
    "descriptionHtml": "<p>We need an experienced WordPress developer to build a booking management plugin...</p>",
    "budget": 800,
    "budgetMin": 800,
    "budgetMax": 1200,
    "currency": "GBP",
    "priceType": "fixed",
    "category": "Technology & Programming",
    "subCategory": "WordPress",
    "skills": ["WordPress", "PHP", "Plugin Development", "JavaScript"],
    "postedDate": "2026-06-18T09:14:22",
    "expiryDate": "2026-07-18T09:14:22",
    "duration": "1 to 3 months",
    "locationType": "Remote",
    "experienceLevel": "Expert",
    "proposalCount": 7,
    "isUrgent": false,
    "isFeatured": false,
    "clientName": "Sarah M.",
    "clientCountry": "United Kingdom",
    "clientUrl": "https://www.peopleperhour.com/freelancer/sarah-m",
    "searchQuery": "wordpress",
    "scrapedAt": "2026-06-19T12:00:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `projectId` | string | Unique PeoplePerHour project identifier (used for deduplication) |
| `title` | string | Project title as posted by the client |
| `url` | string | Direct link to the project page |
| `description` | string | Full project brief as plain text |
| `descriptionHtml` | string | Full project brief with original HTML formatting |

#### Budget & Pricing

| Field | Type | Description |
|-------|------|-------------|
| `budget` | number | Headline budget amount |
| `budgetMin` | number | Lower bound when the project advertises a range |
| `budgetMax` | number | Upper bound when the project advertises a range |
| `currency` | string | Native currency the client posted in (GBP, USD, EUR) |
| `priceType` | string | Pricing model: `fixed` or `hourly` |

#### Classification

| Field | Type | Description |
|-------|------|-------------|
| `category` | string | Top-level category name |
| `subCategory` | string | Sub-category name when present |
| `skills` | string\[] | Required skills tags — included when available (added from a project's detail page when it can be read) |
| `experienceLevel` | string | Seniority tier — Entry, Intermediate, or Expert — inferred from the project's budget tier |
| `locationType` | string | Remote or On-site |
| `duration` | string | Estimated project duration when provided |

#### Client & Status

| Field | Type | Description |
|-------|------|-------------|
| `clientName` | string | Public name of the hiring client |
| `clientCountry` | string | Country the client is based in |
| `clientUrl` | string | Link to the client's profile |
| `proposalCount` | number | Number of bids the project has received |
| `isUrgent` | boolean | Whether the project is flagged urgent |
| `isFeatured` | boolean | Whether the project is featured/promoted |

#### Meta

| Field | Type | Description |
|-------|------|-------------|
| `postedDate` | string | When the project was posted (ISO-style timestamp) |
| `expiryDate` | string | When the project listing expires |
| `postedRelative` | string | Relative posting time when the site provides one |
| `searchQuery` | string | The keyword that surfaced this project |
| `scrapedAt` | string | ISO timestamp of data collection |

### Tips for Best Results

- **Leave `maxResults` at 0 to capture an entire category's open demand** — perfect for a full snapshot of what clients are hiring for right now in your niche.
- **Use Most recent sort for outreach** — fresh postings are where new leads live; the most recent projects have the fewest existing proposals.
- **Watch `proposalCount` to find low-competition leads** — a project with 0-3 proposals is far easier to win than one with 30, so sort your output by this field before pitching.
- **Turn off descriptions for fast volume runs** — when you only need titles, budgets, categories, and links for market sizing, switching off full descriptions makes runs lighter and quicker.
- **Combine a keyword with a category** to tighten results to exactly the segment you serve, instead of scanning a broad keyword across every category.
- **Compare native currencies, not converted estimates** — because every budget keeps its original GBP/USD/EUR, you can benchmark true regional rates without conversion drift.
- **Run several keywords in one job** — list every service variant you offer in `searchQueries`; deduplication keeps the merged lead list clean.

### Pricing

**From $3.00 per 1,000 results** — undercuts comparable PeoplePerHour data tools while returning structured budgets, skills, proposal counts, and client details. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.36 | $0.34 | $0.32 | $0.30 |
| 1,000 | $3.60 | $3.40 | $3.20 | $3.00 |
| 10,000 | $36.00 | $34.00 | $32.00 | $30.00 |
| 100,000 | $360.00 | $340.00 | $320.00 | $300.00 |

A "result" is any project row in the output dataset. There are no compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, lead generation, and competitive analysis of publicly listed freelance projects. Users are responsible for complying with applicable laws and PeoplePerHour's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data in line with relevant privacy regulations.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords or phrases to search PeoplePerHour for, such as 'wordpress', 'logo design', or 'data entry'. Each keyword runs its own search. Leave empty to use the category below or to collect the broadest project feed. Up to 50 keywords per run.

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

Browse a single PeoplePerHour category instead of, or together with, a keyword. Leave on 'Any category' to search everything.

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

Paste full PeoplePerHour freelance-jobs URLs (e.g. https://www.peopleperhour.com/freelance-jobs/technology-programming or a filtered search page) to scrape them exactly as shown on the site. Any filters baked into the URL are respected. Up to 50 URLs per run.

## `priceType` (type: `string`):

Limit results to one pricing model. Leave on 'Any' to include both.

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

Only return projects asking for this experience level. Leave on 'Any' to include all levels.

## `remoteOnly` (type: `boolean`):

Only return projects that can be done remotely.

## `sortBy` (type: `string`):

Order results by most recently posted or by best match to your search.

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

Maximum number of projects to collect per keyword, category, or start URL. Set to 0 to collect all available results across pagination. Results are fetched in pages: the actor stops once your cap is reached but always keeps the whole final page, so a small cap can return up to a full page more than you asked for.

## `onlyUniqueProjects` (type: `boolean`):

When on, each project is returned once even if it appears across several pages or searches. Deduplicates by the project ID. Turn off to keep every copy.

## `includeDescription` (type: `boolean`):

Include the full project description and any extra detail-page fields (skills, client info, expiry) for each project. Leave on for the most complete data. Turn off for lighter, faster records when you only need titles, budgets, categories, posting dates, and project links from the results list.

## Actor input object example

```json
{
  "searchQueries": [
    "wordpress"
  ],
  "startUrls": [],
  "remoteOnly": false,
  "sortBy": "recent",
  "maxResults": 100,
  "onlyUniqueProjects": true,
  "includeDescription": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped projects with key fields like title, budget, price type, category, posting date, and proposal count.

## `detail` (type: `string`):

Complete project data including full descriptions, parsed budget fields, skills, experience level, and client details.

# 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 = {
    "searchQueries": [
        "wordpress"
    ],
    "category": "",
    "startUrls": [],
    "priceType": "",
    "experienceLevel": "",
    "remoteOnly": false,
    "sortBy": "recent",
    "maxResults": 100,
    "onlyUniqueProjects": true,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/peopleperhour-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 = {
    "searchQueries": ["wordpress"],
    "category": "",
    "startUrls": [],
    "priceType": "",
    "experienceLevel": "",
    "remoteOnly": False,
    "sortBy": "recent",
    "maxResults": 100,
    "onlyUniqueProjects": True,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/peopleperhour-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 '{
  "searchQueries": [
    "wordpress"
  ],
  "category": "",
  "startUrls": [],
  "priceType": "",
  "experienceLevel": "",
  "remoteOnly": false,
  "sortBy": "recent",
  "maxResults": 100,
  "onlyUniqueProjects": true,
  "includeDescription": true
}' |
apify call solidcode/peopleperhour-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PeoplePerHour Scraper",
        "description": "[💰 $3.0 / 1K] Extract freelance project and job postings from PeoplePerHour. Search by keyword, browse a category, or paste URLs, then filter by price type, experience level, and remote work. Get titles, budgets, currencies, categories, skills, posting dates, proposal counts, and client details.",
        "version": "1.0",
        "x-build-id": "yU8mbcUkUE6ifLo6O"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~peopleperhour-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-peopleperhour-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/solidcode~peopleperhour-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-peopleperhour-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/solidcode~peopleperhour-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-peopleperhour-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": {
                    "searchQueries": {
                        "title": "Search Keywords",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Keywords or phrases to search PeoplePerHour for, such as 'wordpress', 'logo design', or 'data entry'. Each keyword runs its own search. Leave empty to use the category below or to collect the broadest project feed. Up to 50 keywords per run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "",
                            "artificial-intelligence",
                            "technology-programming",
                            "writing-translation",
                            "design",
                            "digital-marketing",
                            "social-media",
                            "marketing-branding-sales",
                            "video-photography",
                            "music-audio",
                            "business"
                        ],
                        "type": "string",
                        "description": "Browse a single PeoplePerHour category instead of, or together with, a keyword. Leave on 'Any category' to search everything."
                    },
                    "startUrls": {
                        "title": "Direct PeoplePerHour URLs",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Paste full PeoplePerHour freelance-jobs URLs (e.g. https://www.peopleperhour.com/freelance-jobs/technology-programming or a filtered search page) to scrape them exactly as shown on the site. Any filters baked into the URL are respected. Up to 50 URLs per run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceType": {
                        "title": "Price Type",
                        "enum": [
                            "",
                            "fixed",
                            "hourly"
                        ],
                        "type": "string",
                        "description": "Limit results to one pricing model. Leave on 'Any' to include both."
                    },
                    "experienceLevel": {
                        "title": "Experience Level",
                        "enum": [
                            "",
                            "entry",
                            "intermediate",
                            "expert"
                        ],
                        "type": "string",
                        "description": "Only return projects asking for this experience level. Leave on 'Any' to include all levels."
                    },
                    "remoteOnly": {
                        "title": "Remote Only",
                        "type": "boolean",
                        "description": "Only return projects that can be done remotely.",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "recent",
                            "relevant"
                        ],
                        "type": "string",
                        "description": "Order results by most recently posted or by best match to your search.",
                        "default": "recent"
                    },
                    "maxResults": {
                        "title": "Max Results per Search",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of projects to collect per keyword, category, or start URL. Set to 0 to collect all available results across pagination. Results are fetched in pages: the actor stops once your cap is reached but always keeps the whole final page, so a small cap can return up to a full page more than you asked for.",
                        "default": 100
                    },
                    "onlyUniqueProjects": {
                        "title": "Only Unique Projects",
                        "type": "boolean",
                        "description": "When on, each project is returned once even if it appears across several pages or searches. Deduplicates by the project ID. Turn off to keep every copy.",
                        "default": true
                    },
                    "includeDescription": {
                        "title": "Fetch Full Project Descriptions",
                        "type": "boolean",
                        "description": "Include the full project description and any extra detail-page fields (skills, client info, expiry) for each project. Leave on for the most complete data. Turn off for lighter, faster records when you only need titles, budgets, categories, posting dates, and project links from the results list.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
