{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Freelancers Scraper",
    "description": "Scrape Upwork freelancers by keyword, location and every talent filter, or from profile URLs: rate, exact earnings, Job Success Score, badges, skills, optional full profile with reviews. Export to JSON, CSV or Excel.",
    "version": "0.0",
    "x-build-id": "vay7p0T66gSVEUGzG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nice_dev~upwork-freelancers-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nice_dev-upwork-freelancers-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/nice_dev~upwork-freelancers-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nice_dev-upwork-freelancers-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/nice_dev~upwork-freelancers-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nice_dev-upwork-freelancers-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": {
          "startUrls": {
            "title": "Start URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "Upwork talent-search URLs (`https://www.upwork.com/nx/search/talent/?q=python`, every filter set on the site is kept, pagination is automatic) or freelancer profile URLs (`https://www.upwork.com/freelancers/~01f7f788f7fcd6abae` or the custom profile name). When this list is not empty, the search fields below (keywords, locations, city, skills) are ignored, not checked, and the filters Upwork applies itself are not added to a pasted search URL; caps, post-filters and monitoring still apply. Max 1 000 URLs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "query": {
            "title": "Search keyword",
            "maxLength": 200,
            "type": "string",
            "description": "Skill, job title or any text, exactly as typed in Upwork's talent search (e.g. `python developer`). Empty = every freelancer of the chosen locations."
          },
          "searchQueries": {
            "title": "More search keywords",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several keywords in one run: one search per keyword (times each location below). Added to **Search keyword**; freelancers found by several searches are saved once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "maxLength": 200,
            "type": "string",
            "description": "Country, sub-region or region of the freelancer, by its English name as on Upwork (e.g. `United States`, `Eastern Europe`, `Europe`). Empty = worldwide."
          },
          "locations": {
            "title": "More locations",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several locations in one run: every keyword is searched in every location (3 keywords × 4 countries = 12 searches, max 500), each with its own 10 000-result cap. Added to **Location**.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "city": {
            "title": "City",
            "maxLength": 100,
            "type": "string",
            "description": "Freelancer's city as written on Upwork (e.g. `Kyiv`, `Lagos`). Applied to every search."
          },
          "maxItems": {
            "title": "Max freelancers",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of freelancers to save for the whole run (after deduplication and filters). 0 = no limit.",
            "default": 100
          },
          "maxItemsPerQuery": {
            "title": "Max freelancers per search",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap for EACH search (keyword × location, or search URL), so that the first search cannot use up the whole **Max freelancers** budget. 0 = no per-search cap.",
            "default": 0
          },
          "splitLargeSearches": {
            "title": "Go beyond 10 000 results per search",
            "type": "boolean",
            "description": "Upwork shows at most 10 000 freelancers per search. When a search has more and your caps ask for more, it is split automatically into hourly-rate bands (each band read up to its own 10 000, rates with cents included, nobody delivered twice). In a split search, the rank of a freelancer is its position in its band. Off = stop at 10 000 per search.",
            "default": true
          },
          "minHourlyRate": {
            "title": "Min hourly rate (USD)",
            "minimum": 0,
            "maximum": 999,
            "type": "integer",
            "description": "Lowest hourly rate."
          },
          "maxHourlyRate": {
            "title": "Max hourly rate (USD)",
            "minimum": 1,
            "maximum": 999,
            "type": "integer",
            "description": "Highest hourly rate."
          },
          "minJobSuccess": {
            "title": "Min Job Success Score (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Lowest Job Success Score. 80 and 90 are filtered by Upwork; any other value is applied by the Actor on each result (freelancers without a score are dropped). With start URLs, every value is applied by the Actor, unless the pasted URL already asks Upwork for it."
          },
          "minEarnings": {
            "title": "Min total earnings (USD)",
            "minimum": 1,
            "maximum": 100000000,
            "type": "integer",
            "description": "Lowest amount earned on Upwork (e.g. `1` = has earned something, `10000` = $10K+)."
          },
          "minHours": {
            "title": "Min hours billed",
            "enum": [
              "",
              "1",
              "100",
              "1000"
            ],
            "type": "string",
            "description": "Lowest number of hours billed on Upwork.",
            "default": ""
          },
          "hoursBilledRecentOnly": {
            "title": "Hours billed in the last 6 months only",
            "type": "boolean",
            "description": "Count only the hours billed in the last 6 months (needs **Min hours billed**).",
            "default": false
          },
          "englishLevel": {
            "title": "English level",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4"
            ],
            "type": "string",
            "description": "Lowest English level shown on the profile.",
            "default": ""
          },
          "languages": {
            "title": "Other languages",
            "maxItems": 20,
            "uniqueItems": true,
            "type": "array",
            "description": "Languages the freelancer speaks, as ISO 639-1 codes (e.g. `fr`, `es`, `de`). Several codes = the freelancer must speak ALL of them (and, not or).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "talentType": {
            "title": "Talent type",
            "enum": [
              "all",
              "independent",
              "agency"
            ],
            "type": "string",
            "description": "Independent freelancers, agency members, or both.",
            "default": "all"
          },
          "topRatedOnly": {
            "title": "Top Rated only",
            "type": "boolean",
            "description": "Only freelancers with the Top Rated badge.",
            "default": false
          },
          "topRatedPlusOnly": {
            "title": "Top Rated Plus only",
            "type": "boolean",
            "description": "Only freelancers with the Top Rated Plus badge.",
            "default": false
          },
          "risingTalentOnly": {
            "title": "Rising Talent only",
            "type": "boolean",
            "description": "Only freelancers with the Rising Talent badge.",
            "default": false
          },
          "contractToHireOnly": {
            "title": "Open to contract-to-hire only",
            "type": "boolean",
            "description": "Only freelancers open to being hired full-time after a contract.",
            "default": false
          },
          "skills": {
            "title": "Skills",
            "maxItems": 20,
            "uniqueItems": true,
            "type": "array",
            "description": "Upwork skills the freelancer must have, by name (e.g. `Python`, `Figma`). Several skills = the freelancer must have ALL of them (and, not or). Each name is looked up on Upwork before the search (one extra page per skill); an unknown name stops the run and lists the closest skills Upwork offers. Ignored for pasted search URLs.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "timezones": {
            "title": "Time zones (UTC offsets)",
            "maxItems": 40,
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only freelancers in these UTC offsets (e.g. `UTC+02:00`, `UTC-05:00`, `UTC` for UTC+00:00). The offset is the one Upwork prints on the profile: standard time, the same all year (no daylight saving). Applied by the Actor on each result.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Drop the freelancers whose title, profile description or skills contain one of these words (case and accents ignored).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeProfileDetails": {
            "title": "Add full profile details",
            "type": "boolean",
            "description": "Open each freelancer's profile (1 extra page per freelancer): star rating and review count, rehire rate, member since, last worked on, availability, response time, agencies, portfolio, catalog services and the 10 latest completed and 10 ongoing jobs with the client's review (score, comment, 6 sub-scores). Off = search-card fields only (faster, cheaper).",
            "default": false
          },
          "lastWorkedWithinDays": {
            "title": "Last worked within (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only the freelancers whose last job on Upwork ended within this many days (read on the profile page: needs **Add full profile details**). Freelancers dropped by a profile filter are not saved; their profile page read is still charged. Empty = no filter."
          },
          "memberSinceAfter": {
            "title": "Member since, on or after",
            "type": "string",
            "description": "Keep only the freelancers who joined Upwork on or after this date (`2026-09-01` or a relative date like `2 years`; needs **Add full profile details**)."
          },
          "memberSinceBefore": {
            "title": "Member since, on or before",
            "type": "string",
            "description": "Keep only the freelancers who joined Upwork on or before this date (`2026-09-01` or a relative date like `5 years`; needs **Add full profile details**)."
          },
          "minHireAgain": {
            "title": "Min rehire rate (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only the freelancers whose clients hire them again at least this often, 1-100 (the profile's rehire rate; a freelancer without one is dropped; needs **Add full profile details**)."
          },
          "onlyNew": {
            "title": "Only new freelancers",
            "type": "boolean",
            "description": "Skip the freelancers that a previous run (same **Memory key**) already delivered: they are not saved again and their profile is not even opened; each one a run reads again costs one filter check (Upwork sorts by relevance, so a run reads them to find the new ones). First run = everything is new.",
            "default": false
          },
          "stateKey": {
            "title": "Memory key",
            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
            "maxLength": 64,
            "type": "string",
            "description": "Name of the memory used by **Only new freelancers**. Give each schedule / task its own key (e.g. `python-us`) so that they do not share their memory. Letters, digits, `-` and `_`.",
            "default": "default"
          },
          "resetState": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every freelancer again. Untick it afterwards.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of requests processed in parallel.",
            "default": 4
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 10,
            "maximum": 2000,
            "type": "integer",
            "description": "Most requests to the site in any 60 seconds, all of them counted: search pages and profile pages. A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.",
            "default": 120
          },
          "minRequestIntervalMs": {
            "title": "Min delay between requests",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.",
            "default": 0
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.",
            "default": 5
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Include debug messages in the run log.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}