PeoplePerHour Jobs Scraper avatar

PeoplePerHour Jobs Scraper

Pricing

from $0.06 / 1,000 job listing saveds

Go to Apify Store
PeoplePerHour Jobs Scraper

PeoplePerHour Jobs Scraper

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

Pricing

from $0.06 / 1,000 job listing saveds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

21

Total users

4

Monthly active users

16 days ago

Last modified

Categories

Share

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, normalized budget ranges and types, skills, descriptions, proposal counts, visible and normalized posting times, 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?

FieldDescription
titleJob or project title
urlDirect PeoplePerHour listing URL
jobIdNumeric listing ID parsed from the URL
sourceUrlCategory/search URL where the listing was found
categoryMain category parsed from the listing URL
subcategorySubcategory parsed from the listing URL
budgetVisible budget/rate text
currencyCurrency symbol when visible
budgetAmountFirst numeric budget amount when visible, retained for compatibility
budgetMinLower normalized budget or hourly-rate bound
budgetMaxUpper normalized budget or hourly-rate bound
budgetTypefixed, hourly, or unknown based on visible card text
jobTypeFirst visible job type or skill label
skillsVisible skills and job labels
tagsAll visible tags on the listing card
postedAtTextOriginal visible posted-time text
postedAtBest-effort ISO time derived from supported relative labels
postedWithinFilterFreshness filter applied by the run
locationLocation/remote signal when visible
isRemoteBoolean remote indicator when visible
descriptionListing snippet/description
clientNameVisible client name on the card
clientProfileUrlClient profile URL when visible
proposalCountVisible number of proposals
rawFooterTextOriginal card footer text used for parsing
scrapedAtISO 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 tierPrice per saved job
FREE$0.00011498
BRONZE$0.000099982
SILVER$0.000077986
GOLD$0.000059989
PLATINUM$0.000039993
DIAMOND$0.000027995

Your run price is the start charge plus the per-item charge for each saved row. Apify shows the exact charge events and total on every run.

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

{
"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

{
"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,
"budgetMin": 23,
"budgetMax": 23,
"budgetType": "fixed",
"jobType": "WordPress",
"skills": ["WordPress", "PHP"],
"postedAtText": "6 hours ago",
"postedAt": "2026-07-07T20:14:33.782Z",
"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

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

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

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:

$claude mcp add --transport http apify-peopleperhour-jobs 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:

{
"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, retries one transient page-load failure, and fails clearly when every source is challenged or no longer has a recognizable listing shape.

Extraction is card-level: the actor does not open job details or require a PeoplePerHour account. This keeps runs fast, but fields absent from cards remain null.

postedAt is best-effort normalization of supported relative labels (today, yesterday, and minute/hour/day/week/month values). Preserve postedAtText as source evidence; unknown labels keep postedAt as null.

The actor is intentionally jobs-only. It does not scrape freelancer profiles or services.

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

Data handling, dependencies, and affiliation

Extraction is deterministic and does not use AI models. The Actor sends requests only to public PeoplePerHour pages (and through Apify Proxy when you explicitly enable it), then writes results to your Apify dataset. It has no external cache or account system; input, output, and logs follow your Apify storage retention settings and can be deleted with Apify platform controls.

PeoplePerHour is a third-party public source and can change or block its pages. This Actor is an independent tool and is not affiliated with, endorsed by, or operated by PeoplePerHour.

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 explicit keyword or freshness filters produce zero items, broaden or remove them. An unfiltered crawl that cannot recognize job cards fails instead of reporting a misleading successful-empty result.

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.

Changelog

See the Actor changelog for current release details, including normalized budget ranges, ISO posting times, deterministic sorting, and clearer challenge/parser failures.