SPB Git forge
28commits 1branches 0releases
7.7 MBsize
maindefault branch
10 days agolast push
Python 66.3% TypeScript 22.7% JavaScript 8.6% HTML 1.4% CSS 0.7%
2.7 KB · 43 lines python
Raw Blame History
1"""Lever postings — public endpoint behind `jobs.lever.co/<token>`:2`GET https://api.lever.co/v0/postings/{token}?mode=json` → [{id, text, categories:{commitment, location, team, department, allLocations},3country, workplaceType, hostedUrl, applyUrl, createdAt(ms), salaryRange?}]. EU tenants use api.eu.lever.co. Verified 2026-09-12 against the4`palantir` board (fixture trimmed to 20 postings, descriptions removed)."""5from __future__ import annotations67import re8from collections.abc import Mapping9from typing import Any1011from companyatlas.connectors._ats_base import AtsConnector12from companyatlas.connectors._util import country_code, dig, parse_date, text_of13from companyatlas.sdk.connector import ConnectorMeta, register14from companyatlas.sdk.models import ExtractedJob15from companyatlas.taxonomy import FetchMode, Surface161718@register19class LeverConnector(AtsConnector):20    vendor = "lever"21    token_re = re.compile(r"api\.(?:eu\.)?lever\.co/v0/postings/([a-z0-9_-]+)", re.IGNORECASE)22    meta = ConnectorMeta(connector_id="lever-v1", name="Lever postings", version="1", category=Surface.JOBS_BOARD, fetch_mode=FetchMode.JSON,23                         default_interval_s=6 * 3600, url_pattern=r"api\.(eu\.)?lever\.co/v0/postings/", priority=50, pattern_required=True, accept="application/json",24                         description="Public Lever postings API (mode=json)")2526    def parse_jobs(self, data: Any, sensor: Mapping[str, Any]) -> list[ExtractedJob]:27        out: list[ExtractedJob] = []28        for j in data if isinstance(data, list) else []:29            if not isinstance(j, dict) or not j.get("text"):30                continue31            cats = j.get("categories") or {}32            workplace = (j.get("workplaceType") or "").lower()33            sal = j.get("salaryRange") or {}34            out.append(ExtractedJob(35                title=str(j["text"]), url=j.get("hostedUrl") or j.get("applyUrl"), external_id=str(j.get("id") or ""),36                department=text_of(cats.get("department")), team=text_of(cats.get("team")), location_text=text_of(cats.get("location")),37                country=country_code(j.get("country")), remote=True if workplace == "remote" else (False if workplace in ("hybrid", "on-site", "onsite") else None),38                employment_type=text_of(cats.get("commitment")), posted_at=parse_date(j.get("createdAt")),39                salary_min=sal.get("min"), salary_max=sal.get("max"), salary_currency=sal.get("currency"), salary_period=sal.get("interval"),40                raw={"workplaceType": j.get("workplaceType"), "allLocations": dig(cats, "allLocations", default=[])[:5] if isinstance(cats.get("allLocations"), list) else []},41            ))42        return out43