# Upwork Job Scraper via StableApify

> Upwork Job Scraper via StableApify is a paid API for AI agents from stableapify.dev, paid per call via x402, $0.01/call, status unknown (last checked 2026-09-15).

Starts an Apify actor run that scrapes Upwork job listings by username or custom filters, bypassing CAPTCHAs, and returns a run ID and token to fetch results.

## Facts

- Endpoint: POST https://stableapify.dev/api/actors/neatrat/upwork-job-scraper/call
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/upwork-job-scraper-via-stableapify-9e91d9b3
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_NNGAmy-nUXQr0m6-GxyHP

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability upwork-job-scraper-via-stableapify-9e91d9b3 -d '<json body>'
```

Example prompt: Scrape Upwork job listings for the user 'sarptecimer' — grab up to 200 jobs, skip emails, and use 1024 MB memory so I can analyze what kinds of gigs they're posting.

## When to prefer this

Choose this endpoint when you need to programmatically extract Upwork job listings at scale without being blocked by CAPTCHAs, especially when targeting a specific Upwork user's postings or applying custom filters. Prefer it over manual scraping or Upwork's official API (which has strict rate limits and no job-scraping support) when you need bulk data for lead generation, competitive analysis, or market research on freelance job trends.

## Known failure modes

- Invalid or nonexistent Upwork username returns empty dataset
- Insufficient memory setting causes actor run to fail or time out
- CAPTCHA or anti-bot measures updated on Upwork may temporarily break scraping
- maxItems too high combined with low memory causes out-of-memory errors
- Invalid token or payment failure returns 402 or 401 error
- Actor run starts (READY status) but may still fail during execution — check status before fetching results

## How this service works

Start the "Upwork Job Scraper" Apify actor (neatrat/upwork-job-scraper). Scrape Upwork jobs without limits 🌟 Bypass CAPTCHAs & apply custom filters.

Apify is retiring rental Actors, so pricing is changing. For many users around ~7…

## Output

Returns a run object with a unique run ID, status (READY), actor ID, start timestamp, estimated usage in USD, and a default dataset ID, plus a signed JWT token used to fetch the scraped job results from the dataset endpoint.

## Example request

```json
{
 "input": {
  "username": "sarptecimer",
  "includeEmail": false
 },
 "options": {
  "memory": 1024,
  "maxItems": 100
 }
}
```

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "page",
    "pagesToScrape",
    "perPage",
    "sort"
   ],
   "properties": {
    "page": {
     "type": "integer",
     "default": 1,
     "maximum": 9007199254740991,
     "minimum": 1,
     "description": "Page number to start scraping from"
    },
    "sort": {
     "enum": [
      "newest",
      "relevance"
     ],
     "type": "string",
     "default": "newest",
     "description": "How to sort the job listings"
    },
    "query": {
     "type": "string",
     "description": "Keywords to search for in Upwork jobs"
    },
    "rawUrl": {
     "type": "string",
     "description": "Directly use this Upwork search URL instead of constructing one (must be from upwork.com and include nx/search/jobs)"
    },
    "cookies": {
     "type": "object",
     "description": "Cookies to use for requests (useful for bypassing Upwork's protection)",
     "propertyNames": {
      "type": "string"
     },
     "additionalProperties": {}
    },
    "jobType": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Filter jobs by payment type"
    },
    "perPage": {
     "type": "integer",
     "default": 50,
     "maximum": 9007199254740991,
     "minimum": 10,
     "description": "Number of results to display per page"
    },
    "location": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Filter jobs by location (regions, subregions, or countries)"
    },
    "maxJobAge": {
     "type": "object",
     "description": "Filter out jobs older than this time",
     "propertyNames": {
      "type": "string"
     },
     "additionalProperties": {}
    },
    "clientHistory": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Filter by client hiring history"
    },
    "customFilters": {
     "type": "object",
     "description": "Custom filters to apply to job results",
     "propertyNames": {
      "type": "string"
     },
     "additionalProperties": {}
    },
    "pagesToScrape": {
     "type": "integer",
     "default": 1,
     "maximum": 9007199254740991,
     "minimum": 1,
     "description": "Number of pages to scrape sequentially starting from the specified page. Non-paying Apify users are limited to 5 total runs and 500 total results across all runs."
    },
    "experienceLevel": {
     "type": "array",
     "items": {
      "type": "string"
     },

… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/upwork-job-scraper-via-stableapify-9e91d9b3/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from stableapify.dev](https://www.zero.xyz/host/stableapify.dev/llms.txt)
