{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Jobs Finder",
    "description": "Upwork Jobs Finder scrapes Upwork job listings by keyword and exports structured freelance job data, including title, budget, hourly rate, skills, and description. Ideal for Upwork lead generation, job monitoring, market research, and automation workflows.",
    "version": "1.0",
    "x-build-id": "gBsp3vnAUEroiRec0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sentry~upwork-jobs-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sentry-upwork-jobs-finder",
        "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/sentry~upwork-jobs-finder/runs": {
      "post": {
        "operationId": "runs-sync-sentry-upwork-jobs-finder",
        "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/sentry~upwork-jobs-finder/run-sync": {
      "post": {
        "operationId": "run-sync-sentry-upwork-jobs-finder",
        "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",
        "required": [
          "searchQueries"
        ],
        "properties": {
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "Keywords to search for on Upwork. Add one per line — each query is scraped independently.",
            "default": [
              "vibe code"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxJobsPerQuery": {
            "title": "Max Jobs Per Query",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum number of job listings to collect per search query.",
            "default": 50
          },
          "maxPagesPerQuery": {
            "title": "Max Pages Per Query (Optional)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Optional hard limit for pagination depth per query. Leave empty for no page cap."
          },
          "sort": {
            "title": "Sort By",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Sort search results by recency or relevance.",
            "default": "recency"
          },
          "jobType": {
            "title": "Job Type",
            "enum": [
              "all",
              "fixed",
              "hourly"
            ],
            "type": "string",
            "description": "Filter by fixed-price or hourly jobs, or return all.",
            "default": "all"
          },
          "experienceLevel": {
            "title": "Experience Level",
            "enum": [
              "any",
              "entry-level",
              "intermediate",
              "expert"
            ],
            "type": "string",
            "description": "Filter by required experience level.",
            "default": "any"
          },
          "enforceQueryRelevance": {
            "title": "Enforce Query Relevance",
            "type": "boolean",
            "description": "Apply stricter token-level filtering so each returned job matches all query keywords (recommended for stable, precise results).",
            "default": true
          },
          "scrapeJobDetails": {
            "title": "Scrape Full Job Details",
            "type": "boolean",
            "description": "Visit each job's individual page to collect full description, proposal activity, client history, and location restrictions. Slower but more complete — roughly doubles run time.",
            "default": false
          },
          "stealthMode": {
            "title": "Stealth Mode",
            "type": "boolean",
            "description": "Enable anti-detection browser hardening and challenge-resilient navigation behavior.",
            "default": true
          },
          "enableHumanCursor": {
            "title": "Enable Human Cursor",
            "type": "boolean",
            "description": "Enable human-like cursor movement for checkbox-based verification challenges.",
            "default": true
          },
          "humanizeMaxTimeSec": {
            "title": "Human Cursor Max Move Time (s)",
            "minimum": 0.2,
            "maximum": 5,
            "type": "number",
            "description": "Maximum cursor movement duration in seconds for humanized pointer movement.",
            "default": 1.5
          },
          "disableCoop": {
            "title": "Disable COOP (Advanced)",
            "type": "boolean",
            "description": "Disables Cross-Origin-Opener-Policy handling to allow cross-origin iframe interaction. Keep OFF unless needed for specific challenge pages.",
            "default": false
          },
          "stopAfterFirstBlockedQuery": {
            "title": "Stop After First Blocked Query",
            "type": "boolean",
            "description": "If the first query is fully challenge-blocked and returns zero jobs, stop the run early to reduce usage. Turn off to continue remaining queries.",
            "default": false
          },
          "navigationRetries": {
            "title": "Navigation Retries",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to rotate session and retry when challenge or navigation failures happen.",
            "default": 3
          },
          "navigationTimeoutSeconds": {
            "title": "Navigation Timeout (s)",
            "minimum": 10,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for a single page navigation attempt.",
            "default": 35
          },
          "challengeWaitSeconds": {
            "title": "Challenge Wait Seconds",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "How long to keep waiting on anti-bot challenge pages before rotating session.",
            "default": 25
          },
          "queryTimeCapSeconds": {
            "title": "Query Time Cap (s)",
            "minimum": 30,
            "maximum": 1800,
            "type": "integer",
            "description": "Maximum total time spent per query before returning partial results.",
            "default": 180
          },
          "persistSessionState": {
            "title": "Persist Session State",
            "type": "boolean",
            "description": "Reuse cookies/storage across runs for a sticky Upwork session cohort and better result consistency.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Residential proxies are recommended — Upwork blocks datacenter IPs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "proxySessionId": {
            "title": "Sticky Proxy Session ID (Optional)",
            "type": "string",
            "description": "Set a fixed proxy session ID to improve run-to-run consistency by reusing the same proxy cohort."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}