Upwork Job Scraper avatar
Upwork Job Scraper

Pricing

$29.00/month + usage

Go to Store
Upwork Job Scraper

Upwork Job Scraper

Developed by

Runtime

Runtime

Maintained by Community

Upwork Job Scraper is an Apify actor that extracts job listings from Upwork based on keywords. It outputs structured data (title, budget, client info) in JSON/CSV for easy analysis.

5.0 (1)

Pricing

$29.00/month + usage

1

Total users

14

Monthly users

11

Runs succeeded

98%

Last modified

4 days ago

You can access the Upwork Job Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in Integrations settings in Apify Console.

{
"openapi": "3.0.1",
"info": {
"version": "0.9",
"x-build-id": "cEnSsH80xy1flAnOR"
},
"servers": [
{
"url": "https://api.apify.com/v2"
}
],
"paths": {
"/acts/runtime~upwork-job-scraper/run-sync-get-dataset-items": {
"post": {
"operationId": "run-sync-get-dataset-items-runtime-upwork-job-scraper",
"x-openai-isConsequential": false,
"summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
"tags": [
"Run Actor"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inputSchema"
}
}
}
},
"parameters": [
{
"name": "token",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "Enter your Apify token here"
}
],
"responses": {
"200": {
"description": "OK"
}
}
}
},
"/acts/runtime~upwork-job-scraper/runs": {
"post": {
"operationId": "runs-sync-runtime-upwork-job-scraper",
"x-openai-isConsequential": false,
"summary": "Executes an Actor and returns information about the initiated run in response.",
"tags": [
"Run Actor"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inputSchema"
}
}
}
},
"parameters": [
{
"name": "token",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "Enter your Apify token here"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/runsResponseSchema"
}
}
}
}
}
}
},
"/acts/runtime~upwork-job-scraper/run-sync": {
"post": {
"operationId": "run-sync-runtime-upwork-job-scraper",
"x-openai-isConsequential": false,
"summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
"tags": [
"Run Actor"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inputSchema"
}
}
}
},
"parameters": [
{
"name": "token",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "Enter your Apify token here"
}
],
"responses": {
"200": {
"description": "OK"
}
}
}
}
},
"components": {
"schemas": {
"inputSchema": {
"type": "object",
"properties": {
"searchQuery": {
"title": "Search Query",
"type": "string",
"description": "Keywords to search for on Upwork (e.g., job title, skills)",
"default": "vuejs"
},
"page": {
"title": "Page Number",
"type": "integer",
"description": "The page number to scrape on Upwork",
"default": 1
},
"useEnhancedCrawler": {
"title": "Use Enhanced Anti-Detection System",
"type": "boolean",
"description": "Use the advanced Upwork challenge bypass system (recommended for 403 errors)",
"default": true
},
"tlsFingerprintEvasion": {
"title": "Enable TLS Fingerprint Evasion",
"type": "boolean",
"description": "Use advanced TLS fingerprinting evasion to bypass Upwork's security (requires Enhanced Crawler)",
"default": true
},
"customHeaderOrder": {
"title": "Randomize HTTP Header Order",
"type": "boolean",
"description": "Randomize HTTP header order to evade fingerprinting detection (requires Enhanced Crawler)",
"default": true
},
"useApifyProxy": {
"title": "Use Apify Proxy",
"type": "boolean",
"description": "Whether to use Apify Proxy",
"default": true
},
"maxConcurrency": {
"title": "Max Concurrency",
"minimum": 1,
"maximum": 10,
"type": "integer",
"description": "Maximum number of concurrent requests (lower is safer)",
"default": 1
},
"maxRetries": {
"title": "Max Retries",
"minimum": 1,
"maximum": 10,
"type": "integer",
"description": "Maximum number of retries per request",
"default": 3
},
"upworkUsername": {
"title": "Upwork Username",
"type": "string",
"description": "Optional: Your Upwork username for authenticated access (recommended to bypass 403 errors)"
},
"upworkPassword": {
"title": "Upwork Password",
"type": "string",
"description": "Optional: Your Upwork password for authenticated access"
},
"captchaApiKey": {
"title": "2Captcha API Key",
"type": "string",
"description": "Optional: Your 2Captcha API key to solve CAPTCHAs automatically (https://2captcha.com/)"
},
"sessionRotationCount": {
"title": "Session Rotation Count",
"minimum": 1,
"maximum": 10,
"type": "integer",
"description": "Number of browser sessions to rotate through (helps avoid detection)",
"default": 3
},
"minDelayBetweenRequests": {
"title": "Min Delay Between Requests (seconds)",
"minimum": 5,
"maximum": 120,
"type": "integer",
"description": "Minimum delay in seconds between requests (higher values reduce blocking)",
"default": 15
},
"maxDelayBetweenRequests": {
"title": "Max Delay Between Requests (seconds)",
"minimum": 10,
"maximum": 180,
"type": "integer",
"description": "Maximum delay in seconds between requests (higher values reduce blocking)",
"default": 45
},
"sessionCooldownMinutes": {
"title": "Session Cooldown Minutes",
"minimum": 5,
"maximum": 120,
"type": "integer",
"description": "Time in minutes to rest a session after multiple uses",
"default": 30
},
"proxyRotationEnabled": {
"title": "Enable Proxy Rotation",
"type": "boolean",
"description": "Whether to rotate proxies during the session (helps prevent IP-based blocking)",
"default": true
},
"proxyRotationRequests": {
"title": "Requests Per Proxy",
"minimum": 1,
"maximum": 10,
"type": "integer",
"description": "Number of requests before rotating to a new proxy",
"default": 3
},
"simulateBrowserHistory": {
"title": "Simulate Browser History",
"type": "boolean",
"description": "Whether to simulate browser history and cache for a more authentic profile",
"default": true
},
"randomizeTimezone": {
"title": "Randomize Browser Timezone",
"type": "boolean",
"description": "Whether to randomize timezone and locale settings per session",
"default": true
},
"useNewHeadless": {
"title": "Use New Headless Mode",
"type": "boolean",
"description": "Use Chrome's new headless mode which is less detectable than the old mode",
"default": true
},
"useRealProfiles": {
"title": "Use Real Browser Profiles",
"type": "boolean",
"description": "Use real Chrome profiles with history and extensions (better anti-detection)",
"default": true
},
"useCloudScraper": {
"title": "Use CloudScraper",
"type": "boolean",
"description": "Use CloudScraper to bypass Cloudflare protection (fallback method)",
"default": true
},
"simulateExtensions": {
"title": "Simulate Browser Extensions",
"type": "boolean",
"description": "Simulate common browser extensions to appear more like a real user",
"default": true
},
"useFallbackHtmlParser": {
"title": "Use Direct HTML Parser Fallback",
"type": "boolean",
"description": "When browser approach fails, try to extract data directly from HTML (last resort)",
"default": true
},
"disableWebSecurity": {
"title": "Disable Web Security",
"type": "boolean",
"description": "Disable browser web security features (CORS, etc.) to bypass some protections",
"default": false
},
"bypassCSP": {
"title": "Bypass Content Security Policy",
"type": "boolean",
"description": "Bypass website Content Security Policy restrictions",
"default": false
},
"proxyConfiguration": {
"title": "Proxy configuration",
"type": "object",
"description": "Choose to use no proxy, Apify Proxy, or provide custom proxy URLs.",
"default": {}
}
}
},
"runsResponseSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"actId": {
"type": "string"
},
"userId": {
"type": "string"
},
"startedAt": {
"type": "string",
"format": "date-time",
"example": "2025-01-08T00:00:00.000Z"
},
"finishedAt": {
"type": "string",
"format": "date-time",
"example": "2025-01-08T00:00:00.000Z"
},
"status": {
"type": "string",
"example": "READY"
},
"meta": {
"type": "object",
"properties": {
"origin": {
"type": "string",
"example": "API"
},
"userAgent": {
"type": "string"
}
}
},
"stats": {
"type": "object",
"properties": {
"inputBodyLen": {
"type": "integer",
"example": 2000
},
"rebootCount": {
"type": "integer",
"example": 0
},
"restartCount": {
"type": "integer",
"example": 0
},
"resurrectCount": {
"type": "integer",
"example": 0
},
"computeUnits": {
"type": "integer",
"example": 0
}
}
},
"options": {
"type": "object",
"properties": {
"build": {
"type": "string",
"example": "latest"
},
"timeoutSecs": {
"type": "integer",
"example": 300
},
"memoryMbytes": {
"type": "integer",
"example": 1024
},
"diskMbytes": {
"type": "integer",
"example": 2048
}
}
},
"buildId": {
"type": "string"
},
"defaultKeyValueStoreId": {
"type": "string"
},
"defaultDatasetId": {
"type": "string"
},
"defaultRequestQueueId": {
"type": "string"
},
"buildNumber": {
"type": "string",
"example": "1.0.0"
},
"containerUrl": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"ACTOR_COMPUTE_UNITS": {
"type": "integer",
"example": 0
},
"DATASET_READS": {
"type": "integer",
"example": 0
},
"DATASET_WRITES": {
"type": "integer",
"example": 0
},
"KEY_VALUE_STORE_READS": {
"type": "integer",
"example": 0
},
"KEY_VALUE_STORE_WRITES": {
"type": "integer",
"example": 1
},
"KEY_VALUE_STORE_LISTS": {
"type": "integer",
"example": 0
},
"REQUEST_QUEUE_READS": {
"type": "integer",
"example": 0
},
"REQUEST_QUEUE_WRITES": {
"type": "integer",
"example": 0
},
"DATA_TRANSFER_INTERNAL_GBYTES": {
"type": "integer",
"example": 0
},
"DATA_TRANSFER_EXTERNAL_GBYTES": {
"type": "integer",
"example": 0
},
"PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
"type": "integer",
"example": 0
},
"PROXY_SERPS": {
"type": "integer",
"example": 0
}
}
},
"usageTotalUsd": {
"type": "number",
"example": 0.00005
},
"usageUsd": {
"type": "object",
"properties": {
"ACTOR_COMPUTE_UNITS": {
"type": "integer",
"example": 0
},
"DATASET_READS": {
"type": "integer",
"example": 0
},
"DATASET_WRITES": {
"type": "integer",
"example": 0
},
"KEY_VALUE_STORE_READS": {
"type": "integer",
"example": 0
},
"KEY_VALUE_STORE_WRITES": {
"type": "number",
"example": 0.00005
},
"KEY_VALUE_STORE_LISTS": {
"type": "integer",
"example": 0
},
"REQUEST_QUEUE_READS": {
"type": "integer",
"example": 0
},
"REQUEST_QUEUE_WRITES": {
"type": "integer",
"example": 0
},
"DATA_TRANSFER_INTERNAL_GBYTES": {
"type": "integer",
"example": 0
},
"DATA_TRANSFER_EXTERNAL_GBYTES": {
"type": "integer",
"example": 0
},
"PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
"type": "integer",
"example": 0
},
"PROXY_SERPS": {
"type": "integer",
"example": 0
}
}
}
}
}
}
}
}
}
}

Upwork Job Scraper OpenAPI definition

OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.

OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.

By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.

You can download the OpenAPI definitions for Upwork Job Scraper from the options below:

If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.

You can also check out our other API clients: