Upwork Jobs Search Scraper avatar

Upwork Jobs Search Scraper

Under maintenance

Pricing

from $2.99 / 1,000 upwork freelance projects

Go to Apify Store
Upwork Jobs Search Scraper

Upwork Jobs Search Scraper

Under maintenance

Scrape freelance and contract job listings from Upwork. Extract job titles, client info, budget ranges, skills required, experience levels, and project types for freelance marketplace analysis and recruitment.

Pricing

from $2.99 / 1,000 upwork freelance projects

Rating

0.0

(0)

Developer

Jobs API

Jobs API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

8 days ago

Last modified

Share

What does Upwork Jobs Search Scraper do?

Upwork Jobs Search Scraper currently performs a bounded public-access probe against Upwork job search. It is not presently a working Upwork jobs API alternative: Upwork returns a Cloudflare security challenge before public listing content is available in the tested environments, so the Actor stops honestly and emits no fabricated records.

The Actor supports search, single-URL, and multiple-URL probe modes. It records the exact status, final URL, request count, runtime, and failure reason in the default key-value store.

Why use this Upwork access probe?

  • Confirm whether public Upwork job pages are reachable from a particular Actor environment.
  • Capture machine-readable evidence of HTTP challenges or transport failures.
  • Detect access-policy changes without mixing diagnostics into a jobs dataset.
  • Schedule bounded checks, call them through the Apify API, and monitor failures in Apify Console.
  • Avoid misleading fallback data from search indexes, cached snippets, or fabricated jobs.

This implementation does not use authenticated pages, browser fingerprinting, CAPTCHA solving, cookies, external search indexes, private APIs, or access-control bypasses.

What data can the Actor extract?

When Upwork blocks the request, the dataset remains empty by design. These run-state fields are still available:

Storage/keyTypeDescription
RUN_SUMMARY.statusstringHonest blocked status.
RUN_SUMMARY.requestsintegerCount of attempted public HTTPS requests.
RUN_SUMMARY.failureReasonstringChallenge, HTTP, timeout, or parser limitation.
RUN_SUMMARY.runtimeMsintegerEnd-to-end probe duration.
RUN_DIAGNOSTICS.itemsarrayPer-target URL, status/final URL when available, and reason.
datasetarrayEmpty unless a future implementation can verify rich public job records.

The dormant dataset schema requires a canonical Upwork job URL, rich description, and positive verification evidence. The current code deliberately has no parser/emission path because live public HTML is unavailable for responsible implementation and validation.

How to probe Upwork jobs

  1. Open the Actor input tab in Apify Console.
  2. Choose search, single, or multiple.
  3. For search, enter keywords or an exact public /nx/search/jobs/ URL.
  4. For direct modes, provide real Upwork job URLs containing a ~jobId.
  5. Keep maxRequests small and choose a practical timeout.
  6. Start the Actor and inspect RUN_SUMMARY and RUN_DIAGNOSTICS.
  7. Treat a failed run with explicit diagnostics as the expected result while the target security boundary remains active.

How much will it cost to probe Upwork?

A probe makes only bounded native HTTPS requests and uses no browser, so compute usage is small. Actual cost depends on your Apify plan, memory, timeout, and current platform pricing. A single search target with a 30-second timeout is the recommended baseline. Failed target access still consumes the request and runtime used to establish that failure.

Input

See the input tab for full configuration options.

{
"mode": "search",
"query": "software engineer",
"maxItems": 3,
"maxRequests": 5,
"requestTimeoutSecs": 30
}

maxItems limits direct targets, maxRequests is a hard request budget, and requestDelayMs applies between sequential direct probes. A custom search URL must use the exact Upwork /nx/search/jobs/ path.

Output

You can download a non-empty dataset in formats such as JSON, HTML, CSV, or Excel if a future verified parser is implemented. Under the current boundary, the dataset is empty and the useful output is:

{
"actorName": "upwork-jobs-search-scraper",
"mode": "search",
"requests": 1,
"recordsEmitted": 0,
"status": "blocked",
"failureReason": "Upwork public access blocked by the target security layer: HTTP 403 (Challenge - Upwork).",
"runtimeMs": 121
}

A corresponding diagnostic contains the probed URL, HTTP status, final URL, and challenge reason. Diagnostics are never represented as job records.

Tips and advanced options

  • Use one search request first; increasing limits does not solve a target security challenge.
  • Do not treat a generic /freelance-jobs/apply/<category>/ path as a job detail URL; valid direct URLs contain a ~jobId.
  • Inspect both summary and diagnostics before retrying.
  • Avoid repeated schedules while every run receives the same challenge.
  • Do not supply login cookies or private credentials.

Local development

npm ci --no-audit --no-fund
npm run check
npm test
apify validate-schema
apify run --purge --input-file INPUT.json
npm run validate

A non-zero Actor exit is expected for a blocked target. Local storage remains under storage/ and is not uploaded to Apify Console.

FAQ, disclaimers, and support

Why is there no job dataset?

The tested public endpoint returns a Cloudflare challenge before listing data. Emitting cached, indexed, or invented rows would misrepresent source verification, so this Actor emits zero jobs.

Can I provide cookies or use a CAPTCHA solver?

No. This Actor is limited to ordinary unauthenticated public HTTPS and does not accept session material or bypass controls.

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Respect Upwork's terms, robots guidance, rate limits, and security controls. For programmatic access, see the Actor API tab. For support, use the Issues tab with a redacted input and run ID.