Indeed Job Scraper
Shahid Irfan · @shahidirfan
Extract job listings from Indeed with job titles, company names, salaries, locations, descriptions, employment types, posting dates, and application URLs.
About
What does Indeed Jobs Scraper do?
Indeed Jobs Scraper collects job postings from Indeed.com into a clean, structured dataset. Enter a keyword and location, or paste an Indeed search URL, and the Actor returns job titles, companies, locations, salaries, employment types, remote flags, apply links, company profile details, and full job descriptions. It is built for job-market research, recruiting automation, lead generation, and data pipelines that need reliable Indeed job data without manual copy-paste.
Why use Indeed Jobs Scraper?
- Complete, structured records - Each job includes the title, company, location, salary, employment type, remote status, posting date, apply link, and the full description in both HTML and plain text.
- Flexible search - Run a keyword and location search, paste multiple Indeed search URLs, or submit individual job URLs in a single run.
- Automation-ready output - Export results to JSON, CSV, Excel, or XML, or send them to Google Sheets, Slack, or a webhook.
- Built to keep running - The Actor retries temporary failures, adapts when Indeed changes its responses, and falls back to an alternate listing source automatically.
- No account, login, or cookies required - Start collecting job data immediately.
- Runs on a schedule - Monitor new postings hourly, daily, or weekly to track hiring trends and fresh openings.
What data can you extract from Indeed?
| Field | Description |
|---|---|
title | Job title |
company | Hiring company name |
location | Job location (city, state) |
salary | Salary or pay range when disclosed |
job_type | Employment type(s) such as Full-time, Part-time, Contract |
is_remote | Whether the job is remote (hybrid excluded) |
postedAt | Relative posting time, for example "3 days ago" |
postedDate | ISO posting date |
url | Direct Indeed job URL |
apply_url | External apply link when available |
company_url | Company profile URL on Indeed |
company_industry | Company industry when available |
company_num_employees | Company size when available |
company_revenue | Company revenue range when available |
company_website | Company website when available |
description_html | Full job description in HTML |
description_text | Full job description in plain text |
search_url | The search page where the job was found |
source | Source platform, always "indeed" |
scrapedAt | ISO timestamp for when the job was collected |
How to use Indeed Jobs Scraper
- Open the Actor on Apify Store.
- Enter a keyword such as "software engineer" and, optionally, a location such as "Remote" or "New York".
- Optionally set a posted-date filter, a result limit, and a page limit.
- Run the Actor.
- Download the dataset or connect it to your workflow.
You can also paste one or more Indeed search or job URLs into startUrls. When URLs are supplied, they take priority over the keyword and location inputs.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
keyword | String | No | software engineer | Job search term, for example "data analyst" or "product manager" |
location | String | No | - | Location filter, for example "New York" or "Remote". Empty means nationwide |
startUrls | Array | No | - | Indeed search or job URLs. Takes priority over keyword and location |
posted_date | String | No | - | Date filter: 24h, 7d, 30d, or anytime |
results_wanted | Integer | No | 20 | Maximum number of jobs to save |
maxPages | Integer | No | - | Stop after this many pages (about 100 jobs per page). Empty for automatic |
collectDetails | Boolean | No | true | Include full job descriptions in each record |
proxyConfiguration | Object | No | Apify Residential | Residential proxy is on by default because Indeed blocks datacenter IP ranges. Disable it for local or unblocked networks |
Output Data
| Field | Type | Description |
|---|---|---|
title | String | Job title |
company | String | Hiring company name |
location | String | Job location |
salary | String | Salary or pay range when disclosed |
job_type | Array | Employment type(s) |
is_remote | Boolean | True when the job is remote |
postedAt | String | Relative posting time |
postedDate | String | ISO posting date |
url | String | Indeed job URL |
apply_url | String | External apply link when available |
company_url | String | Company profile URL |
company_industry | String | Company industry when available |
company_num_employees | String | Company size when available |
company_revenue | String | Company revenue range when available |
company_website | String | Company website when available |
description_html | String | Full job description in HTML |
description_text | String | Full job description in plain text |
search_url | String | Search page URL where the job was found |
source | String | Source platform, always "indeed" |
scrapedAt | String | ISO timestamp for when the job was collected |
Usage Examples
Keyword and location search
Collect up to 100 software engineering jobs in a location, posted in the last week.
{
"keyword": "software engineer",
"location": "Remote",
"posted_date": "7d",
"results_wanted": 100,
"collectDetails": true
}
Multiple search URLs
Collect jobs from more than one Indeed search page in a single run.
{
"startUrls": [
"https://www.indeed.com/jobs?q=software+engineer&l=Remote",
"https://www.indeed.com/jobs?q=data+scientist&l=New+York"
],
"results_wanted": 200
}
Fresh postings only
Track only jobs posted in the last 24 hours and cap the run to five pages.
{
"keyword": "registered nurse",
"location": "Texas",
"posted_date": "24h",
"maxPages": 5,
"results_wanted": 500
}
Single job lookup
Fetch full details for one Indeed job URL.
{
"startUrls": [
"https://www.indeed.com/viewjob?jk=30dd3ce95631da0a"
],
"results_wanted": 1
}
Sample Output
{
"title": "Senior Software Engineer",
"company": "Tech Corp",
"location": "Austin, TX",
"salary": "$140,000 - $180,000 a year",
"job_type": ["Full-time"],
"is_remote": true,
"postedAt": "3 days ago",
"postedDate": "2026-10-12T18:30:00.000Z",
"url": "https://www.indeed.com/viewjob?jk=abc123",
"apply_url": "https://techcorp.com/careers/123",
"company_url": "https://www.indeed.com/cmp/Tech-Corp",
"company_num_employees": "1,001 to 5,000",
"company_website": "https://techcorp.com",
"description_html": "<p>We are looking for a senior engineer to join our platform team.</p>",
"description_text": "We are looking for a senior engineer to join our platform team.",
"search_url": "https://www.indeed.com/jobs?q=software+engineer&l=Remote",
"source": "indeed",
"scrapedAt": "2026-10-15T12:00:00.000Z"
}
Tips for Best Results
- Start with a small
results_wantedsuch as 20 to validate your keyword and location before running large jobs. - Use
posted_dateto focus on fresh listings for monitoring workflows. - Use
startUrlswhen you want exact control over the search, for example to apply a specific location or category filter on Indeed. - Set
maxPagesto cap long runs and control cost. - Set
collectDetailstofalsefor faster, lighter runs when you only need job summaries and links. - Schedule the Actor to collect new postings on a recurring basis.
- If a specific field is empty for a job, the employer likely did not publish that detail on Indeed.
Integrations
- Google Sheets - Send job data to a spreadsheet for analysis.
- Webhooks - Notify your systems when a run finishes.
- Make or Zapier - Connect results to no-code automations.
- Slack - Post new job batches to a channel.
- API - Access datasets programmatically from your own applications.
- Exports - Download results as JSON, CSV, Excel, or XML.
Frequently Asked Questions
Can I export Indeed job data to CSV or Excel?
Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other formats directly from the run page or the API.
Do I need an Indeed account or cookies?
No. The Actor collects public job data without an Indeed login, cookies, or account.
Can I run this Actor on a schedule?
Yes. You can schedule the Actor in Apify Console to run hourly, daily, weekly, or at another interval, which is useful for monitoring new job postings.
How many jobs can I collect in one run?
You control the limit with results_wanted, up to the Actor's configured maximum. Use maxPages as an additional cap for very large runs.
Why are some fields empty for a job?
Some employers do not publish a salary, company size, revenue, or website. When the source listing omits a detail, the corresponding field is empty.
Is a proxy required?
On Apify, yes. Indeed blocks datacenter IP ranges, so the Actor enables the Apify Residential proxy by default to collect data reliably. If you run it locally or from an unblocked network, you can turn the proxy off. If an unproxied run on Apify returns no jobs, the Actor automatically retries once through Apify Residential proxy.
Is it legal to scrape Indeed?
Scraping public web data can be legal, but you are responsible for complying with applicable laws, Indeed's terms, and privacy rules. Use the data responsibly.
Support
For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.
Legal Notice
This Actor is designed for legitimate collection of publicly available job data from Indeed. Users are responsible for using the data responsibly and complying with applicable laws and website terms.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Fields
startUrlsIndeed search or job URLs. When supplied, these take priority over keyword/location.
keywordJob search term (e.g., 'software engineer', 'data analyst').
locationLocation filter (e.g., 'New York', 'Remote'). Leave empty for nationwide.
posted_dateFilter by posting date.
results_wantedNumber of jobs to collect. The Actor paginates until it reaches this count or runs out of results.
maxPagesOptional safety cap. Stop after N pages (~100 jobs/page). Leave empty to collect all requested results.
collectDetailsInclude full job descriptions. Enabled by default since descriptions come with the listing.
proxyConfigurationApify Residential proxy is enabled by default for reliable runs, because Indeed blocks datacenter IP ranges. You can disable it for local or unblocked networks.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is shahidirfan/indeed-job-scraper (or shahidirfan~indeed-job-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"helloWorld": 123
};
const run = await client.actor('shahidirfan/indeed-job-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"helloWorld": 123
}
run = client.actor("shahidirfan/indeed-job-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/shahidirfan~indeed-job-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"helloWorld":123}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

G2 Product Reviews Scraper ⭐
Shahid Irfan · @shahidirfan
Scrape G2 reviews, software ratings, SaaS product reviews, customer feedback, pros, cons, reviewer insights, and product details. Extract structured G2 reviews.
Lead generationDeveloper toolsAutomation$29/mo1-day free trial
Tripadvisor Hotels Scraper
Shahid Irfan · @shahidirfan
Extract hotel data from TripAdvisor instantly. Scrape reviews, ratings, prices, amenities & location details at scale. Perfect for travel startups.
TravelDeveloper toolsAutomation$29/mo1-day free trial
Pinterest Search Scraper
Shahid Irfan · @shahidirfan
Scrape Pinterest search results with images, pins, titles, descriptions, boards, creators, URLs, engagement data, and more. Extract keyword-based content.
SEO toolsSocial mediaOther$19/mo1-day free trial
YouTube Comments Scraper API
Shahid Irfan · @shahidirfan
Scrape YouTube comments at scale. Get comment text, replies, author details, timestamps & engagement metrics from any video. Perfect for sentiment analysis.
AISocial mediaVideos$29/mo1-day free trial