{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Job Scrapper Pro",
    "description": "Scrape Upwork job listings with full client insights: rating, total spend, country, and hire history, plus job title, budget, skills, and publish time. Filter by country and export to JSON, CSV, or Excel. Ideal for lead generation and market research.",
    "version": "1.0",
    "x-build-id": "RazeznwzY0LaYYDGF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapfox~upwork-job-scrapper-pro/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapfox-upwork-job-scrapper-pro",
        "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/scrapfox~upwork-job-scrapper-pro/runs": {
      "post": {
        "operationId": "runs-sync-scrapfox-upwork-job-scrapper-pro",
        "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/scrapfox~upwork-job-scrapper-pro/run-sync": {
      "post": {
        "operationId": "run-sync-scrapfox-upwork-job-scrapper-pro",
        "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": {
          "keyword": {
            "title": "Search Keyword",
            "type": "string",
            "description": "The job search term, e.g. 'react developer' or 'logo design'. Required UNLESS you provide a Raw Search URL (Advanced) instead."
          },
          "maxPages": {
            "title": "Maximum Pages",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many result pages to scrape (~10 jobs per page).",
            "default": 3
          },
          "perPage": {
            "title": "Results Per Page",
            "enum": [
              "10",
              "20",
              "50"
            ],
            "type": "string",
            "description": "How many jobs Upwork returns per result page (10, 20, or 50). A higher value fetches more jobs per page load, so fewer pages are paginated for the same job count. Leave blank for Upwork's default (~10). NOTE: server-side — confirm Upwork honors it in a live run."
          },
          "sortBy": {
            "title": "Sort By",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Order of the search results.",
            "default": "recency"
          },
          "jobTypes": {
            "title": "Job Types",
            "type": "array",
            "description": "Which pricing types to include. Select both to include everything.",
            "items": {
              "enum": [
                "hourly",
                "fixed"
              ],
              "enumTitles": [
                "Hourly",
                "Fixed Price"
              ],
              "type": "string"
            },
            "default": [
              "hourly",
              "fixed"
            ]
          },
          "hourlyMin": {
            "title": "Min Hourly Rate",
            "minimum": 0,
            "maximum": 999,
            "type": "integer",
            "description": "Only hourly jobs paying at least this rate. Leave blank for no minimum."
          },
          "hourlyMax": {
            "title": "Max Hourly Rate",
            "minimum": 0,
            "maximum": 999,
            "type": "integer",
            "description": "Only hourly jobs paying up to this rate. Leave blank for no maximum."
          },
          "fixedMin": {
            "title": "Min Fixed Price",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only fixed-price jobs with a budget at least this large. Leave blank for no minimum."
          },
          "fixedMax": {
            "title": "Max Fixed Price",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only fixed-price jobs with a budget up to this large. Leave blank for no maximum."
          },
          "experienceLevels": {
            "title": "Experience Levels",
            "type": "array",
            "description": "Which experience levels to include. Select all to include everything.",
            "items": {
              "enum": [
                "entry",
                "intermediate",
                "expert"
              ],
              "enumTitles": [
                "Entry Level",
                "Intermediate",
                "Expert"
              ],
              "type": "string"
            },
            "default": [
              "entry",
              "intermediate",
              "expert"
            ]
          },
          "postedWithin": {
            "title": "Posted Within",
            "enum": [
              "1h",
              "6h",
              "12h",
              "24h",
              "3d",
              "7d"
            ],
            "type": "string",
            "description": "Only include jobs posted within this window (applied after scraping).",
            "default": "24h"
          },
          "paymentVerifiedOnly": {
            "title": "Payment-Verified Clients Only",
            "type": "boolean",
            "description": "Only jobs from clients who have verified a payment method (filtered on Upwork's side).",
            "default": false
          },
          "clientHistory": {
            "title": "Client Hire History",
            "type": "array",
            "description": "Only jobs from clients in these lifetime-hire buckets. NOTE: mapped to Upwork's client_hires search param (server-side) — confirm it works in a live run.",
            "items": {
              "enum": [
                "noHires",
                "1to9Hires",
                "10+Hires"
              ],
              "enumTitles": [
                "No hires yet",
                "1–9 hires",
                "10+ hires"
              ],
              "type": "string"
            }
          },
          "clientCountry": {
            "title": "Client Location (countries or regions)",
            "type": "string",
            "description": "Filter by client location. Type one or more full country names OR regions separated by commas — for example: united states, canada, europe. Regions understood: Europe, North America, South America, Asia, Middle East, Oceania, Africa (each expands to its countries). Common country variants are understood (US / USA / United States all work). Any misspelled or unrecognized name is ignored. Leave blank for anywhere. NOTE: jobs where the client's country wasn't captured are excluded when this filter is set."
          },
          "minClientRating": {
            "title": "Min Client Rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only clients rated at least this (0-5). Jobs with no captured rating are excluded."
          },
          "minClientSpend": {
            "title": "Min Client Spend",
            "minimum": 0,
            "type": "integer",
            "description": "Only clients who have spent at least this total on Upwork. Jobs with no captured spend are excluded."
          },
          "minJobsPosted": {
            "title": "Min Jobs Posted by Client",
            "minimum": 0,
            "type": "integer",
            "description": "Only clients who have posted at least this many jobs. Jobs with no captured count are excluded."
          },
          "rawUrl": {
            "title": "Raw Search URL (advanced)",
            "type": "string",
            "description": "Advanced: scrape this exact Upwork search URL instead of building one from the filters above. Overrides all filters. Still goes through login warm-up."
          },
          "customFilters": {
            "title": "Custom Filters",
            "type": "array",
            "description": "Post-scrape rules applied to every job; a job is kept only if it passes ALL rules. Each rule is an object {\"key\", \"operator\", \"value\"}. Keys: title, description, tags, jobType, experienceLevel, duration, proposals, budget, fixedPrice, hourlyMin, hourlyMax, country, clientRating, clientSpend, jobsPosted. Operators: includes, notIncludes, equals, notEquals, greaterThan, lessThan, gte, lte. Missing field: a positive operator drops the job, a negative one keeps it. Example: [{\"key\":\"title\",\"operator\":\"includes\",\"value\":\"python\"},{\"key\":\"tags\",\"operator\":\"notIncludes\",\"value\":\"wordpress\"}]"
          },
          "timezone": {
            "title": "Your Timezone",
            "type": "string",
            "description": "IANA timezone used to show the job's Published Time (and Scraped At) in your local time — Upwork times are UTC. Examples: America/New_York, Europe/London, Asia/Kolkata, Asia/Karachi. Leave blank to keep UTC."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}