from typing import Literal PlatformGroup = Literal["Search Boards", "ATS Platforms", "Company Pages"] EVER_JOBS_PLATFORMS: dict[str, dict] = { # ── Search Boards ────────────────────────────────────────────────────────── "linkedin": {"group": "Search Boards", "display": "LinkedIn"}, "indeed": {"group": "Search Boards", "display": "Indeed"}, "glassdoor": {"group": "Search Boards", "display": "Glassdoor"}, "google": {"group": "Search Boards", "display": "Google Jobs"}, "naukri": {"group": "Search Boards", "display": "Naukri"}, "bdjobs": {"group": "Search Boards", "display": "BDJobs"}, "internshala": {"group": "Search Boards", "display": "Internshala"}, "bayt": {"group": "Search Boards", "display": "Bayt"}, "ziprecruiter": {"group": "Search Boards", "display": "ZipRecruiter"}, "monster": {"group": "Search Boards", "display": "Monster"}, "dice": {"group": "Search Boards", "display": "Dice"}, "careerjet": {"group": "Search Boards", "display": "CareerJet"}, "jooble": {"group": "Search Boards", "display": "Jooble"}, "adzuna": {"group": "Search Boards", "display": "Adzuna"}, "reed": {"group": "Search Boards", "display": "Reed"}, "totaljobs": {"group": "Search Boards", "display": "TotalJobs"}, "cwjobs": {"group": "Search Boards", "display": "CWJobs"}, "jobsite": {"group": "Search Boards", "display": "Jobsite"}, "cv_library": {"group": "Search Boards", "display": "CV-Library"}, "jobs_ac_uk": {"group": "Search Boards", "display": "jobs.ac.uk"}, "simplyhired": {"group": "Search Boards", "display": "SimplyHired"}, "snagajob": {"group": "Search Boards", "display": "Snagajob"}, "careerbuilder": {"group": "Search Boards", "display": "CareerBuilder"}, "usajobs": {"group": "Search Boards", "display": "USAJobs"}, "federalregister": {"group": "Search Boards", "display": "Federal Register"}, "linkedin_easy": {"group": "Search Boards", "display": "LinkedIn Easy Apply"}, "wellfound": {"group": "Search Boards", "display": "Wellfound (AngelList)"}, "remotive": {"group": "Search Boards", "display": "Remotive"}, "weworkremotely": {"group": "Search Boards", "display": "WeWorkRemotely"}, "himalayas": {"group": "Search Boards", "display": "Himalayas"}, "remoteok": {"group": "Search Boards", "display": "RemoteOK"}, "jobicy": {"group": "Search Boards", "display": "Jobicy"}, "remote_co": {"group": "Search Boards", "display": "Remote.co"}, "justremote": {"group": "Search Boards", "display": "JustRemote"}, "workable": {"group": "Search Boards", "display": "Workable Jobs"}, "upwork": {"group": "Search Boards", "display": "Upwork"}, "freelancer": {"group": "Search Boards", "display": "Freelancer"}, "toptal": {"group": "Search Boards", "display": "Toptal"}, "gun_io": {"group": "Search Boards", "display": "Gun.io"}, "indeed_sponsored": {"group": "Search Boards", "display": "Indeed Sponsored"}, "shine": {"group": "Search Boards", "display": "Shine (India)"}, "freshersworld": {"group": "Search Boards", "display": "Freshersworld"}, "timesjobs": {"group": "Search Boards", "display": "TimesJobs"}, "monsterindia": {"group": "Search Boards", "display": "Monster India"}, "iimjobs": {"group": "Search Boards", "display": "IIMJobs"}, "hirist": {"group": "Search Boards", "display": "Hirist (Tech India)"}, "instahyre": {"group": "Search Boards", "display": "Instahyre"}, "cutshort": {"group": "Search Boards", "display": "Cutshort"}, "angellist": {"group": "Search Boards", "display": "AngelList"}, "startup_jobs": {"group": "Search Boards", "display": "Startup.Jobs"}, "ycombinator": {"group": "Search Boards", "display": "Y Combinator Jobs"}, "producthunt": {"group": "Search Boards", "display": "Product Hunt Jobs"}, "xing": {"group": "Search Boards", "display": "Xing (DACH)"}, "stepstone": {"group": "Search Boards", "display": "StepStone"}, "jobware": {"group": "Search Boards", "display": "Jobware"}, "monster_de": {"group": "Search Boards", "display": "Monster Germany"}, "jobboerse": {"group": "Search Boards", "display": "Jobboerse"}, "indeed_de": {"group": "Search Boards", "display": "Indeed Germany"}, "manatal": {"group": "Search Boards", "display": "Manatal"}, "jobleads": {"group": "Search Boards", "display": "JobLeads"}, "careerone": {"group": "Search Boards", "display": "CareerOne (AU)"}, "seek": {"group": "Search Boards", "display": "Seek (AU/NZ)"}, "indeed_au": {"group": "Search Boards", "display": "Indeed Australia"}, "jobstreet": {"group": "Search Boards", "display": "Jobstreet (SEA)"}, "jobsdb": {"group": "Search Boards", "display": "JobsDB (HK/TH)"}, "recruitnet": {"group": "Search Boards", "display": "RecruitNet"}, "jobrapido": {"group": "Search Boards", "display": "Jobrapido"}, "trovit": {"group": "Search Boards", "display": "Trovit"}, "neuvoo": {"group": "Search Boards", "display": "Neuvoo (Talent.com)"}, "talent_com": {"group": "Search Boards", "display": "Talent.com"}, "lensa": {"group": "Search Boards", "display": "Lensa"}, "appcast": {"group": "Search Boards", "display": "Appcast"}, "jobg8": {"group": "Search Boards", "display": "JobG8"}, "jobisjob": {"group": "Search Boards", "display": "JobIsJob"}, "jobsora": {"group": "Search Boards", "display": "Jobsora"}, "jobvertise": {"group": "Search Boards", "display": "Jobvertise"}, "postjobfree": {"group": "Search Boards", "display": "PostJobFree"}, "juju": {"group": "Search Boards", "display": "Juju"}, "beyond": {"group": "Search Boards", "display": "Beyond"}, "jobsinthemoney": {"group": "Search Boards", "display": "Jobs in the Money"}, "jobs2careers": {"group": "Search Boards", "display": "Jobs2Careers"}, "getwork": {"group": "Search Boards", "display": "GetWork"}, "whatjobs": {"group": "Search Boards", "display": "WhatJobs"}, "efinancialcareers":{"group": "Search Boards", "display": "eFinancialCareers"}, "cwjobs_tech": {"group": "Search Boards", "display": "CWJobs Tech"}, "github_jobs": {"group": "Search Boards", "display": "GitHub Jobs"}, "stackoverflow": {"group": "Search Boards", "display": "Stack Overflow Jobs"}, "techinasia": {"group": "Search Boards", "display": "Tech in Asia"}, "e27": {"group": "Search Boards", "display": "e27 (SEA Startups)"}, "foundit": {"group": "Search Boards", "display": "Foundit (ex-Monster India)"}, "apna": {"group": "Search Boards", "display": "Apna"}, "naukrigulf": {"group": "Search Boards", "display": "NaukriGulf"}, "gulftalent": {"group": "Search Boards", "display": "GulfTalent"}, "dubizzle": {"group": "Search Boards", "display": "Dubizzle Jobs"}, # ── ATS Platforms ────────────────────────────────────────────────────────── "greenhouse": {"group": "ATS Platforms", "display": "Greenhouse"}, "lever": {"group": "ATS Platforms", "display": "Lever"}, "ashby": {"group": "ATS Platforms", "display": "Ashby"}, "workday": {"group": "ATS Platforms", "display": "Workday"}, "smartrecruiters": {"group": "ATS Platforms", "display": "SmartRecruiters"}, "bamboohr": {"group": "ATS Platforms", "display": "BambooHR"}, "recruitee": {"group": "ATS Platforms", "display": "Recruitee"}, "teamtailor": {"group": "ATS Platforms", "display": "Teamtailor"}, "icims": {"group": "ATS Platforms", "display": "iCIMS"}, "taleo": {"group": "ATS Platforms", "display": "Oracle Taleo"}, "successfactors": {"group": "ATS Platforms", "display": "SAP SuccessFactors"}, "jobvite": {"group": "ATS Platforms", "display": "Jobvite"}, "paylocity": {"group": "ATS Platforms", "display": "Paylocity"}, "jazz": {"group": "ATS Platforms", "display": "JazzHR"}, "pinpoint": {"group": "ATS Platforms", "display": "Pinpoint"}, "dover": {"group": "ATS Platforms", "display": "Dover"}, "breezyhr": {"group": "ATS Platforms", "display": "Breezy HR"}, "comeet": {"group": "ATS Platforms", "display": "Comeet"}, "jobsoid": {"group": "ATS Platforms", "display": "Jobsoid"}, "fountain": {"group": "ATS Platforms", "display": "Fountain"}, "keka": {"group": "ATS Platforms", "display": "Keka (India)"}, "darwinbox": {"group": "ATS Platforms", "display": "Darwinbox (India)"}, "zoho_recruit": {"group": "ATS Platforms", "display": "Zoho Recruit"}, "freshteam": {"group": "ATS Platforms", "display": "Freshteam"}, "kronos": {"group": "ATS Platforms", "display": "Kronos/UKG"}, "paycor": {"group": "ATS Platforms", "display": "Paycor"}, "adp": {"group": "ATS Platforms", "display": "ADP Recruiting"}, "oracle_hcm": {"group": "ATS Platforms", "display": "Oracle HCM"}, "sap_jobs": {"group": "ATS Platforms", "display": "SAP Jobs"}, "ceridian": {"group": "ATS Platforms", "display": "Ceridian Dayforce"}, "cornerstone": {"group": "ATS Platforms", "display": "Cornerstone OnDemand"}, "lumesse": {"group": "ATS Platforms", "display": "Lumesse"}, "silkroad": {"group": "ATS Platforms", "display": "SilkRoad"}, "hirevue": {"group": "ATS Platforms", "display": "HireVue"}, "workable_ats": {"group": "ATS Platforms", "display": "Workable ATS"}, "personio": {"group": "ATS Platforms", "display": "Personio"}, "rexx": {"group": "ATS Platforms", "display": "Rexx Systems"}, # ── Company Pages ────────────────────────────────────────────────────────── "amazon": {"group": "Company Pages", "display": "Amazon"}, "apple": {"group": "Company Pages", "display": "Apple"}, "google_careers": {"group": "Company Pages", "display": "Google Careers"}, "microsoft": {"group": "Company Pages", "display": "Microsoft"}, "meta": {"group": "Company Pages", "display": "Meta"}, "netflix": {"group": "Company Pages", "display": "Netflix"}, "nvidia_careers": {"group": "Company Pages", "display": "NVIDIA Careers"}, "stripe": {"group": "Company Pages", "display": "Stripe"}, "openai": {"group": "Company Pages", "display": "OpenAI"}, "anthropic": {"group": "Company Pages", "display": "Anthropic"}, "deepmind": {"group": "Company Pages", "display": "DeepMind"}, "salesforce": {"group": "Company Pages", "display": "Salesforce"}, "shopify": {"group": "Company Pages", "display": "Shopify"}, "uber": {"group": "Company Pages", "display": "Uber"}, "airbnb": {"group": "Company Pages", "display": "Airbnb"}, "twitter": {"group": "Company Pages", "display": "X (Twitter)"}, "snap": {"group": "Company Pages", "display": "Snap"}, "lyft": {"group": "Company Pages", "display": "Lyft"}, "atlassian": {"group": "Company Pages", "display": "Atlassian"}, "confluent": {"group": "Company Pages", "display": "Confluent"}, "databricks": {"group": "Company Pages", "display": "Databricks"}, "snowflake": {"group": "Company Pages", "display": "Snowflake"}, "palantir": {"group": "Company Pages", "display": "Palantir"}, "twilio": {"group": "Company Pages", "display": "Twilio"}, "cloudflare": {"group": "Company Pages", "display": "Cloudflare"}, "hashicorp": {"group": "Company Pages", "display": "HashiCorp"}, "figma": {"group": "Company Pages", "display": "Figma"}, "notion": {"group": "Company Pages", "display": "Notion"}, "slack": {"group": "Company Pages", "display": "Slack/Salesforce"}, "flipkart": {"group": "Company Pages", "display": "Flipkart"}, "swiggy": {"group": "Company Pages", "display": "Swiggy"}, "zomato": {"group": "Company Pages", "display": "Zomato"}, "razorpay": {"group": "Company Pages", "display": "Razorpay"}, "paytm": {"group": "Company Pages", "display": "Paytm"}, "meesho": {"group": "Company Pages", "display": "Meesho"}, "zepto": {"group": "Company Pages", "display": "Zepto"}, "byju": {"group": "Company Pages", "display": "BYJU'S"}, "unacademy": {"group": "Company Pages", "display": "Unacademy"}, "phonepe": {"group": "Company Pages", "display": "PhonePe"}, # Direct-company ATS aggregator (Greenhouse/Lever/Ashby public JSON APIs). # Routed to src/scrapers/company_ats.py, NOT the ever-jobs sidecar. "company_ats": {"group": "Company Pages", "display": "Direct Company ATS (Greenhouse/Lever/Ashby)"}, } INDIA_DEFAULT_PLATFORMS: list[str] = [ "linkedin", "naukri", "indeed", "glassdoor", "company_ats", "google", "bdjobs", "internshala", "bayt", "iimjobs", "foundit", ] PLATFORM_GROUPS: dict[str, list[str]] = { group: [k for k, v in EVER_JOBS_PLATFORMS.items() if v["group"] == group] for group in ("Search Boards", "ATS Platforms", "Company Pages") } def get_platform_keys_for_group(group: PlatformGroup) -> list[str]: return PLATFORM_GROUPS.get(group, []) def get_display_name(key: str) -> str: return EVER_JOBS_PLATFORMS.get(key, {}).get("display", key) def validate_platform_keys(keys: list[str]) -> tuple[list[str], list[str]]: valid = [k for k in keys if k in EVER_JOBS_PLATFORMS] unknown = [k for k in keys if k not in EVER_JOBS_PLATFORMS] return valid, unknown