Indeed Job Scraper
Pricing
$19.99/month + usage
Indeed Job Scraper
✨ Indeed Job Scraper to extract job listings from Indeed quickly and at scale. Collect titles, companies, salaries, locations, and job details with ease. Ideal for job market research and lead generation. Features: ⚡ fast scraping • 📊 clean output • 🔍 insights • 🌍 scalable automation
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
ScrapeBase
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 a production-ready Apify actor that extracts structured job listings from public Indeed search and list pages — fast, clean, and at scale. It solves the pain of manual copy-paste and unreliable scripts by delivering consistent, structured JSON/CSV output for marketers, developers, data analysts, and researchers. Use it to scrape Indeed job listings, build feeds, and power recruitment or market analysis workflows with a dependable Indeed API alternative for job listings. With optional filters, pagination, and automated proxy fallback, it enables repeatable, large-scale Indeed job data extraction.
What data / output can you get?
Below are example fields this actor pushes to the Apify dataset (each item is one job). These are real field names from the output:
| Data type | Description | Example value |
|---|---|---|
| jobId | Unique job identifier (top-level) | “b28e7b80d0399215” |
| title | Job title (top-level) | “Sales Associate” |
| companyName | Company name (top-level) | “Acme Corp” |
| locationShort | Short location (city, state) | “New York, NY” |
| postedText | Relative posted time | “3 days ago” |
| salaryText | Salary text as displayed | “$60,000 - $80,000 a year” |
| jobUrl | Indeed job URL | “https://www.indeed.com/viewjob?jk=b28e7b80d0399215” |
| job.normalizedTitle | Normalized title | “Sales Associate” |
| job.isRemote | Remote flag derived from page | true |
| job.jobType | Employment type(s) | ["Full-time"] |
| job.shiftAndSchedule | Shift and schedule tags | ["Day shift"] |
| job.requirements | Requirement items with severity | [{"label":"Driver’s license","severity":"PREFERRED"}] |
| company.rating.score | Company rating score | 4.2 |
| company.rating.count | Number of reviews | 317 |
| location.city | City | “New York” |
| location.state | State code | “NY” |
| apply.originalApplyUrl | Third-party/original apply link (if present) | “https://www.indeed.com/rc/clk?jk=b28e...applystart” |
| sourceMeta.fccId | FCC/company identifier when present | “e3a9458e7b3b...” |
Bonus outputs include rich nested structures with full job descriptions (both text and HTML), benefits, attributes, hiring indicators, ranking scores, company branding (logo/header image), and a complete raw object for power users. You can download datasets as JSON, CSV, or Excel directly from Apify — perfect to download Indeed job listings CSV for pipelines and dashboards.
Key features
-
⚡ Fast, scalable scraping
- Handles bulk URLs with pagination (next button and start parameter), pushing results continuously to the dataset for real-time output.
-
🧹 Clean, structured output
- Consistent fields: job, company, location, apply, sourceMeta, and _raw. Ideal as an Indeed web scraper for jobs powering analytics or a no-code Indeed job scraper workflow.
-
🧭 Smart filters & sorting
- Optional filters: remote/hybrid, US experience level, posting date window, job type, plus sort by relevance or date. Great for targeted Indeed job data extraction.
-
🧰 Deduplication & “similar jobs”
- Enable unique jobs across URLs and choose whether to include “View similar jobs” cards.
-
🔁 Automated proxy fallback
- Starts without proxy by default; if Indeed blocks the request, it falls back to datacenter and then residential proxy with up to 3 retries, sticking with residential for the rest.
-
👩💻 Developer-friendly foundation
- Built in Python with Playwright and BeautifulSoup — an ideal base for developers who prefer an Indeed job scraper Python stack and want to integrate the Apify dataset via API.
-
🔄 Workflow & exports
- Export JSON/CSV/Excel, integrate with your automation stack, and treat this as an Indeed API alternative for job listings without maintaining brittle scripts.
How to use Indeed Job Scraper - step by step
-
Sign in to Apify and open the Actor
- Go to Apify Console → Actors → search for “indeed-job-scraper”.
-
Choose your target country and build a search (Option 1)
- Set countryCode, then enter query and (optionally) location. This builds a search URL automatically.
-
Or paste Start URLs (Option 2)
- Add one or more Indeed search/list URLs to urls. The actor will scrape these and also include the built search URL from Option 1 (when provided).
-
Configure filters and limits
- Adjust maxRows and maxRowsPerUrl. Optionally set remote, level (US), fromDays, sort, jobType, radius, includeSimilarJobs, and enableUniqueJobs.
-
(Optional) Proxy settings
- Leave proxyConfiguration as-is to start without proxy. If blocked, the actor automatically escalates to datacenter then residential proxy with retries.
-
Start the run
- Click Start. The actor paginates through results, enriches with embedded job pane details, and pushes items to the dataset as they’re found.
-
Monitor progress
- Use the Run log for progress messages and pagination stats.
-
Export your results
- Open the Output tab and export to JSON, CSV, or Excel. Perfect when you need to download Indeed job listings CSV for further processing.
Pro Tip: Set sort to date to push jobs sorted by newest first; combine with remote or level filters to build a targeted Indeed job postings scraper for your pipeline.
Use cases
| Use case name | Description |
|---|---|
| Job market research & trends | Aggregate roles across cities and titles to analyze salary text, benefits, and hiring signals for market insights. |
| Recruitment pipelines | Feed structured job data into CRMs or ATS for faster sourcing and automated alerts. |
| Sales & lead gen (B2B) | Track hiring signals to identify growing accounts and tailor outreach based on roles and locations. |
| Competitive analysis | Compare postings by company rating, posting cadence, and normalized titles across regions. |
| Location benchmarking | Evaluate openings by city/state with filters like remote/hybrid and job type to assess regional demand. |
| Data enrichment via API | Use the Apify dataset programmatically to power dashboards, reports, and pipelines as an Indeed API alternative for job listings. |
| Academic & policy research | Study job availability, compensation language, and benefit mentions across time windows (fromDays). |
Why choose Indeed Job Scraper?
Purpose-built for precision, automation, and reliability, this actor focuses on clean job data at scale.
- 🎯 Accurate, structured output: Rich nested fields (job, company, location, apply, sourceMeta, _raw) ready for analysis.
- 🌍 Targeted filtering: Remote/hybrid, US experience levels, posting windows, and job types enable specific cohorts.
- 📦 Batch scraping at scale: Bulk URLs with pagination for a robust Indeed job search scraper workflow.
- 🧩 Developer access: Python-based stack (Playwright + BeautifulSoup) and Apify dataset exports fit dev pipelines.
- 🔒 Safe & public data only: Scrapes publicly available Indeed pages without login.
- 💰 Cost-effective automation: A no-code Indeed job scraper for teams that need repeatable extraction without maintenance headaches.
- 🛡️ Resilient infrastructure: Automated proxy fallback with retries helps keep long runs stable.
Compared to browser extensions or one-off scripts, this production-ready Indeed job listings crawler offers consistent structure, scale, and automated resilience.
Is it legal / ethical to use Indeed Job Scraper?
Yes — when done responsibly. This actor collects data from publicly available Indeed pages only and does not access private or authenticated data.
Guidelines for compliant use:
- Only use publicly available job data.
- Respect platform terms, and ensure your usage aligns with local regulations (e.g., GDPR, CCPA).
- Avoid excessive load; use maxRows and maxRowsPerUrl sensibly.
- Consult your legal team for edge cases and jurisdiction-specific requirements.
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"],"maxRowsPerUrl": 50,"includeSimilarJobs": true,"enableUniqueJobs": true,"proxyConfiguration": {"useApifyProxy": false}}
Parameters
-
countryCode (string)
- Description: Select the Indeed country domain to scrape from.
- Default: "us"
- Required: No
-
query (string)
- Description: Job search keywords (e.g. job title, skills). Required when using Option 1.
- Default: "Sales"
- Required: No
-
location (string)
- Description: Job location for search. Leave empty for remote or use 'remote'.
- Default: ""
- Required: No
-
maxRows (integer)
- Description: Maximum number of jobs to scrape in total.
- Default: 100
- Required: No
-
radius (string)
- Description: Search radius from location.
- Default: ""
- Required: No
-
remote (string)
- Description: Filter by remote or hybrid work.
- Default: ""
- Required: No
-
level (string)
- Description: Experience level (US).
- Default: ""
- Required: No
-
fromDays (string)
- Description: Only jobs posted in the last N days.
- Default: "0"
- Required: No
-
sort (string)
- Description: Sort results by relevance or date.
- Default: "relevance"
- Required: No
-
jobType (string)
- Description: Filter by employment type.
- Default: ""
- Required: No
-
urls (array)
- Description: List of Indeed search or job list URLs. You can specify multiple URLs; the scraper will use these pages. Option 1 is NOT ignored — the actor will also add the built search URL from Option 1 (when provided).
- Default: none
- Required: No
-
maxRowsPerUrl (integer)
- Description: Maximum jobs to scrape per start URL (when using Option 2).
- Default: 50
- Required: No
-
includeSimilarJobs (boolean)
- Description: Include 'View similar jobs' cards in results.
- Default: true
- Required: No
-
enableUniqueJobs (boolean)
- Description: Deduplicate by job ID across URLs.
- Default: true
- Required: No
-
proxyConfiguration (object)
- Description: By default no proxy is used and requests go directly to Indeed. If Indeed blocks or rejects the request, the actor falls back to datacenter proxy, then to residential proxy (with up to 3 retries). Once fallback occurs, the actor sticks with residential proxy for all remaining requests.
- Default: {"useApifyProxy": false}
- Required: No
Output format
Each dataset item is a single job with the following structure:
- Top-level fields: jobId, title, normalizedTitle, companyName, locationShort, postedText, salaryText, jobUrl
- Nested objects: job, company, location, apply, sourceMeta, _raw
Example:
{"jobId": "b28e7b80d0399215","title": "Sales Associate","normalizedTitle": "Sales Associate","companyName": "Acme Corp","locationShort": "New York, NY","postedText": "3 days ago","salaryText": "$60,000 - $80,000 a year","jobUrl": "https://www.indeed.com/viewjob?jk=b28e7b80d0399215","job": {"id": "b28e7b80d0399215","jobKey": "b28e7b80d0399215","title": "Sales Associate","displayTitle": "Sales Associate","normalizedTitle": "Sales Associate","descriptionText": "Support the sales team...","descriptionHtml": "<div id=\"jobDescriptionText\">Support the sales team...</div>","jobDescription": "Support the sales team...","jobDescriptionHTML": "<div id=\"jobDescriptionText\">Support the sales team...</div>","language": "en","locale": "en_US","isRemote": true,"remoteLocation": true,"jobType": ["Full-time"],"shiftAndSchedule": ["Day shift"],"workingSystem": ["Remote"],"occupation": [],"requirements": [{ "label": "Driver’s license", "severity": "PREFERRED" }],"attributes": [],"benefits": ["Health insurance", "401(k)"],"salary": {"text": "$60,000 - $80,000 a year","currency": "USD","type": "yearly","min": 60000,"max": 80000,"weeklyMin": 1154,"weeklyMax": 1538,"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-03-15","pubDateEpoch": 1741996800000},"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": 317 },"ceo": { "name": null, "photoUrl": null, "startDate": null },"branding": {"logoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_logo.png","headerUrl": null,"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=b28e7b80d0399215","applyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215&from=applystart","originalApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215&from=applystart","thirdPartyApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215&from=applystart","indeedApplyEnabled": true},"sourceMeta": {"source": "Indeed","feedId": 123456,"fccId": "e3a9458e7b3b","scrapingInfo": { "page": 1, "index": 0 },"rankingScores": {"bid": null,"bidPosition": null,"eApply": null,"eQualified": null}},"_raw": {"id": "b28e7b80d0399215"}}
Note: Some nested fields may be null or empty if not present on the page. The _raw object contains the untransformed parsed job card for advanced use.
FAQ
Do I need to enable a proxy to scrape Indeed?
No. By default, requests go directly without a proxy. If Indeed returns a block (e.g., 401/403), the actor automatically falls back to a datacenter proxy and then to a residential proxy with up to 3 retries, sticking with residential for the remaining requests.
Can I scrape multiple Indeed URLs in one run?
Yes. Provide multiple search or list URLs in the urls array. The actor paginates per URL and respects maxRows and maxRowsPerUrl limits.
Does it support filters like remote, experience level, or posting date?
Yes. You can filter by remote or hybrid work (remote), US experience level (level), posting date window (fromDays), and jobType. You can also sort by relevance or date.
Can I include or exclude “View similar jobs” cards?
Yes. Control this via includeSimilarJobs. Set it to true to include or false to exclude those cards.
How do I avoid duplicates when scraping multiple URLs?
Set enableUniqueJobs to true to deduplicate by job ID across all URLs in the run.
What formats can I export?
You can export the Apify dataset in JSON, CSV, or Excel. This makes it easy to download Indeed job listings CSV for analytics, BI tools, or CRMs.
Does it require login or cookies?
No. The actor scrapes publicly available Indeed pages without login and does not access private or authenticated data.
Is there retry logic if a block occurs?
Yes. If blocked, the actor escalates proxy tiers with retries (up to 3 on residential) and continues scraping, improving reliability for larger runs.
Closing CTA / Final thoughts
The Indeed Job Scraper is built for accurate, scalable extraction of public Indeed job listings. With powerful filters, pagination, deduplication, and automated proxy fallback, it delivers clean, structured output for analysts, recruiters, marketers, and developers.
Start with a query and location or paste your own URLs, then export ready-to-use JSON/CSV/Excel. Developers can integrate the Apify dataset into Python and automation pipelines with ease. Start extracting smarter, cleaner Indeed job data — at scale.
