Company Domain → Career Page Job Finder
Pricing
from $1.80 / 1,000 job-results
Company Domain → Career Page Job Finder
Turn company domains into live job listings: discover career pages, detect the ATS (Greenhouse, Lever, Ashby, Workday, generic), and extract clean, CSV-ready jobs with hiring signals - no login or cookies.
Pricing
from $1.80 / 1,000 job-results
Rating
0.0
(0)
Developer
Delowar Munna
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share

Paste a list of company domains and get back their live job listings. The actor normalizes each domain, discovers its career page, detects the ATS (Greenhouse, Lever, Ashby, Workday, or a generic career page), and extracts public jobs into clean, flat, CSV-ready rows enriched with lightweight hiring-signal fields. Built for B2B lead-gen, sales teams, recruiters, staffing agencies, and market researchers.
No login, no cookies, no residential proxy, no expensive enrichment APIs. It uses free public ATS APIs and public pages over HTTP, so it stays fast and cost-predictable. You pay one flat event per unique job row that passes your filters.
✨ Why this scraper
- Start from a plain domain list — you don't need to already know each company's ATS URL. The actor discovers the career path and detects the platform for you.
- 5 sources — Greenhouse, Lever, and Ashby via their free public JSON APIs; Workday public career pages and a conservative generic fallback (best-effort).
- 35 flat fields — provenance, ATS detection, job identity, location/remote, classification, compensation, description, and hiring signals. No nested objects; drops straight into Sheets/Excel/CRMs.
- Pay-Per-Event — one flat
job-resultevent per saved unique job. Duplicates, filtered rows, and failed inputs are never charged. - Transparent hiring-signal score — rule-based (no AI), explained below.
🚀 Quick start — sample inputs
Example 1 — company domains
{"companyDomains": ["stripe.com", "notion.so", "canva.com"],"maxResults": 500,"maxJobsPerCompany": 200,"atsPlatforms": ["auto"],"keywords": ["data", "growth", "sales", "security"],"excludeKeywords": ["internship"],"locations": ["United States", "Australia", "Remote"],"remoteFilter": "any","includeDescription": true,"includeCompensation": true,"deduplicate": true,"proxyConfiguration": { "useApifyProxy": true }}
Example 2 — direct career / ATS board URLs + custom residential proxy via your own provider
{"careerPageUrls": ["https://boards.greenhouse.io/figma","https://jobs.lever.co/voiceflow","https://jobs.ashbyhq.com/notion"],"maxResults": 250,"atsPlatforms": ["greenhouse", "lever", "ashby"],"includeDescription": true,"includeCompensation": true,"proxyConfiguration": {"useApifyProxy": false,"proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]}}
Provide at least one of
companyDomainsorcareerPageUrls. If you provide both, the actor processes both and deduplicates across the whole run.
The actor blocks Apify Residential proxy; if you need residential routing, supply your own provider via
proxyConfiguration.proxyUrlsas shown. See 🚦 Proxy policy below.
📦 Output
The dataset has one view: Jobs & hiring signals — a 35-column flat table.

Output fields (35)
input_value, input_type, company_domain, company_name, career_page_url, ats_platform, ats_board_id, job_id, job_title, job_url, apply_url, location, locations_flat, country_hint, remote_type, department, job_family_hint, seniority_hint, employment_type, posted_at, updated_at, compensation_min, compensation_max, compensation_currency, compensation_period, description_text, description_html, requirements_text, benefits_text, visible_salary_text, hiring_signal_score, hiring_signal_label, reason_tags, source_url, scraped_at.
Sample record — Jobs & hiring signals
(Real run output; description_text / description_html truncated here for readability.)
{"input_value": "notion.so","input_type": "domain","company_domain": "notion.so","company_name": "Notion","career_page_url": "https://notion.so/careers","ats_platform": "ashby","ats_board_id": "notion","job_id": "e3944777-d4a8-41d2-88ab-32daef949d4e","job_title": "Application Security Engineer, AI Security","job_url": "https://jobs.ashbyhq.com/notion/e3944777-d4a8-41d2-88ab-32daef949d4e","apply_url": "https://jobs.ashbyhq.com/notion/e3944777-d4a8-41d2-88ab-32daef949d4e/application","location": "San Francisco, California","locations_flat": "San Francisco, California","country_hint": "California","remote_type": "remote","department": "Security","job_family_hint": "engineering","seniority_hint": "mid","employment_type": "Full-time","posted_at": "2026-02-20T23:06:58.549Z","updated_at": null,"compensation_min": 230000,"compensation_max": 280000,"compensation_currency": "USD","compensation_period": "year","description_text": "WHO WE ARE Notion is the collaborative AI workspace where teams and agents think together. We're building one place where your knowledge...","description_html": "<h1>Who We Are</h1><p>Notion is the collaborative AI workspace where teams and agents think together...</p>","requirements_text": null,"benefits_text": null,"visible_salary_text": "$230,000 - $280,000","hiring_signal_score": 75,"hiring_signal_label": "high","reason_tags": "remote_role|salary_visible|description_available|engineering_role|security_role|ai_ml_role","source_url": "https://api.ashbyhq.com/posting-api/job-board/notion?includeCompensation=true","scraped_at": "2026-06-04T06:05:47.117Z"}
🧭 How discovery works
- Normalize each domain to a canonical form (
https://www.Example.com/careers→example.com). - Discover the career page: scan the homepage for ATS markers and career links (
/careers,/jobs, "join us", …), then probe a couple of common career paths if needed. - Detect & extract the ATS:
- Greenhouse →
boards-api.greenhouse.ioJob Board API - Lever →
api.lever.co/v0Postings API - Ashby →
api.ashbyhq.com/posting-apiJob Posting API (with compensation when enabled) - Workday → public CXS jobs endpoint (best-effort, no login)
- Generic → conservative extraction of clearly-identifiable job links from a career page
- Greenhouse →
- Normalize every posting into the same flat 35-field row, filter, deduplicate, score, and save.
🎯 Hiring-signal score
Transparent rule-based score (0–100) computed from extracted fields — no AI, no external enrichment.
| Signal | Points |
|---|---|
| Base (every valid live job) | +20 |
| Remote or hybrid | +15 |
| Senior / lead / manager / director / executive | +15 |
| Compensation visible | +10 |
| Department / job family detected | +10 |
| Description present | +10 |
| Posted/updated within the last 45 days | +10 |
| Buying-intent / growth-team title term | +10 |
Score is capped at 100.
Labels: very_high (80–100) · high (60–79) · medium (40–59) · low (0–39).
reason_tags is a pipe-separated list explaining the score — e.g. remote_role, hybrid_role, senior_role, management_role, salary_visible, recent_posting, description_available, engineering_role, sales_role, data_role, growth_role, security_role, ai_ml_role.
💰 Pricing
Pay-Per-Event. One flat event per saved row (final per-event price is configured on the Apify console):
| Event | Charged when |
|---|---|
job-result | Once per unique job row that passed all filters and was successfully written to the dataset. |
So your bill is simply results_saved × price_per_event. The actor honors the user-configured per-run spending cap (Apify eventChargeLimitReached): it caps how many results it collects up-front to what the limit can pay for, and stops cleanly the moment the cap is reached.
Not charged:
- Duplicates (deduplicated by
ats_platform + job_id, canonicaljob_url, and domain/title keys). - Rows filtered out by keyword / location / remote / department / ATS filters.
- Rows missing a title, an identifier, or a company anchor.
- Failed inputs and company-level discovery failures.
🚦 Proxy policy
Use Apify Datacenter proxy or no proxy for normal runs — both work reliably for public ATS APIs and career pages at this actor's conservative concurrency.
Apify Residential proxy is not supported. The actor will fail at startup if proxyConfiguration.apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.
If you genuinely need residential routing, supply your own residential provider via the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:
http://user:pass@proxy.iproyal.com:12321http://user:pass@proxy.brightdata.com:22225http://user:pass@proxy.oxylabs.io:7777
📊 Run summary
After each run, a RUN_SUMMARY entry is written to the key-value store:
{"inputs_total": 3,"domains_total": 3,"career_page_urls_total": 0,"successful_inputs": 3,"failed_inputs": 0,"unsupported_inputs": 0,"career_pages_discovered": 2,"ats_pages_discovered": 3,"raw_results_found": 640,"results_saved": 420,"duplicates_removed": 37,"filtered_out": 183,"charged_events": 420,"blocked_requests": 1,"retry_count": 4,"runtime_seconds": 96,"scraped_at": "2026-06-02T00:00:00.000Z"}
charged_events equals the number of successfully saved unique rows.
⚙️ Filters
| Filter | Matches against | Effect |
|---|---|---|
keywords | title, description, department, job family | Keep only jobs matching ≥1 term. |
excludeKeywords | same fields | Exclude any match. Exclusion wins. |
locations | location, locations_flat | Keep only jobs matching ≥1 location term. |
remoteFilter | derived remote_type | any / remote / hybrid / onsite / unknown. |
departments | department, job_family_hint | Keep only jobs matching ≥1 department term. |
atsPlatforms | detected platform | Restrict detection/extraction when not auto. |
deduplicate | dedup keys | Drop duplicate jobs (recommended ON). |
Filters are applied before any dataset push or event charge.
🚧 Limitations (V1)
- Public data only: no login, cookies, or authenticated ATS APIs. If a company's jobs cannot be reached publicly, the input is marked unsupported and the run continues.
- Greenhouse / Lever / Ashby are extracted from robust public JSON APIs. Workday and generic career pages are best-effort: Workday uses the public CXS endpoint where visible (list fields only — no description), and the generic fallback extracts only individual job URLs (index/info/dashboard pages such as
/jobs/benefitsare skipped). It is not a deep website crawler. - Compensation is included when the ATS publishes it (e.g. Ashby orgs that display pay, Lever salary ranges) or when a salary range is stated in the job description; there is no currency conversion or cross-country normalization. Greenhouse exposes no structured pay field, so its compensation comes only from the description text when present.
updated_atis only provided by Greenhouse. The Ashby and Lever public APIs return no update timestamp, soupdated_atisnullfor those sources (we do not fabricate it from the publish date).- No recruiter/contact extraction, email enrichment, LinkedIn enrichment, or AI scoring.
maxResultscaps saved unique rows across the whole run;maxJobsPerCompanycaps per company.
❓ FAQ
Do I need an account or cookies? No. The actor uses only free public ATS APIs and public career pages.
Which ATS platforms are supported?
Greenhouse, Lever, Ashby (public JSON APIs), plus Workday and generic career pages (best-effort). Set atsPlatforms to restrict detection, or leave it as ["auto"].
Can I paste an ATS board URL directly?
Yes — put it in careerPageUrls (e.g. https://jobs.lever.co/acme). It is detected and extracted without re-discovering the domain.
Can I export to CSV?
Yes — every field is flat (no nested objects). Use Apify's CSV / Excel export, or call the dataset API with format=csv.
Will I get blocked? The actor uses conservative concurrency, realistic headers, session rotation, and retry/backoff. Default Apify Proxy is sufficient for typical runs.
🛠️ Technical notes
- Stack: Node.js 22 · Apify SDK 3 · Crawlee
CheerioCrawler· Cheerio. HTTP-first, no browser. - Endpoints: Greenhouse Job Board API, Lever Postings API, Ashby Job Posting API, Workday public CXS, generic page extraction.
- Concurrency:
min=1,max=5(conservative; tune after real runs). - Memory: 1 GB min · 2 GB default · 4 GB max.
- Proxy: Apify Proxy enabled by default; custom configs accepted; Apify Residential rejected at startup.