{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Jobs Scraper — Listings, Budgets, Skills",
    "description": "Scrape Upwork job postings by keyword, category, budget, experience level and client location. Every row carries the FULL job description, hourly or fixed budget, required skills, duration and workload. Clears Upwork's Cloudflare challenge for you. No Upwork account needed.",
    "version": "0.1",
    "x-build-id": "ih3NReMfat5ObKlZU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~upwork-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-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/scrapersdelight~upwork-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-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/scrapersdelight~upwork-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "One Upwork search per keyword, e.g. `python`, `shopify developer`, `\"video editor\"`. Upwork's own search syntax works here — quotes for a phrase, OR/AND, and a leading NOT. Leave empty to scrape the newest jobs across the entire marketplace instead of a keyword.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Upwork search URLs",
            "type": "array",
            "description": "Paste search URLs straight from Upwork (https://www.upwork.com/nx/search/jobs/?...) to reuse filters this input does not expose. Your query string is kept as-is; only the page size is raised to 50 results per request. Used in addition to the keywords above.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "any",
              "hourly",
              "fixed"
            ],
            "type": "string",
            "description": "Restrict to hourly contracts or to fixed-price projects. `any` returns both. Measured on a live 2,444-job search: 1,505 hourly + 939 fixed.",
            "default": "any"
          },
          "experienceLevel": {
            "title": "Experience level",
            "type": "array",
            "description": "Upwork's own experience tiers. Select none (or all three) for no filter.",
            "items": {
              "type": "string",
              "enum": [
                "entry",
                "intermediate",
                "expert"
              ],
              "enumTitles": [
                "Entry Level",
                "Intermediate",
                "Expert"
              ]
            },
            "default": []
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Upwork's 12 top-level job categories. Leave empty for every category.",
            "items": {
              "type": "string",
              "enum": [
                "Accounting & Consulting",
                "Admin Support",
                "Customer Service",
                "Data Science & Analytics",
                "Design & Creative",
                "Engineering & Architecture",
                "IT & Networking",
                "Legal",
                "Sales & Marketing",
                "Translation",
                "Web, Mobile & Software Dev",
                "Writing"
              ]
            },
            "default": []
          },
          "clientLocations": {
            "title": "Client location",
            "type": "array",
            "description": "Only jobs whose client sits in these places. Accepts a country (`United States`, `Germany`), a sub-region (`Northern Europe`) or a continent (`Americas`, `Asia`, `Europe`, `Africa`, `Oceania`). Spelled exactly as Upwork's own location filter spells it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "clientHires": {
            "title": "Client hire history",
            "enum": [
              "any",
              "0",
              "1-9",
              "10-"
            ],
            "type": "string",
            "description": "Filter by how many freelancers the client has hired before — the cheapest proxy for a serious buyer, since Upwork hides client spend from logged-out visitors.",
            "default": "any"
          },
          "workload": {
            "title": "Hours per week",
            "enum": [
              "any",
              "as_needed",
              "full_time"
            ],
            "type": "string",
            "description": "Upwork's workload filter: part time is under 30 hrs/week, full time is 30+.",
            "default": "any"
          },
          "duration": {
            "title": "Project length",
            "type": "array",
            "description": "Expected engagement length. Select none for any length.",
            "items": {
              "type": "string",
              "enum": [
                "week",
                "month",
                "semester",
                "ongoing"
              ],
              "enumTitles": [
                "Less than 1 month",
                "1 to 3 months",
                "3 to 6 months",
                "More than 6 months"
              ]
            },
            "default": []
          },
          "hourlyRateMin": {
            "title": "Min hourly rate (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only hourly jobs whose advertised rate range reaches at least this. 0 = no minimum.",
            "default": 0
          },
          "hourlyRateMax": {
            "title": "Max hourly rate (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only hourly jobs whose advertised rate range stays at or below this. 0 = no maximum.",
            "default": 0
          },
          "fixedBudgetMin": {
            "title": "Min fixed budget (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only fixed-price jobs budgeted at or above this. 0 = no minimum.",
            "default": 0
          },
          "fixedBudgetMax": {
            "title": "Max fixed budget (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only fixed-price jobs budgeted at or below this. 0 = no maximum.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "`recency` walks the newest postings first — the right choice for a job-alert or lead feed. `relevance` mirrors Upwork's default keyword ranking.",
            "default": "recency"
          },
          "maxItems": {
            "title": "Max jobs",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs in total, across all keywords. Upwork returns 50 jobs per request, so a higher number simply means more pages. 0 = every matching job (a bare keyword can match thousands).",
            "default": 250
          },
          "clearance": {
            "title": "Bring your own Cloudflare clearance (advanced)",
            "type": "object",
            "description": "Optional escape hatch. Supply a Cloudflare clearance you minted yourself and the actor skips its own browser step entirely. Shape: {\"cookie\": \"cf_clearance=...; __cf_bm=...\", \"userAgent\": \"<the exact UA of the browser that solved it>\", \"proxySessionId\": \"myid\"}. A cf_clearance cookie is bound to the IP and User-Agent that solved the challenge, so all three must match: mint through an Apify proxy session, then pass that same session id here and the run will egress from the same IP. Leave empty to let the actor mint its own.",
            "default": {}
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Upwork is behind a Cloudflare managed challenge. In testing the challenge was cleared ONLY from residential IPs — the same browser on datacenter IPs never passed — so RESIDENTIAL is the default and is strongly recommended. Point this at your own proxy if you prefer.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}