{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Change Tracker: Greenhouse, Lever, Ashby & more",
    "description": "Track open roles at any company on 6 ATS platforms in one clean schema. Each run flags jobs as new, updated or removed since last time, with changed fields listed. Paste slugs or careers URLs. No login, no proxies. $1 per 1,000 current jobs; removed rows are free.",
    "version": "0.1",
    "x-build-id": "bXv2LaFnpoGh9Bfu2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/democratic_lazurite~ats-job-change-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-democratic_lazurite-ats-job-change-tracker",
        "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/democratic_lazurite~ats-job-change-tracker/runs": {
      "post": {
        "operationId": "runs-sync-democratic_lazurite-ats-job-change-tracker",
        "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/democratic_lazurite~ats-job-change-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-democratic_lazurite-ats-job-change-tracker",
        "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 watch (careers URLs or slugs)",
            "type": "array",
            "description": "Required in practice. List of companies whose public job boards to check. Each item can be: a careers-page URL (e.g. \"https://jobs.lever.co/palantir\", \"https://boards.greenhouse.io/airbnb\", \"https://jobs.ashbyhq.com/ramp\", \"https://jobs.smartrecruiters.com/Ubisoft2\", \"https://bunq.recruitee.com\", \"https://apply.workable.com/huggingface/\"), an explicit \"platform:slug\" (greenhouse:, lever:, lever-eu:, ashby:, smartrecruiters:, recruitee:, workable:), or a bare slug like \"stripe\" (all six platforms are probed). If empty, a two-company demo list is used.",
            "default": [
              "https://jobs.ashbyhq.com/ramp",
              "https://apply.workable.com/huggingface/"
            ],
            "items": {
              "type": "string"
            }
          },
          "outputMode": {
            "title": "What to return",
            "enum": [
              "all",
              "changes",
              "new"
            ],
            "type": "string",
            "description": "Which rows to return. \"changes\" (default) returns only jobs that are new, updated or removed since the previous run with the same stateStoreName; on the very first run every job counts as new. \"new\" returns only newly appeared jobs. \"all\" returns every currently open job (changeType \"unchanged\" included) plus removed ones.",
            "default": "changes"
          },
          "keywords": {
            "title": "Keyword filter (match any)",
            "type": "array",
            "description": "Optional. Only return jobs whose title contains at least one of these words (case-insensitive). Example: [\"engineer\", \"data\"]. Leave empty for no keyword filter.",
            "items": {
              "type": "string"
            }
          },
          "searchDescription": {
            "title": "Also match keywords in the job description",
            "type": "boolean",
            "description": "When true (default), keywords also match the job description text while the run is processing. The description itself is never returned or stored. Set false to match titles only.",
            "default": true
          },
          "locations": {
            "title": "Location filter (match any)",
            "type": "array",
            "description": "Optional. Only return jobs whose location contains one of these strings (case-insensitive substring), e.g. [\"London\", \"Remote\"]. \"Remote\" also matches jobs flagged as remote.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "When true, only return jobs the platform marks as remote. Default false.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum rows to return",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Upper limit on returned rows for this run (default 100, which keeps agent calls small and cheap). Raise it for full exports, e.g. 5000. Removed-job rows also count toward the limit. Note: on a first run, jobs beyond the limit are still recorded as seen (baseline) and will not be reported as new later.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Companies fetched in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many company boards are fetched at the same time (1–20, default 5). The default is fine for most uses.",
            "default": 5
          },
          "minRequestIntervalMs": {
            "title": "Minimum delay per ATS host (ms)",
            "minimum": 0,
            "type": "integer",
            "description": "Politeness delay between two requests to the same ATS host, in milliseconds (default 300). Lower values are faster but less polite; keep the default unless you have a reason.",
            "default": 300
          },
          "cacheTtlMinutes": {
            "title": "Reuse responses younger than (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "Reuse a board response fetched by an earlier run within this many minutes instead of downloading it again (0 = off, default). Useful when an agent calls the Actor repeatedly in a short time.",
            "default": 0
          },
          "stateStoreName": {
            "title": "Watchlist memory name",
            "type": "string",
            "description": "Name of the key-value store that remembers what was seen last run; change detection compares against it. Use one name per watchlist (e.g. \"competitors-q4\"); a new name starts fresh, so its first run reports every job as new. Default \"ats-jobs-state\".",
            "default": "ats-jobs-state"
          },
          "companyNameOverrides": {
            "title": "Company display-name overrides",
            "type": "object",
            "description": "Optional JSON object mapping a slug or \"platform:slug\" to the company name to show, e.g. {\"ramp\": \"Ramp\", \"ashby:open-ai\": \"OpenAI\"}. Leave empty to use names from the job boards.",
            "default": {}
          },
          "resolveCompanyNames": {
            "title": "Look up real names for Lever/Ashby boards",
            "type": "boolean",
            "description": "Lever and Ashby APIs only expose the board slug. When true (default), the Actor reads the public board page title once per board to get the company name (e.g. \"palantir\" becomes \"Palantir Technologies\").",
            "default": true
          },
          "smartRecruitersDetails": {
            "title": "SmartRecruiters: extra detail requests",
            "type": "boolean",
            "description": "Off by default. When true, one extra request per SmartRecruiters posting checks that it is still active and lets description edits count as \"updated\" and keyword matching use the description. Descriptions are still never returned.",
            "default": false
          },
          "smartRecruitersMaxDetails": {
            "title": "SmartRecruiters: max detail requests per company",
            "minimum": 0,
            "type": "integer",
            "description": "Only used when \"SmartRecruiters: extra detail requests\" is on. Caps those extra requests per company (default 500); postings beyond the cap are tracked from the listing data only.",
            "default": 500
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}