{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Scraper",
    "description": "Greenhouse jobs scraper for any company board via the official public Job Board API: every pay range, departments, offices and optional application questions. Schedule changes mode for only new, updated and closed jobs. $1.50 per 1,000 jobs. Unofficial; not affiliated with Greenhouse.",
    "version": "0.1",
    "x-build-id": "MtaXAZQbBjM6NvXfB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tallowlanelabs~greenhouse-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tallowlanelabs-greenhouse-jobs-scraper",
        "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/tallowlanelabs~greenhouse-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tallowlanelabs-greenhouse-jobs-scraper",
        "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/tallowlanelabs~greenhouse-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tallowlanelabs-greenhouse-jobs-scraper",
        "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": {
          "boards": {
            "title": "Company job boards",
            "type": "array",
            "description": "One entry per company. Accepts a Greenhouse board URL (boards.greenhouse.io/stripe, job-boards.greenhouse.io/stripe, job-boards.eu.greenhouse.io/acme, an embed URL with ?for=), a board name (stripe) or greenhouse:stripe, or a company careers-page URL (the Actor loads it once and looks for an embedded Greenhouse board). Optional: leave empty to run a quick 5-job demo from a public example board (snapshot mode).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "changes",
              "snapshot"
            ],
            "type": "string",
            "description": "\"snapshot\" (default) returns every current job on every run (each record still says whether it is new, updated or unchanged). \"changes\" (monitor) returns only jobs that are new, updated or removed since the last run for each board; the first run for a board returns the full baseline. Use \"changes\" for scheduled alerts.",
            "default": "snapshot"
          },
          "changeTypes": {
            "title": "Change types to report",
            "type": "array",
            "description": "Which changes to output in \"changes\" mode.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "updated",
                "removed"
              ],
              "enumTitles": [
                "New jobs",
                "Updated jobs",
                "Removed (closed) jobs"
              ]
            },
            "default": [
              "new",
              "updated",
              "removed"
            ]
          },
          "emitBaseline": {
            "title": "Output the full board on the first run",
            "type": "boolean",
            "description": "In \"changes\" mode, the first run for a board has nothing to compare against. If on, all current jobs are output (charged as job items) with changeType \"baseline\". If off, the first run only stores the baseline silently (nothing output, nothing charged) and alerts start on the next run.",
            "default": true
          },
          "keywords": {
            "title": "Title keywords (any)",
            "type": "array",
            "description": "Only output jobs whose title contains at least one of these (case-insensitive). Leave empty for all.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Skip jobs whose title contains any of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (any)",
            "type": "array",
            "description": "Only output jobs whose location, city, region or country contains one of these strings, e.g. \"New York\", \"Germany\", \"remote\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments / teams (any)",
            "type": "array",
            "description": "Only output jobs whose department or team contains one of these strings, e.g. \"Engineering\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Only output these workplace types. Empty = all. \"unknown\" covers postings that do not say.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite",
                "unknown"
              ]
            },
            "default": []
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Only output jobs first published within this many days (where the ATS gives a date)."
          },
          "salaryOnly": {
            "title": "Only jobs with posted pay",
            "type": "boolean",
            "description": "Only output jobs where Greenhouse publishes a pay range.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only output jobs whose posted yearly pay range reaches at least this amount (top of the range, in the posting's own currency). Jobs without a posted range, or with an hourly or monthly range, are skipped when this is set."
          },
          "maxJobsPerBoard": {
            "title": "Max jobs output per board",
            "minimum": 1,
            "type": "integer",
            "description": "Cap the number of records output per board per run (after filters). Change detection still sees the whole board."
          },
          "includeDescriptions": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "Include the full description. Turning this off makes runs faster and the dataset smaller.",
            "default": true
          },
          "descriptionFormats": {
            "title": "Description formats",
            "type": "array",
            "description": "Formats to include when descriptions are on.",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "markdown",
                "html"
              ]
            },
            "default": [
              "text",
              "markdown"
            ]
          },
          "redactContactInfo": {
            "title": "Mask emails and phone numbers in descriptions",
            "type": "boolean",
            "description": "Some employers put a recruiter email or phone in the public job text. Turn on to replace them with [email removed] / [phone removed].",
            "default": false
          },
          "includeApplicationQuestions": {
            "title": "Include application questions",
            "type": "boolean",
            "description": "Add each job's application form questions (labels, required flags, field types and fixed answer options). Needs one extra API request per output job, so runs take longer; no extra charge.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps each board's last-seen jobs between runs. Use a different name (or a key prefix) to run independent monitors.",
            "default": "greenhouse-jobs-scraper-state"
          },
          "stateKeyPrefix": {
            "title": "State key prefix",
            "type": "string",
            "description": "Optional prefix so several saved tasks can monitor the same board independently.",
            "default": ""
          },
          "resetState": {
            "title": "Reset state (start a new baseline)",
            "type": "boolean",
            "description": "Ignore stored state for the boards in this run and treat it as a first run.",
            "default": false
          },
          "detectFromCareerPages": {
            "title": "Detect ATS from careers-page URLs",
            "type": "boolean",
            "description": "For URLs that are not a Greenhouse domain, load the page once and look for an embedded Greenhouse job board.",
            "default": true
          },
          "boardConcurrency": {
            "title": "Boards in parallel",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many boards to process at once. Per-ATS rate limits still apply. Memory depends on the jobs on these boards: 512 MB (default) fits up to 7,500 live jobs across the boards processed at once (no single board over 5,000); use 1024 MB above that, or set this to 1 for very large boards.",
            "default": 3
          },
          "maxConcurrency": {
            "title": "Max parallel HTTP requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Global cap on in-flight requests across all ATS APIs.",
            "default": 4
          },
          "removalSafetyMinJobs": {
            "title": "Removal safety threshold",
            "minimum": 1,
            "type": "integer",
            "description": "If a board that had at least this many jobs suddenly returns zero, removals are not reported that run (it is usually an API hiccup).",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}