Upwork Jobs Scraper avatar

Upwork Jobs Scraper

Pricing

from $1.50 / 1,000 job scrapeds

Go to Apify Store
Upwork Jobs Scraper

Upwork Jobs Scraper

Scrape job listings from Upwork search results. Returns title, description, budget, skills, experience level, duration, and posting time. Bypasses Cloudflare automatically — no proxy needed.

Pricing

from $1.50 / 1,000 job scrapeds

Rating

5.0

(3)

Developer

Gio

Gio

Maintained by Community

Actor stats

0

Bookmarked

117

Total users

27

Monthly active users

2 days ago

Last modified

Share

Scrape Upwork job listings by keyword. No API key, no login, no proxy setup. Get structured Upwork job data plus client intelligence in one call.

Works with any search query (google ads, python developer, react, copywriter, anything Upwork supports). Bypasses Cloudflare automatically with a real browser fingerprint.

Why this scraper

Most Upwork scrapers stop at title + budget + skills. This one returns the client intelligence that actually determines whether a job is worth applying to:

  • Client country (filter by region)
  • Total client spend on Upwork (filter low-spenders out)
  • Payment verified status (skip unverified clients)
  • Number of proposals already submitted (skip saturated jobs)
  • Contract type and budget range
  • Full description text
  • Experience level required

Use it to feed a lead-scoring pipeline, automate proposal generation, or build a job alerting system that filters noise BEFORE sending you a notification.

Input

{
"query": "python developer",
"max_jobs": 50
}
FieldTypeRequiredDefaultNotes
querystringyesweb scrapingAny Upwork search keyword
max_jobsintegerno101 to 200. Pagination handled automatically.

Output fields

Each job returns the following structured fields:

FieldTypeDescriptionExample
jobIdstringUnique Upwork job ID (use for deduplication)022027586354497239213
titlestringJob titleSenior Google Ads Specialist
descriptionstringFull job descriptionLooking for an expert to manage...
contractTypestringContract type and rateHourly: $60.00 - $120.00
budgetstringBudget for fixed-price jobs$2,500.00
experienceLevelstringRequired experienceExpert, Intermediate, Entry
durationstringEstimated project duration3 to 6 months, < 30 hrs/week
postedOnstringTime since posting21 minutes ago
extraSkillsarrayRequired skills["Google Ads", "PPC"]
proposalsstringProposal count bucketLess than 5, 10 to 15, 20 to 50
clientCountrystringClient countryUnited States, Germany
clientTotalSpentstringLifetime spend on Upwork$50K+, $10K to $50K
clientVerifiedbooleanPayment method verifiedtrue
urlstringDirect link to the jobhttps://www.upwork.com/jobs/~022027...

Example output

{
"jobId": "022027586354497239213",
"title": "Meta + Google Ads help for established ecommerce brand",
"description": "Looking for someone who understands how to grow a real brand without burning money. We've been on Shopify for 4 years and need...",
"contractType": "Hourly: $60.00 - $120.00",
"budget": "$60.00 - $120.00",
"experienceLevel": "Expert",
"duration": "More than 6 months, Less than 30 hrs/week",
"postedOn": "13 hours ago",
"extraSkills": ["Google Ads", "PPC Campaign Setup & Management", "Pay Per Click Advertising"],
"proposals": "10 to 15",
"clientCountry": "United States",
"clientTotalSpent": "$50K+",
"clientVerified": true,
"url": "https://www.upwork.com/jobs/~022027586354497239213"
}

Use cases

Freelancers

Monitor new Upwork postings matching your skills. Filter on clientTotalSpent and clientVerified so you only apply to clients who actually pay. Apply before competitors fill the proposal queue (proposals field).

AI proposal pipelines

Feed each job into a Claude or GPT prompt that scores fit, drafts a tailored proposal, and queues it for review. The full description plus client data gives the LLM what it needs.

Lead generation

Search for companies hiring services you offer. Filter on clientCountry and clientTotalSpent to identify accounts worth direct outreach.

Market intelligence

Track demand trends for specific skills, budget ranges, or geographies. Run daily, push to BigQuery or a Google Sheet, watch what changes.

Automation with n8n / Make / Zapier

  1. HTTP Request node: POST https://api.apify.com/v2/acts/gio21~upwork-jobs-scraper/run-sync-get-dataset-items
  2. Headers: Authorization: Bearer <YOUR_APIFY_TOKEN>
  3. Body: {"query": "your keyword", "max_jobs": 50}
  4. Use the jobId field to dedupe against a Google Sheet or database.
  5. Branch by clientCountry, experienceLevel, or proposals to filter ruthlessly.
  6. Send matched jobs to Slack, Telegram, or an LLM proposal-draft step.

The actor supports synchronous calls that return the dataset directly. No polling needed.

Pricing

$1.50 per 1,000 jobs scraped (live).

JobsCost
10$0.015
100$0.15
1,000$1.50
10,000$15.00

Pay only for jobs returned. Subscription-tier discounts (down to $1.00 per 1,000 for higher Apify plans) roll out June 11, 2026.

FAQ

How fresh are the results? Each run hits Upwork in real time and returns jobs as Upwork displays them. Newest jobs first.

Can I filter by location, hourly rate, or category? Use the query field. Upwork supports search operators like "python developer location:United States" or "react budget:$1000+". Anything you can type in Upwork's search bar works here.

Does it handle Cloudflare? Yes. Uses a real browser fingerprint, no manual proxy setup required.

Does it require an Upwork login? No. All returned fields work without authentication.

What if a field is empty? Some Upwork postings genuinely lack a field (older fixed-price jobs without budget, brand-new clients without spend history). Those fields will be null on the affected rows. Title, jobId, description and url are always populated for valid jobs.

Can I deduplicate runs? Yes. The jobId is the canonical Upwork ID. Store it in your DB or sheet and skip duplicates on subsequent runs.

How do I increase max_jobs above the default? Bump the input value up to 200 per run. For more than 200, schedule multiple runs with different keywords.

Limitations

  • Cloudflare changes: Upwork can update bot detection. If results stop coming back, open an issue and we patch within hours.
  • Rate limit: One concurrent run per query is the safe ceiling. Two-plus parallel runs on the same query can trigger temporary IP blocks.
  • No saved-job sync: The actor reads from Upwork search, not your personal saved jobs.

Built with

Support

Found a bug or want a missing field? Open an issue on the Apify Store page or message us via the Apify community. Average response time: under 24 hours.