{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Scraper - Freelance Jobs & Client Intel",
    "description": "Scrape Upwork freelance jobs: title, description, fixed or hourly budget, experience level, workload, duration and skills. Client intelligence adds payment verified, total spend, hire rate, rating, country and the proposal count. Paste any Upwork search, category or job URL.",
    "version": "0.1",
    "x-build-id": "1Km6WSGyuZ6LbQxr4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~upwork-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-upwork-scraper",
        "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/scrapesage~upwork-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-upwork-scraper",
        "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/scrapesage~upwork-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-upwork-scraper",
        "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": {
          "searchQueries": {
            "title": "Search terms",
            "type": "array",
            "description": "What to search Upwork for, one term per line - a skill, a role or a technology (for example <code>python</code>, <code>shopify developer</code>, <code>copywriter</code>). Each term is searched separately and the results are merged and de-duplicated.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Upwork URLs (search, category or a single job)",
            "type": "array",
            "description": "Paste Upwork URLs straight from your browser and every filter already in them is kept. A search URL (<code>/nx/search/jobs/?q=...</code>) is followed page by page - paste one that already has <code>&amp;page=3</code> and it starts there. A category URL (<code>/freelance-jobs/...</code>) returns a single block of ~30 richer records, because Upwork does not page those landing pages. A single job URL (<code>/jobs/~0...</code>) is scraped with full client details. Type them, upload a file, or link a remote text file.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "urlsFromFile": {
            "title": "...or paste / link a file of URLs",
            "type": "string",
            "description": "A block of Upwork URLs, one per line - or a single link to a .txt / .csv file, a Google Sheet or a Drive file containing them. Blank lines, # comments, quotes and duplicates are all handled."
          },
          "categories": {
            "title": "Upwork category pages",
            "type": "array",
            "description": "Upwork's own <code>/freelance-jobs/&lt;slug&gt;/</code> discipline pages. Each returns about 30 jobs with richer structured fields than the search page - the exact posting time, workload and duration are all included - so this is the cheapest way to sweep a whole discipline. All 83 slugs were read from Upwork's own navigation, so a mistyped one is rejected before the run instead of quietly costing a request and returning nothing.",
            "items": {
              "type": "string",
              "enum": [
                "3d-modeling",
                "affiliate-marketing",
                "ai-content-creation",
                "ai-generated-video",
                "ai-model-training",
                "ai-writing",
                "animation",
                "appointment-setting",
                "article-writing",
                "artificial-intelligence",
                "audio-production",
                "automation",
                "cad-design",
                "canva",
                "chat-support",
                "chatbot-development",
                "chatgpt",
                "coding",
                "computer-vision",
                "content-writing",
                "copywriting",
                "creative-writing",
                "customer-service",
                "data-analysis",
                "data-annotation",
                "data-entry",
                "data-science",
                "deep-learning",
                "digital-marketing",
                "digital-signal-processing",
                "economics",
                "email-marketing",
                "email-support",
                "executive-assistant",
                "frontend-development",
                "full-stack-development",
                "generative-ai",
                "ghostwriting",
                "graphic-design",
                "ibm-spss",
                "illustration",
                "imageobject-recognition",
                "influencer-marketing",
                "interior-design",
                "lead-generation",
                "literature-review",
                "logo-design",
                "machine-learning",
                "microsoft-excel",
                "motion-graphics",
                "narration",
                "ocr-tesseract",
                "pay-per-click",
                "photo-editing",
                "podcasting",
                "presentation-design",
                "prompt-engineering",
                "proofreading",
                "python",
                "pytorch",
                "react-js",
                "research-papers",
                "resume-writing",
                "scriptwriting",
                "seo",
                "shopify",
                "social-media-management",
                "social-media-marketing",
                "software-development",
                "statistics",
                "subtitling",
                "technical-writing",
                "transcription",
                "ux-ui-design",
                "video-editing",
                "videography",
                "virtual-assistant",
                "voice-acting",
                "voice-over",
                "web-design",
                "website-development",
                "wordpress",
                "writing"
              ],
              "enumTitles": [
                "3D Modeling (3d-modeling)",
                "Affiliate Marketing (affiliate-marketing)",
                "Ai Content Creation (ai-content-creation)",
                "Ai Generated Video (ai-generated-video)",
                "Ai Model Training (ai-model-training)",
                "Ai Writing (ai-writing)",
                "Animation (animation)",
                "Appointment Setting (appointment-setting)",
                "Article Writing (article-writing)",
                "Artificial Intelligence (artificial-intelligence)",
                "Audio Production (audio-production)",
                "Automation (automation)",
                "Cad Design (cad-design)",
                "Canva (canva)",
                "Chat Support (chat-support)",
                "Chatbot Development (chatbot-development)",
                "Chatgpt (chatgpt)",
                "Coding (coding)",
                "Computer Vision (computer-vision)",
                "Content Writing (content-writing)",
                "Copywriting (copywriting)",
                "Creative Writing (creative-writing)",
                "Customer Service (customer-service)",
                "Data Analysis (data-analysis)",
                "Data Annotation (data-annotation)",
                "Data Entry (data-entry)",
                "Data Science (data-science)",
                "Deep Learning (deep-learning)",
                "Digital Marketing (digital-marketing)",
                "Digital Signal Processing (digital-signal-processing)",
                "Economics (economics)",
                "Email Marketing (email-marketing)",
                "Email Support (email-support)",
                "Executive Assistant (executive-assistant)",
                "Frontend Development (frontend-development)",
                "Full Stack Development (full-stack-development)",
                "Generative Ai (generative-ai)",
                "Ghostwriting (ghostwriting)",
                "Graphic Design (graphic-design)",
                "Ibm Spss (ibm-spss)",
                "Illustration (illustration)",
                "Imageobject Recognition (imageobject-recognition)",
                "Influencer Marketing (influencer-marketing)",
                "Interior Design (interior-design)",
                "Lead Generation (lead-generation)",
                "Literature Review (literature-review)",
                "Logo Design (logo-design)",
                "Machine Learning (machine-learning)",
                "Microsoft Excel (microsoft-excel)",
                "Motion Graphics (motion-graphics)",
                "Narration (narration)",
                "Ocr Tesseract (ocr-tesseract)",
                "Pay Per Click (pay-per-click)",
                "Photo Editing (photo-editing)",
                "Podcasting (podcasting)",
                "Presentation Design (presentation-design)",
                "Prompt Engineering (prompt-engineering)",
                "Proofreading (proofreading)",
                "Python (python)",
                "Pytorch (pytorch)",
                "React Js (react-js)",
                "Research Papers (research-papers)",
                "Resume Writing (resume-writing)",
                "Scriptwriting (scriptwriting)",
                "Seo (seo)",
                "Shopify (shopify)",
                "Social Media Management (social-media-management)",
                "Social Media Marketing (social-media-marketing)",
                "Software Development (software-development)",
                "Statistics (statistics)",
                "Subtitling (subtitling)",
                "Technical Writing (technical-writing)",
                "Transcription (transcription)",
                "Ux Ui Design (ux-ui-design)",
                "Video Editing (video-editing)",
                "Videography (videography)",
                "Virtual Assistant (virtual-assistant)",
                "Voice Acting (voice-acting)",
                "Voice Over (voice-over)",
                "Web Design (web-design)",
                "Website Development (website-development)",
                "Wordpress (wordpress)",
                "Writing (writing)"
              ]
            }
          },
          "jobTypes": {
            "title": "Job type",
            "type": "array",
            "description": "Keep only fixed-price or hourly contracts.",
            "items": {
              "type": "string",
              "enum": [
                "Fixed price",
                "Hourly"
              ],
              "enumTitles": [
                "Fixed price",
                "Hourly"
              ]
            }
          },
          "experienceLevels": {
            "title": "Experience level",
            "type": "array",
            "description": "Upwork's own three levels.",
            "items": {
              "type": "string",
              "enum": [
                "Entry level",
                "Intermediate",
                "Expert"
              ],
              "enumTitles": [
                "Entry level",
                "Intermediate",
                "Expert"
              ]
            }
          },
          "minBudget": {
            "title": "Minimum budget or hourly rate",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs at or above this figure. Compared against the fixed-price budget, or the top of the hourly range for hourly contracts. Jobs that publish no figure are dropped when this is set."
          },
          "maxBudget": {
            "title": "Maximum budget or hourly rate",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs at or below this figure."
          },
          "titleQuery": {
            "title": "Job title contains",
            "type": "string",
            "description": "Keep only jobs whose title contains this text (case-insensitive) - the quickest way to tighten a broad search."
          },
          "skillsAny": {
            "title": "Must list any of these skills",
            "type": "array",
            "description": "Keep a job if it lists at least one of these skills, matched loosely (for example <code>react</code> matches <code>React Native</code>).",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude jobs containing",
            "type": "array",
            "description": "Drop any job whose title or description contains one of these terms.",
            "items": {
              "type": "string"
            }
          },
          "includeClientDetails": {
            "title": "Fetch client intelligence for each job",
            "type": "boolean",
            "description": "<b>The reason to use this actor.</b> Off by default because it costs one extra request per job. Turn it on and every row gains the buyer's record: payment-method verified, total spend, jobs posted, hire rate, star rating and review count, open jobs, hours billed, country, city and timezone - plus the job's own proposal count, interview count and exact posting timestamp. Any of the client filters below switches this on automatically.",
            "default": false
          },
          "maxDetailRecords": {
            "title": "Maximum jobs to enrich",
            "minimum": 0,
            "type": "integer",
            "description": "A ceiling on how many job pages are fetched for client details, so a broad search cannot become a large bill by accident. Jobs past the cap are still returned, just without the client record.",
            "default": 50
          },
          "paymentVerifiedOnly": {
            "title": "Only clients with a verified payment method",
            "type": "boolean",
            "description": "The single most useful quality filter on Upwork - unverified clients are the ones who waste a freelancer's proposals. Switches client details on automatically.",
            "default": false
          },
          "minClientSpend": {
            "title": "Minimum client total spend (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs from clients who have already spent at least this much on Upwork. Switches client details on automatically."
          },
          "minClientRating": {
            "title": "Minimum client rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only jobs from clients rated at or above this (out of 5). Clients with no rating yet are dropped. Switches client details on automatically."
          },
          "clientCountries": {
            "title": "Client countries",
            "type": "array",
            "description": "Keep only jobs whose client is in one of these countries, matched on the code Upwork publishes (for example <code>USA</code>, <code>GBR</code>, <code>AUS</code>, <code>ESP</code>). Switches client details on automatically.",
            "items": {
              "type": "string"
            }
          },
          "maxPagesPerUrl": {
            "title": "Maximum pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "How many result pages to follow for each search term or search URL - about 10 jobs per page. Category listings ignore this: Upwork serves them as one block of ~30 richer jobs, so use a search term when you want depth.",
            "default": 5
          },
          "maxResults": {
            "title": "Maximum jobs to return",
            "minimum": 1,
            "type": "integer",
            "description": "Stops the run once this many jobs have been collected across all searches.",
            "default": 50
          },
          "monitorMode": {
            "title": "Monitor mode - only jobs new since the last run",
            "type": "boolean",
            "description": "Remembers every job already returned under this monitor key and emits only new ones, tagged monitorEvent: \"new\". Pair it with an Apify Schedule to watch a niche and be first to propose.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Names the memory used by monitor mode. Use a different key per saved watch so separate monitors never share state.",
            "default": "default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}