# PeoplePerHour Jobs Scraper (`automation-lab/peopleperhour-jobs-scraper`) Actor

Scrape public PeoplePerHour freelance jobs with budgets, client signals, proposal counts, categories, posted times, and listing URLs.

- **URL**: https://apify.com/automation-lab/peopleperhour-jobs-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Jobs Scraper

Find fresh freelance project leads from PeoplePerHour and export them to a clean dataset.

### What does PeoplePerHour Jobs Scraper do?

PeoplePerHour Jobs Scraper collects public freelance job and project listings from PeoplePerHour.

It visits PeoplePerHour `/freelance-jobs` pages, category pages, and filtered URLs you provide.

It extracts job titles, URLs, budgets, descriptions, proposal counts, posted-time text, client signals, and category information.

Use it to monitor new project opportunities without manually refreshing PeoplePerHour search pages.

### Who is it for?

Freelancers use it to discover new projects in their niche.

Agencies use it to feed outbound sales and proposal workflows.

Lead generation teams use it to collect companies and client intent signals.

Market researchers use it to track demand, budgets, and category trends.

Recruiting and staffing teams use it to understand what skills are being requested.

### Why use this scraper?

PeoplePerHour listings change quickly.

Manual monitoring is slow and easy to miss.

This actor gives you structured rows that can be filtered, exported, enriched, or sent to your CRM.

It also includes source URLs and timestamps, so your team can audit where each lead came from.

### What data can I extract?

| Field | Description |
| --- | --- |
| `title` | Job or project title |
| `url` | Direct PeoplePerHour listing URL |
| `jobId` | Numeric listing ID parsed from the URL |
| `sourceUrl` | Category/search URL where the listing was found |
| `category` | Main category parsed from the listing URL |
| `subcategory` | Subcategory parsed from the listing URL |
| `budget` | Visible budget/rate text |
| `currency` | Currency symbol when visible |
| `budgetAmount` | Numeric budget amount when visible |
| `postedAtText` | Visible posted-time text |
| `location` | Location/remote signal when visible |
| `isRemote` | Boolean remote indicator when visible |
| `description` | Listing snippet/description |
| `clientName` | Visible client name on the card |
| `clientProfileUrl` | Client profile URL when visible |
| `proposalCount` | Visible number of proposals |
| `scrapedAt` | ISO timestamp of extraction |

### How much does it cost to scrape PeoplePerHour jobs?

The actor uses pay-per-event pricing.

Each run has a fixed start charge of **$0.005**.

Each saved PeoplePerHour job is charged as an `item` event.

| Apify plan tier | Price per saved job | Example: 100 jobs | Example: 1,000 jobs |
| --- | ---: | ---: | ---: |
| FREE | $0.00011498 | $0.0165 including start | $0.1200 including start |
| BRONZE | $0.000099982 | $0.0150 including start | $0.1050 including start |
| SILVER | $0.000077986 | $0.0128 including start | $0.0830 including start |
| GOLD | $0.000059989 | $0.0110 including start | $0.0650 including start |
| PLATINUM | $0.000039993 | $0.0090 including start | $0.0450 including start |
| DIAMOND | $0.000027995 | $0.0078 including start | $0.0330 including start |

On the Apify Free plan, a typical 50-job monitoring run costs about **$0.0108**.

That means roughly **460 similar 50-job runs** fit within a $5 monthly platform credit before other Apify usage.

Use a small `maxItems` value for your first run.

Increase `maxItems` after you confirm the category and filters match your workflow.

### How to scrape PeoplePerHour jobs

1. Open the actor on Apify.
2. Add one or more PeoplePerHour `/freelance-jobs` URLs.
3. Optionally add category slugs such as `technology-programming` or `design`.
4. Set `maxItems` to the number of jobs you need.
5. Choose how many pages to visit per URL.
6. Run the actor.
7. Export results as JSON, CSV, Excel, XML, or via API.

### Input options

`startUrls` accepts PeoplePerHour job listing pages.

`categorySlugs` builds PeoplePerHour category URLs for you.

`keywords` filters visible listing titles and descriptions after pages load.

`maxItems` controls the maximum number of rows saved.

`maxPagesPerUrl` controls pagination depth per start URL.

`sortBy` can request popularity, latest, ending soon, or budget sorting.

`postedWithin` filters by visible posted-time text.

`useProxy` enables Apify Proxy if the target starts returning challenges.

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming" }
  ],
  "keywords": ["wordpress", "seo"],
  "maxItems": 50,
  "maxPagesPerUrl": 3,
  "postedWithin": "any",
  "sortBy": "latest",
  "useProxy": false
}
````

### Example output

```json
{
  "title": "Add user registration to Wordpress blog",
  "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming/website-development/add-user-registration-to-wordpress-blog-4507852",
  "jobId": "4507852",
  "category": "technology programming",
  "subcategory": "website development",
  "budget": "€23",
  "currency": "€",
  "budgetAmount": 23,
  "postedAtText": "6 hours ago",
  "description": "Add user registration for ReplyResearch.com...",
  "clientName": "Jonathan F.",
  "proposalCount": 18,
  "scrapedAt": "2026-07-08T02:14:33.782Z"
}
```

### Tips for better results

Start with specific category pages.

Use `keywords` to reduce noise for broad categories.

Use `sortBy: latest` when monitoring fresh leads.

Use higher `maxPagesPerUrl` for broad lead collection.

Keep the first run small to confirm the data shape.

Enable proxy only if PeoplePerHour returns challenge pages or empty results.

### Supported PeoplePerHour pages

The actor supports public PeoplePerHour URLs under `/freelance-jobs`.

Examples include:

- `https://www.peopleperhour.com/freelance-jobs`
- `https://www.peopleperhour.com/freelance-jobs/technology-programming`
- `https://www.peopleperhour.com/freelance-jobs/design`
- `https://www.peopleperhour.com/freelance-jobs/digital-marketing`

### Integrations

Send new PeoplePerHour leads to Google Sheets.

Push matching jobs to Airtable.

Trigger Slack alerts when a high-budget job appears.

Enrich client profiles in a downstream workflow.

Feed jobs into a CRM for proposal tracking.

Combine the dataset with Apify webhooks for scheduled monitoring.

### API usage with Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/peopleperhour-jobs-scraper').call({
  startUrls: [{ url: 'https://www.peopleperhour.com/freelance-jobs/technology-programming' }],
  maxItems: 50,
  maxPagesPerUrl: 3,
});
console.log(run.defaultDatasetId);
```

### API usage with Python

```python
from apify_client import ApifyClient

client = ApifyClient('MY-APIFY-TOKEN')
run = client.actor('automation-lab/peopleperhour-jobs-scraper').call(run_input={
    'startUrls': [{'url': 'https://www.peopleperhour.com/freelance-jobs/design'}],
    'maxItems': 50,
    'maxPagesPerUrl': 3,
})
print(run['defaultDatasetId'])
```

### API usage with cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~peopleperhour-jobs-scraper/runs?token=MY-APIFY-TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"startUrls":[{"url":"https://www.peopleperhour.com/freelance-jobs/digital-marketing"}],"maxItems":50}'
```

### MCP usage

Use this actor from MCP-compatible tools through Apify MCP Server.

MCP endpoint URL:

`https://mcp.apify.com/?tools=automation-lab/peopleperhour-jobs-scraper`

Add it in Claude Code with HTTP transport:

```bash
claude mcp add apify-peopleperhour-jobs --transport http https://mcp.apify.com/?tools=automation-lab/peopleperhour-jobs-scraper
```

For Claude Desktop, Cursor, or VS Code MCP settings, add an HTTP MCP server entry and include your Apify API token in the authorization header.

Example MCP JSON config for Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify-peopleperhour-jobs": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=automation-lab/peopleperhour-jobs-scraper",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}
```

In Claude Desktop, open Settings → Developer → Edit Config, paste the JSON block, save, and restart Claude Desktop.

In Cursor, open Settings → MCP, add a new server, choose HTTP transport, paste the same URL, and set the `Authorization` header.

In VS Code with an MCP extension, create a new HTTP server configuration using the same name, URL, and bearer-token header.

Example prompts:

- "Scrape the latest PeoplePerHour technology projects and show high-budget WordPress jobs."
- "Monitor PeoplePerHour design jobs and export logo projects to CSV."
- "Find new PeoplePerHour SEO projects posted in the last day."

### Scheduling

Run the actor hourly or daily to monitor new opportunities.

Use `postedWithin` and `sortBy: latest` for recurring jobs.

Set a small enough `maxItems` to avoid collecting old listings repeatedly.

### Proxy and anti-blocking

PeoplePerHour may return challenge pages to simple HTTP clients.

This actor uses Playwright so public listings can load like a browser.

Proxy is optional and disabled by default.

If runs begin returning no data, enable Apify Proxy in the input.

Residential proxy can help with stricter challenge pages, but it costs more.

### Data quality notes

PeoplePerHour can change CSS class names.

The actor uses resilient selectors around listing links and visible card text.

Some fields are optional because PeoplePerHour may not show them on every listing card.

Always keep `url`, `title`, `sourceUrl`, and `scrapedAt` as your stable keys.

### Legality

This actor extracts publicly visible PeoplePerHour listing information.

You are responsible for using the data according to applicable laws, platform terms, and privacy requirements.

Do not use scraped data for spam or abusive outreach.

Respect opt-outs and local marketing regulations.

### Troubleshooting

If you get zero items, check that your URL starts with `/freelance-jobs`.

If keyword filters are too narrow, remove them and rerun a small test.

If PeoplePerHour returns challenge pages, enable `useProxy`.

If a category has fewer jobs than expected, increase `maxPagesPerUrl` or use the main jobs URL.

### FAQ

#### Can I scrape freelancer profiles too?

This actor focuses on job/project listings. Freelancer profiles are a different entity type and are not included in the MVP.

#### Can I monitor only new jobs?

Yes. Use `sortBy: latest`, set `postedWithin`, and schedule the actor.

#### Does it require a PeoplePerHour account?

No. It uses public listing pages and does not log in.

#### Can I use it for lead generation?

Yes. The output is designed for freelancers, agencies, and sales teams looking for project leads.

### Related scrapers

- [Freelancer Projects Scraper](https://apify.com/automation-lab/freelancer-projects-scraper)
- [Freelancermap Projects Scraper](https://apify.com/automation-lab/freelancermap-projects-scraper)
- [Omni Jobs Board Scraper](https://apify.com/automation-lab/omni-jobs-board-scraper)
- [Job Board Keyword Signal Scanner](https://apify.com/automation-lab/job-board-keyword-signal-scanner)

### Changelog

Initial version extracts public PeoplePerHour job listings, budgets, client signals, proposal counts, categories, descriptions, and timestamps.

# Actor input Schema

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

PeoplePerHour /freelance-jobs URLs to crawl. Use the main jobs page, category pages, or PeoplePerHour URLs with your own filters applied.

## `categorySlugs` (type: `array`):

Optional PeoplePerHour category slugs to crawl, for example technology-programming, design, writing-translation, or digital-marketing.

## `keywords` (type: `array`):

Optional words to match in listing titles/descriptions after pages load. Leave empty to save every visible job.

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

Maximum number of PeoplePerHour job listings to save.

## `maxPagesPerUrl` (type: `integer`):

How many pagination pages to visit for each start URL or category slug.

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

Optional PeoplePerHour sort preference for generated URLs.

## `postedWithin` (type: `string`):

Filter by visible posted-time text such as minutes, hours, days, or months ago.

## `useProxy` (type: `boolean`):

Enable if PeoplePerHour blocks your run. The actor defaults to no proxy because Playwright can usually load public listings directly.

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

Standard Apify proxy configuration. Residential proxies are useful if the target starts returning WAF challenges.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming"
    },
    {
      "url": "https://www.peopleperhour.com/freelance-jobs/design"
    }
  ],
  "categorySlugs": [
    "technology-programming",
    "digital-marketing"
  ],
  "keywords": [
    "wordpress",
    "seo"
  ],
  "maxItems": 20,
  "maxPagesPerUrl": 3,
  "sortBy": "latest",
  "postedWithin": "any",
  "useProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming"
        },
        {
            "url": "https://www.peopleperhour.com/freelance-jobs/design"
        }
    ],
    "categorySlugs": [
        "technology-programming",
        "digital-marketing"
    ],
    "keywords": [
        "wordpress",
        "seo"
    ],
    "maxItems": 20,
    "maxPagesPerUrl": 3,
    "sortBy": "latest",
    "postedWithin": "any",
    "useProxy": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/peopleperhour-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 = {
    "startUrls": [
        { "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming" },
        { "url": "https://www.peopleperhour.com/freelance-jobs/design" },
    ],
    "categorySlugs": [
        "technology-programming",
        "digital-marketing",
    ],
    "keywords": [
        "wordpress",
        "seo",
    ],
    "maxItems": 20,
    "maxPagesPerUrl": 3,
    "sortBy": "latest",
    "postedWithin": "any",
    "useProxy": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/peopleperhour-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 '{
  "startUrls": [
    {
      "url": "https://www.peopleperhour.com/freelance-jobs/technology-programming"
    },
    {
      "url": "https://www.peopleperhour.com/freelance-jobs/design"
    }
  ],
  "categorySlugs": [
    "technology-programming",
    "digital-marketing"
  ],
  "keywords": [
    "wordpress",
    "seo"
  ],
  "maxItems": 20,
  "maxPagesPerUrl": 3,
  "sortBy": "latest",
  "postedWithin": "any",
  "useProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call automation-lab/peopleperhour-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PeoplePerHour Jobs Scraper",
        "description": "Scrape public PeoplePerHour freelance jobs with budgets, client signals, proposal counts, categories, posted times, and listing URLs.",
        "version": "0.1",
        "x-build-id": "JCqZra9oQrWJ8KF46"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~peopleperhour-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-peopleperhour-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/automation-lab~peopleperhour-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-peopleperhour-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/automation-lab~peopleperhour-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-peopleperhour-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": {
                    "startUrls": {
                        "title": "PeoplePerHour job URLs",
                        "type": "array",
                        "description": "PeoplePerHour /freelance-jobs URLs to crawl. Use the main jobs page, category pages, or PeoplePerHour URLs with your own filters applied.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "categorySlugs": {
                        "title": "Category slugs",
                        "type": "array",
                        "description": "Optional PeoplePerHour category slugs to crawl, for example technology-programming, design, writing-translation, or digital-marketing.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keyword filters",
                        "type": "array",
                        "description": "Optional words to match in listing titles/descriptions after pages load. Leave empty to save every visible job.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum jobs",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of PeoplePerHour job listings to save.",
                        "default": 20
                    },
                    "maxPagesPerUrl": {
                        "title": "Maximum pages per URL",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "How many pagination pages to visit for each start URL or category slug.",
                        "default": 3
                    },
                    "sortBy": {
                        "title": "Sort listings by",
                        "enum": [
                            "popularity",
                            "latest",
                            "endingSoon",
                            "budget"
                        ],
                        "type": "string",
                        "description": "Optional PeoplePerHour sort preference for generated URLs.",
                        "default": "latest"
                    },
                    "postedWithin": {
                        "title": "Posted within",
                        "enum": [
                            "any",
                            "24h",
                            "7d",
                            "30d"
                        ],
                        "type": "string",
                        "description": "Filter by visible posted-time text such as minutes, hours, days, or months ago.",
                        "default": "any"
                    },
                    "useProxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Enable if PeoplePerHour blocks your run. The actor defaults to no proxy because Playwright can usually load public listings directly.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Standard Apify proxy configuration. Residential proxies are useful if the target starts returning WAF challenges.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
