{
  "openapi": "3.0.1",
  "info": {
    "title": "Upwork Job Scraper: Scheduled Job Alerts, Qualified Clients",
    "description": "New Upwork jobs in seconds, served from a live-updated index — no login, no waiting on a scrape. Filter by client spend, payment-verified, hire rate and budget. Empty runs free. Start from any time; never miss a job. $2 per 1,000, no monthly fee.",
    "version": "1.1",
    "x-build-id": "IHjHOwMgH8PD4zPui"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~upwork-scraper-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-upwork-scraper-ai",
        "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/hyperbach~upwork-scraper-ai/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-upwork-scraper-ai",
        "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/hyperbach~upwork-scraper-ai/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-upwork-scraper-ai",
        "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": {
          "keywords": {
            "title": "Keywords Search",
            "type": "string",
            "description": "Search the job's title, description, skills, categories and AI-generated fields. A new search matches by meaning: every job with all your words, plus jobs about the same thing in other words (see keywords_match). `a OR b`, \"quotes\" and -word ask for an exact word match: bare words must all appear, OR separates alternatives, quotes keep a phrase, a leading minus drops a word. For a whole field of work, set category_name instead: it is exact (e.g. \"Web, Mobile & Software Dev\")."
          },
          "keywords_match": {
            "title": "Keywords matching",
            "enum": [
              "auto",
              "strict",
              "semantic"
            ],
            "type": "string",
            "description": "How `keywords` match. auto (default): a new search matches by meaning — every job with all your words, plus jobs about the same thing in other words, each with a `relevance` score; a search you already ran before this option existed keeps matching exactly as it did; a search written with OR, \"quotes\" or -word matches the words exactly. strict: the words exactly, always. semantic: by meaning, always. Editing the keywords of a saved task makes it a new search.",
            "default": "auto"
          },
          "exclude_keywords": {
            "title": "Exclude Keywords",
            "type": "string",
            "description": "Drop jobs containing any of these words. Quotes keep a phrase together (`\"data entry\" wordpress` drops both), and you can write OR yourself. Searches the same text fields as keywords."
          },
          "category_name": {
            "title": "Category Name",
            "enum": [
              "Accounting & Consulting",
              "Admin Support",
              "Customer Service",
              "Data Science & Analytics",
              "Design & Creative",
              "Engineering & Architecture",
              "IT & Networking",
              "Legal",
              "Sales & Marketing",
              "Translation",
              "Web, Mobile & Software Dev",
              "Writing"
            ],
            "type": "string",
            "description": "Upwork's top-level category of the job. The value must match exactly. One of 12, most jobs first: \"Design & Creative\", \"Sales & Marketing\", \"Web, Mobile & Software Dev\", \"Admin Support\", \"Engineering & Architecture\", \"Accounting & Consulting\", \"Writing\", \"Data Science & Analytics\", \"Customer Service\", \"IT & Networking\", \"Translation\", \"Legal\"."
          },
          "subcategory_name": {
            "title": "Subcategory Name",
            "enum": [
              "3D Modeling & CAD",
              "Accounting & Bookkeeping",
              "AI & Machine Learning",
              "AI Apps & Integration",
              "Art & Illustration",
              "Audio & Music Production",
              "Blockchain, NFT & Cryptocurrency",
              "Branding & Logo Design",
              "Building & Landscape Architecture",
              "Chemical Engineering",
              "Civil & Structural Engineering",
              "Community Management & Tagging",
              "Content Writing",
              "Contract Manufacturing",
              "Corporate & Contract Law",
              "Customer Service & Tech Support",
              "Data Analysis & Testing",
              "Data Entry & Transcription Services",
              "Data Extraction/ETL",
              "Data Mining & Management",
              "Database Management & Administration",
              "Desktop Application Development",
              "DevOps & Solution Architecture",
              "Digital Marketing",
              "Ecommerce Development",
              "Editing & Proofreading Services",
              "Electrical & Electronic Engineering",
              "Energy & Mechanical Engineering",
              "ERP/CRM Software",
              "Finance & Tax Law",
              "Financial Planning",
              "Game Design & Development",
              "Graphic, Editorial & Presentation Design",
              "Information Security & Compliance",
              "Interior & Trade Show Design",
              "International & Immigration Law",
              "Language Tutoring & Interpretation",
              "Lead Generation & Telemarketing",
              "Management Consulting & Analysis",
              "Market Research & Product Reviews",
              "Marketing, PR & Brand Strategy",
              "Mobile Development",
              "Network & System Administration",
              "NFT, AR/VR & Game Art",
              "Other - Accounting & Consulting",
              "Other - Software Development",
              "Performing Arts",
              "Personal & Professional Coaching",
              "Photography",
              "Physical Sciences",
              "Product Design",
              "Product Management & Scrum",
              "Professional & Business Writing",
              "Project Management",
              "Public Law",
              "QA Testing",
              "Recruiting & Human Resources",
              "Sales & Marketing Copywriting",
              "Scripts & Utilities",
              "Translation & Localization Services",
              "Video & Animation",
              "Virtual Assistance",
              "Web & Mobile Design",
              "Web Development"
            ],
            "type": "string",
            "description": "Upwork's subcategory, one level under category_name. The value must match exactly. Most common: \"Digital Marketing\", \"Video & Animation\", \"Graphic, Editorial & Presentation Design\", \"Lead Generation & Telemarketing\", \"Web Development\", \"Virtual Assistance\". All 64 values, grouped under their category, are in the README section \"Categories and subcategories\"."
          },
          "date_posted": {
            "title": "Date Posted",
            "type": "string",
            "description": "When the job was posted on Upwork. Use this to find recent opportunities or analyze posting patterns. Simplest form is a relative age: 90m = posted in the last 90 minutes, 24h = last day, 7d = last 7 days, 2w = last two weeks. A bare number means days (3 = last 3 days). Or give an ISO date (YYYY-MM-DD or full ISO datetime) with >= for newer than that date, <= for older."
          },
          "created_at": {
            "title": "Created At",
            "type": "string",
            "description": "When this job entered our index — a start point you own, including jobs Upwork listed late. Replayable and shareable, unlike a vendor-held 'since last run' state. A bound reads the whole millisecond it names: > the newest created_at you received returns exactly the jobs added since, and <= a row's created_at includes that row. notifications_only: true and page_after also walk without repeats or gaps. Use >=2026-09-01T00:00:00Z to start from a moment you choose, then pass > the newest created_at in each batch. This is ingestion time, not the Upwork posting date (that is date_posted)."
          },
          "limit": {
            "title": "Limit",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Rows to return in this run (1-10000, default 50), ordered by when each posting entered our index, newest first. The searchable window is the last 90 days. With notifications_only=true each run continues from where the last one stopped; with notifications_only=false a run returns the newest matches; to go further back, pass the run's next_page token as page_after.",
            "default": 50
          },
          "notifications_only": {
            "title": "Notifications Only",
            "type": "boolean",
            "description": "Set true on a schedule: each run returns only the postings that arrived since the previous run, per filter set, and every row is billed once. False returns the newest matches every time; a time-window filter polled often re-bills the overlap.",
            "default": false
          },
          "page_after": {
            "title": "Next page token",
            "type": "string",
            "description": "Full page only (notifications_only=false): continue below the last row of an earlier run. Paste that run's next_page (in its OUTPUT and status message) with the same filters, and this run returns the next older matches — no repeats, no gaps — until next_page is absent. Leave empty for the newest page."
          },
          "estimate": {
            "title": "Estimate this search first",
            "type": "boolean",
            "description": "Measure the search instead of running it: how many jobs it would have delivered per day, week and hour over the last 28 days, whether that is too narrow, workable or too broad, what a month of it costs on each Apify plan at your schedule, which filter cuts the most jobs, and 5 recent matches. Returns ONE row, billed as one result; moves no feed position. Uses every filter below, plus limit, notifications_only and estimate_poll_minutes for the cost.",
            "default": false
          },
          "estimate_poll_minutes": {
            "title": "Estimate: run every N minutes",
            "minimum": 1,
            "maximum": 10080,
            "type": "integer",
            "description": "How often you plan to run this search, for the estimate's monthly cost. Default 60.",
            "default": 60
          },
          "include_history": {
            "title": "Include job history",
            "type": "boolean",
            "description": "Attach each job's recorded history to its row, free — no extra charge. `history.readings` is the job's state at each moment it changed (status, applicants, interviewing, invites, hires, last client activity, budget); `history.edits` is each change the client made to the posting, and what changed. Served from our own database of readings, not re-read from Upwork: a job we have not re-read yet has empty lists. Works in feed mode and in refresh mode, where it is the history recorded before that run.",
            "default": false
          },
          "refresh_shape": {
            "title": "Refresh output shape",
            "enum": [
              "raw",
              "flat"
            ],
            "type": "string",
            "description": "Refresh mode only. \"raw\" (default) returns each job's live record as it comes, nested. \"flat\" returns the same flat row the feed returns — the same field names and values — plus a `live` block (status, applicants, interviewing, invites, hires, last client activity), so feed and refresh rows have one shape.",
            "default": "raw"
          },
          "slack_webhook_url": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Post one message per run with the new jobs to a Slack channel. Slack app → Incoming Webhooks → Add New Webhook. Nothing is sent when a run finds nothing (see notify_when_empty). The URL goes to Slack only, never to our servers."
          },
          "telegram_bot_token": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "From @BotFather. With telegram_chat_id, one Telegram message per run with the new jobs."
          },
          "telegram_chat_id": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Your chat or channel id (from @userinfobot; channels start with -100). The bot must be in the chat."
          },
          "webhook_url": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POST a JSON body {count, total, run_url, run_id, items[]} (up to 500 rows) to your URL after each run that found jobs — for n8n, Make, Zapier or your own backend."
          },
          "webhook_headers": {
            "title": "Webhook headers",
            "type": "object",
            "description": "Extra HTTP headers for the webhook POST, e.g. {\"Authorization\": \"Bearer …\"}."
          },
          "notify_when_empty": {
            "title": "Notify on empty runs too",
            "type": "boolean",
            "description": "Send the notification even when the run found no new jobs. Off by default so a schedule stays quiet.",
            "default": false
          },
          "whats_new": {
            "title": "Show what's new",
            "type": "boolean",
            "description": "A one-line note about this Actor's newest feature at the end of the run's status message and in the OUTPUT record, until you try the feature or 20 runs have shown it. After regular use it also asks, at most three times and a week apart, for a rating on the Store page. Never added to the dataset rows. Uncheck to hide both.",
            "default": true
          },
          "all_words": {
            "title": "All of these words",
            "type": "array",
            "description": "Every entry must appear in the job. One word or phrase per entry; an entry with spaces must appear as written. Exact word match, like Upwork's advanced search.",
            "items": {
              "type": "string"
            }
          },
          "any_words": {
            "title": "Any of these words",
            "type": "array",
            "description": "At least one entry must appear in the job. One word or phrase per entry: webflow, framer, \"landing page\".",
            "items": {
              "type": "string"
            }
          },
          "none_words": {
            "title": "None of these words",
            "type": "array",
            "description": "Drop a job if any entry appears in it. One word or phrase per entry.",
            "items": {
              "type": "string"
            }
          },
          "exact_phrase": {
            "title": "The exact phrase",
            "type": "array",
            "description": "Each entry must appear with its words in this order, e.g. cold email.",
            "items": {
              "type": "string"
            }
          },
          "title_search": {
            "title": "Title search",
            "type": "array",
            "description": "Every entry must appear in the job title.",
            "items": {
              "type": "string"
            }
          },
          "skills_search": {
            "title": "Skills search",
            "type": "array",
            "description": "Every entry must appear in the job's skills (the listed skills and the ones our AI read from the description).",
            "items": {
              "type": "string"
            }
          },
          "buyer_payment_verified": {
            "title": "Buyer Payment Verified",
            "type": "boolean",
            "description": "Boolean flag indicating whether the client has verified their payment method on Upwork."
          },
          "total_spent": {
            "title": "Total Spent",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Total amount the client has spent on Upwork across all their projects. Use numeric operators like >=1000000 for values above threshold, or range syntax like 500000-1000000 for values between 500000-1000000."
          },
          "buyer_score": {
            "title": "Buyer Score",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Score of the client's performance on Upwork. Use numeric operators like >=5.0 for values above threshold, or range syntax like 4.7-5.0 for values between 4.7-5.0."
          },
          "job_score": {
            "title": "Job Score",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Rule-based 0–100 score that ranks the job by attractiveness. Weighted across price (20), client reputation (42), client spending (40), premium status (5), and location (10). Because 82 of those 100 points come from client reputation and spending, a threshold mostly selects for good clients rather than good briefs. Half of all jobs score under 37 and only 9% reach 70, so start at >=50 and raise it. Jobs with no client spending history skip that 40-point block and therefore score low — a high threshold filters out thin postings as well as weak ones."
          },
          "hire_rate": {
            "title": "Client Hire Rate",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Upwork's own hire rate for the client: the share of their posted jobs that led to a hire, 0-100. It is not hires divided by jobs posted (a job can hire several people). High values mean a client who hires rather than browses. Use >= for clients who hire frequently (>=80), or <= for selective clients (<=50). Null values indicate new clients."
          },
          "open_jobs": {
            "title": "Open Jobs",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Number of jobs the client currently has open/active. Use numeric operators like <=10 for values below threshold, or range syntax like 5-20 for values between 5-20."
          },
          "client_invites_sent": {
            "title": "Client Invites Sent",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Invites the client had sent when the job was captured, minutes after posting. Clients usually send invites while creating the job, so this catches invite-first postings. 0 when the source reported none (NULLs backfilled to 0 on 2026-08-22 — before that, numeric filters silently dropped the unreported rows). \"0\" finds jobs with no invites yet at capture time (least pre-committed clients); \">=1\" finds invite-first postings. Numeric operators and range syntax like 5-20 work as on any numeric field."
          },
          "hires": {
            "title": "Hires",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Total number of freelancers hired by the client. Use numeric operators like >=10 for values above threshold, or range syntax like 5-20 for values between 5-20."
          },
          "client_location": {
            "title": "Client Location",
            "type": "string",
            "description": "Geographic location of the client posting the job. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "avg_hourly_rate": {
            "title": "Client Avg Hourly Rate",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Average hourly rate this client typically pays freelancers. Based on their historical hiring patterns. Filter by client's typical budget range. Use >= for higher-paying clients (>=60) or <= for budget-conscious clients."
          },
          "buyer_city": {
            "title": "Buyer City",
            "type": "string",
            "description": "City where the client is located. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "buyer_contract_date": {
            "title": "Buyer Contract Date",
            "type": "string",
            "description": "Date when the client first registered their account on Upwork. Indicates how long the client has been active on the platform. Use >= for clients registered after a date, <= for before a date. Format: YYYY-MM-DD or ISO datetime. A relative age also works (365d = registered within the last year). Older registration dates indicate more established clients."
          },
          "jobs_posted": {
            "title": "Client: jobs posted (count)",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "How many jobs this client has posted on Upwork over their whole account — a count, not a date. \"10\" means 10 or more; use date_posted or created_at for a time window. A minimum: \"5\" or \">=5\". Not a time filter — for jobs posted in the last day use date_posted: \"24h\"."
          },
          "price_type": {
            "title": "Price Type",
            "enum": [
              "Fixed-price",
              "Hourly"
            ],
            "type": "string",
            "description": "How the job is priced: Fixed Price (one-time payment) or Hourly (paid per hour worked)."
          },
          "price": {
            "title": "Budget/Price - Fixed-price",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "The budget amount for the fixed-price job. Use numeric operators like >=1000 for jobs above $1000, or 500-2000 for budgets between $500-2000. Only applies to fixed-price jobs."
          },
          "price_min": {
            "title": "Hourly Rate - Min",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Lower end of the job's hourly rate band (Upwork jobs advertise a range like $10-35/hr). Hourly jobs only - fixed-price jobs carry their budget in `price` and leave this empty. price_min and price_max together describe the rate window you want, and a job matches when its advertised band OVERLAPS that window. price_min=35 (or >=35) means \"can pay $35/hr or more\" and returns a job advertised at $10-35/hr. The operator decides which end of the window you are setting, so <=35 here means a ceiling and behaves exactly like price_max=35 - a bare number is read as a floor, never as an exact match. Use 25-75 for work paying somewhere in $25-75. Jobs stating no rate are matched on the client's historical hourly rate instead; see include_unspecified_rate."
          },
          "price_max": {
            "title": "Hourly Rate - Max",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Upper end of the job's hourly rate band (Upwork jobs advertise a range like $10-35/hr). Hourly jobs only - fixed-price jobs carry their budget in `price` and leave this empty. Sets the ceiling of the rate window you want; a job matches when its advertised band overlaps it. price_max=50 (or <=50) means \"can be done at $50/hr or under\". The operator decides which end you are setting, so >=50 here means a floor and behaves exactly like price_min=50 - a bare number is read as a ceiling, never as an exact match. Combine with price_min for a window, e.g. price_min=35 plus price_max=90. Jobs stating no rate are matched on the client's historical hourly rate instead; see include_unspecified_rate."
          },
          "include_unspecified_rate": {
            "title": "Jobs With No Stated Rate",
            "enum": [
              "off",
              "likely",
              "all"
            ],
            "type": "string",
            "description": "What a rate filter should do with jobs that state no rate - about a third of hourly jobs, plus every fixed-price job (their budget is in `price`). `likely` (default) also returns those jobs when the CLIENT's own historical hourly rate fits your window, which is the best evidence available when the posting itself is silent. `off` returns only jobs with a stated rate that overlaps. `all` returns every rate-unspecified job regardless of evidence."
          },
          "experience_level": {
            "title": "Experience Level",
            "enum": [
              "Entry_level",
              "Expert",
              "Intermediate"
            ],
            "type": "string",
            "description": "Required experience level for the job. Exact values: Entry_level, Intermediate, Expert."
          },
          "title": {
            "title": "Job Title",
            "type": "string",
            "description": "The job posting title as written by the client. Contains the main description of what work needs to be done. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "description": {
            "title": "Description",
            "type": "string",
            "description": "Full job description text as written by the client. Contains detailed requirements, expectations, and project scope. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "skills": {
            "title": "Skills",
            "type": "string",
            "description": "Comma-separated list of required skills and technologies for the job as specified by the client. Filter: matches the text anywhere in the field, any case. A comma list or `a OR b` matches jobs with any of them."
          },
          "job_is_premium": {
            "title": "Job Is Premium",
            "type": "boolean",
            "description": "Boolean flag indicating whether job is premium applies to this job."
          },
          "qual_rising_talent": {
            "title": "Qual Rising Talent",
            "type": "boolean",
            "description": "Whether the job is open to Upwork Rising Talent (newer freelancers with potential)."
          },
          "qual_portfolio_required": {
            "title": "Qual Portfolio Required",
            "type": "boolean",
            "description": "Whether the client requires a portfolio or work samples to apply."
          },
          "qual_min_hours_week": {
            "title": "Qual Min Hours Week",
            "enum": [
              "0",
              "10",
              "30",
              "40"
            ],
            "type": "string",
            "description": "Minimum hours per week the client requires for hourly jobs. Values seen: 0 (none stated), 10, 30, 40."
          },
          "ai_urgency": {
            "title": "Urgency",
            "enum": [
              "Immediate",
              "Long-Term",
              "Moderately Urgent",
              "Not Urgent",
              "Urgent",
              "Very Urgent"
            ],
            "type": "string",
            "description": "AI-detected urgency level of the job based on language and posting patterns."
          },
          "ai_technical_skills": {
            "title": "Technical Skills (AI Extracted)",
            "type": "string",
            "description": "Technical skills explicitly mentioned in the job description, extracted using AI. These are skills directly stated by the client as requirements or preferences. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "ai_explicit_mention_of_agency": {
            "title": "Explicit Mention Of Agency",
            "enum": [
              "Agencies Welcome",
              "No Agencies",
              "No Mention"
            ],
            "type": "string",
            "description": "AI-detected explicit mention of agency preferences in the job posting. Indicates whether the client welcomes agencies, prefers individual freelancers, or has no specific preference."
          },
          "clientId": {
            "title": "Client ID",
            "minLength": 1,
            "maxLength": 200,
            "type": "string",
            "description": "Unique identifier for the client. The service automatically tracks what jobs this client has already seen.",
            "default": "default"
          },
          "fields": {
            "title": "Fields (output projection)",
            "type": "array",
            "description": "Optional list of field names to keep in the dataset output. If empty, all fields are returned. Saves storage cost on long runs. Example: id, title, url, job_score, questions. Always-implicit field `id` is kept whether listed or not.",
            "items": {
              "type": "string"
            }
          },
          "refresh_job_ids": {
            "title": "Refresh jobs by id (live scrape)",
            "type": "array",
            "description": "LIVE mode: fetch these jobs fresh from Upwork right now instead of serving the pre-indexed store. Accepts up to 50 entries in any form — job URL, ~02… cipher, or the numeric id. Returns each job's CURRENT state: activity counters (applicants, hires, invites) plus the client's recent contract history with both-way review texts. Cannot be combined with search filters. Billed per returned job at the normal result rate; ids that no longer resolve are free and listed in the run OUTPUT.",
            "items": {
              "type": "string"
            }
          },
          "active_hires": {
            "title": "Active Hires",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Number of freelancers currently hired by the client. Use numeric operators like >=10 for values above threshold, or range syntax like 5-20 for values between 5-20."
          },
          "ai_anti_bot_phrase": {
            "title": "Anti Bot Phrase",
            "type": "string",
            "description": "AI-detected anti-bot phrases and instructions used by clients in job descriptions to filter out automated applications and ensure human applicants read the full posting. These phrases typically ask applicants to include specific words, numbers, emojis, or perform certain actions in their proposals to prove they've read the requirements carefully. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "ai_clients_technical_understanding": {
            "title": "Client's Technical Understanding",
            "enum": [
              "Expert",
              "High",
              "Low",
              "Moderate"
            ],
            "type": "string",
            "description": "AI-detected assessment of the client's technical understanding based on how they describe their project requirements. Helps identify whether the client has deep technical knowledge, moderate understanding, basic knowledge, or expert-level expertise in the domain."
          },
          "ai_deadline": {
            "title": "Deadline",
            "enum": [
              "Fixed Deadline",
              "Flexible Deadline",
              "Immediate Deadline",
              "No Deadline"
            ],
            "type": "string",
            "description": "AI-detected deadline type for the job based on urgency indicators and time-sensitive language in the job description."
          },
          "ai_duration": {
            "title": "Duration",
            "enum": [
              "Flexible",
              "Flexible Deadline",
              "Long-Term",
              "Mid-Term",
              "Part-Time",
              "Short-Term"
            ],
            "type": "string",
            "description": "AI-detected project duration based on job description analysis. Indicates expected length and type of engagement."
          },
          "ai_inferred_technical_skills": {
            "title": "Technical Skills (AI Inferred)",
            "type": "string",
            "description": "Technical skills inferred by AI from the job description context, even when not explicitly mentioned. These are skills likely needed based on project requirements and industry patterns. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "ai_named_entities": {
            "title": "Named Entities",
            "type": "string",
            "description": "AI-extracted named entities from the job description including company names, technologies, frameworks, tools, locations, and other important entities mentioned by the client. This field helps identify specific brands, platforms, or technologies the client is working with. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "ai_specific_requirements_before_applying": {
            "title": "Specific Requirements Before Applying",
            "type": "string",
            "description": "AI-extracted specific requirements that clients mention applicants must fulfill before applying, such as portfolio submissions, work samples, or specific application instructions. Filter: matches the text anywhere in the field, any case. `a OR b` matches jobs with either."
          },
          "buyer_feedback_count": {
            "title": "Buyer Feedback Count",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Number of feedbacks the client has received. Use numeric operators like >=10 for values above threshold, or range syntax like 5-20 for values between 5-20."
          },
          "buyer_offset_utc": {
            "title": "Buyer Offset UTC",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "UTC offset of the buyer's timezone in milliseconds. Indicates the time difference between the buyer's local time and UTC. Values are in milliseconds. Common offsets: 0 (UTC/GMT), 3600000 (+1 hour, Europe), -28800000 (-8 hours, US West Coast), 28800000 (+8 hours, Asia). Use >= or <= to find clients in specific timezone ranges. Positive values are east of UTC, negative are west."
          },
          "company_size": {
            "title": "Company Size",
            "enum": [
              "0",
              "1",
              "10",
              "100",
              "1000",
              "10000",
              "2",
              "500",
              "None"
            ],
            "type": "string",
            "description": "Size of the client's company. Predefined option for company size. Select from available choices."
          },
          "engagement_label": {
            "title": "Engagement Label",
            "enum": [
              "1 to 3 months",
              "3 to 6 months",
              "Less than 1 month",
              "More than 6 months"
            ],
            "type": "string",
            "description": "Expected duration or type of engagement (e.g., 1 to 3 months, 3 to 6 months, Less than 1 month, Less than 1 week, More than 6 months)."
          },
          "engagement_weeks": {
            "title": "Engagement Weeks",
            "enum": [
              "3",
              "9",
              "18",
              "52"
            ],
            "type": "string",
            "description": "Project duration in weeks as Upwork encodes it. Values seen: 3, 9, 18, 52."
          },
          "hourly_budget_type": {
            "title": "Hourly Budget Type",
            "enum": [
              "DEFAULT",
              "MANUAL",
              "NOT_PROVIDED"
            ],
            "type": "string",
            "description": "Type of hourly budget. Options: AS_NEEDED, DEFAULT, FULL_TIME, MANUAL, NOT_PROVIDED, NOT_SURE, PART_TIME."
          },
          "industry": {
            "title": "Industry",
            "enum": [
              "Aerospace",
              "Agriculture & Forestry",
              "Art & Design",
              "Automotive",
              "Aviation",
              "Education",
              "Energy & Utilities",
              "Engineering & Architecture",
              "Fashion & Beauty",
              "Finance & Accounting",
              "Food & Beverage",
              "Government & Public Sector",
              "Health & Fitness",
              "HR & Business Services",
              "Legal",
              "Manufacturing & Construction",
              "Media & Entertainment",
              "Military & Defense",
              "Mining",
              "Nonprofit",
              "Real Estate",
              "Retail & Consumer Goods",
              "Sales & Marketing",
              "Science & Medicine",
              "Sports & Recreation",
              "Supply Chain & Logistics",
              "Tech & IT",
              "Transportation & Warehousing",
              "Travel & Hospitality"
            ],
            "type": "string",
            "description": "The client's industry, as the client set it on Upwork. The value must match exactly. Most common: \"Tech & IT\", \"Sales & Marketing\", \"Media & Entertainment\", \"Education\", \"Health & Fitness\", \"Retail & Consumer Goods\". All 29 values in the last 90 days are in the list."
          },
          "qual_min_success_score": {
            "title": "Qual Min Success Score",
            "enum": [
              "0",
              "80",
              "90"
            ],
            "type": "string",
            "description": "Minimum Upwork success score required to apply for the job."
          },
          "qual_pref_english": {
            "title": "Qual Pref English",
            "enum": [
              "ANY",
              "CONVERSATIONAL",
              "FLUENT",
              "NATIVE"
            ],
            "type": "string",
            "description": "Client's preferred English proficiency level for freelancers."
          },
          "qual_type": {
            "title": "Qual Type",
            "enum": [
              "AGENCY",
              "ANY",
              "INDEPENDENT"
            ],
            "type": "string",
            "description": "Type of freelancer the client is looking for: Agency (team/company), Independent (solo freelancer), or Any (no preference)."
          },
          "total_hours": {
            "title": "Total Hours",
            "pattern": "^(?:|[\\s\\S]*[0-9][\\s\\S]*)$",
            "type": "string",
            "description": "Total number of hours the client has worked on Upwork across all their projects. Use numeric operators like >=100 for values above threshold, or range syntax like 50-200 for values between 50-200."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}