Skip to content

Hyperbach/upwork-jobs-scraper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

Upwork Jobs Scraper

Get Upwork jobs as clean, structured, AI-scored JSON — in 5 lines of Python or Node.

Scraping Upwork yourself means rotating proxies, solving CAPTCHAs, reverse-engineering their GraphQL, and getting IP-banned anyway. This repo skips all that: it shows you how to pull ranked, enriched Upwork job data from a hosted, maintained API — the Upwork Job Scraper actor on Apify.

Every job comes back with a job_score (0–100) — ranked by the client's pay, hire rate, and spend — plus 59 filters so you pull only the jobs worth bidding on, not the firehose.

$2 per 1,000 results · pay per use, no monthly fee · free tier to try · runs that return 0 results cost nothing.


Why an API instead of a DIY scraper?

DIY Upwork scraper This (hosted actor)
Proxies, CAPTCHAs, GraphQL, IP bans Just call an API
Raw HTML/JSON you parse yourself Clean, flat job records
You build ranking & dedup job_score 0–100 + per-client "new jobs only" cursor
Breaks when Upwork changes Maintained for you
~5–15 fields 59 filters, incl. AI-extracted skills, summaries & client signals

Quick start

Python (Apify SDK)

pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")  # https://console.apify.com/account/integrations

run = client.actor("hyperbach/upwork-scraper-ai").call(run_input={
    "limit": 25,
    "skills": "React",
    "price_min": ">=50",
    "buyer_score": ">=4.0",
    "buyer_payment_verified": "true",
})

jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for j in sorted(jobs, key=lambda x: x.get("job_score", 0), reverse=True):
    print(f'{j["job_score"]:>3}  {j["title"]}{j["url"]}')

Node (Apify SDK)

npm install apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('hyperbach/upwork-scraper-ai').call({
  limit: 25, skills: 'React', price_min: '>=50', buyer_score: '>=4.0',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.sort((a, b) => b.job_score - a.job_score)
     .forEach(j => console.log(j.job_score, j.title, j.url));

Plain HTTP (no SDK)

curl -X POST "https://api.apify.com/v2/acts/hyperbach~upwork-scraper-ai/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"limit": 25, "skills": "React", "buyer_score": ">=4.0"}'

More in examples/ — including a REST-only version and a "new jobs since last run" alert loop.

What you get back

A flat, ranked job record per posting. Real sample: examples/sample_job.json

{
  "title": "Senior React Native / Cloud Backend Engineer ...",
  "url": "https://www.upwork.com/jobs/~02205...",
  "price_type": "Hourly", "price_min": 70, "price_max": 100,
  "skills": "React Native, iOS, Google Cloud Platform, Python, AI Development",
  "buyer_score": 4.93, "hire_rate": 100, "total_spent": 54226.41,
  "buyer_payment_verified": true, "client_location": "United States",
  "ai_summary": "You'll build and maintain a production iOS app in React Native ...",
  "questions": ["Describe a React Native iOS app you shipped ...", "..."],
  "job_score": 94,
  "job_score_breakdown": { "top_contributors": [ /* why it ranked 94 */ ] }
}

Filter to exactly the jobs you want

59 fields across job details (skills, budget, category, keywords/exclude_keywords), client quality (hire_rate, total_spent, buyer_score, payment_verified, avg_hourly_rate), requirements (experience level, English level, hours/week), and AI insights (ai_summary, ai_technical_skills, ai_explicit_mention_of_agency, …). Full reference on the actor page.

# High-value React leads from proven clients, newest first
{"skills": "React", "price_min": ">=60", "buyer_score": ">=4.5",
 "total_spent": ">=10000", "buyer_payment_verified": "true"}

# Only NEW jobs since your last call (per-client cursor) — perfect for alerts
{"notifications_only": "true", "skills": "Python", "price_min": ">=45"}

Use cases

  • Freelancers — a ranked daily feed of the best-fit, best-paying jobs, with screening questions ready for your proposal.
  • Agencies — filter straight to high-budget, agency-friendly clients with real spend and hire history.
  • Job boards & SaaS — power a niche Upwork job board or alerting product with clean, scored data.
  • Researchers — track Upwork pricing, demand, and skill trends at scale.

Need historical data?

For research or model training, there's a separate Upwork Jobs Dataset — 1.9M+ historical records (2024–2025) in CSV / JSON / Parquet / SQLite / DuckDB with the same AI-enriched fields.

Links

License

Example code: MIT. Not affiliated with or endorsed by Upwork; "Upwork" is a trademark of its owner. This repo is a client + examples for a hosted scraping API, not a standalone scraper.

About

Ranked, AI-scored Upwork jobs as clean JSON via API. Client examples (Python/Node) for the Upwork Job Scraper on Apify — job_score 0–100, 59 filters, real-time new-jobs feed.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors