Indeed Jobs Scraper: Salaries, Full Descriptions, No Login avatar

Indeed Jobs Scraper: Salaries, Full Descriptions, No Login

Pricing

from $2.00 / 1,000 job with full descriptions

Go to Apify Store
Indeed Jobs Scraper: Salaries, Full Descriptions, No Login

Indeed Jobs Scraper: Salaries, Full Descriptions, No Login

Indeed jobs scraper with salary ranges, company ratings and optional full descriptions. Schedule a monitor that skips jobs already delivered, or group results by hiring company. No login.

Pricing

from $2.00 / 1,000 job with full descriptions

Rating

0.0

(0)

Developer

Agnes Maina

Agnes Maina

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Indeed Jobs Scraper: salaries, full descriptions and a new jobs monitor

This Indeed jobs scraper collects public Indeed job postings with company, location, published salary ranges and posted dates. Full descriptions are on by default and collected when available, and you can filter titles and schedule a monitor that returns only jobs you have not seen before. You pay per delivered row: $0.002 per job with the full description (the default), so $2 per 1,000, or $0.001 per job without it. Companies mode costs $0.01 per company row with an Indeed profile, plus $0.03 per verified owner email.

Limits before you run it: up to 5,000 job rows per run, 2,000 company rows in companies mode, and 20 search URLs. Indeed shows logged out visitors only the first page of a search, so the actor reads page one of several narrower versions of your search and coverage varies. In jobs mode it cannot return applicant counts, recruiter contacts, email addresses or anything behind a login. Companies mode can add the listed CEO's verified work email when findOwnerEmail is on. Salaries are never estimated, a missing description stays null and bills the cheaper event, and a residential proxy is required.

What you get

Two output modes: jobs returns one row per job, companies one row per hiring company. Missing source values are null.

Jobs mode fields, grouped:

  • Identity: jobId, url, title, companyName, searchKeywords, searchLocation, searchUrl
  • Company and place: companyRating, companyReviewCount, location, city, state, country, country is not inferred from the search
  • Pay: salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, jobTypes, benefits
  • Content: snippet from the search card, descriptionText and descriptionHtml when available
  • Dates: postedAt as an ISO publication timestamp, postedAtRaw as the text shown by Indeed, isSponsored

Companies mode fields:

  • Company: companyKey from the search card link, companyName, indeedCompanyUrl, website, domain, industry, employeeRange, revenueRange, founded, headquarters, description capped at 500 characters, companyRating, companyReviewCount
  • Owner: ceoName and ceoApproval as listed on Indeed, ownerFirstName and ownerLastName from the listed CEO name with titles removed, plus ownerEmail, ownerEmailStatus and ownerEmailPattern. The CEO listing does not establish legal ownership.
  • Roles: charged, true when the row was billed with the company event, openRoles and newJobCount, roleTitles and locations capped at 25, newestPostedAt and oldestPostedAt, and jobs with up to 50 jobs, new first, each with jobId, title, url, location, salaryText, postedAt, isNew. openRoles counts matching jobs found by this run's searches, not the company's total vacancies.
  • Trace: searchKeywords, searchLocation, searchUrl, scrapedAt

ownerEmailStatus is verified, probable, unknown, no_domain, no_owner_name, skipped_budget, relay_unavailable, or not_requested when find owner email is off, and only verified is charged. Each run also writes RUN_SUMMARY and DIAGNOSTICS outside the dataset.

Try it in 30 seconds

  1. Open the Actor page in the Apify Store and click Try for free.
  2. Enter keywords, location and country, or paste your Indeed search URLs, set maxJobs to 20 and click Start.

Example output

A captured Indeed result with descriptions disabled. A delivered row holds every field above.

{
"jobId": "9222a6307b90b210",
"url": "https://www.indeed.com/viewjob?jk=9222a6307b90b210",
"title": "Data Engineer",
"companyName": "Resilience",
"companyRating": 3.2,
"companyReviewCount": 33,
"location": "Iowa City, IA",
"city": "Iowa City",
"state": "IA",
"country": "US",
"salaryText": "$100,000 - $140,000 a year",
"salaryMin": 100000,
"salaryMax": 140000,
"salaryCurrency": "USD",
"salaryPeriod": "yearly",
"descriptionText": null,
"descriptionHtml": null,
"isSponsored": false
}

The same search in companies mode, with no email lookup requested:

{
"companyKey": "perfectserve",
"companyName": "PerfectServe",
"indeedCompanyUrl": "https://www.indeed.com/cmp/Perfectserve",
"website": "http://www.perfectserve.com",
"domain": "perfectserve.com",
"ceoName": "Guillaume Castel",
"ceoApproval": 59,
"ownerFirstName": "Guillaume",
"ownerLastName": "Castel",
"employeeRange": "201 to 500",
"revenueRange": "$25M to $100M",
"founded": 1997,
"headquarters": "Knoxville, TN",
"industry": "Information Technology",
"ownerEmail": null,
"ownerEmailStatus": "not_requested",
"ownerEmailPattern": null
}

Pricing

You pay per delivered row:

EventWhen it appliesPrice
job-with-descriptionRow with full description text$0.002, or $2 per 1,000
jobRow without a full description$0.001, or $1 per 1,000
companyCompany row with its Indeed profile$0.01, or $10 per 1,000
owner-emailCompany row with a verified owner email$0.03, or $30 per 1,000
apify-actor-startPlatform start event, per GB of memory, minimum one$0.00005

Each jobs row gets exactly one job event: 500 rows with descriptions cost $1, and 500 without cost half that. In companies mode, 200 company rows cost $2. Across five platform runs on October 7, 2026 the charges matched the delivered rows every time.

Rows for companies without a company page, or whose page fetch fails, come back free with charged: false. Duplicates, filtered rows and jobs skipped by onlyNew are never charged. The actor checks the budget before each write and stops when the next row is not affordable.

Input

FieldTypeDefaultWhat it does
outputstringjobsjobs or companies
searchUrlsarray of stringsnoneUp to 20 Indeed /jobs URLs. A URL carries its own search, so keywords and location are ignored when URLs are given; postedWithinDays cannot be combined with URLs
keywordsstringprefill data engineerSearch phrase, required with location without URLs
locationstringprefill RemoteSent to Indeed, which controls matching
countrystringusus, uk, de, au or ca
postedWithinDaysintegerany age1, 3, 7 or 14, sent as fromage; not with URLs
titleIncludesarray of stringsnoneTitle must contain one phrase
titleExcludesarray of stringsnoneSkip titles containing any phrase
includeDescriptionbooleantrueCollect full descriptions, forced false in companies mode
maxJobsinteger100Global cap, 1 to 5,000, ignored in companies mode
maxCompaniesinteger50Companies mode only, 1 to 2,000
findOwnerEmailbooleanfalseCompanies mode only, checks the CEO's email
onlyNewbooleanfalseSkip jobs already delivered for the same search and filters in 90 days
maxConcurrencyinteger5Concurrent search sessions, 1 to 20
proxyConfigurationobjectApify RESIDENTIALResidential is required, others are refused
{
"keywords": "data engineer",
"location": "Remote",
"country": "us",
"postedWithinDays": 7,
"titleIncludes": ["engineer"],
"titleExcludes": ["intern"],
"includeDescription": true,
"maxJobs": 100
}

Supported URL filters are q, l, radius, fromage, sort, jt, remotejob, sc, salary, filter and limit. Tracking parameters, selected job IDs and starting offsets are removed. Unknown filters are rejected. Only the first page of each variant is requested. Variants use newest ordering, tighter posting ages and smaller radii. Job type variants are added only when no job type is set. Remote and experience variants preserve existing user filters. Variants run in measured yield order, with at most 40 per base search. A search stops after three consecutive variants each add fewer than three unique source jobs. Jobs are deduplicated across all searches; results are not globally sorted by date.

Proxy country follows the domain: US for www.indeed.com, GB for uk.indeed.com, DE for de.indeed.com, AU for au.indeed.com, and CA for ca.indeed.com. Omit the proxy country setting when mixing domains.

Schedule the new jobs monitor

Save a task with your search and onlyNew: true, add it to an Apify schedule, and route the dataset after the run succeeds. The first run returns matching jobs up to the cap, and later runs skip IDs delivered under the same search URLs and title filters within 90 days. Changing maxJobs or concurrency does not reset the history, which lives in the named store indeed-jobs-monitor.

Use one schedule per configuration and do not let runs for it overlap. History is saved every 50 delivered rows and at the end, so a hard crash can repeat at most 50 rows in a later run.

Hiring companies mode

Set output to companies to group jobs by hiring company. Collection stops at maxCompanies, maxJobs is ignored, descriptions are disabled, and companies come back by openRoles descending.

{"keywords":"registered nurse","location":"Chicago, IL","output":"companies","maxCompanies":20}

Turn on findOwnerEmail to check the work email of the CEO listed on Indeed. The actor asks the company's mail server whether that mailbox exists and never sends an email. Only verified addresses are charged, and catch-all domains or inconclusive answers come back probable, free. Apify blocks the mail port, so the check runs on the developer's own mailbox check server, which receives the owner's first name, last name and company domain. Delivery stops with reason budget when the company event no longer fits your spending limit, and ten company page failures in a row stop the run with reason company_pages_failing.

Use cases

  • Recruiting feeds: collect fresh roles for an ATS or a spreadsheet.
  • Hiring signals: watch companies hiring for roles you sell to.
  • Salary research: compare published pay ranges without guessing missing ones.
  • Company lists: group jobs by hiring company and check the listed CEO's mailbox.

Integrations

Call the actor through the Apify API:

curl -X POST "https://api.apify.com/v2/acts/agnes.developer.queen~indeed-jobs-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":"data engineer","location":"Remote","country":"us","maxJobs":20}'

The same call works from Python, Node.js, Make, n8n or Zapier. AI assistants and MCP clients can call the Actor through the Apify MCP server:

https://mcp.apify.com/?tools=agnes.developer.queen/indeed-jobs-scraper

FAQ

Can it scrape Indeed jobs without login?

Yes. It reads public Indeed pages without an account, cookies or login.

Does it return every full description?

Descriptions default to on and succeeded for 63 of 63 jobs in the reviewed Chicago and London runs. Availability changes, so a missing description stays null and the row bills the $0.001 job event.

Why did the run stop before maxJobs?

Indeed shows logged out visitors only the first page, variants can repeat jobs, and filters or monitor history remove candidates. A search stops at its variant cap or at a login wall, and your spending limit and run deadline also stop collection. RUN_SUMMARY records the reason.

How do I get only new jobs?

Set onlyNew to true, save the input as a task and schedule it. Later runs skip job IDs already delivered for that search and filters within 90 days.

Support

Open the Issues tab in Apify Console and include the input, run ID, RUN_SUMMARY and DIAGNOSTICS.