{
  "openapi": "3.0.1",
  "info": {
    "title": "Upspy - Upwork Jobs Scraper",
    "description": "Upwork jobs scraper — export recent Upwork jobs as clean structured data: full job details, screening questions, budgets, skills, and complete client history (spend, hires, hire rate, rating, payment verification) on every posting. By Upspy.",
    "version": "0.0",
    "x-build-id": "nSbeO7CRgl7xG8Ewm"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ahsansubhani~upspy-apify-actor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ahsansubhani-upspy-apify-actor",
        "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/ahsansubhani~upspy-apify-actor/runs": {
      "post": {
        "operationId": "runs-sync-ahsansubhani-upspy-apify-actor",
        "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/ahsansubhani~upspy-apify-actor/run-sync": {
      "post": {
        "operationId": "run-sync-ahsansubhani-upspy-apify-actor",
        "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": {
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Words to look for in the job title. Add one term per row (e.g. shopify, then dropshipping). The match setting below decides whether one term is enough or all are required.",
            "items": {
              "type": "string"
            }
          },
          "titleMatch": {
            "title": "Title — match",
            "enum": [
              "OR",
              "AND"
            ],
            "type": "string",
            "description": "How the title terms combine. Any of them (OR): keep the job if the title contains at least one term. All of them (AND): require every term to appear.",
            "default": "OR"
          },
          "descriptionKeywords": {
            "title": "Description keywords",
            "type": "array",
            "description": "Words to look for in the full job description. One term per row (e.g. automation, api integration). Useful for catching detail the title leaves out.",
            "items": {
              "type": "string"
            }
          },
          "descriptionMatch": {
            "title": "Description — match",
            "enum": [
              "OR",
              "AND"
            ],
            "type": "string",
            "description": "How the description terms combine. Any of them (OR): at least one term. All of them (AND): every term.",
            "default": "OR"
          },
          "skillKeywords": {
            "title": "Skill keywords",
            "type": "array",
            "description": "Words to look for in the job's listed skills/tags. One term per row (e.g. python, postgresql). Often the cleanest way to match a technology.",
            "items": {
              "type": "string"
            }
          },
          "skillMatch": {
            "title": "Skills — match",
            "enum": [
              "OR",
              "AND"
            ],
            "type": "string",
            "description": "How the skill terms combine. Any of them (OR): at least one skill. All of them (AND): every skill.",
            "default": "OR"
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Keep only jobs in these Upwork categories or specialties. Matched at either level, so a broad group (Design & Creative) or a single specialty (Web Development) both work. One per row.",
            "items": {
              "type": "string"
            }
          },
          "budgetType": {
            "title": "How the job pays",
            "enum": [
              "any",
              "hourly",
              "fixed",
              "no"
            ],
            "type": "string",
            "description": "Keep only jobs of this pay type. \"Budget not stated\" keeps jobs that declare neither an hourly rate nor a fixed budget.",
            "default": "any"
          },
          "minHourly": {
            "title": "Minimum hourly rate ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep hourly jobs advertising at least this rate. Fixed-price jobs are never affected by this. Example: 25 keeps $25/hr and up."
          },
          "maxHourly": {
            "title": "Maximum hourly rate ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep hourly jobs advertising no more than this rate. Leave empty for no ceiling."
          },
          "minFixed": {
            "title": "Minimum fixed budget ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep fixed-price jobs with a budget of at least this amount. Hourly jobs are never affected. Example: 500."
          },
          "maxFixed": {
            "title": "Maximum fixed budget ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep fixed-price jobs with a budget of no more than this amount. Leave empty for no ceiling."
          },
          "hideNoBudget": {
            "title": "Hide jobs with no budget",
            "type": "boolean",
            "description": "Drop jobs that state no budget at all. Off (default) keeps them — many good jobs simply don't post a number.",
            "default": false
          },
          "paymentVerifiedOnly": {
            "title": "Payment-verified clients only",
            "type": "boolean",
            "description": "Keep only jobs whose client has a verified billing method — a strong signal the client can actually pay. On by default.",
            "default": true
          },
          "postedWithinValue": {
            "title": "Posted within",
            "minimum": 1,
            "maximum": 24,
            "type": "integer",
            "description": "How far back to look, in the unit set by the toggle below. Range 1–24. Examples: 24 with the toggle off = the last 24 hours; 5 with the toggle on = the last 5 minutes.",
            "default": 24
          },
          "postedWithinInMinutes": {
            "title": "Measure in minutes (off = hours)",
            "type": "boolean",
            "description": "Off: the number above counts hours. On: it counts minutes — for catching jobs posted in the last few minutes.",
            "default": false
          },
          "experienceLevels": {
            "title": "Experience level",
            "type": "array",
            "description": "Keep only jobs at these experience levels. Pick one or more.",
            "items": {
              "type": "string",
              "enum": [
                "Entry level",
                "Intermediate",
                "Expert"
              ],
              "enumTitles": [
                "Entry level",
                "Intermediate",
                "Expert"
              ]
            }
          },
          "projectLengths": {
            "title": "Project length",
            "type": "array",
            "description": "Keep only jobs of these expected durations. Pick one or more.",
            "items": {
              "type": "string",
              "enum": [
                "Less than 1 month",
                "1 to 3 months",
                "3 to 6 months",
                "More than 6 months"
              ],
              "enumTitles": [
                "Less than 1 month",
                "1 to 3 months",
                "3 to 6 months",
                "More than 6 months"
              ]
            }
          },
          "contractTypes": {
            "title": "Contract type",
            "type": "array",
            "description": "Keep only these engagement types. Pick one or both.",
            "items": {
              "type": "string",
              "enum": [
                "Ongoing project",
                "One-time project"
              ],
              "enumTitles": [
                "Ongoing project",
                "One-time project"
              ]
            }
          },
          "clientRankMin": {
            "title": "Minimum client rank (0–5)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Upwork's own overall client-quality score, 0 to 5 (5 = Excellent). Example: 4 keeps well-rated clients."
          },
          "clientSpendMin": {
            "title": "Minimum client spend ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum total the client has ever spent on Upwork, in USD — a proxy for how established they are. Example: 1000."
          },
          "clientHiresMin": {
            "title": "Minimum client hires",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of freelancers the client has hired before. 0 means they may never have hired anyone."
          },
          "clientRatingMin": {
            "title": "Minimum client rating (0–5)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Minimum average star rating the client has received from freelancers. Whole numbers only (0–5)."
          },
          "clientReviewsMin": {
            "title": "Minimum client reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of reviews the client has received. More reviews means a longer, more reliable track record."
          },
          "clientAvgRateMin": {
            "title": "Minimum client average paid ($/hr)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum average hourly rate the client has actually paid in the past, in USD — a signal of budget. Example: 20."
          },
          "clientHireRateMin": {
            "title": "Minimum client hire rate (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Minimum share of the client's postings that ended in a hire, as a percentage. A low hire rate can mean a client who posts but rarely hires. Example: 50."
          },
          "includeNoTrackRecord": {
            "title": "Include clients with no track record",
            "type": "boolean",
            "description": "Whether to keep clients with no history at all — spent nothing, hired no one, and no reviews. On by default; turn off to focus only on proven clients.",
            "default": true
          },
          "clientLocations": {
            "title": "Client countries to keep",
            "type": "array",
            "description": "Keep only clients located in these countries. Use full country names, one per row (e.g. United States, United Kingdom).",
            "items": {
              "type": "string"
            }
          },
          "avoidClientLocations": {
            "title": "Client countries to drop",
            "type": "array",
            "description": "Drop clients located in these countries. Full country names, one per row.",
            "items": {
              "type": "string"
            }
          },
          "usJobs": {
            "title": "US-only jobs",
            "enum": [
              "include",
              "exclude",
              "only"
            ],
            "type": "string",
            "description": "Jobs Upwork restricts to US-based freelancers. Include (default) keeps them alongside everything else; Exclude drops them; Only returns just these.",
            "default": "include"
          },
          "ukJobs": {
            "title": "UK-only jobs",
            "enum": [
              "include",
              "exclude",
              "only"
            ],
            "type": "string",
            "description": "Jobs Upwork restricts to UK-based freelancers. Same three options as US-only jobs.",
            "default": "include"
          },
          "screeningQuestions": {
            "title": "Screening questions",
            "enum": [
              "any",
              "with",
              "without"
            ],
            "type": "string",
            "description": "Any: don't filter on this. \"Only jobs that ask\": keep postings that include screening questions. \"Only jobs that don't\": keep postings without any.",
            "default": "any"
          },
          "maxJobs": {
            "title": "Max jobs",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop the run after this many jobs. Because you pay per result, this is also your cost ceiling for the run. Example: 500.",
            "default": 500
          },
          "upspyApiKey": {
            "title": "Upspy API key",
            "type": "string",
            "description": "Optional and rarely needed. Blank uses the built-in key, so no account is required. Advanced users with an Upspy account can set their own key (app.upspy.ai → Settings → Developer) via the JSON input to run against their account."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}