spb/company-atlas
Public
Python 66.3%
TypeScript 22.7%
JavaScript 8.6%
HTML 1.4%
CSS 0.7%
1"""Recruitee careers-site API — public, keyless endpoint behind `<token>.recruitee.com`:2`GET https://{token}.recruitee.com/api/offers/` → {"offers":[{id, slug, title, careers_url, city, country, country_code, state_name, department,3published_at, created_at, remote, hybrid, on_site, employment_type_code, category_code, experience_code, location, salary?, tags}]}.4Verified 2026-09-12 against `vandebron` (fixture trimmed to 20 offers, 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 RecruiteeConnector(AtsConnector):20 vendor = "recruitee"21 token_re = re.compile(r"https?://([a-z0-9-]+)\.recruitee\.com/api/offers", re.IGNORECASE)22 meta = ConnectorMeta(connector_id="recruitee-v1", name="Recruitee offers", version="1", category=Surface.JOBS_BOARD, fetch_mode=FetchMode.JSON,23 default_interval_s=6 * 3600, url_pattern=r"\.recruitee\.com/api/offers", pattern_required=True, priority=50, accept="application/json",24 description="Public Recruitee careers-site API")2526 def parse_jobs(self, data: Any, sensor: Mapping[str, Any]) -> list[ExtractedJob]:27 out: list[ExtractedJob] = []28 for o in (data.get("offers") if isinstance(data, dict) else []) or []:29 if not isinstance(o, dict) or not o.get("title"):30 continue31 if o.get("status") not in (None, "published"):32 continue33 sal = o.get("salary") or {}34 remote = True if o.get("remote") else (False if (o.get("on_site") or o.get("hybrid")) else None)35 out.append(ExtractedJob(36 title=str(o["title"]), url=o.get("careers_url"), external_id=str(o.get("id") or o.get("slug") or ""),37 department=text_of(o.get("department")), location_text=text_of(o.get("location")) or ", ".join(x for x in (o.get("city"), o.get("country")) if x) or None,38 city=text_of(o.get("city")), region=text_of(o.get("state_name")), country=country_code(o.get("country_code")) or country_code(o.get("country")),39 remote=remote, employment_type=text_of(o.get("employment_type_code")), posted_at=parse_date(o.get("published_at") or o.get("created_at")),40 salary_min=sal.get("min") if isinstance(sal, dict) else None, salary_max=sal.get("max") if isinstance(sal, dict) else None,41 salary_currency=sal.get("currency") if isinstance(sal, dict) else None, salary_period=sal.get("period") if isinstance(sal, dict) else None,42 raw={"category_code": o.get("category_code"), "experience_code": o.get("experience_code"), "tags": (o.get("tags") or [])[:10]},43 ))44 return out45