{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Watch — Greenhouse & Lever job change monitor",
    "description": "Monitor Greenhouse and Lever career boards through their public job-board APIs. By default each run returns only NEW, CHANGED and CLOSED postings since the previous run. No login, no proxies, no personal contact data.",
    "version": "0.1",
    "x-build-id": "o7FCp62umspU7b5Ew"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rounded_phlogopite~ats-job-watch/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rounded_phlogopite-ats-job-watch",
        "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/rounded_phlogopite~ats-job-watch/runs": {
      "post": {
        "operationId": "runs-sync-rounded_phlogopite-ats-job-watch",
        "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/rounded_phlogopite~ats-job-watch/run-sync": {
      "post": {
        "operationId": "run-sync-rounded_phlogopite-ats-job-watch",
        "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 boards",
            "maxItems": 500,
            "type": "array",
            "description": "One entry per company board: 'greenhouse:slug' / 'lever:slug' or a public board URL (job-boards.greenhouse.io/gitlab, jobs.lever.co/palantir, jobs.eu.lever.co/acme). Max 500 entries, 300 characters each. A board that does not exist (404) is charged as a normal board check ($0.002). EU-hosted Greenhouse boards (*.eu.greenhouse.io) are rejected as a free input error (not requested, not charged). Ashby, SmartRecruiters and Recruitee are intentionally not supported (their API terms restrict or don't clearly allow third-party commercial use).",
            "items": {
              "type": "string",
              "maxLength": 300
            },
            "default": [
              "greenhouse:gitlab",
              "lever:palantir"
            ]
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "changes",
              "full"
            ],
            "type": "string",
            "description": "'changes' (default) = only NEW / CHANGED / CLOSED since the previous run of the same watchlist (charged as 'change-event'). 'full' = additionally every open job as UNCHANGED (charged as 'snapshot-job', $0.001 each). In 'full' mode the first check of a board (including the first run) always outputs its current jobs as BASELINE, charged as 'snapshot-job' ($0.001 each), whatever 'Output current jobs on the first run' is set to. If stored history is lost, no job rows are output or charged for that board in that run.",
            "default": "changes"
          },
          "emitBaseline": {
            "title": "Output current jobs on the first run (snapshot)",
            "type": "boolean",
            "description": "Applies to 'changes' mode ('full' mode always outputs BASELINE rows on a board's first check). Off (default): the first run of a watchlist saves the current jobs as a baseline and outputs no job rows - only one free BASELINE_SAVED status row per board. On: the first run also outputs every current job with changeType BASELINE, charged as 'snapshot-job' ($0.001 each). BASELINE rows are not change events. If stored history is ever lost or unreadable, existing jobs are never re-sent in any mode (no NEW, BASELINE or UNCHANGED rows, no change-event or snapshot-job charges for that board in that run): one free BASELINE_RESET row per affected board is written instead.",
            "default": false
          },
          "emitStatusRows": {
            "title": "Write free status rows",
            "type": "boolean",
            "description": "On (default): when there is nothing else to report, the dataset gets a free status row so you can tell a quiet run from a broken one: BASELINE_SAVED (first check of a board), NO_CHANGES (at least one board was checked and nothing changed; boards that could not be checked are counted in boardsFailed) or RUN_SKIPPED (another run of the same watchlist was still in progress, so nothing was checked or charged). Status rows have jobKey null and are never charged. Turn off if your integration should receive job rows only (BASELINE_RESET rows are always written).",
            "default": true
          },
          "titleKeywords": {
            "title": "Title must contain (any)",
            "maxItems": 100,
            "type": "array",
            "description": "Case-insensitive. Empty = all titles. Max 100 entries, 200 characters each.",
            "items": {
              "type": "string",
              "maxLength": 200
            }
          },
          "excludeTitleKeywords": {
            "title": "Title must NOT contain",
            "maxItems": 100,
            "type": "array",
            "description": "Case-insensitive, e.g. 'intern'. Max 100 entries, 200 characters each.",
            "items": {
              "type": "string",
              "maxLength": 200
            }
          },
          "locations": {
            "title": "Location contains (any)",
            "maxItems": 100,
            "type": "array",
            "description": "Case-insensitive substring match on the location text, e.g. 'Tokyo', 'Germany', 'Remote'. Max 100 entries, 200 characters each.",
            "items": {
              "type": "string",
              "maxLength": 200
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only postings the ATS marks as remote (or whose location says Remote).",
            "default": false
          },
          "includeDescription": {
            "title": "Include plain-text description",
            "type": "boolean",
            "description": "Adds the job description as plain text. Makes items larger.",
            "default": false
          },
          "escapeFormulas": {
            "title": "Make text safe for spreadsheets",
            "type": "boolean",
            "description": "On (default): a text field that looks like a spreadsheet formula gets a leading apostrophe ('), so Excel / Google Sheets do not run it when you open a CSV/XLSX export. That is a value starting with = or @, a tab or a carriage return, or starting with + / - followed by a digit, ( = + - @ . or a function call such as -SUM(. Ordinary text like '- Bullet point' or '-Remote' is not changed, and change detection is unaffected. Turn off if you read the JSON directly and need the exact original text.",
            "default": true
          },
          "watchlistId": {
            "title": "Watchlist ID (optional)",
            "type": "string",
            "description": "Name for the stored state. Leave empty to derive it from the board list. Use the same ID in a scheduled task to keep history even if you add boards."
          },
          "maxJobsPerBoard": {
            "title": "Max jobs per board",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Safety cap. If a board is truncated, CLOSED detection is skipped for it to avoid false alerts.",
            "default": 2000
          },
          "delayBetweenBoardsSecs": {
            "title": "Delay between boards (s)",
            "minimum": 1,
            "maximum": 5,
            "type": "number",
            "description": "Politeness delay between API calls: min 1 s (the providers' robots.txt Crawl-delay), max 5 s.",
            "default": 1
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}