J

Jobs Tracker

live
Current time (ET)
--:--:-- --
--
Since last scrape
--
--
Next scrape in
--
daily at 2:15 AM ET
Tickers
--
Total Open
--
Portfolio
Company Detail
Hiring vs Opex
Compensation
Skills
Lifecycle
Data Quality
Technical details
⬇ Download 7-day research data (JSON)
Self-contained equity-research bundle • 35 companies • LLM-ready • ~800 KB
Net change · by department
by P&L bucket · novel terms
top new postings + descriptions
Accelerating
--
tickers hiring faster (7d vs prior 7d)
Decelerating
--
tickers hiring slower (7d vs prior 7d)
Tier A / B / C
--
signal-quality tiers
Tracking since
--
--
Portfolio
--
Range
Metric
Filled = postings that disappeared from the listing and stayed gone past the grace window.
Hiring mix vs. filed SEC opex
Compares each company's hiring mix (% of open reqs per P&L bucket) to filed opex mix from the latest 10-Q. R&D ratio > 1.25 indicates engineering hiring outpaces filed R&D spend — a leading indicator of tech-pivot.
ratio > 1.25 = over-hiring R&D · 0.75–1.25 = aligned · ratio < 0.75 = under-hiring R&D
TickerSectorPeriod Revenuen reqs Hiring R&DFiled R&DR&D ratio Hiring S&MFiled S&M Hiring COGSFiled COGS Signal
Sector economics
Estimated total opex extrapolated from disclosed salaries across all open reqs.
SectorOpen reqsTickers CoverageAvg salaryEst. payroll % of universe
Count vs dollar-weighted R&D mix
Positive Δ = company hires fewer engineers than headcount share implies, but they're expensive (senior-heavy). Negative Δ = lots of engineers by count, but real dollars go to non-R&D functions.
TickerSectorn R&D countR&D $Δpp Interpretation
AI/ML hiring intensity by company
Share of JDs mentioning LLM / GenAI / PyTorch / HuggingFace / foundation models / transformers. Tickers with under 20 reqs excluded.
TickerSector AI reqsTotalShare
Skill cluster intensity by sector
Share of sector's postings mentioning skills in each cluster.
SectorTotal reqs AI/ML %GPU %Cloud %
Lifecycle data
Per-ticker lifecycle stats: days-to-close, closure rate, and posted-age medians. All computed from accumulated daily runs. Values firm up after ~10 days of history.
Ticker Open today Tracked ever Closed (lifetime) Avg days open Closure rate
Field coverage per ticker
Color code: green ≥80% · amber 40–79% · red <40%
Tickern DescSalaryEmp PostedDept SkillsYrs

Technical reference & replication guide

How this dashboard is built: every job-board URL, the deduplication logic, the anti-bot tooling, every bug fixed and what to watch for. Snapshot 2026-06-02 — 35 tickers, 62 distinct (ticker, ats, board) leaves, ~39,000 open reqs/day.

Part 1 — Per-ticker board inventory

1.1 Greenhouse-hosted boards (24)

Public, unauthenticated. Listing JSON at https://boards-api.greenhouse.io/v1/boards/<slug>/jobs; per-job detail at …/jobs/<job_id>.

TickerSubsidiarySlugListing URL
ABNBAirbnbairbnb…/boards/airbnb/jobs
APPAppLovinapplovin…/boards/applovin/jobs
CARTInstacart (Maplebear)instacart…/boards/instacart/jobs
COMPCompassurbancompass…/boards/urbancompass/jobs
CVNACarvanacarvana…/boards/carvana/jobs
CVNACarvana → ADESAadesa…/boards/adesa/jobs
DASHDoorDashdoordashusa…/boards/doordashusa/jobs
DASHDoorDash → Bbot (2022)bbot…/boards/bbot/jobs
EXPEExpedia → Trivago (60%)trivago…/boards/trivago/jobs
GOOGLAlphabet → Calico Labscalicolabs…/boards/calicolabs/jobs
LIFEEthos Technologiesethoslife…/boards/ethoslife/jobs
LYFTLyftlyft…/boards/lyft/jobs
PINSPinterestpinterest…/boards/pinterest/jobs
PTONPelotonpeloton…/boards/peloton/jobs
RBLXRobloxroblox…/boards/roblox/jobs
RDDTRedditreddit…/boards/reddit/jobs
ROKURokuroku…/boards/roku/jobs
TTWOTake-Two (corp)taketwo…/boards/taketwo/jobs
TTWORockstar Gamesrockstargames…/boards/rockstargames/jobs
TTWO2K Games2k…/boards/2k/jobs
TTWOZyngazyngacareers…/boards/zyngacareers/jobs
TTWOGearbox (acq Apr 2024)gearbox…/boards/gearbox/jobs
UUnityunity3d…/boards/unity3d/jobs
UBERUber → Careem (2020)careem…/boards/careem/jobs
BKNGBooking → Agodaagoda…/boards/agoda/jobs
BKNGBooking → OpenTable (2014)opentable…/boards/opentable/jobs

1.2 Workday-hosted (5)

POST to https://<tenant>.<subdomain>.myworkdayjobs.com/wday/cxs/<tenant>/<site>/jobs with body {"appliedFacets":{}, "limit":20, "offset":0, "searchText":""}. The subdomain (wd1/wd3/wd5/wd108) is the Workday cluster. Pagination caps at 10000.

TickerTenantSubSiteFull POST URL
ETSYetsywd5Etsy_Careershttps://etsy.wd5.myworkdayjobs.com/wday/cxs/etsy/Etsy_Careers/jobs
SNAPsnapchatwd1snaphttps://snapchat.wd1.myworkdayjobs.com/wday/cxs/snapchat/snap/jobs
EXPEexpediawd108searchhttps://expedia.wd108.myworkdayjobs.com/wday/cxs/expedia/search/jobs
Zzillowwd5Zillow_Group_Externalhttps://zillow.wd5.myworkdayjobs.com/wday/cxs/zillow/Zillow_Group_External/jobs
GOOGL→Verilyverilywd1Verily_Careershttps://verily.wd1.myworkdayjobs.com/wday/cxs/verily/Verily_Careers/jobs

EXPE's Workday is the single consolidated portal for the entire Expedia Group (Hotels.com, Vrbo, Travelocity, Hotwire, Orbitz, Ebookers, CheapTickets, CarRentals, Wotif, Expedia Cruises). No per-brand careers subdomain exists.

1.3 Lever-hosted (3)

Public API https://api.lever.co/v0/postings/<company>?mode=json — returns descriptionPlain (clean text), description (HTML), createdAt (Unix ms), categories.{team, commitment, location}.

TickerCompany slugFull URL
BMBLbumbleinc…/v0/postings/bumbleinc
MTCHmatchgroup…/v0/postings/matchgroup
WMGwmg…/v0/postings/wmg

BMBL migrated off Workday ~early 2026. bumble.wd3.myworkdayjobs.com now 302s to the Workday Community maintenance page.

1.4 Ashby-hosted (1)

GraphQL: https://jobs.ashbyhq.com/api/non-user-graphql?op=ApiJobBoardWithTeams, body {"operationName":"ApiJobBoardWithTeams","variables":{"organizationHostedJobsPageName":"kayak"}}.

TickerOrgHuman listing
BKNG→KAYAKkayakjobs.ashbyhq.com/kayak

1.5 Rippling-hosted (1, post-migration)

OPEN migrated Greenhouse → Rippling on 2026-05-18. Old Greenhouse board now 404s. Clean public API:

TickerSlugListing API
OPENopendoorapi.rippling.com/platform/api/ats/v1/board/opendoor/jobs

1.6 Phenom-hosted (2)

Phenom is a third-party career-site platform. Its paginated API caps at ~500 with shuffle-induced duplicates — the bypass is the SEO sitemap (see §4.6). Each detail page embeds JSON-LD JobPosting.

TickerListing UISitemap
EBAYjobs.ebayinc.com/us/en/search-resultssitemap.xml → sitemap1 (500) + sitemap2 (77) = 576
CHWYcareers.chewy.com/us/en/search-results(pagination; sitemap not yet enabled)

1.7 Custom / first-party scrapers

AMZN — Amazon corp (amazon_jobs) — 4 passes, 8+ board values

AMZN — Whole Foods / One Medical (subsidiaries)

BKNG — Booking / Priceline

DASH — Deliveroo / Wolt

GOOGL — Google Careers / Waymo

META — Meta Careers (most expensive scraper)

Other single-board custom scrapers

Part 2 — Tools used

ToolPurposeCost
httpxDefault HTTP client for most scrapersFree
curl_cffi (chrome120)Spoof Chrome TLS fingerprint when CDNs reject Python TLS (Waymo, Deliveroo)Free
Bright Data Web UnlockerAnti-bot static pages (Deliveroo CF sitemap, EBAY sitemap discovery)$0.0015/req
Bright Data Scraping BrowserPerimeterX/Akamai — real Chrome session (Wayfair only)$0.008/req
Oxylabs ResidentialPer-page proxy fallback for rate-limited APIs (Phenom, Google layer-2/3)$7/GB
brotliRequired for Meta GraphQL (refuses without Accept-Encoding: br)Free
PlaywrightOriginally GOOGL/META; now only W. Connects to BD Scraping Browser over CDP.Free

Typical nightly cost: <$0.10 Bright Data + ~$5/mo Oxylabs. Worst case if multiple CDNs degrade: ~$2.50/night (capped by BD_MAX_CALLS_PER_RUN=1500).

Part 3 — Deduplication

Layer 1 — per-scrape in-memory (storage._dedup)

Key is (ticker, req_id); first occurrence wins. Collapses the same req appearing under multiple board values (Amazon category shards, TTWO sibling boards, Rippling cross-listed UUIDs).

def _dedup(postings):
    seen = set(); out = []
    for p in postings:
        key = (p.ticker, p.req_id)
        if key in seen: continue
        seen.add(key); out.append(p)
    return out

Layer 2 — per-day in-DB write scope (storage.record_run)

DELETE is scoped to (run_date, ticker, ats, board IN <boards-in-result>) — so multiple yaml entries sharing (ticker, ats) but different boards (CVNA carvana+adesa, BKNG agoda+opentable, AMZN's 8 boards) don't wipe each other.

Critical fix (2026-05-26): the old code wiped on ANY empty result. With the 5-pass retry pipeline, a partial pass-1 (EBAY 436/569) followed by a failed pass-2 (0 rows + errors) wiped pass-1's data. This had silently zeroed AMZN amazon_jobs (22,444 → 0), EBAY, WBTN, and GOOGL. Now: empty+errors → preserve prior data; empty+no-errors → legitimate-zero DELETE.

Layer 3 — virtual leaves (computed, NOT re-scraped)

AMZN's "AWS only" and "Fulfillment only" pills are post-hoc department filters on the same Amazon rows — NOT separate scrapes:

Each virtual leaf carries virtual:True so the "All" total excludes them — else AMZN would double-count by ~11,600. (This was the 37,825-vs-26,163 bug.)

Anomaly-check scope

Keyed by yaml disambiguator (board/tenant/company/org), not (ticker, ats) — avoids false "95% drop" when one of CVNA's two greenhouse boards reports its smaller count alone. Also now consults the runs table + re-runs after extended retries so transient Workday flake (ETSY/SNAP/UMG/Z) doesn't false-alarm.

Part 4 — Errors fixed (root causes)

4.1 GOOGL — JSON-unescape corruption

Descriptions stored with literal

Select company
Choose a ticker to see its full daily posting history, P&L mix, top departments & skills, and searchable postings table.