All notable changes to this project will be documented in this file.
- Optional WTTJ companies (
companyUrls) — paste a slug (enky) or the company profile URL. The Actor loads the public profile, stats, and team page itself. When the list is not empty, sector / job / location filters are ignored
- Dataset fields from the public profile:
average_age, parity_women, parity_men, published_revenue, featured_people (name / title / bio). Team pages are discovered from the slug — no /team-3 input.
- Console input: URL list first, then discovery filters. Classic-board-only filters (contract, salary, recency) are labelled as such
- International jobs board in company discovery — employers that only post there (Alan, Qonto-style) now appear in the same run as classic WTTJ listings (Enky, Doctolib FR)
- Dataset field
discovery_source: wttj, intel, or wttj+intel
- Cap splits results between the two boards so a
maxCompanies of 10 is not filled only by the classic index
- Same PPE. Extra board adds no extra event.
- Funding, investors, and named founders on the same company row when WTTJ publishes them (total raised, last round, founder
/in/ URLs)
- Hiring mix — total live jobs, jobs by function (sales vs tech vs marketing…), and
hiring_focus. Team names/size when published; named team members are not on the public profile
- Free founder / CEO LinkedIn fills
contact_* when present — paid person search only runs if you ask for another role
- Dataset fields:
total_funding_usd, last_round, last_round_amount_usd, last_round_year, investors, founders, percentage_female, employee_growth_pct, glassdoor_rating, jobs_count_live, hiring_by_function, hiring_focus, teams
- Same PPE grid. Funding and founder profiles add no extra event.
- Filters: country (FR, GB, US…), city, remote (full / hybrid / occasional), yearly salary floor
- On every company row: salary band, remote policies, all matching cities, employer labels, equality index, benefits, newest matching role date
- Same pay-per-event grid. Location / remote / salary filters add no extra PPE.
- Prefer a readable LinkedIn company slug (
/company/payfit) only when it matches the WTTJ slug — never swap the WTTJ company id for a regional page (payfit-uk)
- Public
/in/ URLs from the profile or company site (/about, /team) as a free person LinkedIn; paid search no longer wipes them on a miss
- Extra socials from the WTTJ profile (
twitter_url) plus linkedin_source and people_linkedin_urls
- Dataset Outreach view (LinkedIn first)
- Lemlist: skip rows with no LinkedIn; send
companyUrl when the website is known
- EN + FR company-profile payloads in parallel; org website lookup in parallel
- Console copy: company LinkedIn is included by default; paid hop is named-person only
- Store title: Companies Hiring by Sector (drops jargon “Hiring Signals”; LinkedIn is company page, not a LinkedIn scraper)
- PPE:
contact-enrichment billed only when a named /in/ is found; lemlist-push registered on the Store
- WTTJ company LinkedIn over HTTPS —
GET api.welcometothejungle.com/api/v1/pages?path=/en/companies/{slug} (the JSON the SPA uses). No AWS WAF, no Playwright. WTTJ chrome wttj-en / wttj-fr links are ignored. Company website remains a fallback when the profile has no networks.linkedin.
- Dropped the Chromium hop (WAF on the HTML page). Default memory back to 256 MB.
- Cross-run deduplication —
deduplicateAcrossRuns input persists seen company slugs in a named Apify Key-Value Store (wttj-seen-slugs); maxCompanies cap is applied after filtering already-seen companies so the cap always targets new ones only
- Reset option —
resetDeduplication clears the cache for a fresh start
- Icebreaker language support (FR/EN) with
icebreakerLanguage input
- Retry x1 on Lemlist API calls (transient errors / 5xx) with 1.5s backoff
lemlist_lead_id field in dataset output
- Native Lemlist integration — push leads directly into a campaign with
lemlistApiKey + lemlistCampaignId input fields; PPE event lemlist-push at $0.005/lead
- Icebreaker language —
icebreakerLanguage input (en/fr) generates a localised pre-filled message with open role titles and city; fully tested
- Retry on Lemlist calls — single retry on transient errors (network timeout, 5xx) with 1.5s backoff; 409 duplicate handled gracefully
lemlist_lead_id field in dataset output — lea_xxx if pushed, duplicate if already in campaign
- 6 contact roles: CEO, Founder, CTO, CMO, VP Sales, HR
founding_year and company_summary fields extracted from Algolia
- Dynamic Algolia credential fetching from
/api/env with static fallback
- 49 unit tests (filter building, company parsing, contact enrichment, Lemlist push)
- PPE pricing updated:
wttj-company $0.003, contact-enrichment $0.05, lemlist-push $0.005
- Lemlist push works with or without contact enrichment (company-only lead supported)
- Input schema cleaned up — Lemlist fields in dedicated section, enrichment section independent
- Initial release
- Sector, profession category, contract type, and date range filters — all via Console dropdowns
- Deduplication by company slug across paginated results
- Optional CEO / Founder / HR LinkedIn enrichment via autom.dev + GPT-4o-mini
- Pay-per-event pricing: $0.003 per exported company, $0.05 per contact enrichment
- RUN_LOG key-value store export
- Local CSV export for development