Indeed Job Scraper
Pricing
Pay per usage
Indeed Job Scraper
Scrape job listings from Indeed.com with salary data, job descriptions, and company info
Pricing
Pay per usage
Rating
0.0
(0)
Developer
George Kioko
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
Indeed Job Scraper - Extract Job Listings, Salaries & Company Data
Scrape job listings from Indeed.com at scale across multiple countries. This actor extracts job titles, company names, salaries, locations, job types, work modes (remote/hybrid/onsite), and posting dates from Indeed search results using Puppeteer with built-in anti-detection and residential proxies.
An ideal indeed api alternative for developers, recruiters, and analysts who need structured job market data without manual copy-pasting.
Key Features
- Multi-country support - Scrape jobs from US, UK, Canada, Australia, and India Indeed domains
- Salary data extraction - Captures salary information when listed by employers
- Anti-detection built in - Stealth browser fingerprinting, randomized delays, residential proxies, and CAPTCHA retry logic
- Automatic pagination - Follows next-page links or builds pagination URLs to collect all results
- Work mode detection - Automatically classifies jobs as remote, hybrid, or onsite
- Job type classification - Detects full-time, part-time, contract, temporary, and internship roles
- Multiple search terms - Run parallel searches for different job titles in a single execution
- Pay-per-event pricing - Only pay for jobs actually scraped at $0.005/job
How It Works
graph LRA["Search Input<br/>(terms, location, country)"] --> B["Puppeteer Browser<br/>(anti-detection + proxy)"]B --> C["Indeed Search Pages<br/>(auto-pagination)"]C --> D["Data Extraction<br/>(jobs, salaries, metadata)"]D --> E["Apify Dataset<br/>(structured JSON)"]style A fill:#4CAF50,color:#fffstyle B fill:#2196F3,color:#fffstyle C fill:#FF9800,color:#fffstyle D fill:#9C27B0,color:#fffstyle E fill:#F44336,color:#fff
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
searchTerms | Array of strings | Yes | ["software engineer"] | Job search keywords. Each term runs as a separate search. |
location | String | No | "" (any) | Job location filter (e.g., "New York, NY", "Remote", "London") |
maxResults | Integer | No | 50 | Maximum jobs to scrape per search term (1-500) |
country | String | No | "us" | Indeed country domain: us, uk, ca, au, or in |
Example Input
{"searchTerms": ["data engineer", "machine learning engineer"],"location": "San Francisco, CA","maxResults": 100,"country": "us"}
Output Data
Each scraped job listing produces a JSON object with the following fields:
{"title": "Senior Software Engineer","company": "Acme Corp","location": "New York, NY 10001","salary": "$130,000 - $160,000 a year","description": "We are looking for a senior engineer to join our platform team...","postedDate": "Posted 3 days ago","url": "https://www.indeed.com/viewjob?jk=abc123def456","jobType": "Full-time","workMode": "hybrid","jobId": "abc123def456","searchTerm": "software engineer","country": "us","scrapedAt": "2026-03-26T14:30:00.000Z"}
| Field | Type | Description |
|---|---|---|
title | String | Job title as listed on Indeed |
company | String | Hiring company name |
location | String | Job location (city, state, zip) |
salary | String | Salary or pay range ("Not listed" if unavailable) |
description | String | Job snippet/summary from search results |
postedDate | String | When the job was posted (e.g., "Posted 5 days ago") |
url | String | Direct link to the full job listing on Indeed |
jobType | String | Full-time, Part-time, Contract, Temporary, Internship, or Not specified |
workMode | String | remote, hybrid, or onsite |
jobId | String | Indeed's unique job identifier |
searchTerm | String | The search keyword that found this job |
country | String | Country code used for the search |
scrapedAt | String | ISO 8601 timestamp of when the job was scraped |
Supported Countries
| Country | Code | Indeed Domain |
|---|---|---|
| United States | us | www.indeed.com |
| United Kingdom | uk | uk.indeed.com |
| Canada | ca | ca.indeed.com |
| Australia | au | au.indeed.com |
| India | in | in.indeed.com |
Use Cases
- Job market research - Track hiring trends, in-demand skills, and salary ranges across industries and geographies
- Salary benchmarking - Compare compensation packages for specific roles across cities and countries
- HR analytics - Monitor competitor hiring activity and workforce expansion signals
- Recruitment tools - Feed job data into applicant tracking systems or candidate matching platforms
- Career analysis - Identify which locations and companies offer the best opportunities for specific roles
- Labor market reports - Generate data-driven reports on employment trends for consulting or media
Pricing
This actor uses pay-per-event pricing:
| Event | Cost |
|---|---|
job-scraped | $0.005 per job listing |
Example costs:
- 50 jobs = $0.25
- 200 jobs = $1.00
- 1,000 jobs = $5.00
Platform costs (compute + proxy) are billed separately by Apify.
How to Run
1. Apify Console (easiest)
- Go to the actor page on Apify Store
- Click Start (or Try for free)
- Fill in the search terms, location, and country
- Click Run and download results from the Dataset tab
2. Apify API
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["product manager", "project manager"],"location": "Remote","maxResults": 100,"country": "us"}'
3. Apify CLI
apify call YOUR_ACTOR_ID -i '{"searchTerms": ["data scientist"],"location": "Austin, TX","maxResults": 50,"country": "us"}'
4. Apify JavaScript SDK
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('YOUR_ACTOR_ID').call({searchTerms: ['software engineer', 'backend developer'],location: 'New York, NY',maxResults: 100,country: 'us',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
5. Apify Python SDK
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("YOUR_ACTOR_ID").call(run_input={"searchTerms": ["software engineer", "backend developer"],"location": "New York, NY","maxResults": 100,"country": "us",})items = list(client.dataset(run["defaultDatasetId"]).iterate_items())print(f"Scraped {len(items)} jobs")
Limitations
- Rate limits - Indeed enforces rate limiting; the actor uses randomized delays (2-6 seconds between pages) and residential proxies to stay within acceptable bounds
- Anti-bot measures - CAPTCHAs may occasionally appear; the actor detects them and retries with a different proxy (up to 3 retries per request)
- Public listings only - Only scrapes publicly visible job listings from Indeed search results; does not access recruiter-only or premium postings
- Salary availability - Not all job listings include salary data; the field returns
"Not listed"when salary is not displayed - Job descriptions - Extracts the snippet/summary shown on search results, not the full job description from individual job pages
- Concurrency - Limited to 3 concurrent browser pages to avoid triggering Indeed's bot detection
- Results cap - Maximum 500 jobs per search term per run
FAQ
How many jobs can I scrape per run?
Up to 500 jobs per search term. You can include multiple search terms in a single run, each with its own limit of maxResults.
Does this scraper get full job descriptions?
The actor extracts the job snippet shown on Indeed's search results page. For full descriptions, you would need to visit each individual job page, which significantly increases runtime and detection risk.
How often does Indeed change its page structure?
Indeed periodically updates its HTML structure. This actor uses multiple CSS selector fallbacks for each data field to handle layout variations. If you notice missing data, please report it so selectors can be updated.
Can I scrape jobs from countries not listed?
Currently the actor supports 5 countries: US, UK, Canada, Australia, and India. Additional Indeed domains can be added on request.
Why are some salaries showing "Not listed"?
Many employers on Indeed choose not to display salary information. The actor can only extract salary data when it is publicly shown on the search results page.
Is this legal?
This actor scrapes publicly available job listing data from Indeed. It uses the data only as displayed to regular users and does not bypass any login walls. Users are responsible for complying with Indeed's Terms of Service and applicable laws in their jurisdiction.
How do I avoid getting blocked?
The actor already includes anti-detection measures: stealth browser configuration, randomized delays, residential proxies, and CAPTCHA detection with automatic retries. For best results, keep maxResults reasonable (under 200 per search term) and avoid running too frequently.
Can I integrate this with Google Sheets or other tools?
Yes. Apify datasets can be exported to CSV, JSON, Excel, or connected directly to Google Sheets, Zapier, Make (Integromat), and other automation platforms through Apify's integrations.
Keywords: indeed scraper, indeed job scraper, scrape indeed jobs, job listing scraper, salary data scraper, job market data, indeed api alternative, job scraping tool, indeed data extraction, recruitment data scraper