{
  "title": "Lever jobs - choose employer boards",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "companies": {
      "title": "Employer board names or URLs",
      "type": "array",
      "description": "One entry per company. Paste the Lever company slug or the full board URL - both work. The slug is the path segment in https://jobs.lever.co/<slug> (for example 'spotify'); links to a single posting such as https://jobs.lever.co/spotify/<job-id> are accepted too and the slug is taken from them. A slug with no Lever board returns HTTP 404 and is reported per company rather than failing the whole run.",
      "editor": "stringList",
      "default": [
        "spotify",
        "wealthfront",
        "palantir"
      ],
      "prefill": [
        "spotify",
        "wealthfront",
        "palantir"
      ],
      "sectionCaption": "1 · Employer boards",
      "sectionDescription": "Use public Lever board names or URLs."
    },
    "maxResultsPerCompany": {
      "title": "Maximum postings per employer",
      "type": "integer",
      "description": "Upper bound on rows saved for each company. Postings are sorted newest-created first, so a low cap keeps the freshest roles. Lever returns a whole board in a single response, so raising this costs almost no extra time - a 900-posting board is still one request.",
      "editor": "number",
      "default": 200,
      "minimum": 1,
      "sectionCaption": "2 · Run limits",
      "sectionDescription": "Bound the number of postings per employer and the run duration."
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Wall-clock budget for the crawl. When it is reached the Actor stops cleanly, keeps everything already saved, and logs which companies it did not reach - instead of being killed with a failed run. Raise it when you pass a long list of companies.",
      "editor": "number",
      "default": 240,
      "minimum": 30
    },
    "onlyNewSinceLastRun": {
      "title": "Only postings new since the last run",
      "type": "boolean",
      "description": "Save only matching postings not successfully saved by a previous monitor run. IDs are retained in the named lever-jobs-baseline store. The first run returns matching postings within your limits; capped or filtered-out jobs remain eligible later. A run with no new matching jobs succeeds with an empty dataset. Avoid concurrent monitor runs for the same board.",
      "editor": "checkbox",
      "default": false,
      "sectionCaption": "3 · Saved comparisons",
      "sectionDescription": "The first comparison establishes history. Reuse the same scope for later observations and avoid concurrent writers."
    }
  },
  "description": "Choose public Lever employer boards and a per-employer result cap. Keep new-postings-only mode off for an initial snapshot; later comparisons track saved posting IDs."
}
