{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Scraper - Job Board API & New-Job Tracking",
    "description": "Every open job on any company's Greenhouse board, read from the official Greenhouse Job Board API: title, department, locations, remote, pay ranges on request, description and dates. Built-in change tracking reports new, updated and removed jobs between runs.",
    "version": "1.0",
    "x-build-id": "81uM5egNFT3htNoV5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cedarfetch~greenhouse-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cedarfetch-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/cedarfetch~greenhouse-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-cedarfetch-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/cedarfetch~greenhouse-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-cedarfetch-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",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Greenhouse boards",
            "type": "array",
            "description": "One per line. Accepts Greenhouse board URLs (https://job-boards.greenhouse.io/stripe, https://boards.greenhouse.io/stripe, EU boards on job-boards.eu.greenhouse.io), a link to a single job (reads the whole board), embed links (boards.greenhouse.io/embed/job_board?for=stripe), a job link on the company's own site that carries ?gh_jid= (the board name is taken from the domain, with a warning if the job is not on it), or the bare board token (stripe).",
            "items": {
              "type": "string"
            }
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many matching jobs per company. 0 means all. Keeps test runs and samples cheap; a capped run never reports removed jobs.",
            "default": 0
          },
          "includeDescription": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "Add descriptionText (plain text) and descriptionHtml. Greenhouse returns the description with the job list, so this costs no extra request; turn it off for smaller rows.",
            "default": true
          },
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep jobs whose title contains these words (case- and accent-insensitive, whole words). Add * for a prefix: \"engineer*\" also matches \"Engineering\". Phrases work: \"data scientist\".",
            "items": {
              "type": "string"
            }
          },
          "titleKeywordsMode": {
            "title": "Title keywords must match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "\"any\": at least one keyword in the title. \"all\": every keyword in the title.",
            "default": "any"
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words (same matching rules), for example \"intern\" or \"senior\".",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep jobs where any listed location (or the country code / name Greenhouse gives) matches one of these words, for example \"London\", \"Germany\", \"US\" or \"Remote\". Whole-word matching, so \"US\" does not match \"Austin\".",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments or teams",
            "type": "array",
            "description": "Keep jobs whose department or team matches one of these words, for example \"Engineering\" or \"Sales\".",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs with isRemote = true. On Greenhouse this comes from the company's \"Location Type\" / workplace custom field when it has one, otherwise from location names such as \"Remote\" (see the README).",
            "default": false
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Keep jobs first published on or after this moment: an ISO date (2026-11-01 or 2026-11-01T12:00:00Z) or a relative value such as \"7 days\", \"24 hours\" or \"2 weeks\". Jobs without a publish date are dropped by this filter."
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only these normalised employment types. Greenhouse has no standard employment-type field (only optional custom fields), so most Greenhouse jobs have employmentType null and are dropped by this filter.",
            "items": {
              "type": "string",
              "enum": [
                "full_time",
                "part_time",
                "contract",
                "temporary",
                "internship",
                "apprenticeship",
                "volunteer",
                "other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract / freelance",
                "Temporary / fixed-term",
                "Internship / working student",
                "Apprenticeship",
                "Volunteer",
                "Other"
              ]
            }
          },
          "trackChanges": {
            "title": "Track changes between runs",
            "type": "boolean",
            "description": "Compare every job with the previous run and add changeType (new, updated, unchanged, removed), the changed fields and their previous values, and firstSeenAt. Jobs that disappeared from the board are reported as rows with changeType \"removed\" and removedAt. The snapshot is kept in a named key-value store in your account, so it survives between runs. Schedule the Actor daily for a jobs feed.",
            "default": false
          },
          "changesOnly": {
            "title": "Output only changes",
            "type": "boolean",
            "description": "Requires change tracking. Deliver (and pay for) only the change types selected below; unchanged jobs are skipped but the snapshot is still refreshed. The first tracked run labels every job \"new\".",
            "default": false
          },
          "changeTypes": {
            "title": "Changes to output",
            "type": "array",
            "description": "With \"Output only changes\": which change types to deliver. A daily new-jobs feed uses [\"new\"]; new plus closed jobs uses [\"new\", \"removed\"].",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "updated",
                "removed",
                "unchanged"
              ],
              "enumTitles": [
                "New jobs",
                "Updated jobs",
                "Removed (closed) jobs",
                "Unchanged jobs"
              ]
            },
            "default": [
              "new",
              "updated",
              "removed"
            ]
          },
          "snapshotStoreName": {
            "title": "Snapshot store name",
            "type": "string",
            "description": "Name of the key-value store that holds the change-tracking snapshots. Leave empty for the default \"greenhouse-jobs-scraper-snapshots\" (separate from the other Cedarfetch jobs Actors, so their tracking never mixes). Use a different name to run independent tracking jobs on the same boards (for example one per client). Lowercase letters, digits and hyphens."
          },
          "fetchGreenhousePay": {
            "title": "Fetch pay ranges",
            "type": "boolean",
            "description": "Greenhouse lists jobs without pay. With this on, one extra request per matching job reads the pay range the company publishes for pay-transparency laws (fills compensation; empty when the company publishes none).",
            "default": false
          },
          "concurrency": {
            "title": "Parallel requests per company",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many requests run at once against one board (matters for the per-job pay-range requests).",
            "default": 2
          },
          "requestDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Pause after each request to the same company's board, with small random jitter.",
            "default": 250
          },
          "maxConcurrentCompanies": {
            "title": "Companies in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many different companies are read at the same time.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Give up on a single request after this many seconds (it is then retried). A large Greenhouse board with descriptions is one response of several MB.",
            "default": 60
          },
          "maxRetries": {
            "title": "Max retries",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries for rate-limit (429), server-error (5xx) and network failures, with jittered exponential backoff that honours Retry-After. 401/403 and bot-protection answers are never retried.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}