Indeed Jobs Scraper
Pricing
from $1.50 / 1,000 job listings
Indeed Jobs Scraper
Scrape Indeed job listings by keyword, country, and location. Extract titles, companies, salaries, full descriptions, benefits, skills, posted dates, apply links, and job URLs. Export data, run via API, schedule and monitor runs, or integrate with other tools.
Pricing
from $1.50 / 1,000 job listings
Rating
0.0
(0)
Developer
Chronometrica
Maintained by CommunityActor stats
2
Bookmarked
5
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
What does Indeed Jobs Scraper do?
Indeed Jobs Scraper allows you to extract clean, deduplicated job data from Indeed job listings: job title, full description, company name, location, salary, employment type, benefits, skills, apply links, posting metadata, and more.
To get that data, choose the Indeed country site, enter keywords, optionally add a location, set how many jobs to save, and click Start. You can also run the scraper through the Apify API, schedule it, or connect it to other tools. It saves one row per job by default, so overlapping keywords, locations, and pages do not fill your dataset with duplicate listings.
With Indeed Jobs Scraper, you can:
- Scrape Indeed job listings by job title, keyword, company, country, and location.
- Extract detailed job posting data, including description text and HTML when available.
- Collect salary ranges, company details, location fields, benefits, skills, apply URLs, and job URLs.
- Filter Indeed jobs by posting date, radius, job type, remote status, employer, salary period, and minimum salary.
- Run one country-wide search from the form or larger keyword/location matrices from JSON or API input.
- Save clean unique job listings with duplicate skips counted in the run summary.
- Download Indeed job data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- Check the run summary to see how many jobs were found, saved, skipped, duplicated, filtered, or stopped.
What job listing data can I extract?
With this Actor, you can extract the following data from public Indeed job postings:
| 💼 Job title | 🏢 Company name | 📍 Job location |
| 📝 Full description text | 🧾 Description HTML | 🔎 Description status |
| 💰 Salary range | 💵 Salary currency | ⏱ Salary period |
| 🧑💻 Employment type | 🪜 Seniority | 🏠 Remote status |
| 🎁 Benefits | 🧰 Skills | 🚀 Apply link |
| 🔗 Indeed job URL | 🏷 Sponsored / Easy Apply | 📅 Posted date |
| 🌎 Country and source site | 🔍 Search keyword | 🧭 Search location |
| 📊 Jobs saved | ♻️ Duplicates skipped | 🚦 Stop reason |
Here are the main output groups:
| Data group | Example fields |
|---|---|
| 💼 Job details | jobId, title, employmentType, seniority, isRemote, isSponsored, isEasyApply |
| 🏢 Company details | companyName, companyUrl, companyWebsite, companyIndustry, companyEmployees, companyRevenue |
| 📍 Location | locationRaw, locationCity, locationRegion, locationCountry, resolvedCountry, sourceSite |
| 💰 Salary | salaryRaw, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salarySource |
| 📝 Description | descriptionSnippet, descriptionText, descriptionHtml, descriptionStatus |
| 🚀 Links and enrichment | benefits, skills, applyUrl, finalApplyUrl, jobUrl |
| 📊 Run summary | candidateItemsSeen, jobsSaved, duplicateCandidatesSeen, duplicatesSkipped, warnings, stopReason |
Salary, benefits, skills, company profile fields, and final apply URLs depend on
what is available on each Indeed listing. If full job descriptions matter for
your workflow, check the descriptionStatus field in the output.
Can I use this Actor through an API?
Yes. You can run Indeed Jobs Scraper manually in Apify Console or use it as an API for Indeed job data.
Developers can call this Actor through:
- Apify API
- Python SDK
- Node.js SDK
- Webhooks
- Scheduled runs
- Apify integrations
This makes it useful for recruiting pipelines, dashboards, job boards, warehouse loads, agents, and automated market research workflows.
Why scrape Indeed?
Indeed is a large source of job market data. Scraping Indeed can help you track hiring demand, salary signals, employer activity, and job-description language across roles and locations.
Here are just some of the ways you could use Indeed job data:
| 📈 Monitor hiring trends | Track demand by role, skill, location, company, or remote status. |
| 💰 Benchmark salaries | Compare salary ranges across markets and job families. |
| 🧲 Build recruiting workflows | Collect active job listings for sourcing, staffing, and lead generation. |
| 🏢 Track competitors | Watch hiring activity, expansion signals, and technology adoption. |
| 🧪 Research labor markets | Analyze job descriptions, benefits, skills, and compensation signals. |
| 🧱 Enrich job boards | Feed clean Indeed job data into apps, databases, and career tools. |
Scrape Indeed salaries and full descriptions
Use Indeed Jobs Scraper when salary ranges, full descriptions, and job URLs are
the fields that matter most. Each saved row can include salaryRaw,
salaryMin, salaryMax, salaryCurrency, salaryPeriod,
descriptionText, descriptionHtml, descriptionStatus, applyUrl, and
jobUrl when those values are available on the public listing.
Indeed benefits and skills scraper
Indeed listings often include useful labor-market signals beyond the job title. This Actor saves benefits, skills, employment type, seniority, remote status, company fields, and posting metadata where available, so you can compare hiring requirements across roles, markets, and employers.
Indeed Jobs API for job listings
Indeed Jobs Scraper can be run manually in Apify Console or called as an API. Use it from scheduled runs, webhooks, the Apify API, Python SDK, Node.js SDK, or downstream warehouse jobs when you need repeatable Indeed job-listing data.
No Indeed account login or user-provided browser cookies are required.
Clean, duplicate-free Indeed job datasets
Indeed search results can overlap across related keywords, locations, and pages.
For normal datasets, keep saveOnlyUniqueItems enabled so the Actor saves one
row per job and skips duplicate candidates before they become saved rows.
The OUTPUT summary shows candidateItemsSeen, duplicateCandidatesSeen,
duplicatesSkipped, and jobsSaved, so you can see how many matching rows were
found, how many were duplicates, and how many unique job listings were saved.
Turn unique-job mode off only when you intentionally want to measure keyword
overlap or search ranking behavior.
How much does scraping Indeed cost?
Indeed Jobs Scraper uses a Pay-Per-Event pricing model. You are charged for saved job listings.
The current price is $1.50 per 1,000 saved job listings, or $0.0015 per job listing. For example:
| Saved job listings | Estimated Actor charge |
|---|---|
| 100 jobs | $0.15 |
| 1,000 jobs | $1.50 |
| 10,000 jobs | $15.00 |
Check the Pricing tab for the current rate before production runs. Start
with maxItems between 10 and 100 if you want to test the output before running
larger searches. For normal runs, keep Unique jobs only enabled so duplicate
candidates are skipped before they become saved rows.
How do I use Indeed Jobs Scraper?
Indeed Jobs Scraper was designed for an easy start even if you've never extracted data from the web before. Here's how you can scrape Indeed job data with this tool:
- Create or log in to your Apify account.
- Open Indeed Jobs Scraper.
- Choose the Indeed country site to search.
- Add a job title, keyword, skill, or company to search for.
- Optionally add a location. Location narrows the keyword search; leave it empty for a country-wide search.
- Set the maximum number of job listings to collect.
- Add filters such as posted date, radius, job type, remote-only, employer exclusions, or salary filters if needed.
- Click Start and wait for the data to be extracted.
- Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
⬇️ Input
The input uses one main search flow:
-
Country Choose the Indeed country site to search.
-
Keywords Search Indeed by job titles/keywords inside the selected country.
-
Location Optionally enter a city, state, province, or region. Location narrows the keyword search; it is not a separate search mode. Leave it blank for country-wide results.
Job listings to collect is the shared cap for the whole run. All keywords and
the selected country/location share this same save limit.
You can also add optional filters for date, radius, job type, remote jobs, employers, salary, and enrichment.
Here's a simple input example for a country-wide software engineer search in the United States:
{"searchTerm": "software engineer","country": "us","location": "","postedWithinDays": "7","radiusMiles": 25,"sortBy": "relevance","maxItems": 25,"maxPagesPerSearch": 2,"balanceKeywordCoverage": true,"saveOnlyUniqueItems": true,"excludeCompanies": "","salaryType": "any","minSalary": 0,"followApplyRedirects": false,"scrapeCompanyDetails": false,"jobType": "any","remoteOnly": false}
Click on the Input tab for a full explanation of input in JSON.
Search terms
Use one job title, skill, company, or role family per line. Multiple distinct search terms can help you collect broader job market data.
Good search terms:
data engineeranalytics engineerdata scientist
Overlapping search terms can return the same job more than once. Keep
saveOnlyUniqueItems enabled unless you are measuring keyword overlap or search
ranking.
Locations and countries
Choose one Indeed country site first. Location is optional and narrows the keyword search inside that country. For a country-wide search, leave the location field empty.
Supported countries:
Argentina, Australia, Austria, Bahrain, Belgium, Brazil, Canada, Chile, China,Colombia, Costa Rica, Czech Republic, Denmark, Ecuador, Egypt, Finland, France,Germany, Greece, Hong Kong, Hungary, India, Indonesia, Ireland, Israel, Italy,Japan, Kuwait, Luxembourg, Malaysia, Mexico, Morocco, Netherlands, New Zealand,Nigeria, Norway, Oman, Pakistan, Panama, Peru, Philippines, Poland, Portugal,Qatar, Romania, Saudi Arabia, Singapore, South Africa, South Korea, Spain,Sweden, Switzerland, Taiwan, Thailand, Turkey, Ukraine, United Arab Emirates,United Kingdom, United States, Uruguay, Venezuela, Vietnam
Filters, quality controls, and enrichment
| Option | What it does |
|---|---|
postedWithinDays | Keeps jobs from the selected freshness window. |
radiusMiles | Searches around the selected location. |
jobType | Filters full-time, part-time, contract, or internship jobs. |
remoteOnly | Returns remote jobs only. |
excludeCompanies | Skips matching employers and counts skipped rows in the run summary. |
salaryType and minSalary | Filters jobs by salary period and minimum salary when salary data is available. |
saveOnlyUniqueItems | Removes duplicate jobs from overlapping keywords, locations, and pages. |
balanceKeywordCoverage | Gives each keyword a turn before going deeper into one keyword's pages. |
followApplyRedirects | Adds the final employer or ATS apply URL when available. This is slower. |
scrapeCompanyDetails | Adds company website, industry, size, revenue, and description when available. |
⬆️ Output sample
The results will be wrapped into a dataset which you can find in the Output tab. Each result is one saved Indeed job listing.
For easier postprocessing, export the results to one of the supported formats: JSON, JSONL, CSV, Excel spreadsheet, XML, RSS, or HTML table.
Here's an example of the exported JSON output:
{"jobId": "example-job-key","title": "Junior Data Analyst","companyName": "Example Company","companyUrl": "https://www.indeed.com/cmp/example-company","locationRaw": "London","locationCity": "London","locationRegion": "ENG","locationCountry": "gb","resolvedCountry": "gb","sourceSite": "uk.indeed.com","isRemote": false,"salaryRaw": "GBP 24,000-42,000 per year","salaryMin": 24000,"salaryMax": 42000,"salaryCurrency": "GBP","salaryPeriod": "year","salarySource": "listing","employmentType": "fulltime","seniority": "junior","descriptionSnippet": "Support data-driven decision-making processes...","descriptionText": "Full job description text...","descriptionHtml": "<p>Full job description HTML...</p>","descriptionStatus": "full","benefits": ["Example benefit"],"skills": ["SQL", "Python", "Power BI"],"applyUrl": "https://example.com/apply","jobUrl": "https://uk.indeed.com/viewjob?jk=example-job-key","query": "data analyst","searchLocation": "London","verifiedAt": "2026-06-21T02:15:24.063Z","isExpired": false,"verificationSource": "search","scrapedAt": "2026-06-21T02:15:24.063Z"}
Run summary
Indeed Jobs Scraper also saves an OUTPUT summary in the default key-value store.
Use it to see why the final number of saved jobs changed.
{"stopReason": "max_items_reached","resolvedCountry": "gb","sourceSite": "uk.indeed.com","searchesQueued": 1,"pagesParsed": 1,"requestedMaxItems": 10,"candidateItemsSeen": 100,"jobsSaved": 10,"duplicateCandidatesSeen": 0,"duplicatesSkipped": 0,"rowsExcludedByCompany": 0,"rowsExcludedByDate": 0,"rowsExcludedBySalary": 0,"blockedPages": 0,"failedRequests": 0,"warnings": [],"statusMessage": "Saved 10 Indeed jobs."}
Why did I get fewer jobs than requested?
maxItems is a cap on saved rows, not a guarantee that every search has that
many matching jobs.
If your run saves fewer jobs than requested, check the OUTPUT summary. It
shows whether rows were skipped because of duplicates, employer exclusions, date
filters, salary filters, source exhaustion, page limits, failed requests, or
blocked pages.
Common reasons include:
- The selected role and location have fewer available jobs than
maxItems. - Strict filters removed many candidate rows.
- Multiple keywords returned the same jobs and unique-job mode skipped duplicates.
- The search depth limit was reached before enough unique matching jobs were found.
If you need more rows, increase maxPagesPerSearch, relax strict filters, add
more distinct keywords, expand the search radius, or search a broader location.
Tips for scraping Indeed
- Start with a small test run and inspect the dataset before increasing
maxItems. - Use distinct keywords instead of near-duplicates.
- Keep
saveOnlyUniqueItemsenabled for normal datasets. - Use
postedWithinDaysfor fresh job monitoring. - Enable
followApplyRedirectsonly when you need the final apply destination. - Enable
scrapeCompanyDetailsonly when company profile enrichment matters. - Check
descriptionStatuswhen full job descriptions are important.
FAQ
Does Indeed Jobs Scraper need login or cookies?
No. You do not need to provide an Indeed account, login session, or browser cookies.
Can I use Indeed Jobs Scraper through an API?
Yes. Run it with the Apify API, Python SDK, Node.js SDK, webhooks, schedules, or
integrations. The dataset contains saved job rows and the OUTPUT key-value
store record contains the run summary.
Why are salaries, benefits, skills, or full descriptions sometimes missing?
Those fields depend on what Indeed exposes for each listing. Use
descriptionStatus, salary fields, and the run summary to separate complete
rows from partial rows.
How do I avoid duplicate jobs?
Keep saveOnlyUniqueItems enabled. The Actor saves one row per job across
overlapping keywords, locations, and pages. The OUTPUT summary reports
candidateItemsSeen, duplicateCandidatesSeen, duplicatesSkipped, and
jobsSaved, so you can audit how many candidates were found, skipped as
duplicates, and saved as unique job listings.
How much does it cost?
The current Actor charge is $1.50 per 1,000 saved job listings. Check the Pricing tab before production runs because live Store pricing is the source of truth.
Is it legal to scrape Indeed?
This Actor extracts public job listing data. You are responsible for making sure your use case complies with applicable laws, platform terms, and privacy rules.
Job listings can sometimes include personal data or contact details. You should not scrape, store, or process personal data unless you have a legitimate reason and the right legal basis. If you're unsure whether your reason is legitimate, consult your lawyers.
Indeed is a trademark of its owner. This Actor is independent and is not affiliated with, endorsed by, or sponsored by Indeed.
Related job scrapers
- LinkedIn Jobs Scraper for LinkedIn job listings, search URLs, job IDs, Easy Apply signals, and job criteria.
- Indeed Jobs Scraper for Indeed salaries, full descriptions, benefits, skills, and apply links.
Support
If a run does not return what you expected, open an issue with the run ID and the input you used. The run summary shows saved rows, skipped rows, filters, warnings, and stop reason so support can be specific.
Related searches: Indeed scraper, Indeed jobs scraper, scrape Indeed jobs, Indeed job listings, remove duplicate jobs, duplicate-free job scraper, unique job listings, deduped job listings, job board deduplication, Indeed job descriptions, Indeed full description scraper, Indeed salary scraper, Indeed benefits and skills scraper, Indeed Jobs API, job market data, recruiting data, HR analytics, salary benchmarking, job board data, company hiring signals.