Indeed Jobs Scraper
Under maintenancePricing
Pay per usage
Indeed Jobs Scraper
Under maintenanceScrape Indeed job listings: title, company, salary, description and more. Search by keywords, location and country, or start from Indeed URLs.
Extract job listings from Indeed, the world's largest job site — job title, company, location, salary, full description, ratings, posting date and more. Search by keywords and location across 57 countries, or start directly from Indeed URLs.
Indeed shut down its public Job Search API, so scraping is the only practical way to get this data programmatically. This Actor handles the hard parts for you: browser fingerprinting, residential proxy rotation and Cloudflare anti-bot protection.
Features
- 🔍 Keyword + location search — same as Indeed's "what / where" boxes
- 🌍 57 countries — every Indeed country site, selected with a single input field
- 🎛️ Search filters — date posted, job type, experience level, minimum pay, remote-only, radius, sort order
- 🔗 Start URLs — scrape any Indeed search page, company jobs page or single job URL
- 🏢 Company details (optional) — rating, review count, industry, size, HQ, revenue, description
- ↪️ External apply links (optional) — resolves Indeed's redirect to the employer's real application URL
- ♻️ Deduplication — each job saved once per run, even if it appears in multiple searches
- 📦 Structured output — clean JSON via API, or export CSV / Excel / HTML from the Apify Console
Output example
{"positionName": "Senior Web Developer","id": "8a2f4e15c3b7d901","url": "https://www.indeed.com/viewjob?jk=8a2f4e15c3b7d901","company": "Acme Corp","companyLogo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/acme.png","location": "San Francisco, CA 94105","salary": "$120,000 - $150,000 a year","jobType": ["Full-time"],"rating": 4.2,"reviewsCount": 128,"postedAt": "3 days ago","postingDateParsed": "2026-07-02T08:00:00.000Z","description": "We are looking for a Senior Web Developer…","descriptionHTML": "<p>We are looking for a Senior Web Developer…</p>","externalApplyLink": "https://careers.acme.com/jobs/1234","isExpired": false,"scrapedAt": "2026-07-05T12:34:56.789Z","searchInput": { "position": "web developer", "location": "San Francisco", "country": "US" },"companyInfo": null}
externalApplyLink is the employer's own application URL. Jobs that are applied to through
Indeed Apply have no such URL, so the field is null for them.
Input
| Field | Type | Default | Description |
|---|---|---|---|
position | string | – | Keywords, e.g. web developer |
location | string | – | City, state or zip, e.g. San Francisco |
country | string | US | Country code — determines the Indeed domain |
maxItemsPerSearch | integer | 50 | Result cap per search / per start URL |
datePosted | string | any | Posting window: 1, 3, 7 or 14 days |
jobType | string | any | fulltime, parttime, contract, temporary, internship, permanent, apprenticeship, seasonal, commission, subcontract |
experienceLevel | string | any | entry_level, mid_level, senior_level |
minSalary | string | – | Minimum pay in local format, e.g. $60,000 or £35,000 |
remote | boolean | false | Remote / work-from-home jobs only |
radius | integer | – | Distance from location in miles (max 100) |
sortBy | string | relevance | relevance or date (newest first) |
includeSimilarJobs | boolean | false | Also return near-duplicates Indeed normally hides |
startUrls | array | – | Indeed URLs to scrape directly |
parseCompanyDetails | boolean | false | Attach companyInfo from the employer's Indeed page |
saveOnlyUniqueItems | boolean | true | Deduplicate jobs across searches |
followApplyRedirects | boolean | false | Resolve external apply links to the final employer URL |
maxConcurrency | integer | 5 | Parallel pages (higher = faster, more blocks) |
proxyConfiguration | object | Apify residential | Proxy settings |
Minimal input:
{ "position": "web developer", "location": "San Francisco", "country": "US", "maxItemsPerSearch": 50 }
How many results can I get?
Indeed itself never serves more than ~1,000 results for a single search, no matter how you paginate. To go deeper, split one broad search into several narrower ones — by city, radius, or date posted — and run them as separate searches or start URLs. Duplicates across searches are removed automatically when saveOnlyUniqueItems is on.
Proxy requirements
Indeed uses aggressive anti-bot protection (Cloudflare). Residential proxies are effectively required — datacenter IPs get blocked almost immediately. The default input already selects the Apify RESIDENTIAL proxy group; make sure it is enabled for your Apify account. Expect roughly 0.3–1 GB of residential traffic per 1,000 jobs (the Actor blocks images, fonts and trackers to keep this low).
Integrations & API
Run the Actor from the Apify API, the JavaScript / Python clients, or on a schedule. Connect webhooks to trigger downstream workflows when a run finishes, and read results straight from the run's dataset in JSON, CSV or Excel.
# Run via API and get the datasetcurl "https://api.apify.com/v2/acts/<user>~indeed-scraper/run-sync-get-dataset-items?token=<API_TOKEN>" \-X POST -H 'Content-Type: application/json' \-d '{"position":"data engineer","country":"US","maxItemsPerSearch":100}'
Limitations & fair use
- Only publicly visible job data is collected — nothing behind a login, and no personal data.
- Job listings change fast; results reflect the moment of the run.
- Company-jobs start URLs (
/cmp/…/jobs) are supported on a best-effort basis. startUrlsentries withrequestsFromUrl(remote URL lists) are not supported yet.- Respect Indeed's public data and applicable laws when using the output.
Troubleshooting
- Run finishes with 0 items and "blocks retried" > 0 → your proxy configuration has no residential access. Switch the proxy group to
RESIDENTIAL. - Fewer items than
maxItemsPerSearch→ the search genuinely has fewer results, or the ~1,000 cap was hit. PARSER_DEGRADEDwarnings in the log → Indeed changed its page markup; the Actor falls back to secondary extraction. If fields go missing, please report it — an HTML snapshot is saved to the run's key-value store for diagnosis.
Changelog
0.1.0
- Initial release: keyword/location/country search, start URLs, job details, company enrichment, apply-link resolution, deduplication, 57 countries.