Indeed & ZipRecruiter Scraper — Jobs, Hiring Signals, Profiles
Pricing
from $5.00 / 1,000 result (company or job record)s
Indeed & ZipRecruiter Scraper — Jobs, Hiring Signals, Profiles
Scrape Indeed and ZipRecruiter in one run: company hiring signals with live job totals, fresh job postings by company or keyword with exact timestamps and salaries, and company profile enrichment. CSV-ready output for recruiting outreach, lead scoring, and market research. X402, MPP, MCP
Pricing
from $5.00 / 1,000 result (company or job record)s
Rating
0.0
(0)
Developer
Pika Choo
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Indeed & ZipRecruiter Scraper — Hiring Signals, Job Search & Company Profiles
Scrape Indeed and ZipRecruiter in one run. Track which companies are hiring, pull fresh job postings by company or keyword, and enrich company profiles — built for recruiting outreach, sales lead scoring, talent-market research, and marketing automation pipelines.
Three scan modes in one actor
| Mode | You provide | You get |
|---|---|---|
| Companies (default) | A list of company names (optionally with websites) | Hiring signal per company (active-posting counts per board + ZipRecruiter live job total), full company profile, and the latest jobs — posted in the last N hours or the latest 10 |
| Keywords | Up to 10 search terms | Fresh job postings matching each keyword across both boards, with salary, location, remote flag and exact posting timestamps |
| Profiles | A list of company names | Company profiles only — industry, size, revenue, HQ, founding year, rating, live job count — fast and lightweight |
Why this scraper
- ✅ Two job boards, one dataset — Indeed and ZipRecruiter results merged, deduplicated, and labeled per source
- ✅ Real posting timestamps — ZipRecruiter jobs carry exact hour-precise
posted_attimestamps taken from the page itself; repost/refresh bumps are detected and reported separately (reposted_at), so a "fresh" job is genuinely fresh - ✅ True 24h / 48h recency filtering — done by timestamp, more accurate than the boards' own date filters
- ✅ Employer-verified matching — jobs are matched to the target company by website domain plus normalized name, so common names ("Kelly", "Volt") don't pull in unrelated employers
- ✅ Live job totals — the company's real ZipRecruiter posting count, not a page-limited sample: a direct hiring-volume signal
- ✅ Company profiles from both boards — industry, employee count, revenue, description, logo, HQ, founding year, employee rating, socials, website
- ✅ CSV-ready output — every job also lands as a flat one-row-per-job record, so exports open clean in Excel / Google Sheets
- ✅ Resilient by design — automatic retries, browser crash recovery, IP rotation, and per-site timeouts; partial results are saved incrementally
Output
One company record per target (mode: companies/profiles):
{"record_type": "company","company_query": "Paychex","has_active_postings": true,"active_jobs_by_site": { "indeed": 17, "zip_recruiter": 21 },"active_jobs_total_by_site": { "zip_recruiter": 593 },"posted_last_48h_count": 17,"profile": {"company_industry": "Human Resources","company_num_employees": "10,000+","company_revenue": "$1B to $5B (USD)","zr_total_jobs": 593,"zr_rating": 7.27,"zr_headquarters": "Rochester, NY, US","zr_year_founded": "1971"},"latest_jobs": [ { "title": "…", "posted_at": "2026-07-07T06:55:00Z", "job_url": "…" } ]}
Plus flat job records (all modes) with title, company, location, posting date and exact timestamp, salary range, job type, remote flag, and direct application URL — and per-keyword summary records in keyword mode.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
scanMode | companies | keywords | profiles | companies | See modes above. |
companies | array | — | Company names; add the website for precise matching: "Kelly Services | kellyservices.com". |
keywords | array | — | Search terms (keyword mode, max 10). Indeed operators supported: "exact phrase", -exclude, (a OR b). |
location | string | United States | Search location (ZipRecruiter covers US & Canada). |
recencyMode | last48h | latest10 | last48h | Jobs in the recency window, or the 10 most recent regardless of age. |
hoursOld | integer | 48 | Recency window in hours. |
maxJobsPerCompany | integer | 50 | Per company/keyword per site cap. |
sites | array | both | indeed, zip_recruiter. |
includeDescription | boolean | false | Attach full job descriptions. |
emitJobRecords | boolean | true | Also push each job as its own flat row for clean CSV export. |
proxyConfiguration | object | Residential | Residential proxy strongly recommended. |
Data freshness notes
- ZipRecruiter rows are filtered by their exact posting timestamp (hour-precise). Indeed reports dates, so its rows are day-precise.
- ZipRecruiter ingests new postings in daily batches, so its freshest jobs are typically 12–48 hours old — for guaranteed two-board coverage use a 48-hour window; a 24-hour window is primarily driven by Indeed.
- Job counts per run are bounded by
maxJobsPerCompany;active_jobs_total_by_site.zip_recruiteris the company's real total from its ZipRecruiter page.
Output reference
Company record (record_type: "company", modes: companies / profiles)
| Field | What it tells you |
|---|---|
has_active_postings | The core hiring signal — is this company hiring right now? |
active_jobs_by_site | Employer-verified posting counts per board this run |
active_jobs_total_by_site.zip_recruiter | The company's real total open ZipRecruiter postings — hiring volume at a glance |
posted_last_48h_count | How many postings fall inside your recency window |
profile.* | Industry, employee count, revenue, description, logo, HQ, founding year, employee rating, website, socials |
latest_jobs | The returned jobs, nested (also emitted as flat rows) |
Job record (record_type: "job", all modes)
| Field | What it tells you |
|---|---|
title, company, location | The posting basics |
date_posted / posted_at | Original posting date, plus the exact UTC timestamp where the board exposes one |
reposted_at | Present when the employer bumped/refreshed an older ad — a re-engagement signal, never disguised as a new posting |
salary_min/max/interval/currency | Structured pay data (direct or parsed) |
job_url | Direct employer application link when available, board link otherwise |
site | Which board the row came from |
Keyword summary (record_type: "keyword", keyword mode): totals per term
and per board plus how many matches fell inside the window.
What teams build with it
- Recruiting & staffing outreach — run your target-account list daily;
when
posted_last_48h_countgoes positive, that account enters your campaign with the actual job titles and salaries in the first line - Candidate-matching pipelines — feed the flat job rows (title, salary, location, remote flag, timestamps) straight into an AI matching engine and email the shortlist while the posting is hours old
- Sales lead scoring — hiring velocity is one of the strongest buying signals; score accounts by live job totals and fresh-posting counts
- Talent-market & compensation research — keyword mode across regions gives posting volume and salary ranges per role, per board
- CRM enrichment — profiles mode fills industry, size, revenue, HQ, founding year and rating for thousands of records without touching the job feed
Scheduling & integration
Runs on Apify like any actor: trigger on a schedule (e.g. every morning after job boards refresh), call it via the REST API from your own stack, or wire webhooks/integrations (Make, Zapier, Google Sheets) to push each run's dataset into your pipeline. Results export as JSON, CSV, or Excel directly from the dataset — the flat job rows are designed to open clean in a spreadsheet with zero rework.
FAQ
How accurate is the company matching? Jobs are matched by the employer's
website domain first (when you supply Name | website), with a normalized-name
fallback. Generic names ("Kelly", "Volt") won't pull in unrelated employers.
Why do the two boards show different freshness? Indeed timestamps postings same-day; ZipRecruiter ingests in daily batches, so its newest postings are typically 12–48h old. A 48-hour window gives full two-board coverage.
What's a repost and why does it matter? Boards let employers "bump" old
ads to the top. This actor reports the original posting date (what the job
page itself shows) and surfaces the bump separately as reposted_at — so your
"posted in the last 24 hours" list contains only genuinely new jobs.
Can I search jobs without a company list? Yes — scanMode: "keywords"
searches both boards by term, with the same recency filtering and flat output.
What locations are covered? Indeed supports country selection via
countryIndeed; ZipRecruiter covers the US and Canada.