Indeed Job Scraper
Pricing
$19.99/month + usage
Indeed Job Scraper
💼 Indeed Job Scraper extracts real-time job listings from Indeed—titles, companies, locations, salaries, descriptions & links. ⚡ Automate at scale, filter by keywords & location, and export to CSV/JSON/API. 📊 Perfect for recruiting, market research, and job trend analytics. 🚀
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
ScrapAPI
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Indeed Job Scraper
The Indeed Job Scraper is a production-ready Apify actor that extracts structured job listings from public Indeed search and list pages — including titles, companies, locations, salaries, descriptions, and application links. It solves the manual, time-consuming task of collecting Indeed job postings by automating pagination, filtering, and data normalization at scale. Built for marketers, developers, recruiters, analysts, and researchers, this Indeed scraper lets you scrape Indeed jobs, apply filters for relevance, and export Indeed job listings to CSV/JSON/API for downstream analytics and pipelines.
What data / output can you get?
Below are examples of the structured fields the actor pushes to the Apify dataset for each Indeed job. Field names mirror the actual output.
| Data type | Description | Example value |
|---|---|---|
| jobId | Unique job key extracted from Indeed | b28e7b80d0399215 |
| title | Job title as shown on Indeed | Sales Associate |
| normalizedTitle | Normalized/standardized title from page data | Sales Associate |
| companyName | Employer name | Acme Corp |
| locationShort | Short location string for quick filtering | New York, NY |
| postedText | Relative time posted string | 3 days ago |
| salaryText | Salary text if found (extracted or from page) | $22 an hour |
| jobUrl | Direct Indeed viewjob URL | https://www.indeed.com/viewjob?jk=b28e7b80d0399215 |
| job.salary.currency | Parsed salary currency (when detected) | USD |
| job.isRemote | Boolean flag for remote roles (derived) | true |
| company.rating.score | Company rating score (if available) | 4.1 |
| apply.applyUrl | Direct or third-party apply link (if found) | https://www.indeed.com/rc/clk?jk=b28e7... |
| location.city | City extracted from the listing | New York |
Bonus outputs include rich nested objects:
- job: full/HTML descriptions, job types, shift and schedule, benefits, attributes, parsed salary min/max with weekly projections, hiring stats, dates, and status flags.
- company: display name, rating count, branding (logo/header), and Indeed company page link when available.
- sourceMeta: source “Indeed”, feedId/fccId, scrapingInfo (page/index), and ranking scores.
- _raw: the original raw scraped object for full fidelity.
You can export results in Apify to JSON or CSV, or access them via the Apify API for integration with your pipelines.
Key features
-
⚡ Automatic proxy fallback & resilience
Starts clean and escalates on blocks: no proxy ➜ datacenter ➜ residential (with retries). On the Apify platform, the actor defaults to residential for reliability and then sticks with it. -
📦 Batch scraping & bulk automation
Provide multiple Indeed search/list URLs at once and the actor will crawl each, follow pagination, and collect results up to your limits. -
🎯 Powerful filters
Configure remote/hybrid, US experience level (entry_level, mid_level, senior_level), posting age (fromDays), sort (relevance or date), country domain, and job type. -
🧠 Accurate job parsing
Captures title, company, location, salary (parsed and normalized), benefits, job descriptions (text + HTML), apply links, and more with robust DOM and script-data extraction. -
🔁 Deduplication & similar jobs handling
Enable unique jobs only across URLs and choose whether to include “View similar jobs” cards. -
🧪 Controlled limits & pagination
Set maxRows for total listings and maxRowsPerUrl for per-URL caps while the actor follows next-page buttons and start offsets. -
🧰 Developer-friendly JSON output
Clean, predictable JSON with top-level convenience fields plus nested objects for job, company, location, apply, sourceMeta, and _raw. Ideal for APIs, ETL, and Python Indeed scraper workflows. -
🗺️ Global domains
Select from multiple Indeed country domains (e.g., us, uk, ca, au, etc.) to target the right market.
How to use Indeed Job Scraper - step by step
- Sign in to Apify and open the Actor in the Apify Console.
- Choose your approach:
- Option 1: Use Query + Filters — set countryCode, query, location, and any filters (remote, level, fromDays, sort, jobType, radius). The actor will build and add a search URL.
- Option 2: Start URLs — paste one or more Indeed search/list URLs into urls. You can combine both options; the actor will scrape all provided URLs plus the query-built search URL.
- Set limits:
- maxRows to control total listings to collect.
- maxRowsPerUrl to cap per-URL collection.
- Configure output and deduplication:
- includeSimilarJobs to include/exclude similar job cards.
- enableUniqueJobs to deduplicate by job ID across URLs.
- (Optional) Configure proxyConfiguration. By default, requests go directly to Indeed with automatic fallback on blocks. On Apify platform runs, the actor defaults to residential for reliability.
- Click Start. The actor will navigate each URL, parse listings, follow pagination, and extract embedded job details (salary, benefits, description) when available.
- Monitor progress in the Log and see pushed items accumulating in the Dataset.
- Export results from the Dataset as JSON or CSV, or consume via the Apify API.
Pro tip: Set sort to date to push items in descending publication order. Pair with enableUniqueJobs for clean, fresh feeds in automated Indeed job scraping workflows.
Use cases
| Use case | Description |
|---|---|
| Recruiting pipeline enrichment | Aggregate Indeed job postings across locations and titles to keep ATS or CRM openings fresh and de-duplicated. |
| Market and location analysis | Compare job availability and demand by city/state or country by scraping Indeed jobs at scale with consistent fields. |
| Compensation benchmarking | Collect salaryText and parsed salary ranges to analyze pay distributions across roles and regions. |
| Job board aggregation | Feed a custom job board or newsletter by exporting Indeed job listings to CSV/JSON/API on a schedule. |
| Academic & labor research | Build datasets of job titles, descriptions, and benefits for trend analysis and skills taxonomy research. |
| Data engineering pipelines | Use the API-friendly JSON to land jobs into your warehouse or trigger ETL with Airflow, n8n, or custom scripts. |
Why choose Indeed Job Scraper?
This Indeed job listings scraper is built for precision, resilience, and clean data pipelines.
- ✅ Structured, analysis-ready output (job, company, location, apply, sourceMeta, _raw)
- 🌍 Country-aware domains and filters (remote/hybrid, level, fromDays, sort, jobType)
- 📈 Scales from a single search to hundreds of URLs with pagination and limits
- 🧹 Smart deduplication and similar-jobs control for clean datasets
- 🔐 Robust connection strategy with automatic proxy fallback and retries
- 💻 Developer-friendly JSON suitable for APIs, Python, and automated ETL
- 💾 Easy exports to JSON/CSV and consumption via the Apify API
Unlike brittle browser extensions or ad-hoc scripts, this Indeed job board scraper is production-ready, handles pagination and embedded details, and keeps your outputs consistent run after run.
Is it legal / ethical to use Indeed Job Scraper?
Yes — when used responsibly. This actor is designed to extract data from publicly available Indeed pages only. Users are responsible for ensuring their usage complies with applicable laws and Indeed’s terms.
Guidelines:
- Scrape only public pages and avoid login-protected content.
- Comply with data protection regulations (e.g., GDPR, CCPA) and internal policies.
- Use reasonable limits and avoid overloading the site.
- Consult your legal team for edge cases or compliance questions.
Input parameters & output format
Example JSON input
{"countryCode": "us","query": "Sales","location": "New York, NY","radius": "10","remote": "remote","level": "entry_level","fromDays": "7","sort": "date","jobType": "fulltime","urls": ["https://www.indeed.com/jobs?q=sales&l=New+York%2C+NY"],"maxRows": 100,"maxRowsPerUrl": 50,"includeSimilarJobs": true,"enableUniqueJobs": true,"proxyConfiguration": {"useApifyProxy": false}}
Parameters
-
countryCode (string)
Select the Indeed country domain to scrape from. Default: "us". Required: No. -
query (string)
Job search keywords (e.g. job title, skills). Required when using Option 1. Default: "Sales". Required: No. -
location (string)
Job location for search. Leave empty for remote or use 'remote'. Default: "". Required: No. -
maxRows (integer)
Maximum number of jobs to scrape in total. Minimum: 1, Maximum: 1000. Default: 100. Required: No. -
radius (string)
Search radius from location. Allowed: "", "0", "5", "10", "15", "25", "35", "50", "100". Default: "". Required: No. -
remote (string)
Filter by remote or hybrid work. Allowed: "", "remote", "hybrid". Default: "". Required: No. -
level (string)
Experience level (US). Allowed: "", "entry_level", "mid_level", "senior_level". Default: "". Required: No. -
fromDays (string)
Only jobs posted in the last N days. Allowed: "0", "1", "3", "7", "14", "30". Default: "0". Required: No. -
sort (string)
Sort results by relevance or date. Allowed: "", "relevance", "date". Default: "relevance". Required: No. -
jobType (string)
Filter by employment type. Allowed: "", "fulltime", "parttime", "contract", "temporary", "internship", "volunteer", "permanent", "seasonal", "freelance". Default: "". Required: No. -
urls (array)
Start URLs: list of Indeed search or job list URLs. Can be used together with Option 1 (query/filters). Required: No. -
maxRowsPerUrl (integer)
Maximum jobs to scrape per start URL (when using Option 2). Minimum: 1, Maximum: 500. Default: 50. Required: No. -
includeSimilarJobs (boolean)
Include 'View similar jobs' cards in results. Default: true. Required: No. -
enableUniqueJobs (boolean)
Deduplicate by job ID across URLs. Default: true. Required: No. -
proxyConfiguration (object)
By default requests go directly to Indeed; if blocked, the actor falls back to datacenter then residential (with up to 3 retries) and sticks with residential thereafter. Prefill: {"useApifyProxy": false}. Required: No.
Example JSON output item
{"jobId": "b28e7b80d0399215","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=b28e7b80d0399215","job": {"id": "b28e7b80d0399215","jobKey": "b28e7b80d0399215","title": "Sales Associate","displayTitle": "Sales Associate","normalizedTitle": "Sales Associate","descriptionText": "As a Sales Associate, you will...","descriptionHtml": "<div id=\"jobDescriptionText\">...</div>","jobDescription": "As a Sales Associate, you will...","jobDescriptionHTML": "<div id=\"jobDescriptionText\">...</div>","language": "en","locale": "en_US","isRemote": true,"remoteLocation": "Remote","jobType": ["Full-time"],"shiftAndSchedule": ["Day shift"],"workingSystem": ["Remote"],"occupation": [],"requirements": [],"attributes": [],"benefits": ["Health insurance", "Paid time off"],"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": 1712700000000},"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.1, "count": 128 },"ceo": { "name": null, "photoUrl": null, "startDate": null },"branding": {"logoUrl": "https://.../logo.png","headerUrl": "https://.../header.jpg","brandColor": null,"showJobBranding": false},"links": {"corporateWebsite": null,"careers": null,"facebook": null,"instagram": null,"twitter": null,"indeedCompanyPage": "https://www.indeed.com/cmp/Acme-Corp"},"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=b28e7b80d0399215","applyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215","originalApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215","thirdPartyApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215","indeedApplyEnabled": true},"sourceMeta": {"source": "Indeed","feedId": 123456,"fccId": "abcdef123","scrapingInfo": { "page": 1, "index": 0 },"rankingScores": { "bid": null, "bidPosition": null, "eApply": null, "eQualified": null }},"_raw": {"id": "b28e7b80d0399215","company": "Acme Corp"}}
Note: Some fields may be null or empty when not present on the page (e.g., salary, benefits, coordinates). When sort is set to date, items are sorted by publication time before being pushed.
FAQ
Do I need to use a proxy?
No, you don’t have to set one. By default, requests go directly to Indeed and the actor automatically falls back to datacenter and then residential proxy if blocked. On Apify platform runs, it defaults to residential for reliability.
Can I scrape multiple Indeed URLs in one run?
Yes. Add multiple search/list pages to urls and the Indeed jobs web scraper will process each, follow pagination, and respect your maxRows and maxRowsPerUrl limits.
Does it support filtering by remote/hybrid or job level?
Yes. Use the remote parameter for remote or hybrid, and level for US experience levels (entry_level, mid_level, senior_level). You can also filter by fromDays, sort, jobType, radius, and countryCode.
How many jobs can I scrape per run?
You control this via maxRows (total cap) and maxRowsPerUrl (per-URL cap). The maximum allowed by the input schema for maxRows is 1000 per run.
What data fields are included?
Each item includes top-level fields like jobId, title, companyName, locationShort, postedText, salaryText, jobUrl, plus nested job, company, location, apply, sourceMeta, and _raw objects. Salaries are parsed into currency, type, min/max, and weekly projections when detectable.
What formats can I export to?
You can export Indeed job listings to JSON or CSV from the Apify Dataset, or pull them programmatically via the Apify API — perfect for developers building a Python Indeed scraper pipeline.
Does it deduplicate jobs?
Yes. Set enableUniqueJobs to true to deduplicate by job ID across all start URLs, ensuring a clean feed when you export Indeed job listings.
Is there a free trial?
Yes. On Apify, actors typically include trial minutes to test runs (this actor lists trial minutes in the Store). You can experiment with small batches before scaling.
Closing CTA / Final thoughts
The Indeed Job Scraper is built to automate accurate, scalable Indeed job data extraction for recruiters, analysts, and developers. With bulk URL support, robust filters, automatic proxy fallback, and structured JSON designed for APIs and ETL, it helps you analyze hiring trends, enrich pipelines, and export Indeed job listings with confidence.
Start a run in Apify Console, or integrate via the Apify API to build an automated Indeed job postings scraper workflow in your stack. Extract smarter, cleaner insights from Indeed at scale.
