{
  "openapi": "3.0.1",
  "info": {
    "title": "Lever Jobs Scraper",
    "description": "Lever jobs scraper for any company board (US and EU) via Lever's public Postings API: salary ranges, team, location, remote/hybrid, commitment, apply links. Schedule for new, changed and closed jobs, pay changes included. $1.50 per 1,000 jobs. Unofficial; not affiliated with Lever.",
    "version": "0.1",
    "x-build-id": "5nMWowHVWkCxNL7IC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tallowlanelabs~lever-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tallowlanelabs-lever-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~lever-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tallowlanelabs-lever-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~lever-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tallowlanelabs-lever-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 Lever board URL (jobs.lever.co/zoox, or any job or apply link on it), an EU board URL (jobs.eu.lever.co/acme), a Postings API URL (api.lever.co/v0/postings/zoox), a site name (zoox) or lever:zoox (EU: lever:eu:acme), or a company careers-page URL (the Actor loads it once and looks for a Lever link). Optional: leave empty to run a quick 5-job demo from a public example board.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "snapshot",
              "changes"
            ],
            "type": "string",
            "description": "\"snapshot\" (default) returns every current job on every run; each record still says whether it is new, updated (with changedFields) or unchanged since the last run. \"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. Schedule \"changes\" daily for alerts.",
            "default": "snapshot"
          },
          "changeTypes": {
            "title": "Change types to report",
            "type": "array",
            "description": "Which changes to output in \"changes\" mode. A pay change shows up as an \"updated\" job with \"salary\" in changedFields.",
            "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 that publish pay (Lever's structured salary range, or a pay amount found in the posting's salary text).",
            "default": false
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only output jobs whose posted yearly pay reaches at least this amount (top of the range, in the posting's own currency). Jobs without posted pay, or with hourly, weekly or monthly pay, 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: plain text, Markdown, and/or the original HTML (all sections: intro, lists such as requirements, and closing text).",
            "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] or [phone removed].",
            "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": "lever-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 Lever domain, load the page once and look for a Lever job-board link.",
            "default": true
          },
          "boardConcurrency": {
            "title": "Boards in parallel",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many boards to process at once. Memory depends on the jobs on these boards: 512 MB (default) fits up to 3,000 live jobs across the boards processed at once (no single board over 2,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 to the Lever API.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}