{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Feed & Tracker: Greenhouse, Lever, Ashby & 6 more ATS",
    "description": "Search fresh jobs across about 9,700 company job boards on 9 ATS platforms, or track your own company list for new and removed jobs. Every result links to the original posting. Pay per result.",
    "version": "2.0",
    "x-build-id": "l4X21vaIECAMzlaye"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/bottyprojects~job-board-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-bottyprojects-job-board-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/bottyprojects~job-board-tracker/runs": {
      "post": {
        "operationId": "runs-sync-bottyprojects-job-board-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/bottyprojects~job-board-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-bottyprojects-job-board-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "track"
            ],
            "type": "string",
            "description": "Search = one live query across a bundled list of public company job boards (plus any boards you list below). You pay only per matching job delivered. Track = monitor the companies you list run after run and report new / removed / changed jobs. API calls without this field run in Track mode, exactly as before.",
            "default": "track"
          },
          "searchKeywords": {
            "title": "Search: job title keywords (any)",
            "type": "array",
            "description": "Search mode: a job matches if its title contains any of these words or phrases as whole words (case-insensitive), e.g. \"data engineer\", \"product designer\", \"account executive\". Use \"Title must NOT contain\" below to exclude words such as \"senior\" or \"intern\".",
            "items": {
              "type": "string"
            }
          },
          "searchLocations": {
            "title": "Search: locations (any)",
            "type": "array",
            "description": "Search mode: a job matches if its location mentions any of these. Country names understand common cities and codes (\"United States\" also matches \"Austin, TX\"; \"Germany\" matches \"Berlin\"). \"Remote\" matches remote jobs. Leave empty for anywhere.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Search: posted within the last N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Search mode: only jobs whose board shows a posting date in the last N days (0 = any date). Boards that publish no date (Pinpoint, some Personio and Breezy jobs) are left out unless you turn on \"Include jobs without a posting date\".",
            "default": 30
          },
          "maxResults": {
            "title": "Search: max results",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Search mode: stop after this many matching jobs. You are charged per job delivered, so this also caps the cost of a run (e.g. 100 results = $0.30).",
            "default": 100
          },
          "maxResultsPerCompany": {
            "title": "Max results per company",
            "minimum": 0,
            "type": "integer",
            "description": "Search mode: at most this many results from any one company found through the bundled list, so one big employer can't fill your whole result set. Boards you enter in Companies are not capped. 0 = no limit.",
            "default": 10
          },
          "companies": {
            "title": "Companies (tracking) / extra boards (search)",
            "type": "array",
            "description": "Company career-board URLs or ATS slugs to track. You confirm these pages are publicly accessible without login. Companies or tenants that block automated access or ask to be excluded will be skipped. One per line: a board URL (e.g. https://jobs.ashbyhq.com/ramp, https://job-boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://apply.workable.com/huggingface, https://acme.recruitee.com, https://acme.jobs.personio.de, https://acme.teamtailor.com, https://acme.breezy.hr, https://acme.pinpointhq.com, https://ats.rippling.com/acme/jobs), the shorthand ats:slug (greenhouse:stripe, lever:spotify, ashby:notion, workable:huggingface, recruitee:x, personio:x, teamtailor:x, breezy:x, pinpoint:x, rippling:x), or a company careers page that embeds one of those boards. Add \" | Name\" to set the company name. Required in tracking mode; optional in search mode, where these boards are searched first.",
            "items": {
              "type": "string"
            }
          },
          "includeUndated": {
            "title": "Search: include jobs without a posting date",
            "type": "boolean",
            "description": "Search mode: also return jobs from boards that do not publish a posting date (postedAt will be empty).",
            "default": false
          },
          "maxBoards": {
            "title": "Search: max boards to scan",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Search mode: how many job boards from the bundled list to check (largest boards first). Boards are not charged; this only limits run time.",
            "default": 1500
          },
          "maxRunSeconds": {
            "title": "Search: time limit (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Search mode: stop scanning after this many seconds and return what was found.",
            "default": 240
          },
          "searchAts": {
            "title": "Search: job-board platforms",
            "type": "array",
            "description": "Search mode: which platforms from the bundled list to search (empty = all). BambooHR and Rippling boards are never in the bundled list (SmartRecruiters is not supported); Rippling and BambooHR boards can still be added under Companies.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "workable",
                "recruitee",
                "personio",
                "teamtailor",
                "breezy",
                "pinpoint"
              ]
            }
          },
          "useSeedList": {
            "title": "Search: use the bundled board list",
            "type": "boolean",
            "description": "Search mode: turn off to search only the boards you list under Companies (and boards your earlier runs added).",
            "default": true
          },
          "onlyChanges": {
            "title": "Only output changes",
            "type": "boolean",
            "description": "Output only jobs that are new, removed, or whose title / location / department / type changed since the last run with the same tracker ID. Unchanged open jobs are skipped (and not charged).",
            "default": false
          },
          "emitBaseline": {
            "title": "Output all jobs on a company's first run",
            "type": "boolean",
            "description": "The first time a company is tracked every job is 'new'. Turn this off to silently record the baseline in 'Only output changes' mode, so you are only told about real changes from the next run on.",
            "default": true
          },
          "trackerId": {
            "title": "Tracker ID",
            "type": "string",
            "description": "Name of this watchlist's memory. Runs with the same tracker ID are compared with each other. Use different IDs for different lists (e.g. 'prospects', 'competitors'). Letters, digits, - and _ only.",
            "default": "default"
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the records output per company (0 = no cap). Change tracking still covers all jobs.",
            "default": 0
          },
          "titleKeywords": {
            "title": "Title must contain (any)",
            "type": "array",
            "description": "Only output jobs whose title contains at least one of these words (case-insensitive). Leave empty for all jobs. In search mode this is used only if \"Search: job title keywords\" is empty.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Title must NOT contain",
            "type": "array",
            "description": "Skip jobs whose title contains any of these words (both modes).",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location contains (any)",
            "type": "array",
            "description": "Only output jobs whose location contains at least one of these words, e.g. 'Remote', 'New York', 'Germany'. In search mode this is used only if \"Search: locations\" is empty.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Only output jobs flagged as fully remote (both modes).",
            "default": false
          },
          "includePersonalData": {
            "title": "Include personal data (off by default)",
            "type": "boolean",
            "description": "**Include personal data (off by default).** When off, recruiter or hiring-manager names, avatars, emails and phone numbers are removed, and emails and phone numbers inside job descriptions are replaced with a placeholder (`[email removed]`, `[phone removed]`). Turn this on only if you have a lawful basis to process this data (for example, a documented legitimate-interest assessment under GDPR Art. 6(1)(f)) and you can meet transparency (GDPR Art. 14), minimisation, retention and data-subject request obligations. When on, you are the data controller for that data. Don't use it for unsolicited marketing or to build contact lists.",
            "default": false
          },
          "personalDataLawfulBasisConfirmed": {
            "title": "I confirm I have a lawful basis for any personal data",
            "type": "boolean",
            "description": "Required when \"Include personal data\" is on. When on, only names and business contact details shown on the public posting are kept; nothing is enriched or combined across postings.",
            "default": false
          },
          "descriptionSnippetLength": {
            "title": "Description snippet length",
            "minimum": 0,
            "maximum": 2000,
            "type": "integer",
            "description": "Characters of job description to include (personal data removed unless \"Include personal data\" is on). 0 = no snippet. In search mode Greenhouse jobs have no snippet (their list endpoint has no descriptions), which keeps searches fast.",
            "default": 300
          },
          "scanCareersPages": {
            "title": "Detect ATS from company careers pages",
            "type": "boolean",
            "description": "If an entry is a company's own careers page (not a board URL), fetch that one page (robots.txt respected) to find the embedded job board.",
            "default": true
          },
          "outputErrors": {
            "title": "Output error rows",
            "type": "boolean",
            "description": "Add one row per company that failed (with the reason). Error rows are never charged.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Companies in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many companies to fetch at once. Requests to the same ATS host are always spaced out politely. Tracking mode only.",
            "default": 4
          },
          "enableBambooHR": {
            "title": "Allow BambooHR boards I enter",
            "type": "boolean",
            "description": "Off by default. When on, BambooHR careers pages you list under Companies are read from their public, logged-off careers list at about 1 request per second; the run stops for that board on HTTP 401/403/429 or a challenge. Never searched from the bundled list.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}