Job Posting Aggregator avatar

Job Posting Aggregator

Pricing

Pay per usage

Go to Apify Store
Job Posting Aggregator

Job Posting Aggregator

Scrape and normalize job postings from Indeed, LinkedIn, Greenhouse, and Lever.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Miguel Fernandez

Miguel Fernandez

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

7.1 days

Issues response

9 days ago

Last modified

Share

1|# Job Posting Aggregator 2| 3|Aggregate job postings from multiple job boards into one normalized dataset. Search by title, location, and recency — output is a clean, consistent JSON schema regardless of which source the job came from. 4| 5|## Changelog 6| 7|### v1.2 (2026-04-06) 8|- FIX: Country-specific proxy and domain support 9| - Proxy country now auto-detected from location (was hardcoded to US) 10| - Indeed uses country-specific domains (indeed.com.sg, indeed.co.uk, indeed.ca, indeed.com.au) 11| - Fixes issue where searching "Singapore" would return US results 12| - Supports: US, Singapore (SG), UK (GB), Canada (CA), Australia (AU) 13| 14|### v1.1 (2026-04-03) 15|- Updated selectors for 2025 DOM 16|- Improved bot-block detection and retry logic 17|- Added residential proxy support documentation 18| 19|--- 20| 21|## Supported Sources 22| 23|| Source | Coverage | Notes | 24||--------|----------|-------| 25|| Indeed | Largest job board — all industries, all experience levels | High success rate; occasional CAPTCHA with heavy use | 26|| LinkedIn Jobs | Professional network public listings | No login required; proxy recommended for high volume | 27|| Greenhouse | ATS used by 5,000+ tech companies | Scrapes the global Greenhouse job search | 28|| Lever | ATS used by fast-growing startups | Scraped via Google (site:jobs.lever.co) | 29| 30|--- 31| 32|## What You Get 33| 34|| Field | Description | 35||-------|-------------| 36|| title | Job title | 37|| company | Company name | 38|| location | City/state or "Remote" | 39|| salary | Salary range when listed (Indeed only) | 40|| seniority | Inferred level: intern, junior, mid, senior, manager, executive | 41|| url | Direct link to the job posting | 42|| postedDate | When posted (format varies by source) | 43|| snippet | Short description excerpt (when available) | 44|| department | Department (Greenhouse only) | 45|| source | Which job board (indeed, linkedin, greenhouse, lever) | 46|| searchTerm | The search term that found this job | 47|| searchLocation | The location filter used | 48|| scrapedAt | ISO 8601 timestamp | 49| 50|--- 51| 52|## Input 53| 54|| Field | Type | Required | Description | Default | 55||-------|------|----------|-------------|---------| 56|| searchTerms | Array of strings | Yes | Job titles or keywords to search | — | 57|| locations | Array of strings | No | Locations to search ("Remote", "Austin, TX", etc.) | ["Remote"] | 58|| sources | Array of strings | No | Which boards: indeed, linkedin, greenhouse, lever | ["indeed"] | 59|| maxResultsPerSource | Integer | No | Max results per source per search (1–200) | 50 | 60|| postedWithinDays | Integer | No | Only show jobs posted within N days (1–30) | 7 | 61|| useResidentialProxy | Boolean | No | Route requests through residential proxies (country auto-detected from location) — improves success rate, especially for LinkedIn | false | 62| 63|### Example Input 64| 65|

json 66|{ 67| "searchTerms": ["software engineer", "product manager", "data scientist"], 68| "locations": ["San Francisco, CA", "Austin, TX", "Remote"], 69| "sources": ["indeed", "linkedin"], 70| "maxResultsPerSource": 50, 71| "postedWithinDays": 7, 72| "useResidentialProxy": true 73|} 74|
75| 76|--- 77| 78|## Example Output 79| 80|
json 81|{ 82| "title": "Senior Software Engineer", 83| "company": "Acme Corp", 84| "location": "Austin, TX", 85| "salary": "$140,000 - $180,000 a year", 86| "seniority": "senior", 87| "url": "https://www.indeed.com/viewjob?jk=abc123", 88| "postedDate": "2 days ago", 89| "snippet": "We're looking for a Senior Software Engineer to join our platform team...", 90| "source": "indeed", 91| "searchTerm": "software engineer", 92| "searchLocation": "Austin, TX", 93| "scrapedAt": "2026-04-03T14:30:00.000Z" 94|} 95|
96| 97|--- 98| 99|## Use Cases 100| 101|- Recruiting — Aggregate listings from all major boards into one spreadsheet or database 102|- Market research — Analyze hiring trends by role, location, company size, or seniority 103|- Sales intelligence — Track which companies are actively hiring (strong buying signal for SaaS and B2B) 104|- Competitor analysis — Monitor competitor hiring patterns to understand their growth strategy 105|- Salary benchmarking — Collect salary data across roles and locations (availability varies by listing) 106|- Job alert automation — Run on a schedule, filter by new results, and pipe to Slack or email 107| 108|--- 109| 110|## How It Works 111| 112|1. Builds search URLs for each combination of searchTerm × location × source 113|2. Loads each page through a headless Chromium browser 114|3. Detects bot-block pages (CAPTCHA, login walls) and retries with backoff before giving up 115|4. Extracts job cards using source-specific selectors with multiple fallbacks 116|5. Normalizes all fields into a consistent output schema 117|6. Infers seniority from the job title using keyword matching 118|7. Pushes each result to the dataset as it's found (streaming output) 119| 120|--- 121| 122|## Reliability & Proxy Notes 123| 124|Job boards actively detect and block scrapers. Here's what to expect: 125| 126|| Source | Without Proxy | With Residential Proxy | 127||--------|--------------|------------------------| 128|| Indeed | Good | Excellent | 129|| LinkedIn | Fair (login walls common) | Good | 130|| Greenhouse | Excellent (no anti-bot) | N/A | 131|| Lever (via Google) | Fair | Good | 132| 133|Recommendation: Enable useResidentialProxy: true when scraping LinkedIn or running large volumes. The actor uses Apify's built-in residential proxy pool with country auto-detection from your location parameter (supports US, SG, GB, CA, AU). 134| 135|--- 136| 137|## Seniority Inference 138| 139|The seniority field is inferred from the job title using keyword matching — it is not sourced from the job board directly. 140| 141|| Level | Keywords matched | 142||-------|-----------------| 143|| intern | intern, internship | 144|| junior | junior, jr., entry level, entry-level, associate | 145|| senior | senior, sr., staff, principal, lead | 146|| manager | manager, mgr | 147|| executive | director, vp, vice president, head of, chief | 148|| mid | (default — none of the above matched) | 149| 150|--- 151| 152|## Pricing 153| 154|Pay-per-result on the Apify platform. Typical cost: $2–5 per 100 job postings. 155| 156|Enabling residential proxy adds proxy bandwidth cost (billed separately by Apify). 157| 158|--- 159| 160|## Limitations 161| 162|- LinkedIn: Public-only listings. LinkedIn has strong anti-scraping measures — residential proxy recommended for reliable results. 163|- Greenhouse: The global search at boards.greenhouse.io/search covers all companies using the Greenhouse ATS. Individual company boards (e.g. boards.greenhouse.io/stripe) are not supported via the greenhouse source — use the company's direct URL if needed. 164|- Lever: No central Lever job listing exists. Jobs are discovered via Google search (site:jobs.lever.co). Google's SERP structure changes periodically. 165|- Salary data: Only Indeed reliably includes salary. LinkedIn, Greenhouse, and Lever typically don't. 166|- Deduplication: Jobs are not deduplicated across sources — the same role may appear from Indeed and LinkedIn. 167|