{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Job Scraper",
    "description": "Scrape recent and relevant Upwork.com jobs, filter and only pay for what you need. Unauthed runs = no ban risk.",
    "version": "3.0",
    "x-build-id": "2KGZFhdihi2me1OlD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/matthewjames~upwork-job-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-matthewjames-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/matthewjames~upwork-job-scraper/runs": {
      "post": {
        "operationId": "runs-sync-matthewjames-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/matthewjames~upwork-job-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-matthewjames-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",
            "maxLength": 16384,
            "type": "string",
            "description": "Use Upwork search keywords, phrases, or AND / OR / NOT expressions. Example: (n8n OR zapier) NOT wordpress. A Custom Search URL takes priority."
          },
          "startUrls": {
            "title": "Custom Search URL (Overrides search filters)",
            "pattern": "^(?:[hH][tT][tT][pP][sS]://[wW][wW][wW]\\.[uU][pP][wW][oO][rR][kK]\\.[cC][oO][mM](?::443)?/nx/(?:search/jobs|s/universal-search/jobs)(?:/(?!(?:\\.|%2[eE]){1,2}(?:/|[?#]|$))[^/?#\\s\\\\]*)*(?:\\?[^#\\s\\\\]*)?(?:#[^\\s\\\\]*)?)?$(?![\\s\\S])",
            "maxLength": 16384,
            "type": "string",
            "description": "Paste one Upwork job-search URL. It replaces the query and all native search filters in the form, including countries and payment verification. Job age and result limits still apply. Unsupported URL filters are rejected. Each page requests 50 jobs."
          },
          "maxResults": {
            "title": "Maximum Results",
            "minimum": 0,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Maximum number of distinct jobs to save. 0 means no result cap. Job age, page limits, and spending limits still apply. Upwork may have fewer jobs available.",
            "default": 0
          },
          "scrapePages": {
            "title": "Pages to Scrape",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Maximum number of search pages to fetch. Each page requests 50 jobs; Upwork may return fewer. Result and spending limits can stop the run earlier. With Maximum Job Age enabled, two consecutive pages with no jobs within that age also stop the run.",
            "default": 1
          },
          "sortOrder": {
            "title": "Sort Order",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Leave empty for the existing most-recent order. A Custom Search URL overrides this control. Existing sort JSON inputs retain precedence. No oldest-first order is supported."
          },
          "authorizationHeader": {
            "title": "Authorization Header (recommended)",
            "type": "string",
            "description": "Paste the authorization header from your logged-in Upwork session, with or without the Bearer prefix. Treat it as a password. Tokens can expire and need renewal for scheduled runs. If Upwork rejects the token during search, the run stops without trying cookies or standard results."
          },
          "cookies": {
            "title": "Cookies (alternative)",
            "maxItems": 256,
            "type": "array",
            "description": "Export the full cookies from your signed-in Upwork session as a JSON array. Expired cookies can fall back to visitor access when your chosen filters support it. Authentication-only searches stop instead."
          },
          "paymentType": {
            "title": "Job Type",
            "enum": [
              "hourly",
              "fixed"
            ],
            "type": "string",
            "description": "Leave empty for either payment type. A Custom Search URL overrides this control. Existing jobType JSON inputs retain precedence over this control."
          },
          "experienceLevel": {
            "title": "Experience Level",
            "maxItems": 256,
            "type": "array",
            "description": "Select the experience levels of the jobs.",
            "items": {
              "type": "string",
              "enum": [
                "Entry Level",
                "Intermediate",
                "Expert"
              ]
            }
          },
          "hoursPerWeek": {
            "title": "Hours Per Week",
            "maxItems": 256,
            "type": "array",
            "description": "Select hours per week options.",
            "items": {
              "type": "string",
              "enum": [
                "Less than 30 hrs/week",
                "More than 30 hrs/week"
              ]
            }
          },
          "projectLength": {
            "title": "Project Length",
            "maxItems": 256,
            "type": "array",
            "description": "Ask Upwork for jobs with these project lengths. Upwork applies its own matching rules. A Custom Search URL overrides this control.",
            "items": {
              "type": "string",
              "enum": [
                "Less than one month",
                "1 to 3 months",
                "3 to 6 months",
                "More than 6 months"
              ]
            }
          },
          "contractToHire": {
            "title": "Contract-to-Hire Only",
            "type": "boolean",
            "description": "Ask Upwork for jobs that may lead to a full-time hire. False disables this filter. A Custom Search URL overrides this control.",
            "default": false
          },
          "workload": {
            "title": "Exact Hourly Workload",
            "pattern": "^(?:as_needed|part_time|full_time)?$",
            "type": "string",
            "description": "Legacy JSON control for exact hourly workload. Use Hours Per Week in the form. If both are set, the choices must agree. A Custom Search URL overrides this field."
          },
          "hourlyJobTypeMin": {
            "title": "Min Hourly Rate ($)",
            "minimum": 0,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Enter the minimum hourly rate."
          },
          "hourlyJobTypeMax": {
            "title": "Max Hourly Rate ($)",
            "minimum": 0,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Enter the maximum hourly rate."
          },
          "fixedPriceJobTypeMin": {
            "title": "Min Fixed Price ($)",
            "minimum": 0,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Enter the minimum fixed price."
          },
          "fixedPriceJobTypeMax": {
            "title": "Max Fixed Price ($)",
            "minimum": 0,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Enter the maximum fixed price."
          },
          "maxJobAgeHours": {
            "title": "Maximum Job Age (hours)",
            "minimum": 0,
            "maximum": 2501999792.9836087,
            "type": "number",
            "description": "Save jobs posted within this many hours before the run starts. 24 means one day; 0.5 means 30 minutes; 0 turns this option off. Check jobs up to your page limit, stopping after two consecutive pages with no jobs within this age. A page with any matching job resets that count, even if the job is a duplicate. This saves requests but may miss fresh jobs on later pages. Jobs without a usable posting time are excluded. The cutoff does not move, and retries do not reset the count.",
            "default": 0
          },
          "clientCountries": {
            "title": "Client Countries (include)",
            "maxItems": 256,
            "type": "array",
            "description": "Ask Upwork for jobs from clients in these countries. Leave empty for any country. A Custom Search URL overrides this selection. Country codes are also accepted in JSON.",
            "items": {
              "type": "string",
              "enum": [
                "Argentina",
                "Australia",
                "Austria",
                "Brazil",
                "Canada",
                "Cayman Islands",
                "China",
                "Cyprus",
                "Czechia",
                "Dominican Republic",
                "Egypt",
                "Estonia",
                "Ethiopia",
                "France",
                "Germany",
                "Gibraltar",
                "Greece",
                "Hungary",
                "India",
                "Israel",
                "Italy",
                "Jamaica",
                "Japan",
                "Jordan",
                "Kenya",
                "Kuwait",
                "Kyrgyzstan",
                "Lebanon",
                "Liechtenstein",
                "Luxembourg",
                "Malaysia",
                "Mauritius",
                "Mayotte",
                "Mexico",
                "Morocco",
                "Netherlands",
                "New Zealand",
                "Nigeria",
                "Norway",
                "Pakistan",
                "Philippines",
                "Poland",
                "Portugal",
                "Romania",
                "Saudi Arabia",
                "Serbia",
                "Slovenia",
                "South Africa",
                "South Korea",
                "Spain",
                "Switzerland",
                "Thailand",
                "Türkiye",
                "Ukraine",
                "United Arab Emirates",
                "United Kingdom",
                "United States",
                "Vietnam"
              ]
            }
          },
          "clientHires": {
            "title": "Client Hiring History",
            "enum": [
              "0",
              "1-9",
              "10-"
            ],
            "type": "string",
            "description": "Ask Upwork for clients with this hiring history. Leave empty for any history. A Custom Search URL overrides this control."
          },
          "verifiedPaymentOnly": {
            "title": "Payment-Verified Clients Only",
            "type": "boolean",
            "description": "Ask Upwork to return only jobs from clients with a verified payment method. False disables this filter. Requires valid authentication. A Custom Search URL overrides this setting.",
            "default": false
          },
          "proposalRange": {
            "title": "Proposal Range",
            "enum": [
              "0-4",
              "5-9",
              "10-14",
              "15-19",
              "20-49"
            ],
            "type": "string",
            "description": "Ask Upwork for jobs in this proposal-count band. Leave empty for any count. This is Upwork's native range, not an exact maximum. A Custom Search URL overrides this control. Requires valid Upwork authentication."
          },
          "paidEnrichment": {
            "title": "Add Extra Details (optional add-on)",
            "type": "boolean",
            "description": "Add available client history, job requirements, screening questions, and hiring activity to each job. Requires your Upwork Authorization Header or Cookies. Check this Actor's Pricing: if an enrichment fee is listed, each saved job with usable Extra Details has that additional fee. While no enrichment fee is configured, details are included without an add-on charge. Standard result and other listed charges still apply. Unavailable details have no enrichment fee. Leave off for the standard 16 fields.",
            "default": false
          },
          "enrichDetails": {
            "title": "Enrich With Details",
            "type": "boolean",
            "description": "Legacy input retained for saved tasks. This setting no longer enables enrichment or authorizes a charge. Use Add Extra Details to opt in. The paidEnrichment setting takes precedence."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Select which proxies to use. Supports custom proxy urls.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "startUrl": {
            "title": "Custom Search URL (startUrl legacy alias)",
            "pattern": "^(?:[hH][tT][tT][pP][sS]://[wW][wW][wW]\\.[uU][pP][wW][oO][rR][kK]\\.[cC][oO][mM](?::443)?/nx/(?:search/jobs|s/universal-search/jobs)(?:/(?!(?:\\.|%2[eE]){1,2}(?:/|[?#]|$))[^/?#\\s\\\\]*)*(?:\\?[^#\\s\\\\]*)?(?:#[^\\s\\\\]*)?)?$(?![\\s\\S])",
            "maxLength": 16384,
            "type": "string",
            "description": "Legacy JSON alias for Custom Search URL. Use a supported HTTPS Upwork job-search URL."
          },
          "rawSearchUrl": {
            "title": "Custom Search URL (rawSearchUrl legacy alias)",
            "pattern": "^(?:[hH][tT][tT][pP][sS]://[wW][wW][wW]\\.[uU][pP][wW][oO][rR][kK]\\.[cC][oO][mM](?::443)?/nx/(?:search/jobs|s/universal-search/jobs)(?:/(?!(?:\\.|%2[eE]){1,2}(?:/|[?#]|$))[^/?#\\s\\\\]*)*(?:\\?[^#\\s\\\\]*)?(?:#[^\\s\\\\]*)?)?$(?![\\s\\S])",
            "maxLength": 16384,
            "type": "string",
            "description": "Legacy JSON alias for Custom Search URL. Use a supported HTTPS Upwork job-search URL."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}