{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Job Board Scraper - Company Jobs, Salary, Remote",
    "description": "Open positions from any company's Greenhouse board, read from the public Job Board API - no key, no browser. One row per posting: title, location, department path, office, published salary range, first published and updated time in UTC, apply link and optional description text.",
    "version": "0.1",
    "x-build-id": "upospiVlY7PfGelip"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~greenhouse-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-greenhouse-jobs",
        "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/yadroo~greenhouse-jobs/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-greenhouse-jobs",
        "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/yadroo~greenhouse-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-greenhouse-jobs",
        "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": [
          "boardTokens"
        ],
        "properties": {
          "boardTokens": {
            "title": "Company board tokens",
            "type": "array",
            "description": "One or more Greenhouse board tokens, e.g. `stripe`, `duolingo`, `gitlab`, `databricks`. The token is the last part of a company's board URL (`job-boards.greenhouse.io/<token>`, `boards.greenhouse.io/<token>`) - paste the whole URL and the token is taken from it. Each token costs one request; unknown tokens come back as a single row with `found: false` instead of failing the run.",
            "items": {
              "type": "string"
            }
          },
          "titleKeywords": {
            "title": "Job title contains any of",
            "type": "array",
            "description": "Keep a posting when its title contains at least one of these words, case-insensitive, e.g. [\"engineer\", \"data\"]. Empty = every open posting of the board.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Job title must not contain",
            "type": "array",
            "description": "Drop a posting when its title contains any of these words, e.g. [\"intern\", \"contract\"]. Applied after `titleKeywords`.",
            "items": {
              "type": "string"
            }
          },
          "locationContains": {
            "title": "Location contains any of",
            "type": "array",
            "description": "Keep postings whose location text contains one of these, case-insensitive, e.g. [\"London\", \"India\", \"New York\"]. Greenhouse stores the location as free text a company typed (\"Seattle, San Francisco, New York City\", \"Remote - California\", \"Hybrid\"), so match on city, state or country words rather than exact strings.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department contains any of",
            "type": "array",
            "description": "Keep postings whose department contains one of these at any level of the company's own department tree, e.g. [\"Sales\", \"Engineering\"]. The tree is read from the board, so a parent name (\"Sales\") also returns the postings of its children (\"Enterprise Sales\", \"Sales Development\").",
            "items": {
              "type": "string"
            }
          },
          "offices": {
            "title": "Office contains any of",
            "type": "array",
            "description": "Keep postings attached to an office whose name contains one of these, e.g. [\"Dublin\", \"Remote\"]. Offices are the company's own office list and are often coarser than the location text. Setting this makes the actor ask for the large response that also carries the descriptions, so the run takes longer.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote postings only",
            "type": "boolean",
            "description": "Keep only postings whose location or office text marks them as remote (\"remote\", \"anywhere\", \"distributed\", \"work from home\"). Greenhouse has no remote flag, so this is a text match on what the company wrote - `isRemote` in the output shows the same verdict for every row.",
            "default": false
          },
          "withSalaryOnly": {
            "title": "Only postings with a published salary range",
            "type": "boolean",
            "description": "Keep only postings that carry a pay range. Pay transparency is published per posting and mostly by employers under US, EU or UK disclosure rules, so a whole board can be without ranges.",
            "default": false
          },
          "postedWithinDays": {
            "title": "First published within N days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Keep postings first published in the last N days - the \"who started hiring recently\" filter for hiring-signal and lead pipelines. Empty = no age limit."
          },
          "sinceHours": {
            "title": "Changed in the last N hours",
            "minimum": 1,
            "maximum": 8760,
            "type": "integer",
            "description": "Keep postings whose `updatedAt` is inside the last N hours (UTC). Use it on a schedule to follow edits and re-posts, not only brand-new jobs. Empty = no limit."
          },
          "onlyNew": {
            "title": "Only postings not seen before",
            "type": "boolean",
            "description": "Remember board token, job id and `updatedAt` in this actor's key-value store and emit only rows that were not there on the previous run. An edited posting counts as new because its `updatedAt` moved. The first run emits everything it finds.",
            "default": false
          },
          "includeDescription": {
            "title": "Include the job description",
            "type": "boolean",
            "description": "Add `descriptionHtml` (as published) and `descriptionText` (entities decoded, tags stripped, blank lines kept) to every row, and ask the API for the richer response. Off by default because descriptions make rows ~20x larger.",
            "default": false
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "updatedDesc",
              "publishedDesc",
              "titleAsc",
              "boardOrder"
            ],
            "type": "string",
            "description": "Order of the rows. With several board tokens the rows are sorted across all of them, after `maxItemsPerBoard` was applied.",
            "default": "updatedDesc"
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many rows in total. A mid-size board has 50-500 open postings, the largest ones a few thousand.",
            "default": 25
          },
          "maxItemsPerBoard": {
            "title": "Max rows per company",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap the rows taken from each board before the global `maxItems`, so one big employer cannot fill the whole dataset when you watch a list of companies. Empty = no per-company cap."
          },
          "fields": {
            "title": "Output fields",
            "type": "array",
            "description": "Keep only these output fields, in this order, e.g. [\"company\", \"title\", \"location\", \"url\"]. Empty = all fields.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}