{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse, Lever & Ashby Jobs Scraper + Changes",
    "description": "Get open jobs from companies on Greenhouse, Lever or Ashby and what changed since your last run: new and closed jobs, new jobs by function, new countries. $2 per 1,000 companies checked + $3 per 1,000 changed companies + $1 per 1,000 job rows. Not affiliated with Greenhouse, Lever or Ashby.",
    "version": "0.2",
    "x-build-id": "mtdDMiSVHBcyRUlfL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/domestic_buffalograss~company-hiring-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-domestic_buffalograss-company-hiring-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/domestic_buffalograss~company-hiring-tracker/runs": {
      "post": {
        "operationId": "runs-sync-domestic_buffalograss-company-hiring-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/domestic_buffalograss~company-hiring-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-domestic_buffalograss-company-hiring-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",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Companies (domains or careers page URLs)",
            "type": "array",
            "description": "One company per line: a domain (stripe.com), a careers page URL (https://stripe.com/jobs), or a Greenhouse / Lever / Ashby board URL (https://jobs.lever.co/palantir). The ATS is detected for you. Company names alone are not supported; Greenhouse EU boards (job-boards.eu.greenhouse.io) are not supported yet. Identical lines are merged. Up to 5,000.",
            "default": [
              "https://boards.greenhouse.io/airbnb",
              "https://jobs.lever.co/palantir",
              "https://jobs.ashbyhq.com/ramp"
            ],
            "items": {
              "type": "string"
            }
          },
          "stateKey": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Changes are computed against the previous run with the same watchlist name. Use different names to track different lists independently. One run per name at a time: a second run waits up to 4 minutes for the first, so give runs you start in parallel (Clay, n8n, several schedules) different names.",
            "default": "default"
          },
          "outputJobs": {
            "title": "Job rows in the dataset",
            "enum": [
              "new",
              "all",
              "none"
            ],
            "type": "string",
            "description": "Company rows are always returned. New (default): on the first run of a board its open jobs (change = baseline), at most \"First-run job rows per company\" (default 50, the most recently posted first), then only jobs that are new since the last run. All: every open job, every run (no limit). None: company rows only. Each job row is billed (Job row event); a first run costs up to 50 rows per company at the default, e.g. 30 companies with 50 or more jobs each = 1,500 rows.",
            "default": "new"
          },
          "baselineJobRowsPerCompany": {
            "title": "First-run job rows per company",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "With Job rows = New: on the first run of a board (and a new baseline after the filters change) at most this many job rows per company, the most recently posted first. 0 = no job rows on the first run. The jobs over the limit are not output or charged; the company row counts them (baselineJobRowsOmitted). The baseline still saves every open job. Not used with All.",
            "default": 50
          },
          "groupBy": {
            "title": "Count breakdowns",
            "type": "array",
            "description": "Breakdowns included in each company row (countsBy): function, department, location, country, team. Other values are ignored with a warning in the log.",
            "items": {
              "type": "string",
              "enum": [
                "function",
                "department",
                "location",
                "country",
                "team"
              ],
              "enumTitles": [
                "Job function",
                "Department",
                "Location",
                "Country",
                "Team"
              ]
            },
            "default": [
              "function",
              "department",
              "country"
            ]
          },
          "filters": {
            "title": "Filters",
            "type": "object",
            "description": "Track only matching jobs. titleIncludes: words in the job title (whole words, any match; Japanese, Chinese, Korean and Thai terms match inside words). functions: Engineering, Product, Design, Data, Sales, Marketing, Customer Success, Operations, G&A, Other (classified from English titles; other languages mostly end up as Other). countries: ISO codes such as US, GB, DE (UK, USA and English country names are converted); jobs whose location names no recognisable country (or places or a list of several countries, such as \"Remote - US, Canada\") are left out. departmentIncludes: text in the department or team name. Values that cannot be read are ignored with a warning in the log. Changing filters starts a new baseline.",
            "default": {
              "titleIncludes": [],
              "functions": [],
              "countries": [],
              "departmentIncludes": []
            }
          },
          "overrides": {
            "title": "Overrides (fix or force the ATS)",
            "type": "array",
            "description": "Set the ATS and board name by hand when detection is wrong or says needs_review. Example: [{\"company\": \"acme.com\", \"ats\": \"lever\", \"token\": \"acme\", \"label\": \"Acme\"}]. company is the domain or a URL of it (matched against the same domain in Companies); an override that matches no line is reported in the log. ats is greenhouse, lever or ashby; add \"region\": \"eu\" for Lever EU boards.",
            "default": []
          },
          "slackWebhookUrl": {
            "title": "Slack Incoming Webhook URL",
            "type": "string",
            "description": "https://hooks.slack.com/services/... Stored as a secret."
          },
          "webhookUrl": {
            "title": "Webhook URL (JSON POST)",
            "type": "string",
            "description": "Any HTTPS endpoint (n8n, Make, Zapier, your API). Receives the digest as JSON. Stored as a secret."
          },
          "notifyOnlyWhenChanged": {
            "title": "Only send when something changed",
            "type": "boolean",
            "description": "Skip the digest when nothing is news since the last run. It is still sent when at least one company changed (new jobs, jobs confirmed closed that no earlier change covered, or jobs back that had offset new ones) or got its first job in a new country or a new department, even with no job added or closed. The first run only saves baselines, so the first digest then comes after the second run. A run in which no company could be read never sends a digest.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Companies in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "At most 2 requests run at once per ATS host regardless of this value.",
            "default": 4
          },
          "maxJobsInRow": {
            "title": "Jobs listed inside each company row",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How many new / closed / recent jobs are embedded in the company row (newJobs, closedJobs, recentJobs).",
            "default": 20
          },
          "maxDetectionsPerRun": {
            "title": "Domains detected per run",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Domains with no saved detection are detected (up to 2 careers pages + up to 6 board-name guesses, free) in input order, at most this many per run. The rest are returned as detection_deferred (free, no request) and detected by later runs. Saved detections, board URLs and overrides do not count.",
            "default": 1000
          },
          "spreadsheetSafeText": {
            "title": "Spreadsheet-safe text",
            "type": "boolean",
            "description": "Turn on if you open the dataset in Excel, Google Sheets or another spreadsheet (CSV/XLSX export). Text that starts with =, +, -, @ (or a tab or line break) gets a leading apostrophe, so the spreadsheet shows it as text instead of running it as a formula. Job titles, departments and locations are written by each employer, so this protects you from a title such as =HYPERLINK(...). Off by default because it changes those values for JSON consumers (-Senior Engineer becomes '-Senior Engineer).",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}