Upwork Jobs Scraper — Freelance Listings & Monitor
Pricing
from $3.20 / 1,000 job listings
Upwork Jobs Scraper — Freelance Listings & Monitor
Upwork Jobs Scraper for freelance listings and a new-job monitor. Search by keyword or a search URL and export title, budget, hourly range, skills, experience, and posted time as JSON.
Pricing
from $3.20 / 1,000 job listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by Upwork Inc. or its affiliates. Data is read from publicly accessible job-search results only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
Upwork scraper for public freelance job listings (Upwork jobs scraper, Upwork job monitor). A practical Upwork API alternative: search by keyword or paste a search URL, then export title, description, fixed budget, hourly range, skills, experience level, duration, and posted time as JSON, CSV, or Excel. Fast HTTP, no headless browser, no login. Call it from Python, Node.js, cURL, or Apify MCP.
Built for freelancers and agencies who want a new-job monitor: schedule a run and save only listings that were not in the previous pull.
| Actor | Focus |
|---|---|
| Upwork Jobs Scraper ◄── you are here | Freelance listings and a new-job monitor |
| LinkedIn Jobs Scraper | Public LinkedIn job listings |
| Seek Jobs Scraper | Australia and New Zealand job cards |
| InfoJobs Job Scraper | Spain jobs, contract, and EUR salary |
| APEC Jobs Scraper | France cadre jobs |
| Stepstone Jobs Scraper | DACH commercial job board |
| Arbeitsagentur Jobs Scraper | Germany public Jobsuche |
| Glassdoor Scraper | Employer reviews, salaries, and jobs |
| Naukri Jobs Scraper | India Naukri.com jobs |
| ZipRecruiter Jobs Scraper | United States ZipRecruiter jobs |
When to use this Actor
- You need an Upwork jobs scraper that returns structured JSON without a browser
- You want keyword search, newest first, with budget, hourly range, and skills
- You run a daily or hourly monitor and only want new job ids saved
- You scrape Upwork from Python, Node.js, or an MCP assistant
When not to use this Actor
- Single job pages (
/jobs/~…). Those URLs are skipped. Use a keyword or a search URL. - Freelancer profiles, proposals, or messages. This Actor reads the public job search only.
- Client spend, hire rate, and proposal count. The anonymous search does not include those fields.
Key features
- Keyword search and Upwork search URLs (
q) - Newest-first pages, up to 50 jobs per page
- Hourly vs fixed-price, experience level, and budget filters
- Monitor mode with a named store of seen job ids
- Residential proxy on by default, because datacenter IPs often get a challenge page
Input
| Field | Required | Default | Description |
|---|---|---|---|
keyword | No | — | Search text. Empty means the newest public jobs. |
searchKeywords | No | — | Extra keywords, each searched on its own. |
startUrls | No | — | Search URLs. The q parameter is the keyword. |
jobType | No | Any | HOURLY or FIXED. |
experienceLevel | No | Any | Entry, Intermediate, or Expert. |
hourlyMin / hourlyMax | No | — | USD hourly window. |
fixedMin / fixedMax | No | — | USD fixed-budget window. |
maxItems | No | 50 | Row cap across all keywords. 0 means no row cap. |
maxPages | No | 3 | Pages per keyword. |
monitorMode | No | false | Save only job ids not seen in the named store. |
monitorStoreName | No | upwork-jobs-monitor | One name per watch. |
resetMonitorState | No | false | Clear seen ids before this run. |
proxyConfiguration | No | US residential | Leave residential on unless a direct run already works. |
{"keyword": "python","jobType": "HOURLY","experienceLevel": "Expert","hourlyMin": 30,"maxItems": 50,"monitorMode": true,"monitorStoreName": "upwork-python-watch"}
Output
Each dataset row is one public job card.
| Field | Description |
|---|---|
jobId | Upwork job id |
title | Job title |
description | Public description |
url | Job URL |
jobType | HOURLY or FIXED |
experienceLevel | Entry, Intermediate, or Expert |
hourlyMin / hourlyMax | Posted hourly range in USD, when the job is hourly |
fixedBudget | Posted fixed budget in USD, when the job is fixed-price |
durationLabel / durationWeeks | Engagement length |
skills | Skill labels |
postedAt | Publish time |
keyword | Search text that returned the row |
scrapedAt | Time this run saved the row |
{"jobId": "2107753753929570153","title": "Python automation for a weekly report","description": "Build a small Python job that pulls a spreadsheet and emails a summary.","url": "https://www.upwork.com/jobs/~022107753753929570153","jobType": "FIXED","experienceLevel": "Expert","hourlyMin": null,"hourlyMax": null,"fixedBudget": 150,"durationLabel": "1 to 3 months","durationWeeks": 9,"skills": ["Python", "Automation"],"postedAt": "2026-10-07T08:43:52.730Z","keyword": "python","scrapedAt": "2026-10-07T09:00:00Z"}
Use cases
- Watch a skill keyword and send new fixed-price or hourly jobs to a sheet
- Compare posted budgets for the same keyword over a week
- Feed titles, skills, and budgets into an assistant that drafts proposals
- Keep a baseline of seen ids, then schedule the Actor so later runs stay short
Integration examples
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('crawloop/upwork-jobs-scraper').call({keyword: 'python',maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.slice(0, 5));
Python
from apify_client import ApifyClientclient = ApifyClient(token)run = client.actor("crawloop/upwork-jobs-scraper").call(run_input={"keyword": "python","maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("title"), item.get("jobType"), item.get("fixedBudget"), item.get("url"))
cURL
curl "https://api.apify.com/v2/acts/crawloop~upwork-jobs-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keyword":"python","maxItems":50}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP. Connect your Apify account, then call crawloop/upwork-jobs-scraper.
Example prompts:
- "Run Upwork Jobs Scraper for python, max 50, and return title, jobType, fixedBudget, hourlyMin, skills, and url as JSON"
- "Monitor new Upwork logo design jobs with monitorMode on and monitorStoreName upwork-logo-watch"
- "Pull Upwork expert hourly jobs for React, then run Glassdoor Scraper for a company named in the description"
Suite next step
This Actor covers public Upwork job cards and a new-job monitor. For the same skill on public employment postings, run LinkedIn Jobs Scraper. When a description names an employer you want to research, run Glassdoor Scraper. For country job boards, continue with Seek Jobs Scraper or InfoJobs Job Scraper.
FAQ
Is this an official Upwork API? No. It reads the public visitor job search. You do not log in and you do not need Upwork developer credentials.
Can I paste a search URL?
Yes. startUrls reads the q parameter. Individual /jobs/~ pages are skipped.
What does monitor mode do?
Seen job ids are stored in a named Key-Value store. The first run is the baseline. Later scheduled runs save only ids that were not seen before, and stop when a newest-first page is already known. Use one monitorStoreName per watch.
Why is a residential proxy on? Datacenter addresses often receive a challenge page instead of the visitor token. Leave residential on. Turn it off only after a direct run succeeds.
Are client spend and proposal counts included? No. The anonymous search returns the job card: title, description, budget or hourly range, skills, experience, duration, and posted time.
Can I export JSON, CSV, or Excel? Yes. Every run writes a dataset you can download as JSON, CSV, or Excel, or pull with the Apify API.
Related Actors
| Actor | Focus |
|---|---|
| Upwork Jobs Scraper ◄── you are here | Freelance listings and a new-job monitor |
| LinkedIn Jobs Scraper | Public LinkedIn job listings |
| Seek Jobs Scraper | Australia and New Zealand jobs |
| InfoJobs Job Scraper | Spain jobs |
| Glassdoor Scraper | Employer reviews, salaries, and jobs |
| ZipRecruiter Jobs Scraper | United States jobs |