"""Ashby job board — public endpoint behind `jobs.ashbyhq.com/`: `GET https://api.ashbyhq.com/posting-api/job-board/{token}` → {"jobs":[{id, title, department, team, employmentType, location, secondaryLocations, publishedAt, isListed, isRemote, workplaceType, address:{postalAddress:{addressLocality, addressRegion, addressCountry}}, jobUrl, applyUrl, compensation?}]}. Verified 2026-09-12 against the `ashby` board (fixture trimmed to 20 jobs, 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 AshbyConnector(AtsConnector): vendor = "ashby" token_re = re.compile(r"api\.ashbyhq\.com/posting-api/job-board/([a-z0-9_.-]+)", re.IGNORECASE) meta = ConnectorMeta(connector_id="ashby-v1", name="Ashby job board", version="1", category=Surface.JOBS_BOARD, fetch_mode=FetchMode.JSON, default_interval_s=6 * 3600, url_pattern=r"api\.ashbyhq\.com/posting-api/job-board/", priority=50, pattern_required=True, accept="application/json", description="Public Ashby posting API") def parse_jobs(self, data: Any, sensor: Mapping[str, Any]) -> list[ExtractedJob]: out: list[ExtractedJob] = [] for j in (data.get("jobs") if isinstance(data, dict) else []) or []: if not isinstance(j, dict) or not j.get("title") or j.get("isListed") is False: continue addr = dig(j, "address", "postalAddress", default={}) or {} comp = j.get("compensation") or {} summary = comp.get("compensationTierSummary") if isinstance(comp, dict) else None out.append(ExtractedJob( title=str(j["title"]), url=j.get("jobUrl") or j.get("applyUrl"), external_id=str(j.get("id") or ""), department=text_of(j.get("department")), team=text_of(j.get("team")), location_text=text_of(j.get("location")), city=text_of(addr.get("addressLocality")), region=text_of(addr.get("addressRegion")) or None, country=country_code(addr.get("addressCountry")), remote=bool(j.get("isRemote")) if j.get("isRemote") is not None else None, employment_type=text_of(j.get("employmentType")), posted_at=parse_date(j.get("publishedAt")), raw={"workplaceType": j.get("workplaceType"), "secondaryLocations": [text_of(s.get("location")) for s in (j.get("secondaryLocations") or []) if isinstance(s, dict)][:5], "compensation": summary}, )) return out