{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Job Scraper – Job Alerts with Client Intel",
    "description": "Scrolling Upwork for good jobs means missing them and wasting connects. Get jobs by keyword or link with pay, skills, exact proposal count and client history, plus a client score, opportunity score and red flags. Set alerts for new jobs only.",
    "version": "1.0",
    "x-build-id": "MCd2Djw7tFZ39FKN3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/crawl_craft~upwork-job-scraper-job-alerts-with-client-intel/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-crawl_craft-upwork-job-scraper-job-alerts-with-client-intel",
        "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/crawl_craft~upwork-job-scraper-job-alerts-with-client-intel/runs": {
      "post": {
        "operationId": "runs-sync-crawl_craft-upwork-job-scraper-job-alerts-with-client-intel",
        "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/crawl_craft~upwork-job-scraper-job-alerts-with-client-intel/run-sync": {
      "post": {
        "operationId": "run-sync-crawl_craft-upwork-job-scraper-job-alerts-with-client-intel",
        "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": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "🔍 Keywords, search links or job links",
            "minItems": 1,
            "type": "array",
            "description": "One per line: a keyword (python developer), an Upwork job search link (https://www.upwork.com/nx/search/jobs/?q=react&t=0 - every filter in the link is used), or a link to a single job. Duplicates are removed. Add as many as you like.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "📊 Max jobs per keyword or link",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Jobs to return for EACH keyword or search link (3 keywords x 50 = up to 150 jobs). 0 returns everything (Upwork serves about 5,050 per search). Free plan: up to 10 jobs per run in total.",
            "default": 10
          },
          "jobType": {
            "title": "💼 Job type",
            "enum": [
              "any",
              "hourly",
              "fixed"
            ],
            "type": "string",
            "description": "Pay model of the jobs.",
            "default": "any"
          },
          "experienceLevel": {
            "title": "🎓 Experience level",
            "type": "array",
            "description": "Experience levels to include. Leave empty for all levels.",
            "items": {
              "type": "string",
              "enum": [
                "entry",
                "intermediate",
                "expert"
              ],
              "enumTitles": [
                "Entry level",
                "Intermediate",
                "Expert"
              ]
            }
          },
          "workload": {
            "title": "🕒 Weekly workload",
            "enum": [
              "any",
              "as_needed",
              "part_time",
              "full_time"
            ],
            "type": "string",
            "description": "Hours per week. Applies to hourly jobs only, so choosing one limits the search to hourly jobs.",
            "default": "any"
          },
          "duration": {
            "title": "⌛ Project length",
            "enum": [
              "any",
              "week",
              "month",
              "semester",
              "ongoing"
            ],
            "type": "string",
            "description": "Expected project length.",
            "default": "any"
          },
          "budget": {
            "title": "💰 Fixed budget range (USD)",
            "type": "string",
            "description": "Fixed-price budget range in USD, for example 500-5000, 1000- (at least 1000) or -200 (up to 200). Several ranges with commas."
          },
          "hourlyRate": {
            "title": "💵 Hourly rate range (USD)",
            "type": "string",
            "description": "Hourly rate range in USD, for example 30-60 or 50- (at least 50)."
          },
          "proposals": {
            "title": "🙋 Proposals so far",
            "type": "string",
            "description": "Keep only jobs with this many proposals, for example 0-4 or 0-4,5-9 or 50+. Checked against the exact count of every job."
          },
          "clientHires": {
            "title": "🤝 Client hires so far",
            "type": "string",
            "description": "How many freelancers the client has hired before, for example 0, 1-9 or 10+."
          },
          "location": {
            "title": "🌎 Client countries",
            "type": "array",
            "description": "Only jobs from clients in these countries or regions, for example United States, Canada, Europe. One per line.",
            "items": {
              "type": "string"
            }
          },
          "verifiedPaymentOnly": {
            "title": "✅ Payment verified clients only",
            "type": "boolean",
            "description": "Keep only clients with a verified payment method.",
            "default": false
          },
          "contractToHire": {
            "title": "🔄 Contract-to-hire jobs only",
            "type": "boolean",
            "description": "Keep only jobs that may turn into a full-time hire.",
            "default": false
          },
          "minClientScore": {
            "title": "🧠 Minimum client score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only clients scoring at least this (0-100, from payment verification, spend, hire rate, rating, reviews, account age and rate paid). 0 keeps every client.",
            "default": 0
          },
          "minClientTotalSpent": {
            "title": "💎 Minimum client total spent (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only clients who spent at least this much on Upwork. 0 keeps every client.",
            "default": 0
          },
          "minClientRating": {
            "title": "⭐ Minimum client rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only clients with at least this feedback score (0-5). 0 keeps every client.",
            "default": 0
          },
          "minClientReviewCount": {
            "title": "📝 Minimum client reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only clients with at least this many reviews. 0 keeps every client.",
            "default": 0
          },
          "excludeLocations": {
            "title": "🚫 Exclude client countries",
            "type": "array",
            "description": "Drop jobs from clients in these countries. One per line.",
            "items": {
              "type": "string"
            }
          },
          "includeKeywords": {
            "title": "✨ Must mention (any of)",
            "type": "array",
            "description": "Keep only jobs whose title, description or skills contain at least one of these words. One per line.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "🛑 Must not mention (any of)",
            "type": "array",
            "description": "Drop jobs whose title, description or skills contain any of these words. One per line.",
            "items": {
              "type": "string"
            }
          },
          "postedWithin": {
            "title": "🕐 Posted within",
            "enum": [
              "any",
              "30m",
              "1h",
              "6h",
              "24h",
              "3d",
              "7d",
              "30d"
            ],
            "type": "string",
            "description": "Only jobs posted in this window. Pick a short window and schedule the run to get fresh leads.",
            "default": "any"
          },
          "fromDate": {
            "title": "📆 Posted on or after",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Earliest publish date, YYYY-MM-DD."
          },
          "toDate": {
            "title": "📅 Posted on or before",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Latest publish date, YYYY-MM-DD."
          },
          "incrementalMode": {
            "title": "🆕 Only new jobs since the last run",
            "type": "boolean",
            "description": "Return only jobs not returned by an earlier run of this Actor in your account. Schedule the Actor to get only fresh leads.",
            "default": false
          },
          "alertWebhookUrl": {
            "title": "📣 Alert webhook (Slack, Discord or any URL)",
            "type": "string",
            "description": "Optional. A Slack or Discord webhook gets a message with the top 10 jobs by opportunity score; any other URL receives the jobs as JSON. Treat it like a password."
          },
          "maxConcurrency": {
            "title": "🚄 Parallel requests",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many job pages are opened at the same time. Without a proxy the run uses at most 8 and slows down by itself when Upwork pushes back.",
            "default": 10
          },
          "maxRequestRetries": {
            "title": "🔁 Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How often a failed request is tried again.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "The run starts without a proxy. If Upwork refuses a request it switches to a datacenter proxy, then to a residential proxy, and stays on it for the rest of the run.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}