{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Jobs Monitor — Change Tracking + Hiring Signal Score",
    "description": "Pull every open job from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards by company slug or careers URL. Normalized fields, salary, new-since-last-run diff and a per-company hiring-signal score. Optional change tracking and an explainable 0–100 signal score.",
    "version": "0.0",
    "x-build-id": "Fbl2CZcqnf974uIUh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/goldenrod_serrano~ats-hiring-signals/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-goldenrod_serrano-ats-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~ats-hiring-signals/runs": {
      "post": {
        "operationId": "runs-sync-goldenrod_serrano-ats-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~ats-hiring-signals/run-sync": {
      "post": {
        "operationId": "run-sync-goldenrod_serrano-ats-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": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "One per line. Any of: a careers/job-board URL (boards.greenhouse.io/stripe, jobs.lever.co/palantir, jobs.ashbyhq.com/ramp, apply.workable.com/x, jobs.smartrecruiters.com/x, x.recruitee.com), a company careers page that embeds one of those boards, 'ats:slug' (e.g. greenhouse:stripe), or a bare slug (auto-detected across all 6 ATS).",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords (any match)",
            "type": "array",
            "description": "Keep jobs whose title/department (or description, if included) contains any of these. Case-insensitive. Empty = all jobs.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these (e.g. intern, senior).",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (any match)",
            "type": "array",
            "description": "Substring match on location/country, e.g. 'London', 'US', 'Remote'.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments (any match)",
            "type": "array",
            "description": "Substring match on department/team, e.g. 'Sales', 'Engineering'.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only jobs marked remote (by the ATS flag or the location text).",
            "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"
            }
          },
          "workModels": {
            "title": "Work model (any match)",
            "type": "array",
            "description": "Keep only remote, hybrid and/or onsite jobs (normalized 'work_model' field from the ATS workplace flag or location text). Jobs whose board doesn't say are dropped when this is set.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs first published in the last N days. 0/empty = no limit. (Workable/SmartRecruiters/Recruitee/Lever/Ashby give a publish date; Greenhouse gives first_published.)"
          },
          "onlyNewSinceLastRun": {
            "title": "Only new jobs since last run (monitor mode)",
            "type": "boolean",
            "description": "Remembers job IDs per company in a named key-value store, so scheduled runs output (and charge) only newly opened jobs. First run outputs everything that matches. The company summary also reports closed_jobs_since_last_run (jobs that disappeared from the board) and net_change_since_last_run.",
            "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. 'sales-roles', 'clients-q4'). 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, department, team, work model, employment type and salary - 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"
            }
          },
          "includeDescription": {
            "title": "Include job description text",
            "type": "boolean",
            "description": "Adds plain-text descriptions (bigger output). Not available for SmartRecruiters.",
            "default": false
          },
          "longOpenDays": {
            "title": "Long-open threshold (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Mark is_long_open when the posting is at least this many days old. Long-open / reposted roles are the classic recruiter BD entry point (role hard to fill).",
            "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. Turn off to keep every ATS id.",
            "default": true
          },
          "companyDomainMap": {
            "title": "Company domain map (optional)",
            "type": "object",
            "description": "Map company name or board slug to a website domain, e.g. {\"anthropic\":\"anthropic.com\"}. Used when the input is an ATS URL that does not reveal the company site. Never invented from the slug alone."
          },
          "outputJobs": {
            "title": "Output job rows",
            "type": "boolean",
            "description": "Push one row per matching job (charged per job). Turn off to get only the company summaries.",
            "default": true
          },
          "outputCompanySummary": {
            "title": "Output company hiring-signal summary",
            "type": "boolean",
            "description": "One row per company: open jobs, posted in last 7/30 days, remote share, top departments/locations and a 0-100 hiring-signal score. Great for sales prospecting.",
            "default": true
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "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": 20,
            "type": "integer",
            "description": "How many companies to fetch in parallel.",
            "default": 5
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}