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"""Workable — public widget endpoint behind `apply.workable.com/<token>`:2`GET https://apply.workable.com/api/v1/widget/accounts/{token}` → {name, description, jobs:[{title, shortcode, code, employment_type,3telecommuting, department, url, published_on, created_at, country, city, state, function, locations:[{country, countryCode, city, region}]}]}.4Verified 2026-09-12 against `epignosis` (fixture trimmed, 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, parse_date, text_of13from companyatlas.sdk.connector import ConnectorMeta, register14from companyatlas.sdk.models import ExtractedJob15from companyatlas.taxonomy import FetchMode, Surface161718@register19class WorkableConnector(AtsConnector):20    vendor = "workable"21    token_re = re.compile(r"apply\.workable\.com/api/v1/widget/accounts/([a-z0-9_-]+)", re.IGNORECASE)22    meta = ConnectorMeta(connector_id="workable-v1", name="Workable widget", version="1", category=Surface.JOBS_BOARD, fetch_mode=FetchMode.JSON,23                         default_interval_s=6 * 3600, url_pattern=r"apply\.workable\.com/api/v1/widget/accounts/", pattern_required=True, priority=50,24                         accept="application/json", description="Public Workable widget API")2526    def parse_jobs(self, data: Any, sensor: Mapping[str, Any]) -> list[ExtractedJob]:27        out: list[ExtractedJob] = []28        for j in (data.get("jobs") if isinstance(data, dict) else []) or []:29            if not isinstance(j, dict) or not j.get("title"):30                continue31            locs = j.get("locations") or []32            first = locs[0] if locs and isinstance(locs[0], dict) else {}33            city, state, country = j.get("city") or first.get("city"), j.get("state") or first.get("region"), j.get("country") or first.get("country")34            out.append(ExtractedJob(35                title=str(j["title"]), url=j.get("url") or j.get("shortlink"), external_id=str(j.get("shortcode") or j.get("code") or ""),36                department=text_of(j.get("department")), location_text=", ".join(x for x in (city, state, country) if x) or None,37                city=text_of(city), region=text_of(state), country=country_code(first.get("countryCode")) or country_code(country),38                remote=bool(j.get("telecommuting")) if j.get("telecommuting") is not None else None, employment_type=text_of(j.get("employment_type")),39                posted_at=parse_date(j.get("published_on") or j.get("created_at")),40                raw={"function": j.get("function"), "experience": j.get("experience"), "industry": j.get("industry")},41            ))42        return out43