{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Scraper for Public Job Boards",
    "description": "Greenhouse jobs scraper: export open jobs from public Greenhouse boards by token or URL. One row per job with title, location, departments, dates and job link; optional descriptions, pay ranges and new/closed tracking. Per-board errors in SUMMARY. Pay per job row; pay ranges extra.",
    "version": "0.1",
    "x-build-id": "EBEojkhXaitDb3eHZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/riprap-tools~greenhouse-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-riprap-tools-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/riprap-tools~greenhouse-jobs/runs": {
      "post": {
        "operationId": "runs-sync-riprap-tools-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/riprap-tools~greenhouse-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-riprap-tools-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",
        "properties": {
          "boards": {
            "title": "Board tokens or URLs",
            "minItems": 1,
            "maxItems": 100,
            "type": "array",
            "description": "Greenhouse job board tokens or board URLs, e.g. tailscale, https://job-boards.greenhouse.io/tailscale or https://boards.greenhouse.io/tailscale. EU board URLs (job-boards.eu.greenhouse.io/TOKEN) work too. The token is the path part after the host. Company names and domains are not resolved. Duplicates are read once. A board that fails is reported in SUMMARY with a code and never stops the other boards.",
            "items": {
              "type": "string"
            },
            "default": [
              "tailscale"
            ]
          },
          "titleKeywords": {
            "title": "Title keywords",
            "maxItems": 50,
            "type": "array",
            "description": "Keep jobs whose title contains any of these words or phrases. Case-insensitive literal text, no wildcards or regex. Empty keeps every title. Example: backend, platform engineer.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "default": []
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "maxItems": 50,
            "type": "array",
            "description": "Drop jobs whose title contains any of these words or phrases. Case-insensitive literal text. Applied after titleKeywords. Example: intern, manager.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "default": []
          },
          "locationKeywords": {
            "title": "Location keywords",
            "maxItems": 50,
            "type": "array",
            "description": "Keep jobs whose location text or any office name/location contains any of these strings (case-insensitive literal). remote matches only listings whose text says remote; it does not prove where a remote hire may live. Empty keeps every location.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "default": []
          },
          "departments": {
            "title": "Departments",
            "maxItems": 50,
            "type": "array",
            "description": "Keep jobs in a department whose name contains any of these strings (case-insensitive literal), e.g. Engineering. Department names are set by each employer. Empty keeps every department.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "default": []
          },
          "postedWithinDays": {
            "title": "Posted within days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Keep jobs whose firstPublished date is within this many days of the run. Jobs without firstPublished are excluded while this is set and counted in SUMMARY. Employers can reset this date by reposting. Omit to keep all dates."
          },
          "includeDescription": {
            "title": "Include descriptions",
            "type": "boolean",
            "description": "Add descriptionText (plain text) and descriptionHtml (decoded HTML) to each row. Off by default to keep rows small for agents; the price per job is the same either way.",
            "default": false
          },
          "includePayRanges": {
            "title": "Include pay ranges",
            "type": "boolean",
            "description": "Read each matching job's detail page from the API to add payRanges: structured pay-transparency ranges in cents, exactly as published. Adds one request per job, spaced at least one second apart, so a 400-job board takes minutes. The pay-range event is charged only for jobs that publish at least one range.",
            "default": false
          },
          "maxJobs": {
            "title": "Maximum jobs",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum job rows across all boards; closed-job notices do not count. Boards are read in input order. When the cap is reached the run stops, and SUMMARY marks the affected boards as incomplete. An incomplete board never produces closed-job notices.",
            "default": 500
          },
          "baselineName": {
            "title": "Baseline name",
            "pattern": "^[A-Za-z0-9_-]{1,100}$",
            "type": "string",
            "description": "Turns on new/closed tracking: 1-100 letters, digits, underscores or hyphens. Rows get changeType new or existing; a job gone since the last complete read of its board gets one free closed-job notice. New means first seen under this name, not newly posted. Reuse the name with the same boards and filters; jobs excluded by earlier filters count as existing. Do not run two jobs on one name at once."
          },
          "onlyChanges": {
            "title": "Only new and closed",
            "type": "boolean",
            "description": "Requires baselineName: output only new jobs and closed-job notices; existing jobs are skipped and not charged. The first run under a new baselineName marks every job new.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}