Upwork Jobs Scraper
Pricing
from $1.23 / 1,000 job saveds
Upwork Jobs Scraper
Export public Upwork jobs with descriptions, budgets, skills and visible client details. Filter and download matching freelance opportunities.
Upwork Jobs Scraper
Pricing
from $1.23 / 1,000 job saveds
Export public Upwork jobs with descriptions, budgets, skills and visible client details. Filter and download matching freelance opportunities.
You can access the Upwork Jobs 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 API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "0.1", "x-build-id": "a2dB3fUbcj5gsvpjL" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/fetch_cat~upwork-jobs-scraper/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-fetch_cat-upwork-jobs-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/fetch_cat~upwork-jobs-scraper/runs": { "post": { "operationId": "runs-sync-fetch_cat-upwork-jobs-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/fetch_cat~upwork-jobs-scraper/run-sync": { "post": { "operationId": "run-sync-fetch_cat-upwork-jobs-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": { "query": { "title": "Search query", "type": "string", "description": "Words or Upwork search operators. Defaults to web scraping when neither query nor searchUrl is supplied." }, "searchUrl": { "title": "Public Upwork search URL", "type": "string", "description": "Optional https://www.upwork.com/nx/search/jobs/?q=... URL. Supports q and sort; use dedicated inputs for filters. Leave query blank when using this field." }, "maxItems": { "title": "Maximum saved jobs", "minimum": 1, "maximum": 1000, "type": "integer", "description": "Stop after this many unique matching jobs. Public previews with restricted details count as jobs.", "default": 50 }, "pageSize": { "title": "Jobs requested per page", "minimum": 1, "maximum": 50, "type": "integer", "description": "1–50. Smaller pages can reduce unused search results in small runs.", "default": 50 }, "maxPages": { "title": "Maximum search pages", "minimum": 1, "maximum": 100, "type": "integer", "description": "Bounds scanning when filters are narrow. Hitting this limit is reported as partial coverage.", "default": 20 }, "sort": { "title": "Search order", "enum": [ "newest", "relevance" ], "type": "string", "description": "Newest publication first or Upwork relevance.", "default": "newest" }, "postedSince": { "title": "Published on or after", "type": "string", "description": "ISO date or timezone-qualified timestamp; compared with the source publication time." }, "jobType": { "title": "Job type", "enum": [ "FIXED", "HOURLY" ], "type": "string", "description": "Keep fixed-price or hourly jobs." }, "experienceLevel": { "title": "Experience level", "enum": [ "ENTRY_LEVEL", "INTERMEDIATE", "EXPERT" ], "type": "string", "description": "Keep the requested source experience level." }, "category": { "title": "Category name or slug", "type": "string", "description": "Match an exact public category or category-group name/slug, case-insensitively. Requires details." }, "clientCountry": { "title": "Client country", "type": "string", "description": "Exact source country name, case-insensitive, such as Canada. This is the hiring client location, not the proxy or applicant location." }, "remoteOnly": { "title": "Explicitly remote jobs only", "type": "boolean", "description": "Require the source to explicitly label REMOTE. Unspecified arrangements are excluded; Upwork often leaves this field unspecified. Requires details.", "default": false }, "paymentVerifiedOnly": { "title": "Verified-payment clients only", "type": "boolean", "description": "Require a public true payment-verification value. Missing/restricted values do not match.", "default": false }, "includeDetails": { "title": "Include public job and client details", "type": "boolean", "description": "Default true. Retrieve full public description, category, client facts and activity. Account-restricted jobs retain their public preview with detailStatus=restricted.", "default": true }, "failOnBlocked": { "title": "Fail on incomplete extraction", "type": "boolean", "description": "Fail on source blocks, unexpected errors or scan limits, while preserving saved jobs. False permits an explicitly partial run. Zero-row blocks always fail.", "default": true }, "requestTimeoutSecs": { "title": "Request timeout in seconds", "minimum": 5, "maximum": 60, "type": "integer", "description": "Maximum time for one public request, capped by the shared runtime deadline.", "default": 20 }, "maxRunSeconds": { "title": "Total runtime budget", "minimum": 60, "maximum": 3600, "type": "integer", "description": "Includes a shutdown reserve of at least30seconds and10percent. Increase for many jobs or restrictive filters.", "default": 600 }, "maxSessionAttempts": { "title": "Maximum session attempts per operation", "minimum": 1, "maximum": 5, "type": "integer", "description": "Bounded retry count for guest bootstrap, network failures and HTTP blocks. Account restrictions are not retried.", "default": 3 }, "proxyConfiguration": { "title": "Apify proxy configuration", "type": "object", "description": "Automatic US datacenter selection is tried first. If a session fails, the remaining bounded attempts use Apify residential proxies. Explicit proxy groups are respected. No external proxy credentials are accepted.", "default": { "useApifyProxy": true, "apifyProxyGroups": [], "apifyProxyCountry": "US" } }, "hourlyRateMin": { "title": "Minimum hourly rate", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "hourlyRateMax": { "title": "Maximum hourly rate", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "fixedBudgetMin": { "title": "Minimum fixed budget", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "fixedBudgetMax": { "title": "Maximum fixed budget", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "minClientSpend": { "title": "Minimum public client spend", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "minClientRating": { "title": "Minimum client rating", "minimum": 0, "maximum": 5, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "maxProposals": { "title": "Maximum proposal count", "minimum": 0, "type": "number", "description": "Local filter on the corresponding public source value; unavailable values do not match." }, "includeKeywords": { "title": "Description/title must include all", "type": "array", "description": "Case-insensitive text filters applied to the full public detail when available, otherwise to the public preview.", "items": { "type": "string" }, "default": [] }, "excludeKeywords": { "title": "Description/title must exclude all", "type": "array", "description": "Case-insensitive text filters applied to the full public detail when available, otherwise to the public preview.", "items": { "type": "string" }, "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 } } } } } } } } }}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 Jobs 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: