{
  "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": "e86StHUfdsluZB3Mf"
  },
  "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",
            "type": "string",
            "description": "Keywords for your job search (e.g., 'n8n OR zapier'). Ignored when a Custom Search URL is provided."
          },
          "startUrls": {
            "title": "Custom Search URL (Overrides search filters)",
            "type": "string",
            "description": "Paste one supported Upwork job-search URL. Its search query, job type, experience, duration, workload, rates, budget, and sorting take precedence over the corresponding search controls. Freshness, keyword matching, client qualification, and maximum matching results still apply. Page size is always 50, including custom URLs."
          },
          "maxResults": {
            "title": "Maximum Matching Results",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after saving this many accepted, distinct jobs. Applied after search-data filters and deduplication. 0 disables this cap. Existing page limits still apply; fewer matching jobs may be 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.",
            "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)",
            "type": "array",
            "description": "Export cookies from a logged-in Upwork session and paste the full JSON array here. Use this instead of Authorization Header. Incomplete, expired, or rejected cookies produce a warning and fallback to standard results."
          },
          "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",
            "type": "array",
            "description": "Select the experience levels of the jobs.",
            "items": {
              "type": "string",
              "enum": [
                "Entry Level",
                "Intermediate",
                "Expert"
              ]
            }
          },
          "projectLength": {
            "title": "Project Length",
            "type": "array",
            "description": "Select project length options.",
            "items": {
              "type": "string",
              "enum": [
                "Less than one month",
                "1 to 3 months",
                "3 to 6 months",
                "More than 6 months"
              ]
            }
          },
          "hoursPerWeek": {
            "title": "Hours Per Week",
            "type": "array",
            "description": "Select hours per week options.",
            "items": {
              "type": "string",
              "enum": [
                "Less than 30 hrs/week",
                "More than 30 hrs/week"
              ]
            }
          },
          "workload": {
            "title": "Exact Hourly Workload",
            "enum": [
              "as_needed",
              "part_time",
              "full_time"
            ],
            "type": "string",
            "description": "Optional exact workload for hourly jobs. Combines with Hours Per Week; conflicting selections return no matches. Fixed-price jobs and unavailable workloads fail this filter. A Custom Search URL overrides this control."
          },
          "hourlyJobTypeMin": {
            "title": "Min Hourly Rate ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Enter the minimum hourly rate."
          },
          "hourlyJobTypeMax": {
            "title": "Max Hourly Rate ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Enter the maximum hourly rate."
          },
          "fixedPriceJobTypeMin": {
            "title": "Min Fixed Price ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Enter the minimum fixed price."
          },
          "fixedPriceJobTypeMax": {
            "title": "Max Fixed Price ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Enter the maximum fixed price."
          },
          "maxJobAgeHours": {
            "title": "Maximum Job Age (hours)",
            "minimum": 0,
            "maximum": 2501999792.9836087,
            "type": "number",
            "description": "Include jobs posted within this many hours before the run starts. For example, 24 means the last day and 0.5 means the last 30 minutes. 0 disables this filter. The cutoff stays fixed across retries and restarts. Jobs without a usable posting time are excluded when enabled. Page limits still apply.",
            "default": 0
          },
          "includeKeywords": {
            "title": "Include Keywords",
            "type": "object",
            "description": "Enter terms and choose the fields to search. Empty terms disable this rule. Matching uses case-insensitive literal substrings.",
            "properties": {
              "keywords": {
                "title": "Keywords or phrases",
                "type": "array",
                "editor": "stringList",
                "items": {
                  "type": "string"
                },
                "prefill": [],
                "description": "Add one literal term or phrase per entry. An empty list disables this rule."
              },
              "matchMode": {
                "title": "Require",
                "type": "string",
                "editor": "select",
                "enum": [
                  "any",
                  "all"
                ],
                "enumTitles": [
                  "Any term",
                  "All terms"
                ],
                "description": "Any term is the default. All terms can match different selected fields.",
                "prefill": "any"
              },
              "matchTitle": {
                "title": "Search title",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              },
              "matchDescription": {
                "title": "Search description",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              },
              "matchSkills": {
                "title": "Search skills",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              }
            }
          },
          "excludeKeywords": {
            "title": "Exclude Keywords",
            "type": "object",
            "description": "Reject jobs containing any term in the selected fields. Empty terms disable this rule. Exclusion wins over inclusion.",
            "properties": {
              "keywords": {
                "title": "Keywords or phrases",
                "type": "array",
                "editor": "stringList",
                "items": {
                  "type": "string"
                },
                "prefill": [],
                "description": "Add one literal term or phrase per entry. An empty list disables this rule."
              },
              "matchTitle": {
                "title": "Search title",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              },
              "matchDescription": {
                "title": "Search description",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              },
              "matchSkills": {
                "title": "Search skills",
                "type": "boolean",
                "editor": "checkbox",
                "prefill": true,
                "description": "Enabled when omitted. Select at least one field when keywords are present."
              }
            }
          },
          "clientCountries": {
            "title": "Client Countries (include)",
            "type": "array",
            "description": "Select client countries to include. Leave empty to disable this filter. These choices cover countries observed in search responses, not a complete country list. Country names and codes are normalized for matching. Exclusions win. Jobs with missing countries are excluded when this filter is enabled.",
            "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"
              ]
            }
          },
          "excludeClientCountries": {
            "title": "Client Countries (exclude)",
            "type": "array",
            "description": "Select client countries to exclude. Leave empty to disable this filter. These choices cover countries observed in search responses, not a complete country list. Country names and codes are normalized for matching. Exclusions win. Jobs with missing countries are excluded when this filter is enabled.",
            "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"
              ]
            }
          },
          "verifiedPaymentOnly": {
            "title": "Payment-Verified Clients Only",
            "type": "boolean",
            "description": "Require an explicit verified payment status. False disables this filter. Requires a valid authorization token or cookies; missing status is excluded. Unrecognized nonempty statuses never count as verified.",
            "default": false
          },
          "minClientTotalSpent": {
            "title": "Minimum Client Total Spent (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum recorded client spending in USD. 0 disables this filter. Unknown currencies and unavailable spending are treated as unknown; no currency conversion. Requires a valid authorization token or cookies. Missing values are excluded.",
            "default": 0
          },
          "minClientRating": {
            "title": "Minimum Client Rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Minimum recorded client rating. 0 disables this filter. Requires a valid authorization token or cookies. Missing values are excluded.",
            "default": 0
          },
          "minClientReviewCount": {
            "title": "Minimum Client Review Count",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum client review count. This is not the number of hires. 0 disables this filter. Requires a valid authorization token or cookies. Missing values are excluded.",
            "default": 0
          },
          "maxProposals": {
            "title": "Maximum Proposals",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs with this many proposals or fewer. Leave empty to disable this filter; 0 keeps only jobs with zero proposals. Requires an exact count from authenticated search data. Jobs with missing counts or only a reported range are excluded when enabled."
          },
          "enrichDetails": {
            "title": "Enrich With Details",
            "type": "boolean",
            "description": "Optional JSON override. When omitted, valid authentication enables job enrichment automatically. Set false to keep the original 16-field output and skip detail requests, or true to request enrichment explicitly. Explicit true retains null Extra Details and diagnostic records when authentication is unavailable."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Select which proxies to use. Supports custom proxy urls.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}