{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Scraper: Whole Boards, Descriptions Included",
    "description": "Scrapes job postings from any Greenhouse job board through Greenhouse's public API. One request returns an entire board with full descriptions, departments and real posted dates. Incremental mode ignores Greenhouse's bulk updated_at restamps, so you are not re-billed for rows that did not change.",
    "version": "1.0",
    "x-build-id": "siAiPj99rUnnpozI1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/firstpartydata~greenhouse-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-firstpartydata-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/firstpartydata~greenhouse-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-firstpartydata-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/firstpartydata~greenhouse-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-firstpartydata-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": {
          "companies": {
            "title": "Greenhouse boards",
            "type": "array",
            "description": "One or more Greenhouse job boards. A full URL such as https://job-boards.greenhouse.io/stripe works, and so does the older boards.greenhouse.io form, the bare board identifier (stripe), or the company domain (stripe.com). The identifier is the last path segment and is kept exactly as you typed it in companyToken. Leave this empty and switch on the built-in list below to search every bundled board instead.",
            "items": {
              "type": "string"
            }
          },
          "useBuiltInCorpus": {
            "title": "Search the built-in company list",
            "type": "boolean",
            "description": "Read the bundled list of verified live Greenhouse boards instead of, or as well as, the companies above. Ordered largest employer first. Greenhouse returns a whole board in one request, so reading many boards costs one request each rather than one per posting.",
            "default": false
          },
          "corpusSample": {
            "title": "How many bundled boards to read",
            "minimum": 0,
            "type": "integer",
            "description": "How many bundled Greenhouse boards to read, largest first. Boards are size-ordered, so a few hundred already covers most of the postings: 250 covers about 50% of them, 500 about 63%, 1000 about 78% and 2000 about 90%. 0 means every bundled board.",
            "default": 300
          },
          "withSalaryOnly": {
            "title": "Only postings with a pay range",
            "type": "boolean",
            "description": "Keep only postings with a real compensation range, meaning one with numbers in it. Greenhouse publishes no structured pay field at all: it returned one on 0 of 9,323 sampled postings. This actor reads a range out of the description prose instead, which reaches 26% to 29% of rows across two samples, and only works with Return descriptions switched on. With descriptions off this filter matches nothing.",
            "default": false
          },
          "remoteOnly": {
            "title": "Only remote postings",
            "type": "boolean",
            "description": "Keep only postings this actor reads as remote. Greenhouse has no remote or hybrid field, so this is derived from the location, the title and the description, and comes out true on about 10% of rows. It is a judgement rather than something Greenhouse stated, which is why it is a separate switch from the exact work-arrangement filter the other Actors in this family offer.",
            "default": false
          },
          "titleInclude": {
            "title": "Job title must contain",
            "type": "array",
            "description": "Keep only postings whose title contains one of these. Matched case-insensitively against the title alone, so it is narrower than Keywords and better for a role type: \"engineer\" here will not pull in every posting that mentions engineering in its description.",
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Job title must not contain",
            "type": "array",
            "description": "Drop postings whose title contains any of these. Applied after Job title must contain, and useful for stripping the senior or intern ends of a search.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only postings containing one of these anywhere in the title or description. Greenhouse returns the full description in the same request as the board, so this costs nothing extra here, unlike on systems that charge a request per posting for it. Needs Return descriptions on.",
            "items": {
              "type": "string"
            }
          },
          "keywordsMatchAll": {
            "title": "Match all keywords",
            "type": "boolean",
            "description": "Require every keyword rather than any one of them.",
            "default": false
          },
          "location": {
            "title": "Location contains",
            "type": "array",
            "description": "Keep only postings whose location text contains one of these. Greenhouse publishes location as prose that the employer typed, so this is a string match rather than a structured lookup: \"Dublin\", \"San Francisco\", \"Remote - US\". A posting can carry several locations and all of them are matched.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Keep only postings in these countries, by ISO code (DE) or name (Germany). Greenhouse publishes no country field, so this reads one off the location prose and resolves 78% to 81% of rows across two samples. Every row it resolves is marked countryInferred. Roughly a fifth of Greenhouse postings cannot be placed at all and will never match a country filter.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only postings first published in this many days. 0 disables it. Greenhouse publishes a real first-published timestamp on 99.9% of postings, so this is exact here rather than rounded to the day. Note it reads the published date, never the updated date, for the reason in the listing.",
            "default": 0
          },
          "includeDescriptions": {
            "title": "Return descriptions",
            "type": "boolean",
            "description": "Return the description as both HTML and plain text. On Greenhouse this is free: the description arrives in the same single request as the rest of the board, so turning it off saves payload size but no time. Leave it on unless you only need to know who is hiring for what. Keywords and the pay filter both need it.",
            "default": true
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed postings",
            "type": "boolean",
            "description": "Return only postings that are new or have changed since the last run with the same state key. The first run has no history and returns everything. On Greenhouse this matters more than elsewhere: the change fingerprint deliberately ignores the vendor updated_at field, which whole boards restamp at once without anything actually changing.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Names the saved state that Only new or changed compares against. Leave it empty and one is derived from your input, so two different searches keep separate histories. Set it explicitly to share a history across runs whose input you expect to edit.",
            "default": ""
          },
          "maxItems": {
            "title": "Maximum jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Hard ceiling on results, so an over-broad search cannot produce a surprise bill. The run stops as soon as it is reached. 0 means no limit, which on the whole bundled list is well over 100,000 postings.",
            "default": 1000
          },
          "maxPerCompany": {
            "title": "Maximum jobs from any one job board",
            "minimum": 0,
            "type": "integer",
            "description": "Stops a single large board filling the whole result. It matters here: Greenhouse hands back an entire board in one response, so without a limit the first board to answer can take the whole ceiling by itself, and the largest bundled board carries 4,980 postings. The form opens at 10, so every company you name shows up in a first run, and a sample of the built-in list reaches at least 30 boards. A number set here always applies, including to companies you name. Set 0 and a capped run over the built-in list spreads itself across at least 40 boards, while named companies get no limit. Counted per board, not per employer.",
            "default": 0
          },
          "concurrency": {
            "title": "Boards read at once",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many Greenhouse boards to read at once. 20 is the figure two 400-board runs cleared with zero refusals, not a guess. Greenhouse sits behind a CloudFront WAF that will refuse a client it decides is a crawler, and it blocked this project once for about twenty minutes during corpus building. A refusal is reported separately from a missing board rather than confused with one, because a blocked source and a closed board need opposite responses. Raise it only if you have a reason.",
            "default": 20
          },
          "atsPlatforms": {
            "title": "ATS platforms",
            "type": "array",
            "description": "Fixed to Greenhouse for this Actor.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse"
              ],
              "enumTitles": [
                "Greenhouse"
              ]
            },
            "default": [
              "greenhouse"
            ]
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}