Indeed Jobs Scraper: Salaries, Companies & New Job Alerts avatar

Indeed Jobs Scraper: Salaries, Companies & New Job Alerts

Pricing

from $1.60 / 1,000 jobs

Go to Apify Store
Indeed Jobs Scraper: Salaries, Companies & New Job Alerts

Indeed Jobs Scraper: Salaries, Companies & New Job Alerts

Get Indeed jobs for software engineers, nurses or sales teams by keyword and city, with salaries, company ratings, posting dates and full descriptions. Run daily new-job alerts with saved watch history. About $0.002 per job: 1,000 jobs cost $2. No login.

Pricing

from $1.60 / 1,000 jobs

Rating

0.0

(0)

Developer

mogged

mogged

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

For recruiting teams, job market analysts and people building a daily hiring monitor. Search Indeed by job title and city, export disclosed salaries and company ratings, and keep a daily watch that delivers only new matching job IDs.

A Job costs $0.002, including its public description when requested. 1,000 delivered jobs cost $2, plus a $0.00005 start fee at the standard 512 MB setting. Bronze, Silver and Gold discounts are 5%, 10% and 20%. You do not need an Indeed account, exported cookies or a separate data service.

What you get

DataFields and meaning
JobjobId, title, company, url, employmentType
SalarysalaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText, salaryDisclosed
CompanycompanyRating, companyReviewCount, companyUrl, companyWebsite, companyLogo, companySize, industry
Locationlocations, city, state, postalCode, country, latitude, longitude
DatespostedAt for first appearance on Indeed, datePublished for the supplied publication date, scrapedAt for this observation
Work arrangementworkMode when an explicit remote, hybrid or office source tag exists
Descriptiondescription, detailsIncluded, and explicit experience or education text when requested
Source attributesattributes, an array of Indeed taxonomy keys and labels
MonitoringisNewSinceLastRun, plus a saved history when daily watch mode is enabled
Run overviewA free SUMMARY row and a SUMMARY storage record with delivered jobs, company totals, salary spread and exclusions

Unavailable information stays null. Applicant counts, private employer data and candidate records are not extracted.

Start in three steps

  1. Enter keywords, for example software engineer, nurse or accountant.
  2. Enter one or more locations, choose the matching country, and set maxItems.
  3. Start the run and open the Dataset. Use the overview for salaries and the details view for descriptions, then export JSON, CSV or Excel.

The default asks for 20 software engineering jobs around New York. A cloud validation run on 29 October 2026 delivered 20 jobs in 7.2 seconds. A separate 100-job nursing run with descriptions finished in 23 seconds. These are measured examples; source response times and available results vary.

{
"keywords": ["software engineer"],
"locations": ["New York, NY"],
"country": "US",
"maxItems": 20,
"includeDetails": true
}

Keywords are searched across each supplied location. Company names create separate targeted searches; full names work better than short fragments. The global cap can fill before later cities are reached.

Inputs

InputDefaultHow to use it
keywordsSoftware engineer when no search or URL is suppliedOne or more job titles, skills or Indeed search expressions
locationsA major city for US, GB, CA, AU and ZA; otherwise nationwideCities, regions or postal codes in the chosen market
countryUSUS, GB, CA, AU, NZ, ZA, IN, IE, DE or FR
radius25From 0 to 100; miles for US and GB, kilometres elsewhere
maxItems20From 1 to 5,000 unique delivered jobs across the whole run
includeDetailsfalseAdd the public job description, with contact lines removed; no separate description fee
companiesNo filterNames for Indeed company searches, then case-insensitive employer-name verification
workModeanyremote, hybrid or office requires an explicit matching source tag
postedWithinDaysNo filterCompare the exact postedAt timestamp to the run start time
salaryMinNo filterMinimum explicitly disclosed annual lower bound in the market's currency
experienceYearsNo filterStrict match against an explicit experience range in the description
startUrlsEmptyOptional Indeed search URLs or individual job links
onlyNewSinceLastRunfalseEnable persistent new-job monitoring
watchIddefaultStable name of a watch; 1 to 80 letters, digits, underscores or hyphens
proxyConfigurationAutomaticDatacenter first; residential retries only after a refusal or transport failure

The runtime also accepts query or searchTerms for keywords, location for locations and urls for start URLs.

Salary research

{
"keywords": ["software engineer"],
"locations": ["Seattle, WA"],
"country": "US",
"salaryMin": 80000,
"maxItems": 50
}

This keeps jobs with a disclosed annual lower bound of at least $80,000. It excludes hourly pay and jobs with no disclosed lower bound. It does not turn an hourly figure into an annual estimate, compare different currencies or substitute an Indeed estimated salary.

A range, an exact amount, a minimum-only amount and a maximum-only amount retain their different meanings. The absent bound stays null. Salary spread in the summary is grouped by currency and pay period, so hourly and annual figures are never combined into one misleading range.

Read known jobs or saved searches

{
"startUrls": [
"https://www.indeed.com/jobs?q=nurse&l=Boston%2C+MA&fromage=7",
"https://www.indeed.com/viewjob?jk=d352556bfc9f8ca7"
],
"maxItems": 30,
"includeDetails": true
}

Direct job links are checked before keyword searches. Job IDs deduplicate across links, searches and pages. A job removed or expired at the source produces a free note rather than an invented job row.

Imported search URLs honor q, l, radius and fromage. This Actor uses its own date-oriented source request and begins at the first page; imported sort and start do not select a different order or initial page. Other filters, including opaque sc expressions, are rejected with a free validation note. Recreate supported filters using the documented inputs. Company profile URLs and browsing categories are not supported URL inputs.

Monitor new jobs every day

Create a task using this input and attach an Apify daily schedule to that task:

{
"keywords": ["accountant"],
"locations": ["Chicago, IL"],
"country": "US",
"maxItems": 100,
"onlyNewSinceLastRun": true,
"watchId": "chicago-accounting"
}

The first run establishes a baseline and delivers up to the cap. Later runs require both an unseen ID and a source dateOnIndeed timestamp after the last completed watch window. Older jobs discovered on a later page do not suddenly become new alerts. Changes to an existing job ID are not emitted as new jobs.

A later run that fills its cap keeps its old watch timestamp. Run the task again to drain the remaining new-job backlog. An uncapped successful completion advances the window. Failed source reads and spending-limit stops keep the old window. The baseline intentionally treats older uncollected jobs as history when its window advances.

Watch history is scoped to the Actor, your account and watchId. Use separate names for different searches, and keep a watch's criteria stable. A lock prevents overlapping runs from delivering the same watch simultaneously. If a run is interrupted, resume it before starting another run with the same watch name; an unfinished marker preserves that continuity. Changing the name creates an independent baseline. Deleting a task does not reset its named watch storage.

Output example

These selected fields came from a real signed-out cloud run on 29 October 2026:

{
"jobId": "d352556bfc9f8ca7",
"title": "Junior Software Engineer",
"company": "SOCOTEC",
"locations": ["New York, NY"],
"workMode": "hybrid",
"salaryMin": 110000,
"salaryMax": 140000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"salaryDisclosed": true,
"companyRating": 3,
"companyReviewCount": 605,
"postedAt": "2026-08-03T18:20:32.227Z",
"url": "https://www.indeed.com/viewjob?jk=d352556bfc9f8ca7"
}

verdict is a readable summary at the start of each job row. NOTE and SUMMARY records are distinguishable by recordType; useful job rows have jobId. Filter on jobId when a downstream integration should accept jobs only.

The shared job schema also contains conservative compatibility fields such as companyId, skills, department, roleCategory, applicants and applyUrl. They remain null when this route does not supply a verified value. Use the explicit attributes labels for taxonomy analysis; do not assume every label is an employer-required skill. industry can be a native source classification code.

Pricing and spending limits

Delivered jobsStandard Job charges
20$0.04
100$0.20
1,000$2

Add the small start fee. Discounts apply to Job charges, and descriptions are included. A repeat watch with no new jobs has no Job charge. Failed reads, rejected inputs, duplicate IDs, excluded jobs and summaries have no Job charge. The Actor pays platform usage under its configured pay-per-event model.

The Actor checks available room before saving each new job, stops cleanly when the next Job is unaffordable and records the stop in the summary. A delivered job is saved before its charge. Stable charge keys, a durable dataset ledger and acknowledged charge receipts support recovery after a reboot without charging a saved job twice.

Use with AI agents (MCP)

Connect an Apify-compatible agent to https://mcp.apify.com. Ask it to use moggedhq/indeed-jobs-scraper with a small input first. For example: find 20 nursing jobs around Boston, include public descriptions, and return title, salary, company rating and posting date. Supply keywords, locations, country and maxItems directly. For a daily monitor, also supply a persistent watchId and onlyNewSinceLastRun: true.

It should preserve null salary bounds and pay periods when comparing results. This Actor does not apply to jobs or send alerts itself; connect the output to your own notification workflow.

API and integrations

JavaScript using the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('moggedhq/indeed-jobs-scraper').call({
keywords: ['nurse'], locations: ['Boston, MA'], maxItems: 20,
includeDetails: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const jobs = items.filter(item => item.jobId);

Python uses the same input:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('moggedhq/indeed-jobs-scraper').call(run_input={
'keywords': ['accountant'], 'locations': ['Chicago, IL'],
'maxItems': 20
})
jobs = [item for item in client.dataset(run['defaultDatasetId']).iterate_items()
if item.get('jobId')]

For Make, Zapier or n8n, start the Actor or a saved task, wait for completion, read the dataset and select rows containing jobId. Send those rows to a spreadsheet, database or notification step. An Apify schedule can start the daily task; a success webhook can trigger the next step. A successful run can still contain source notes, so inspect SUMMARY.status and freeFailures as well as the run status.

Limits and practical questions

Does it log into Indeed? No. It reads Indeed's signed-out native job data. It does not request account cookies, solve challenges or access candidate records.

Does it return every matching job? No completeness guarantee is made. Each search reads at most ten pages of up to 100 records. Indeed controls visibility, relevance and pagination. Large or strict searches can deliver fewer rows than requested. Split broad research into separate role and city tasks.

Why is a remote job missing? Strict work-mode filtering requires an explicit source tag. Missing tags stay unknown rather than being treated as office work. Nationwide remote searches can use an appropriate location and keyword, but Indeed can still include adjacent results.

What does experience filtering mean? Only explicit numeric years-of-experience wording is used. Unknown experience is excluded by a strict filter. Fractional years and literal ranges are preserved; seniority labels are not converted into invented year counts. This currently works best with English descriptions.

Why is some description text absent? Contact and recruitment-contact lines are conservatively removed. No personal contact directory is created. Description extraction does not guarantee perfect entity removal from every employer's prose.

Can HTML pages be blocked while the Actor works? Yes. The validated native data route is different from the ordinary HTML page. The internal endpoint or its public app identifier can change, and availability can differ by market. Refusals receive paced retries, followed by free notes if no useful response is available.

Which source terms apply? Indeed's terms govern use of its service and data. This is an independent tool with no Indeed affiliation or endorsement. Use the data for purposes you are permitted to undertake. Review the current source terms before deploying a commercial monitoring workflow.