Indeed & ZipRecruiter Scraper — Jobs, Hiring Signals, Profiles avatar

Indeed & ZipRecruiter Scraper — Jobs, Hiring Signals, Profiles

Pricing

from $5.00 / 1,000 result (company or job record)s

Go to Apify Store
Indeed & ZipRecruiter Scraper — Jobs, Hiring Signals, Profiles

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

Pika Choo

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

ModeYou provideYou 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
KeywordsUp to 10 search termsFresh job postings matching each keyword across both boards, with salary, location, remote flag and exact posting timestamps
ProfilesA list of company namesCompany 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_at timestamps 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

FieldTypeDefaultNotes
scanModecompanies | keywords | profilescompaniesSee modes above.
companiesarrayCompany names; add the website for precise matching: "Kelly Services | kellyservices.com".
keywordsarraySearch terms (keyword mode, max 10). Indeed operators supported: "exact phrase", -exclude, (a OR b).
locationstringUnited StatesSearch location (ZipRecruiter covers US & Canada).
recencyModelast48h | latest10last48hJobs in the recency window, or the 10 most recent regardless of age.
hoursOldinteger48Recency window in hours.
maxJobsPerCompanyinteger50Per company/keyword per site cap.
sitesarraybothindeed, zip_recruiter.
includeDescriptionbooleanfalseAttach full job descriptions.
emitJobRecordsbooleantrueAlso push each job as its own flat row for clean CSV export.
proxyConfigurationobjectResidentialResidential 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_recruiter is the company's real total from its ZipRecruiter page.

Output reference

Company record (record_type: "company", modes: companies / profiles)

FieldWhat it tells you
has_active_postingsThe core hiring signal — is this company hiring right now?
active_jobs_by_siteEmployer-verified posting counts per board this run
active_jobs_total_by_site.zip_recruiterThe company's real total open ZipRecruiter postings — hiring volume at a glance
posted_last_48h_countHow many postings fall inside your recency window
profile.*Industry, employee count, revenue, description, logo, HQ, founding year, employee rating, website, socials
latest_jobsThe returned jobs, nested (also emitted as flat rows)

Job record (record_type: "job", all modes)

FieldWhat it tells you
title, company, locationThe posting basics
date_posted / posted_atOriginal posting date, plus the exact UTC timestamp where the board exposes one
reposted_atPresent when the employer bumped/refreshed an older ad — a re-engagement signal, never disguised as a new posting
salary_min/max/interval/currencyStructured pay data (direct or parsed)
job_urlDirect employer application link when available, board link otherwise
siteWhich 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_count goes 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.