Upwork Jobs Scraper — Freelance Listings & Monitor avatar

Upwork Jobs Scraper — Freelance Listings & Monitor

Pricing

from $3.20 / 1,000 job listings

Go to Apify Store
Upwork Jobs Scraper — Freelance Listings & Monitor

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

Andrej Kiva

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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.

ActorFocus
Upwork Jobs Scraper ◄── you are hereFreelance listings and a new-job monitor
LinkedIn Jobs ScraperPublic LinkedIn job listings
Seek Jobs ScraperAustralia and New Zealand job cards
InfoJobs Job ScraperSpain jobs, contract, and EUR salary
APEC Jobs ScraperFrance cadre jobs
Stepstone Jobs ScraperDACH commercial job board
Arbeitsagentur Jobs ScraperGermany public Jobsuche
Glassdoor ScraperEmployer reviews, salaries, and jobs
Naukri Jobs ScraperIndia Naukri.com jobs
ZipRecruiter Jobs ScraperUnited 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

FieldRequiredDefaultDescription
keywordNo—Search text. Empty means the newest public jobs.
searchKeywordsNo—Extra keywords, each searched on its own.
startUrlsNo—Search URLs. The q parameter is the keyword.
jobTypeNoAnyHOURLY or FIXED.
experienceLevelNoAnyEntry, Intermediate, or Expert.
hourlyMin / hourlyMaxNo—USD hourly window.
fixedMin / fixedMaxNo—USD fixed-budget window.
maxItemsNo50Row cap across all keywords. 0 means no row cap.
maxPagesNo3Pages per keyword.
monitorModeNofalseSave only job ids not seen in the named store.
monitorStoreNameNoupwork-jobs-monitorOne name per watch.
resetMonitorStateNofalseClear seen ids before this run.
proxyConfigurationNoUS residentialLeave 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.

FieldDescription
jobIdUpwork job id
titleJob title
descriptionPublic description
urlJob URL
jobTypeHOURLY or FIXED
experienceLevelEntry, Intermediate, or Expert
hourlyMin / hourlyMaxPosted hourly range in USD, when the job is hourly
fixedBudgetPosted fixed budget in USD, when the job is fixed-price
durationLabel / durationWeeksEngagement length
skillsSkill labels
postedAtPublish time
keywordSearch text that returned the row
scrapedAtTime 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 ApifyClient
client = 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.

ActorFocus
Upwork Jobs Scraper ◄── you are hereFreelance listings and a new-job monitor
LinkedIn Jobs ScraperPublic LinkedIn job listings
Seek Jobs ScraperAustralia and New Zealand jobs
InfoJobs Job ScraperSpain jobs
Glassdoor ScraperEmployer reviews, salaries, and jobs
ZipRecruiter Jobs ScraperUnited States jobs