{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Board Monitor",
    "description": "Monitor company job boards on Greenhouse, Lever (US + EU), Ashby, Workable and SmartRecruiters (Recruitee optional). Get only the new, changed and closed jobs since your last run, in one normalized format. By Steadfeed.",
    "version": "0.4",
    "x-build-id": "GhGWkoatFx43goKJy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadfeed~ats-job-board-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadfeed-ats-job-board-monitor",
        "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/steadfeed~ats-job-board-monitor/runs": {
      "post": {
        "operationId": "runs-sync-steadfeed-ats-job-board-monitor",
        "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/steadfeed~ats-job-board-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-steadfeed-ats-job-board-monitor",
        "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",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Company job boards",
            "type": "array",
            "description": "One entry per company. Paste the careers board URL (e.g. https://boards.greenhouse.io/stripe, https://jobs.lever.co/spotify, https://jobs.eu.lever.co/olx, https://jobs.ashbyhq.com/openai, https://apply.workable.com/huggingface, https://jobs.smartrecruiters.com/BoschGroup, https://vandebron.recruitee.com), or write \"ats:slug\" (greenhouse:, lever:, lever-eu:, ashby:, workable:, smartrecruiters:, recruitee:). A bare slug like \"openai\" is looked up on each supported ATS in turn (slower, and it can pick the wrong board if two ATSs use the same name).",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "diff",
              "snapshot"
            ],
            "type": "string",
            "description": "\"diff\" outputs only jobs that are NEW, CHANGED or CLOSED since the last run with the same watchlist ID. \"snapshot\" outputs every open job (plus CLOSED ones) with its change type.",
            "default": "diff"
          },
          "emitOnFirstRun": {
            "title": "Output all jobs on the first run",
            "type": "boolean",
            "description": "On the first run for a board, every job is NEW. Turn this off to only save a silent baseline and get changes from the second run on. Diff mode only: snapshot mode always outputs every current job.",
            "default": true
          },
          "watchlistId": {
            "title": "Watchlist ID",
            "type": "string",
            "description": "Name for this watchlist's saved state. Use different IDs for separate schedules or filters so they don't share history. Letters, digits, '-', '_' and '.' only.",
            "default": "default"
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store in your Apify account where the last-seen jobs are kept between runs. Named stores are kept until you delete them.",
            "default": "steadfeed-ats-monitor-state"
          },
          "titleKeywords": {
            "title": "Title contains (any)",
            "type": "array",
            "description": "Only output jobs whose title contains at least one of these words (case-insensitive). Changes are still tracked for all jobs.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Title excludes",
            "type": "array",
            "description": "Skip jobs whose title contains any of these words, e.g. \"intern\", \"senior\".",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location contains (any)",
            "type": "array",
            "description": "Only output jobs whose location contains at least one of these, e.g. \"London\", \"Germany\", \"Remote\".",
            "items": {
              "type": "string"
            }
          },
          "departmentKeywords": {
            "title": "Department or team contains (any)",
            "type": "array",
            "description": "Only output jobs whose department or team contains one of these, e.g. \"Engineering\".",
            "items": {
              "type": "string"
            }
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Only output these workplace types. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            }
          },
          "includeUnknownWorkplace": {
            "title": "Keep jobs with unknown workplace type",
            "type": "boolean",
            "description": "When filtering by workplace type, keep jobs whose board doesn't say (common on Greenhouse).",
            "default": true
          },
          "descriptionFormat": {
            "title": "Job description",
            "enum": [
              "text",
              "html",
              "both",
              "none"
            ],
            "type": "string",
            "description": "Include the job description as plain text, HTML, both, or not at all (smaller output). E-mail addresses, phone numbers and named recruiter/contact lines are removed.",
            "default": "text"
          },
          "statusRowsInDataset": {
            "title": "Add a status row per company to the dataset",
            "type": "boolean",
            "description": "Adds one row with recordType \"companyStatus\" per board (ok / not_found / error, counts). The same list is always saved as COMPANY_STATUS in the run's key-value store.",
            "default": true
          },
          "maxJobRowsPerRun": {
            "title": "Max job rows per run",
            "minimum": 0,
            "type": "integer",
            "description": "Stop outputting job rows after this many (0 = no limit). Useful to cap cost on the first run.",
            "default": 0
          },
          "greenhousePayRanges": {
            "title": "Greenhouse: fetch pay ranges",
            "type": "boolean",
            "description": "Makes one extra request per Greenhouse job to read its published pay range. Slower on big boards.",
            "default": false
          },
          "smartRecruitersDescriptions": {
            "title": "SmartRecruiters: fetch descriptions",
            "type": "boolean",
            "description": "SmartRecruiters' list endpoint has no description. This makes one extra request per job.",
            "default": false
          },
          "maxDetailRequestsPerCompany": {
            "title": "Max extra detail requests per company",
            "minimum": 0,
            "type": "integer",
            "description": "Upper limit for the per-job requests above.",
            "default": 200
          },
          "enableRecruitee": {
            "title": "Enable Recruitee",
            "type": "boolean",
            "description": "Recruitee's Careers Site API needs a company token from 10 February 2027. Until then public boards work without one. Off by default.",
            "default": false
          },
          "recruiteeTokens": {
            "title": "Recruitee Careers Site tokens",
            "type": "string",
            "description": "Optional. Either one token, or one \"company=token\" per line. WARNING: Recruitee says a Careers Site token has the same permissions as the user who created it. Only use a token from your own Recruitee account, created by a user with minimal permissions."
          },
          "maxConcurrency": {
            "title": "Boards checked in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many companies are processed at the same time. Requests to each ATS host are still spaced out.",
            "default": 4
          },
          "requestIntervalMs": {
            "title": "Min gap between requests to the same host (ms)",
            "minimum": 100,
            "type": "integer",
            "description": "Requests to one ATS host (e.g. boards-api.greenhouse.io) are spaced at least this far apart.",
            "default": 500
          },
          "workableRequestIntervalMs": {
            "title": "Min gap between Workable requests (ms)",
            "minimum": 100,
            "type": "integer",
            "description": "Workable rate-limits its public API more strictly.",
            "default": 1500
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries on 429, 5xx and network errors, with exponential backoff and Retry-After.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}