Indeed Scraper
Pricing
from $3.99 / 1,000 results
Indeed Scraper
Indeed, Scraper extracts job listings, titles, companies, locations, salaries, job descriptions, requirements, and posting details from Indeed. Automate job market research, recruitment, salary analysis, competitor hiring research, and talent sourcing with structured employment data.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Indeed Scraper — Job Listings, Salaries, Companies & Apply Links from 62 Countries
Scrape Indeed job postings by keyword and location, or by pasting Indeed URLs directly. Each job comes back with title, company, location, salary, job type, full description in text and HTML, posting date, company rating and reviews, and the external apply link — optionally resolved to its final destination URL.
62 Indeed country domains, deduplication built in, and a tiered proxy fallback that escalates only when it needs to.
What is Indeed Scraper?
Indeed is the largest job aggregator in the world and has no open API for reading arbitrary listings — its Publisher API was retired and access is now partner-only.
This Actor works from the public site. Give it a keyword and location, or paste job, company or search URLs, and it collects the postings behind them, opens each job page for the full description, and normalises everything into flat rows.
Two features make it genuinely useful for pipelines rather than one-off exports: saveOnlyUniqueItems removes duplicate postings automatically (Indeed repeats listings across searches constantly), and followApplyRedirects resolves Indeed's redirect wrapper to the employer's actual application URL.
What data can you extract?
| Group | Fields |
|---|---|
| 💼 Job | positionName, jobType, salary, description, descriptionHTML, id, url |
| 🏢 Company | company, companyIndeedUrl, rating, reviewsCount, companyInfo |
| 📍 Location | location |
| 📅 Timing | postedAt, postingDateParsed, scrapedAt |
| 🔗 Application | externalApplyLink (optionally resolved past redirects) |
| 🔎 Provenance | searchInput, urlInput, isExpired |
Why teams scrape Indeed
For recruiters and staffing agencies
Knowing which companies are hiring, for what, and at what salary is the core input to a staffing pipeline. Because you can run keyword × location combinations in bulk, a whole territory can be refreshed daily rather than checked by hand.
For salary benchmarking
Indeed publishes salary ranges on a large share of listings. Collecting them across a role and location gives you a market rate that is grounded in live postings rather than survey memory.
For job boards and aggregators
Full descriptions in both text and HTML mean you can republish or index listings without a second fetch, and externalApplyLink preserves the path back to the employer.
For competitive and market intelligence
A competitor's open roles reveal their roadmap — the teams they are growing tell you what they are building before any announcement does.
For lead generation in HR tech and recruitment services
Companies posting many roles have active hiring budget. company, companyIndeedUrl, rating and reviewsCount are enough to qualify and prioritise them.
For labour-market research
Posting volume by role, city and country over time is one of the better real-time indicators of economic activity, and 62 country domains make cross-market comparison possible in a single tool.
How to scrape Indeed step by step
- Open the Actor and enter a position or keyword — e.g.
web developer. - Enter a location (city, postcode, or
Remote) and pick a country. - Set Max job listings per search. Note this applies per keyword and per start URL independently.
- Optionally turn on Scrape company details and Follow redirects for apply link.
- Click Start, then export the Output tab as CSV, Excel or JSON.
⬇️ Input
Example input — keyword search
{"position": "web developer","location": "San Francisco","country": "United States","maxItemsPerSearch": 100,"saveOnlyUniqueItems": true}
Example input — URLs
{"startUrls": ["https://www.indeed.com/jobs?q=data+engineer&l=London","https://www.indeed.com/cmp/Google/jobs","https://www.indeed.com/viewjob?jk=5916e62b577782e7"],"maxItemsPerSearch": 200,"followApplyRedirects": true}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
position | string | — | Positions or keywords to search (web developer, data scientist). Can be combined with startUrls — both run independently. |
location | string | — | City, postcode or locality (San Francisco, New York, NY, 90210, Remote). |
country | string | United States | Chooses the Indeed domain — 62 countries supported (US → indeed.com, UK → uk.indeed.com, DE → de.indeed.com, and so on). |
startUrls | array | — | Indeed URLs: job detail (/viewjob?jk=…), company jobs (/cmp/Name/jobs), search/category (/jobs?q=…) or main site URLs. |
maxItemsPerSearch | integer | 10 | Maximum listings per keyword search and per start URL, independently. Range 1–10,000. |
parseCompanyDetails | boolean | false | Also visit each company page to add company rating and review count. Slightly slower. |
saveOnlyUniqueItems | boolean | true | Deduplicate listings. Recommended — Indeed repeats postings across searches heavily. |
followApplyRedirects | boolean | false | Follow externalApplyLink redirects and output the final destination URL. Adds a small delay per job. |
requestDelay | integer | 1 | Seconds between requests, 0–10. Lower is faster; higher is more reliable. |
proxyConfiguration | object | off | Optional. Smart fallback: no proxy → datacenter → residential (3 retries) when blocked. Your own proxy URLs are tried first. |
Read
maxItemsPerSearchcarefully. It is applied independently to each keyword and each start URL. Two keywords plus three URLs at 100 each can return up to 500 jobs.
⬆️ Output
Example output
{"positionName": "Senior Web Developer","company": "Example Systems","companyIndeedUrl": "https://www.indeed.com/cmp/Example-Systems","location": "San Francisco, CA","salary": "$140,000 - $175,000 a year","jobType": "Full-time","postedAt": "3 days ago","postingDateParsed": "2026-08-07T00:00:00Z","rating": 4.1,"reviewsCount": 812,"externalApplyLink": "https://careers.example.com/jobs/1234","url": "https://www.indeed.com/viewjob?jk=5916e62b577782e7","id": "5916e62b577782e7","description": "We are looking for a Senior Web Developer to join our platform team…","descriptionHTML": "<div><p>We are looking for a Senior Web Developer…</p></div>","searchInput": { "position": "web developer", "location": "San Francisco", "country": "United States" },"urlInput": null,"isExpired": false,"scrapedAt": "2026-08-10T11:14:52Z","companyInfo": {}}
Illustrative values — a live run returns current Indeed data.
Usage recipes
Territory sweep for a recruiter
{"position": "registered nurse","location": "Manchester","country": "United Kingdom","maxItemsPerSearch": 500,"parseCompanyDetails": true}
Track one company's hiring
{"startUrls": ["https://www.indeed.com/cmp/Example-Systems/jobs"],"maxItemsPerSearch": 300}
Schedule it weekly and diff on id to see exactly which roles opened and closed.
Multi-country comparison
Run the same role once per country value and merge the exports — or paste country-specific search URLs directly:
{"startUrls": ["https://uk.indeed.com/jobs?q=data+engineer&l=London","https://de.indeed.com/jobs?q=data+engineer&l=Berlin","https://nl.indeed.com/jobs?q=data+engineer&l=Amsterdam"],"maxItemsPerSearch": 200}
Build a direct-apply pipeline
{"position": "product manager","location": "Remote","maxItemsPerSearch": 200,"followApplyRedirects": true}
externalApplyLink then points at the employer's own ATS rather than an Indeed redirect.
Salary benchmarking
Run a broad keyword, export to CSV, and analyse the salary column. Not every posting publishes one, but enough do to establish a market range.
How does this compare to Indeed's official API?
Indeed retired its open Publisher API. What exists today is partner-oriented: access to job data through Indeed requires an approved commercial relationship, and there is no self-serve key that lets you query arbitrary listings.
This Actor reads the public job pages any visitor can see, needs no approval or key, and works identically across all 62 country domains. If you have an Indeed partner agreement, use it — the official route always has better guarantees. If you do not, this is the practical alternative.
Integrate and automate
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperforge/indeed-scraper").call(run_input={"position": "web developer","location": "San Francisco","country": "United States","maxItemsPerSearch": 100,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["positionName"], "|", job["company"], "|", job.get("salary"), "|", job["url"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperforge/indeed-scraper').call({position: 'web developer',location: 'San Francisco',maxItemsPerSearch: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
REST API
curl -X POST "https://api.apify.com/v2/acts/scraperforge~indeed-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"position":"web developer","location":"San Francisco","maxItemsPerSearch":100}'
n8n, Make, Zapier and AI agents
Call the Actor from n8n, Make, Zapier or an MCP-capable agent — for example, a daily job-alert workflow that filters new postings and pushes them to Slack or an ATS.
Schedules and webhooks
Attach a Schedule for daily hiring monitoring and use webhooks to notify your stack, or push results into Google Sheets, Airtable, Slack or Google Drive.
Pricing and what you are charged for
Pay-per-event: a small Actor-start charge plus a charge per job row delivered to your dataset. You pay for listings, not run time.
Cost control:
- Keep
saveOnlyUniqueItemson — you should not pay twice for the same posting. - Remember
maxItemsPerSearchmultiplies across keywords and URLs. parseCompanyDetailsandfollowApplyRedirectsadd requests and time but not extra rows.
Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.
Limits, reliability and blocking
maxItemsPerSearchis per keyword and per URL, applied independently — plan your totals accordingly.- Salary is only present when the employer publishes it. Many listings omit it; the field is then empty rather than estimated.
requestDelayis a real reliability lever. Dropping it to 0 speeds runs up but raises the chance of rate limiting; 1 second is the recommended default.- The proxy chain escalates only when needed — no proxy first, then datacenter, then residential with 3 retries. Pre-enabling a proxy improves success rates on large runs.
followApplyRedirectsadds a request per job, so use it when you actually need the destination URL.- Indeed reposts listings frequently, sometimes with new IDs. Deduplication catches identical postings, not re-listings with fresh identifiers.
companyInfois populated only when company details are requested, and depends on what Indeed publishes.- Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for large multi-keyword runs.
Is it legal to scrape Indeed?
This Actor collects publicly available job postings — content employers publish specifically so candidates find it. It does not log in, submit applications, or access private candidate data.
Job descriptions are copyrighted works belonging to their authors: index and analyse freely, but be careful about wholesale republication. Recruiter names and contact details that appear inside descriptions are personal data under GDPR and comparable regimes — process them lawfully and do not use them for unrelated marketing. You are responsible for ensuring your use complies with Indeed's terms and applicable law.
❓ Frequently asked questions
Do I need an Indeed account or API key?
No. The Actor reads public job pages without credentials.
Does Indeed still have a public API?
Not a self-serve one. The Publisher API was retired and access is now partner-only, which is why public-page scraping is the common route.
Which countries are supported?
62 Indeed domains — US, UK, Canada, Australia, Germany, France, Spain, Italy, Netherlands, India, Japan, Brazil, Mexico, UAE, Singapore, South Africa, Poland, Sweden and many more.
Can I combine keyword search with URLs?
Yes. They run independently, and maxItemsPerSearch applies to each separately.
How do I get the employer's real application link?
Enable followApplyRedirects. Indeed wraps apply links in a redirect; this resolves it to the final destination.
Why is salary missing on some jobs?
Because the employer did not publish one. The Actor extracts salary from the posting and its structured data — it never estimates.
Does it get the full job description?
Yes, in both plain text (description) and HTML (descriptionHTML).
How do I avoid duplicate jobs?
Leave saveOnlyUniqueItems on — it is the default and strongly recommended, since Indeed repeats listings across searches.
What if I get blocked?
Raise requestDelay, and enable a proxy up front rather than relying on the automatic fallback. Residential is the most reliable tier.
Which export format should I use?
CSV or Excel work well — the rows are essentially flat. Use JSON if you want searchInput and companyInfo preserved as objects.
🔗 Related scrapers
- Wellfound Jobs Scraper — startup roles with unusually good salary coverage.
- LinkedIn Company Employees Scraper — who already works at the companies that are hiring.
- LinkedIn Company Scraper with Firmographics & Funding Data — qualify employers by size, industry and funding.
- Leads Scraper — reach the hiring managers behind the postings.
Browse the full collection on the ScraperForge profile.
💬 Feedback
Need extra fields, deeper company data, or a custom hiring-intelligence pipeline? Open an issue on the Issues tab of this Actor.