{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Freelancer Scraper — Rates, Earnings, JSS, Work History",
    "description": "Search Upwork freelancers by keyword, skills, rate, JSS, badge, country, hours and tenure. Per profile: exact earnings, every contract with feedback both ways, education, employment, languages, certificates. Seconds from a maintained census; live search on request. Pay per row, no start fee.",
    "version": "0.1",
    "x-build-id": "VaHG5cUGE5YBAqX5b"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/moxlade~upwork-freelancers/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-moxlade-upwork-freelancers",
        "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/moxlade~upwork-freelancers/runs": {
      "post": {
        "operationId": "runs-sync-moxlade-upwork-freelancers",
        "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/moxlade~upwork-freelancers/run-sync": {
      "post": {
        "operationId": "run-sync-moxlade-upwork-freelancers",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "title": "Search keywords",
            "maxLength": 200,
            "type": "string",
            "description": "Matched against the profile title, overview and skills, in any word form (developer also finds developers). All words must match. Write alternatives with OR (media buyer OR creative strategist), a phrase in quotes, -word to exclude. Leave empty to filter the whole census by the fields below. When the census holds fewer matching profiles than maxItems, the rest come from Upwork's live search, kept to the same every-word match and billed as card_live (not when a filter the live search cannot apply is set)."
          },
          "skills": {
            "title": "Skills (any of)",
            "maxItems": 50,
            "type": "array",
            "description": "Skill names as Upwork lists them, e.g. Python, Django, Web Scraping. A profile matches if it lists any of them.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "maxItems": 50,
            "type": "array",
            "description": "Country names as Upwork shows them, e.g. United States, United Kingdom, Germany. Any of these.",
            "items": {
              "type": "string"
            }
          },
          "regions": {
            "title": "Regions",
            "type": "array",
            "description": "Upwork's regions. Any of these.",
            "items": {
              "type": "string",
              "enum": [
                "Americas",
                "Europe",
                "Asia",
                "Africa",
                "Oceania"
              ]
            }
          },
          "availability": {
            "title": "Availability",
            "type": "array",
            "description": "As stated on the profile: more than 30 hrs/week (fullTime), less than 30 (partTime), as needed (notSure).",
            "items": {
              "type": "string",
              "enum": [
                "fullTime",
                "partTime",
                "notSure"
              ]
            }
          },
          "excludeAgencies": {
            "title": "Exclude agency members",
            "type": "boolean",
            "description": "Drop freelancers listed under an agency."
          },
          "rateMin": {
            "title": "Hourly rate from (USD)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Listed hourly rate at least this."
          },
          "rateMax": {
            "title": "Hourly rate up to (USD)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Listed hourly rate at most this."
          },
          "jssMin": {
            "title": "Job Success Score at least",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "0–100. Profiles without a shown JSS are excluded when this is set."
          },
          "hoursMin": {
            "title": "Hours billed at least",
            "minimum": 0,
            "type": "integer",
            "description": "Total hours billed on Upwork."
          },
          "jobsMin": {
            "title": "Jobs worked at least",
            "minimum": 0,
            "type": "integer",
            "description": "Jobs worked, as the profile reports it."
          },
          "earnedMin": {
            "title": "Lifetime earnings at least (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Uses the exact figure where known, the card's lower bound otherwise."
          },
          "hireAgainMin": {
            "title": "Hire-again rate at least (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Share of clients who would hire again."
          },
          "topRated": {
            "title": "Top Rated only",
            "type": "boolean",
            "description": "Only Top Rated freelancers (includes Top Rated Plus)."
          },
          "topRatedPlus": {
            "title": "Top Rated Plus only",
            "type": "boolean",
            "description": "Only Top Rated Plus."
          },
          "risingTalent": {
            "title": "Rising Talent only",
            "type": "boolean",
            "description": "Only freelancers with the Rising Talent badge."
          },
          "idVerified": {
            "title": "Identity verified",
            "type": "boolean",
            "description": "Only freelancers whose identity Upwork has verified."
          },
          "hasContracts": {
            "title": "Has completed contracts",
            "type": "boolean",
            "description": "Only freelancers with at least one completed contract."
          },
          "memberSinceAfter": {
            "title": "Member since (after)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Joined Upwork on or after this date (YYYY-MM-DD)."
          },
          "memberSinceBefore": {
            "title": "Member since (before)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Joined Upwork on or before this date (YYYY-MM-DD)."
          },
          "lastWorkedWithinDays": {
            "title": "Worked within the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Last work on Upwork within this many days — active freelancers only."
          },
          "profileUrls": {
            "title": "Profile URLs or ids",
            "maxItems": 5000,
            "type": "array",
            "description": "Look up specific freelancers instead of searching: profile URLs (https://www.upwork.com/freelancers/~01…), bare ids (~01…), or custom profile URLs (https://www.upwork.com/freelancers/<username>). A custom URL the census has not met is resolved on its first run with fullProfiles: true and answered from the census after that. Up to 5,000. A private profile is answered as status: private with the date it went private.",
            "items": {
              "type": "string"
            }
          },
          "includePrivate": {
            "title": "Include profiles that went private",
            "type": "boolean",
            "description": "Search results also return profiles that are no longer public (status: private, with private_since and the last public state). Lookups by id always answer them.",
            "default": false
          },
          "include": {
            "title": "Include sections",
            "type": "array",
            "description": "Sections to add to every row from the stored profile at no extra charge: contracts (completed contracts with feedback both ways; the full list after a fullProfiles read), portfolios, testimonials, specialized_profiles, education, employment_history, languages, certificates, other_experiences.",
            "items": {
              "type": "string",
              "enum": [
                "contracts",
                "portfolios",
                "testimonials",
                "specialized_profiles",
                "education",
                "employment_history",
                "languages",
                "certificates",
                "other_experiences"
              ]
            }
          },
          "fullProfiles": {
            "title": "Full profiles (fresh read + every contract)",
            "type": "boolean",
            "description": "With profileUrls: re-read each profile from Upwork now and fetch everything it has — the complete contract history (hours, charges also on private contracts, the client's feedback and the freelancer's feedback about the client), education, employment history, languages, certificates, other experiences, portfolios, testimonials and specialized profiles. Billed as profile_live per profile; about 10 s per profile. Without it, the stored profile is returned (profile_stored).",
            "default": false
          },
          "liveSearch": {
            "title": "Live search",
            "type": "boolean",
            "description": "Ask Upwork for the current result for the query instead of the stored census: Upwork's own relevance order, and freelancers the census has not seen yet. Slower (under a minute for 25 rows), billed as card_live per row. Needs a query.",
            "default": false
          },
          "maxPages": {
            "title": "Live search: max pages",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "With liveSearch, how many result pages to walk at most (10 rows per page) before returning what passed the filters.",
            "default": 10
          },
          "maxAgeDays": {
            "title": "Max age of a stored profile (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Stored rows read from Upwork longer ago than this are left out of a search. Every row carries fetched_at and age_days regardless.",
            "default": 30
          },
          "includeStale": {
            "title": "Include older profiles",
            "type": "boolean",
            "description": "Ignore maxAgeDays and return every matching stored profile.",
            "default": false
          },
          "changedSince": {
            "title": "Changed since",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}(T[0-9:.]+Z?)?|\\s*\\d{1,3}\\s*[A-Za-z]{1,6}\\s*)$",
            "type": "string",
            "description": "ISO date or timestamp, or a window like 7d, 2w, 1m or 7 days (so a scheduled task never needs editing). Only profiles whose rate, title, JSS, badge, hours, jobs, skills, availability or hire-again rate moved since then; each row carries the changes as {field, from, to, at}."
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "relevance",
              "rate",
              "rate_asc",
              "hours",
              "jss",
              "earnings",
              "last_worked_on",
              "first_seen",
              "fetched"
            ],
            "type": "string",
            "description": "Order of the stored results. Upwork's own relevance order comes only with liveSearch.",
            "default": "relevance"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper bound on rows returned — and on what the run can cost.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}