{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Monitor — New Postings Only (Greenhouse, Lever, Ashby)",
    "description": "Yesterday's job list is noise. Get only the roles that weren't there last run — Greenhouse, Lever and Ashby, with signed webhooks and per-signal pricing.",
    "version": "1.0",
    "x-build-id": "QVPmyrx4iWtXlo5yQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/drkiwi~hiring-signal-alerts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-drkiwi-hiring-signal-alerts",
        "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/drkiwi~hiring-signal-alerts/runs": {
      "post": {
        "operationId": "runs-sync-drkiwi-hiring-signal-alerts",
        "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/drkiwi~hiring-signal-alerts/run-sync": {
      "post": {
        "operationId": "run-sync-drkiwi-hiring-signal-alerts",
        "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 to track",
            "type": "array",
            "description": "Required, unless you are running a health check. List of companies to monitor. Each entry needs a 'slug' (the company identifier in the ATS job board URL). 'ats' can be 'greenhouse', 'lever', 'ashby', or 'auto' (default) to detect it automatically. 'name' is an optional display label.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "title": "Display name",
                  "description": "Optional label used in the output and notifications. Defaults to the slug."
                },
                "slug": {
                  "type": "string",
                  "title": "ATS slug",
                  "description": "The company identifier in its job board URL, e.g. 'stripe' in boards.greenhouse.io/stripe."
                },
                "ats": {
                  "type": "string",
                  "title": "ATS platform",
                  "description": "Which ATS hosts this board. Use 'auto' to detect it automatically.",
                  "enum": [
                    "greenhouse",
                    "lever",
                    "ashby",
                    "auto"
                  ],
                  "default": "auto"
                }
              },
              "required": [
                "slug"
              ]
            },
            "default": [
              {
                "name": "Dropbox",
                "slug": "dropbox",
                "ats": "greenhouse"
              },
              {
                "name": "Palantir",
                "slug": "palantir",
                "ats": "lever"
              },
              {
                "name": "Linear",
                "slug": "linear",
                "ats": "ashby"
              }
            ]
          },
          "keywords": {
            "title": "Keyword filter (optional)",
            "type": "array",
            "description": "Only alert on jobs whose title matches one of these (case-insensitive substring). Leave empty for no filter.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department filter (optional)",
            "type": "array",
            "description": "Only alert on jobs whose department matches one of these (case-insensitive substring). Leave empty for no filter.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Location filter (optional)",
            "type": "array",
            "description": "Only alert on jobs whose location matches one of these (case-insensitive substring). Leave empty for no filter.",
            "items": {
              "type": "string"
            }
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "If set, a POST request fires for each new matching job."
          },
          "webhookSecret": {
            "title": "Webhook signing secret (optional)",
            "type": "string",
            "description": "If set, every webhook is signed so your endpoint can verify it really came from this Actor and has not been replayed. The POST carries 'x-hiring-signal-timestamp' and 'x-hiring-signal-signature: sha256=...', where the signature is HMAC-SHA256 of '<timestamp>.<raw body>' using this secret. Verification example in the README."
          },
          "firstRunLookbackDays": {
            "title": "Show recent postings on the first run (days)",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "The first run for a company normally records a baseline and reports nothing, because there is no previous run to compare against. Set this to e.g. 7 and that first run also reports roles the ATS says were published in the last 7 days — so you see real signals immediately instead of an empty result. Applies to a company's first run only; every run after that reports genuinely new postings regardless. Set to 0 to disable.",
            "default": 0
          },
          "alertOnFirstRun": {
            "title": "Alert on every open role on the first run",
            "type": "boolean",
            "description": "Treats EVERY currently open role as new on a company's first run, however old it is. This can be expensive on large boards (a single company may have 500+ open roles, all charged) — prefer the lookback setting above. Overrides the lookback when enabled.",
            "default": false
          },
          "onlyPushNewJobs": {
            "title": "Only push new jobs to the dataset",
            "type": "boolean",
            "description": "By default the dataset contains every job currently open at the tracked companies, with 'isNewThisRun' flagging the new ones. Enable this to push only the newly detected jobs.",
            "default": false
          },
          "healthCheck": {
            "title": "Run a health check instead of tracking companies",
            "type": "boolean",
            "description": "Ignores the company list and instead verifies that the Greenhouse, Lever and Ashby APIs still return the fields this Actor depends on. Reports one row per provider and fails the run if any check fails. Free — it never charges. Schedule it daily if you rely on this Actor for anything important: it catches upstream changes before they silently empty your alerts.",
            "default": false
          },
          "resetState": {
            "title": "Reset tracking state before this run",
            "type": "boolean",
            "description": "Clears the stored 'seen jobs' state for the companies in this input before running. The run then behaves as a first run for them. Useful for testing and for re-baselining.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store holding the 'jobs already seen' state between runs. Leave as-is unless you want separate, independent baselines (for example a test schedule and a production schedule). Must be alphanumerics and dashes only. This cannot be the run's default store, because Apify creates a fresh default store for every run.",
            "default": "hiring-signal-state"
          },
          "maxConcurrency": {
            "title": "Max concurrent companies",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many company job boards to fetch in parallel.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 300,
            "type": "integer",
            "description": "Timeout for a single HTTP request to an ATS API.",
            "default": 60
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failing ATS request (network errors, timeouts, HTTP 429 and 5xx) before giving up on that company.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}