{
  "openapi": "3.0.1",
  "info": {
    "title": "Workday Jobs Monitor — Change Tracking + Hiring Signal Score",
    "description": "Pull every open job from any Workday career site (*.myworkdayjobs.com), filtered by country or city, with a new-jobs-since-last-run monitor and a per-company hiring-signal summary. Optional change tracking and an explainable 0–100 signal score.",
    "version": "0.0",
    "x-build-id": "QfUEZUcd0anfcoUJL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/goldenrod_serrano~workday-hiring-signals/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-goldenrod_serrano-workday-hiring-signals",
        "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/goldenrod_serrano~workday-hiring-signals/runs": {
      "post": {
        "operationId": "runs-sync-goldenrod_serrano-workday-hiring-signals",
        "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/goldenrod_serrano~workday-hiring-signals/run-sync": {
      "post": {
        "operationId": "run-sync-goldenrod_serrano-workday-hiring-signals",
        "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": {
          "careerSites": {
            "title": "Workday career sites",
            "type": "array",
            "description": "One per line. Any Workday career-site URL: https://<company>.wdN.myworkdayjobs.com/<Site> (a job or search URL works too), https://wdN.myworkdaysite.com/recruiting/<company>/<Site>, 'company/wdN/Site', or a company careers page that links to its Workday site.",
            "items": {
              "type": "string"
            }
          },
          "searchText": {
            "title": "Search text (server-side)",
            "type": "string",
            "description": "Passed to Workday's own search box, e.g. 'sales' or 'data engineer'. Fastest way to narrow big sites. Empty = all jobs."
          },
          "locations": {
            "title": "Countries / cities",
            "type": "array",
            "description": "Matched to the site's own location filters, so Workday filters server-side (works past the 2000-job cap). Country or city names, plus shortcuts: UAE, KSA, GCC, SEA, LATAM, UK, US. Falls back to text match on location when the site has no location filter.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords (any match)",
            "type": "array",
            "description": "Keep jobs whose title contains any of these. Case-insensitive. Use Search text for Workday full-text search.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these (e.g. intern).",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs posted in the last N days (from Workday's 'Posted N Days Ago'; 30 means 30+). 0/empty = no limit."
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only jobs whose title/location says remote.",
            "default": false
          },
          "seniorityLevels": {
            "title": "Seniority levels (any match)",
            "type": "array",
            "description": "Keep only these levels, inferred from the job title: intern, entry, mid, senior, lead, manager, director, executive. Empty = all. Every job row has a 'seniority' field either way.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Include job details (description, country, start date, legal entity)",
            "type": "boolean",
            "description": "One extra request per kept job. Adds full plain-text description, country + ISO code, exact posting date, time type and hiring legal entity.",
            "default": false
          },
          "longOpenDays": {
            "title": "Long-open threshold (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Mark is_long_open when posted_days_ago is at least this many days. Long-open / reposted roles are the classic recruiter BD entry point.",
            "default": 30
          },
          "dedupeJobs": {
            "title": "Merge duplicate jobs (same title+location+company)",
            "type": "boolean",
            "description": "Collapse rows that share a fingerprint within the run. The kept row gets duplicate_count and duplicate_urls.",
            "default": true
          },
          "companyDomainMap": {
            "title": "Company domain map (optional)",
            "type": "object",
            "description": "Map Workday tenant or input URL to a website domain, e.g. {\"nvidia\":\"nvidia.com\"}. Workday hosts are never used as the company domain."
          },
          "onlyNewSinceLastRun": {
            "title": "Only new jobs since last run (monitor mode)",
            "type": "boolean",
            "description": "Remembers job URLs per site in a named key-value store, so scheduled runs output (and charge) only newly opened jobs. First run outputs everything that matches. From the second run on, the company summary also reports closed_jobs_since_last_run and net_change_since_last_run (keep the same filters per state key).",
            "default": false
          },
          "stateKey": {
            "title": "State key (for change tracking / monitor)",
            "type": "string",
            "description": "Name for the saved state. Use different keys for separate watch lists (e.g. 'gcc-weekly', 'sales-roles'). Required for change tracking and for the older monitor mode.",
            "default": "default"
          },
          "changeTracking": {
            "title": "Change tracking (new / changed / closed)",
            "type": "boolean",
            "description": "Keeps one small state record per company in the named key-value store and outputs only what changed since the last run with the same Monitor state key: change_type='new' (charged as a normal job row), change_type='changed' (a tracked field - title, location, country, time type and work model - changed; charged as a job row, with changed_fields and previous_values) and free type='job_closed' rows for jobs that disappeared. First run = baseline (everything matching is 'new'). If a listing could be truncated, no closures are reported and the old state is merged, never overwritten. Every scanned job is saved as seen: maxJobsPerCompany only limits output, and capped-out jobs are never sent or charged later. Only rows stopped by your max charge are carried to the next run. Replaces 'Only new jobs since last run' when both are on.",
            "default": false
          },
          "signalScoring": {
            "title": "Signal score (0–100 with reasons)",
            "type": "boolean",
            "description": "Adds signal_score, signal_tier (hot/warm/cool/cold), score_reasons (one plain-English line per component, with points) and score_components to each company summary, and company_signal_score + score_reasons to each job row. Components: new demand 25, growth velocity 20 (real open-role trend when change tracking has history, else posting pace), seniority 15, department focus 15, hard-to-fill/long-open roles 10, volume 10, remote share 5. The legacy hiring_signal_score is unchanged.",
            "default": false
          },
          "scoreFunctions": {
            "title": "Score: target functions",
            "type": "array",
            "description": "Optional. Functions that matter to you for the 'department focus' part of the score: sales, customer_success, marketing, data_ai, engineering, product_design, finance_legal, people_ops. Empty = reward the company's biggest build-out.",
            "items": {
              "type": "string"
            }
          },
          "outputJobs": {
            "title": "Output job rows",
            "type": "boolean",
            "description": "One row per matching job (charged per job). Turn off to get only company summaries.",
            "default": true
          },
          "outputCompanySummary": {
            "title": "Output company hiring-signal summary",
            "type": "boolean",
            "description": "One row per site: open jobs, posted in last 7/30 days, remote share, top locations/countries and a 0-100 hiring-signal score.",
            "default": true
          },
          "maxScanPerCompany": {
            "title": "Max jobs to scan per site",
            "minimum": 0,
            "type": "integer",
            "description": "Stop listing after N jobs per site (newest first). 0 = all (Workday shows at most ~2000 per query; use Countries or Search text to go deeper).",
            "default": 0
          },
          "maxJobsPerCompany": {
            "title": "Max jobs to output per site",
            "minimum": 0,
            "type": "integer",
            "description": "0 = no cap. With change tracking on, every scanned job is saved as seen: this cap only limits how many rows this run outputs. Jobs cut by the cap are not sent or charged later. For a full baseline (every matching job delivered once), set this to 0 on the first run.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many sites to fetch in parallel.",
            "default": 4
          },
          "addTickers": {
            "title": "Add stock ticker + SEC CIK (investors)",
            "type": "boolean",
            "description": "Adds ticker, cik and sec_title to each company summary (and ticker to each job) using SEC's public company_tickers.json. Conservative exact-name match: unmatched or ambiguous names stay null - no guessing. Free, no extra charge.",
            "default": true
          },
          "tickerMap": {
            "title": "Your own company → ticker map",
            "type": "object",
            "description": "Optional. Overrides automatic matching, e.g. {\"amazon\": \"AMZN\", \"meta\": \"META\"}. Keys are the company name or slug as it appears in the output."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}