{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Job Scraper 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": "VDrZjNS6sxFyjBa8g"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapfox~upwork-job-scraper-pro/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapfox-upwork-job-scraper-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-scraper-pro/runs": {
      "post": {
        "operationId": "runs-sync-scrapfox-upwork-job-scraper-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-scraper-pro/run-sync": {
      "post": {
        "operationId": "run-sync-scrapfox-upwork-job-scraper-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'"
          },
          "maxPages": {
            "title": "Maximum Pages to Scrape",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many result pages to scrape (~10 jobs per page)."
          },
          "experienceLevels": {
            "title": "Experience Levels",
            "type": "array",
            "description": "Which experience levels to include.",
            "items": {
              "enum": [
                "entry",
                "intermediate",
                "expert"
              ],
              "enumTitles": [
                "Entry Level",
                "Intermediate",
                "Expert"
              ],
              "type": "string"
            },
            "default": [
              "entry",
              "intermediate",
              "expert"
            ]
          },
          "jobType": {
            "title": "Job Type",
            "type": "array",
            "description": "Filter jobs by payment type.",
            "items": {
              "enum": [
                "hourly",
                "fixed"
              ],
              "enumTitles": [
                "Hourly",
                "Fixed Price"
              ],
              "type": "string"
            },
            "default": [
              "hourly",
              "fixed"
            ]
          },
          "paymentVerifiedOnly": {
            "title": "Payment verified",
            "type": "boolean",
            "description": "Filter jobs by payment verification status.",
            "default": false
          },
          "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."
          },
          "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."
          },
          "clientCountry": {
            "title": "Client Location",
            "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."
          },
          "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\"}]"
          },
          "perPage": {
            "title": "Results Per Page",
            "enum": [
              "10",
              "20",
              "50"
            ],
            "type": "string",
            "description": "Number of results to display per page.",
            "default": "50"
          },
          "sortBy": {
            "title": "Sort By",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Order of the search results.",
            "default": "recency"
          },
          "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"
          },
          "clientHistory": {
            "title": "Client Hire History",
            "type": "array",
            "description": "Filter by client hire history",
            "items": {
              "enum": [
                "noHires",
                "1to9Hires",
                "10+Hires"
              ],
              "enumTitles": [
                "No hires yet",
                "1–9 hires",
                "10+ hires"
              ],
              "type": "string"
            }
          },
          "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."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}