Indeed Job Scraper
Pricing
$19.99/month + usage
Indeed Job Scraper
🔎 Indeed Job Scraper collects structured job data from Indeed — titles, companies, locations, salaries, descriptions, dates & links. ⚙️ Ideal for recruiters, HR & analysts to automate sourcing, track hiring trends, and fuel ATS/BI pipelines at scale. 🚀
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
ScrapePilot
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Indeed Job Scraper
The Indeed Job Scraper is an Apify actor that collects structured job listings from public Indeed search and list pages — fast, reliable, and ready for analysis. It solves the repetitive, error-prone task of copy-pasting job data by automating pagination, filtering, and normalization into clean datasets. Built for recruiters, HR teams, analysts, developers, and researchers, this Indeed web scraper helps you scrape Indeed jobs at scale and export them for ATS, BI, or data science workflows — a practical Indeed jobs API alternative for automation-first teams.
What data / output can you get?
Below are real output fields as they appear in the dataset. Each row is one job with flat top-level fields for easy table views, plus structured nested objects.
| Data type | Description | Example value |
|---|---|---|
| jobId | Unique Indeed job key | “123abc456def” |
| title | Job title as shown | “Sales Associate” |
| normalizedTitle | Standardized/normalized title | “Sales Associate” |
| companyName | Employer name | “Acme Corp” |
| locationShort | Short location string | “New York, NY” |
| postedText | Relative time posted | “3 days ago” |
| salaryText | Salary text if detected | “$22 an hour” |
| jobUrl | Direct viewjob URL | “https://www.indeed.com/viewjob?jk=123abc456def” |
| job.salary.text | Original salary text | “$22 an hour” |
| job.jobType | Job type(s) | [“Full-time”] |
| company.rating.score | Company rating score | 4.2 |
| company.rating.count | Number of reviews | 128 |
| location.countryCode | Country code | “US” |
| apply.applyUrl | Third-party/original apply URL if available | “https://www.example.com/apply?jk=123abc456def” |
| sourceMeta.fccId | FCC (firm) identifier if present | “1a2b3c4d5e” |
Notes:
- Bonus fields include benefits, requirements, shift and schedule, working system (e.g., work setting), and structured salary ranges when extractable (min/max, weeklyMin/weeklyMax).
- You can download results as JSON or CSV from the Apify dataset.
Key features
-
🚀 Bold, structured output
- Clean top-level fields for quick browsing and a rich nested structure (job, company, location, apply, sourceMeta, and _raw) for deep analytics.
-
📚 Batch scraping & bulk automation
- Feed multiple Indeed search/list URLs in one run; the actor follows pagination (Next button and start parameter) to collect more listings.
-
🎯 Smart filtering & deduplication
- Optional filters for Remote/Hybrid (remote), US experience level (level), and recency (fromDays). Deduplicate by job ID across URLs with enableUniqueJobs.
-
🧭 Built-in sorting by date
- When sort is set to "date", the actor sorts collected jobs by published timestamp (pubDate) before pushing to the dataset — great for recency-first pipelines.
-
🔁 Resilient connection strategy
- Automatic retries and proxy escalation: respects your proxyConfiguration. On Apify platform, it defaults to reliable RESIDENTIAL routing; elsewhere it can start without proxy and escalate to datacenter → residential upon blocks with retries.
-
📦 Developer-friendly output
- Designed for downstream use in ATS/CRM/BI. Export datasets to JSON/CSV, use it from the Apify API, or plug into your indeed job scraper Python workflows.
-
⚙️ Production-ready reliability
- Real-time pushes (streaming) while scraping, smart pagination, and robust parsing of embedded job details to capture descriptions, salary, benefits, and more.
How to use Indeed Job Scraper - step by step
- Create or log into your Apify account.
- Find “indeed-job-scraper” in the Apify Console and open the actor.
- Add input:
- Option 1: Provide Query (e.g., “Sales”), Country (e.g., “us”), and optional Location (“New York, NY”), filters, and limits.
- Option 2: Add Start URLs — a list of Indeed search/listing URLs. You can combine both options; the actor will scrape your Start URLs and also add a search URL built from Option 1 when provided.
- Configure limits and filters:
- maxRows, maxRowsPerUrl, includeSimilarJobs, enableUniqueJobs, remote, level, fromDays, sort, jobType, radius, countryCode.
- Proxy settings (optional):
- proxyConfiguration defaults to direct access when off-platform; on Apify, it uses RESIDENTIAL routing. The actor escalates to datacenter → residential as needed on blocks with retries.
- Click Start to run:
- The actor paginates and pushes results to the dataset in real-time. When sort = “date”, it sorts by pubDate before pushing.
- Download your data:
- Go to the Dataset tab and export as JSON or CSV for analysis or ingestion.
Pro tip: Orchestrate recurring runs via the Apify API and feed results to your data warehouse or enrichment pipeline — a scalable Indeed job scraping automation setup.
Use cases
| Use case name | Description |
|---|---|
| Recruiting pipeline automation | Aggregate Indeed listings into your ATS, deduplicate, and filter by Remote/Hybrid or experience level to prioritize outreach. |
| Labor market analytics | Analyze job counts, salary signals, and posting velocity across cities and states using normalized titles and structured dates. |
| Competitive hiring research | Track employer branding, ratings, and benefits across companies to benchmark packages and capture hiring trends. |
| Location intelligence | Map job openings by city/state and monitor shifts with the location object (including formatted short/long display). |
| Data enrichment for sales/BD | Build feeds of hiring signals to identify growing accounts and new opportunities. Export to JSON/CSV for CRM ingestion. |
| Academic & policy research | Study occupation mixes, shifts and schedules, and benefits prevalence across industries using structured job attributes. |
| API-driven workflows | Use the Apify API with your indeed job scraper python scripts to power scheduled pipelines and downstream transformations. |
Why choose Indeed Job Scraper?
This production-ready Indeed postings scraper focuses on structured accuracy, scale, and developer experience.
- ✅ Accurate, structured model: Rich job, company, location, apply, and source metadata — including parsed salary details when available.
- 🌍 Flexible filters: Remote/hybrid, experience level (US), and recency filters to target the jobs that matter.
- 📈 Scales with you: Bulk URLs, pagination, and deduplication for large campaigns and multi-region coverage.
- 🧰 Developer-first: Clean JSON, CSV export, and easy integration into indeed job scraping automation or an indeed job listings scraper pipeline.
- 🔒 Resilient connectivity: Automatic retries and proxy tier escalation; defaults to RESIDENTIAL routing on Apify for consistent results.
- 💸 Extension-free reliability: Outperforms fragile browser add-ons by running server-side with Playwright and robust parsing.
- 🔗 Integration-ready: Use as an indeed jobs api alternative and connect the dataset to your BI, ATS, or ETL stack.
Bottom line: it’s a dependable indeed scraper tool that delivers the fields you need in a repeatable, automation-friendly format.
Is it legal / ethical to use Indeed Job Scraper?
Yes — when done responsibly. This actor collects data from publicly available Indeed pages and does not access private or authenticated content.
Guidelines for responsible use:
- Only extract publicly visible information from Indeed search and list pages.
- Comply with applicable laws and regulations (e.g., GDPR, CCPA).
- Review and respect Indeed’s terms of use and your organization’s compliance policies.
- Use reasonable scraping limits to avoid undue load.
For edge cases or jurisdiction-specific questions, consult your legal team.
Input parameters & output format
Example JSON input
{"countryCode": "us","query": "Sales","location": "New York, NY","maxRows": 100,"radius": "25","remote": "remote","level": "entry_level","fromDays": "7","sort": "date","jobType": "fulltime","urls": ["https://www.indeed.com/jobs?q=sales&l=New+York%2C+NY","https://www.indeed.com/jobs?q=account+executive&l=New+York%2C+NY"],"maxRowsPerUrl": 50,"includeSimilarJobs": true,"enableUniqueJobs": true,"proxyConfiguration": {"useApifyProxy": false}}
Parameters (all optional unless noted — the schema’s required list is empty):
- countryCode (string, default: "us") — Select the Indeed country domain to scrape from.
- query (string, default: "Sales") — Job search keywords (e.g., job title, skills). Required when using Option 1.
- location (string, default: "") — Job location for search. Leave empty for remote or use 'remote'.
- maxRows (integer, default: 100) — Maximum number of jobs to scrape in total.
- radius (string, default: "") — Search radius from location. Allowed values: "", "0", "5", "10", "15", "25", "35", "50", "100".
- remote (string, default: "") — Filter by work setting. Allowed values: "", "remote", "hybrid".
- level (string, default: "") — Experience level (US). Allowed values: "", "entry_level", "mid_level", "senior_level".
- fromDays (string, default: "0") — Only jobs posted in the last N days. Allowed values: "0", "1", "3", "7", "14", "30".
- sort (string, default: "relevance") — Sort results by "relevance" or "date".
- jobType (string, default: "") — Filter by employment type. Allowed values include: "", "fulltime", "parttime", "contract", "temporary", "internship", "volunteer", "permanent", "seasonal", "freelance".
- urls (array) — List of Indeed search or job list URLs. You can specify multiple URLs; the actor will also add the built search URL from Option 1 (when provided).
- maxRowsPerUrl (integer, default: 50) — Maximum jobs to scrape per start URL (when using Option 2).
- includeSimilarJobs (boolean, default: true) — Include “View similar jobs” cards in results.
- enableUniqueJobs (boolean, default: true) — Deduplicate by job ID across URLs.
- proxyConfiguration (object) — Proxy settings. By default: direct access off-platform; on Apify, RESIDENTIAL routing is used for reliability. The actor can escalate to datacenter → residential on blocks with retries.
Example JSON output
{"jobId": "123abc456def","title": "Sales Associate","normalizedTitle": "Sales Associate","companyName": "Acme Corp","locationShort": "New York, NY","postedText": "3 days ago","salaryText": "$22 an hour","jobUrl": "https://www.indeed.com/viewjob?jk=123abc456def","job": {"id": "123abc456def","jobKey": "123abc456def","title": "Sales Associate","displayTitle": "Sales Associate","normalizedTitle": "Sales Associate","descriptionText": "Assist customers on the sales floor and process transactions.","descriptionHtml": "<div id=\"jobDescriptionText\">Assist customers...</div>","jobDescription": "Assist customers on the sales floor and process transactions.","jobDescriptionHTML": "<div id=\"jobDescriptionText\">Assist customers...</div>","language": "en","locale": "en_US","isRemote": false,"remoteLocation": null,"jobType": ["Full-time"],"shiftAndSchedule": ["8 hour shift"],"workingSystem": ["Onsite"],"occupation": [],"requirements": [],"attributes": [],"benefits": ["Health insurance", "401(k)"],"salary": {"text": "$22 an hour","currency": "USD","type": "hourly","min": 22,"max": 22,"weeklyMin": 880,"weeklyMax": 880,"source": "EXTRACTION"},"hiring": {"urgentlyHiring": false,"highVolumeHiring": false,"isRepost": false,"organicApplyStarts": null,"numOfCandidates": null},"dates": {"postedText": "3 days ago","formattedRelativeTime": "3 days ago","postedToday": false,"datePublished": "2026-04-10","pubDateEpoch": 1765296000000},"status": {"expired": false,"newJob": false,"visited": false}},"company": {"name": "Acme Corp","displayName": "Acme Corp","industry": null,"revenue": null,"numEmployees": null,"foundedYear": null,"description": null,"briefDescription": null,"rating": {"score": 4.2,"count": 128},"ceo": {"name": null,"photoUrl": null,"startDate": null},"branding": {"logoUrl": "https://example.com/logo.png","headerUrl": "https://example.com/header.jpg","brandColor": null,"showJobBranding": false},"links": {"corporateWebsite": null,"careers": null,"facebook": null,"instagram": null,"twitter": null,"indeedCompanyPage": "https://www.indeed.com/cmp/Acme"},"emails": []},"location": {"countryCode": "US","country": "United States","state": "NY","stateName": "New York","city": "New York","postalCode": "10001","streetAddress": null,"formattedShort": "New York, NY","formattedLong": "New York, NY 10001","latitude": null,"longitude": null},"apply": {"jobUrl": "https://www.indeed.com/viewjob?jk=123abc456def","applyUrl": "https://www.example.com/apply?jk=123abc456def","originalApplyUrl": "https://www.example.com/apply?jk=123abc456def","thirdPartyApplyUrl": "https://www.example.com/apply?jk=123abc456def","indeedApplyEnabled": true},"sourceMeta": {"source": "Indeed","feedId": 987654321,"fccId": "1a2b3c4d5e","scrapingInfo": {"page": 1,"index": 0},"rankingScores": {"bid": null,"bidPosition": null,"eApply": null,"eQualified": null}},"_raw": {"...": "Original raw fields captured pre-transformation"}}
Notes:
- Some nested fields may be null when they’re not present on the source page (e.g., precise geolocation, external apply URLs, revenue).
- The _raw object contains the original scraped payload for advanced use.
FAQ
Is there a free trial or test period?
Yes. Apify provides trial minutes so you can test the actor before committing to production workloads. Run a few searches, validate fields, and then move to scheduled automation.
Do I need to log in to Indeed or provide cookies?
No. The actor scrapes publicly available Indeed search and list pages and does not require login or cookies to collect job data.
Can I use this as an Indeed jobs API alternative?
Yes. Many teams use the dataset and Apify API as an indeed jobs api alternative to programmatically download Indeed job listings without relying on a first‑party API.
How do I scrape Indeed jobs to CSV?
Run the actor with your inputs, then open the run’s Dataset and export to CSV. You can also export JSON for ingestion into pipelines and BI tools.
Does it support Python or SDK integration?
Yes. Access the dataset via the Apify API from your indeed job scraper python scripts. This makes it easy to schedule runs and pipe results into ETL, analytics, or enrichment workflows.
How does proxy fallback work?
The actor respects your proxyConfiguration. When blocks occur, it escalates connection tiers with retries (datacenter → residential). On the Apify platform, it defaults to reliable RESIDENTIAL routing for Indeed.
Can I filter by Remote/Hybrid and experience level?
Yes. Use remote ("remote" or "hybrid") and level ("entry_level", "mid_level", "senior_level") to filter results. You can also filter by recency with fromDays and sort by "date" or "relevance".
What job data points are included?
Each item includes flat fields (jobId, title, companyName, locationShort, postedText, salaryText, jobUrl) and nested objects for job, company, location, apply, sourceMeta, plus the _raw payload — ideal for analysts and developers.
Closing thoughts
The Indeed Job Scraper is built for automated, structured collection of public Indeed listings at scale. With bulk URL support, smart filters, resilient connection handling, and clean JSON/CSV exports, it’s a dependable foundation for recruiters, analysts, and developers alike. Use it as a practical indeed web scraper and indeed job data extractor, or integrate via the Apify API for end‑to‑end indeed job scraping automation. Start extracting smarter, cleaner Indeed job data for your ATS, BI, or research workflows today.
