"""Lever postings — public endpoint behind `jobs.lever.co/`: `GET https://api.lever.co/v0/postings/{token}?mode=json` → [{id, text, categories:{commitment, location, team, department, allLocations}, country, workplaceType, hostedUrl, applyUrl, createdAt(ms), salaryRange?}]. EU tenants use api.eu.lever.co. Verified 2026-09-12 against the `palantir` board (fixture trimmed to 20 postings, descriptions removed).""" from __future__ import annotations import re from collections.abc import Mapping from typing import Any from companyatlas.connectors._ats_base import AtsConnector from companyatlas.connectors._util import country_code, dig, parse_date, text_of from companyatlas.sdk.connector import ConnectorMeta, register from companyatlas.sdk.models import ExtractedJob from companyatlas.taxonomy import FetchMode, Surface @register class LeverConnector(AtsConnector): vendor = "lever" token_re = re.compile(r"api\.(?:eu\.)?lever\.co/v0/postings/([a-z0-9_-]+)", re.IGNORECASE) meta = ConnectorMeta(connector_id="lever-v1", name="Lever postings", version="1", category=Surface.JOBS_BOARD, fetch_mode=FetchMode.JSON, default_interval_s=6 * 3600, url_pattern=r"api\.(eu\.)?lever\.co/v0/postings/", priority=50, pattern_required=True, accept="application/json", description="Public Lever postings API (mode=json)") def parse_jobs(self, data: Any, sensor: Mapping[str, Any]) -> list[ExtractedJob]: out: list[ExtractedJob] = [] for j in data if isinstance(data, list) else []: if not isinstance(j, dict) or not j.get("text"): continue cats = j.get("categories") or {} workplace = (j.get("workplaceType") or "").lower() sal = j.get("salaryRange") or {} out.append(ExtractedJob( title=str(j["text"]), url=j.get("hostedUrl") or j.get("applyUrl"), external_id=str(j.get("id") or ""), department=text_of(cats.get("department")), team=text_of(cats.get("team")), location_text=text_of(cats.get("location")), country=country_code(j.get("country")), remote=True if workplace == "remote" else (False if workplace in ("hybrid", "on-site", "onsite") else None), employment_type=text_of(cats.get("commitment")), posted_at=parse_date(j.get("createdAt")), salary_min=sal.get("min"), salary_max=sal.get("max"), salary_currency=sal.get("currency"), salary_period=sal.get("interval"), raw={"workplaceType": j.get("workplaceType"), "allLocations": dig(cats, "allLocations", default=[])[:5] if isinstance(cats.get("allLocations"), list) else []}, )) return out