Indeed Jobs Scraper: Salaries, Full Descriptions, No Login
Pricing
from $2.00 / 1,000 job with full descriptions
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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:
snippetfrom the search card,descriptionTextanddescriptionHtmlwhen available - Dates:
postedAtas an ISO publication timestamp,postedAtRawas the text shown by Indeed,isSponsored
Companies mode fields:
- Company:
companyKeyfrom the search card link,companyName,indeedCompanyUrl,website,domain,industry,employeeRange,revenueRange,founded,headquarters,descriptioncapped at 500 characters,companyRating,companyReviewCount - Owner:
ceoNameandceoApprovalas listed on Indeed,ownerFirstNameandownerLastNamefrom the listed CEO name with titles removed, plusownerEmail,ownerEmailStatusandownerEmailPattern. The CEO listing does not establish legal ownership. - Roles:
charged, true when the row was billed with the company event,openRolesandnewJobCount,roleTitlesandlocationscapped at 25,newestPostedAtandoldestPostedAt, andjobswith up to 50 jobs, new first, each withjobId,title,url,location,salaryText,postedAt,isNew.openRolescounts 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
- Open the Actor page in the Apify Store and click Try for free.
- Enter keywords, location and country, or paste your Indeed search URLs, set
maxJobsto 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:
| Event | When it applies | Price |
|---|---|---|
job-with-description | Row with full description text | $0.002, or $2 per 1,000 |
job | Row without a full description | $0.001, or $1 per 1,000 |
company | Company row with its Indeed profile | $0.01, or $10 per 1,000 |
owner-email | Company row with a verified owner email | $0.03, or $30 per 1,000 |
apify-actor-start | Platform 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
| Field | Type | Default | What it does |
|---|---|---|---|
output | string | jobs | jobs or companies |
searchUrls | array of strings | none | Up 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 |
keywords | string | prefill data engineer | Search phrase, required with location without URLs |
location | string | prefill Remote | Sent to Indeed, which controls matching |
country | string | us | us, uk, de, au or ca |
postedWithinDays | integer | any age | 1, 3, 7 or 14, sent as fromage; not with URLs |
titleIncludes | array of strings | none | Title must contain one phrase |
titleExcludes | array of strings | none | Skip titles containing any phrase |
includeDescription | boolean | true | Collect full descriptions, forced false in companies mode |
maxJobs | integer | 100 | Global cap, 1 to 5,000, ignored in companies mode |
maxCompanies | integer | 50 | Companies mode only, 1 to 2,000 |
findOwnerEmail | boolean | false | Companies mode only, checks the CEO's email |
onlyNew | boolean | false | Skip jobs already delivered for the same search and filters in 90 days |
maxConcurrency | integer | 5 | Concurrent search sessions, 1 to 20 |
proxyConfiguration | object | Apify RESIDENTIAL | Residential 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.
Related Actors
- LinkedIn Jobs Scraper does the same for LinkedIn postings, with a new jobs monitor.
- LinkedIn New Hires Finder finds decision makers who joined a company recently.
- LinkedIn Company Scraper turns company names and URLs into company facts.
Support
Open the Issues tab in Apify Console and include the input, run ID, RUN_SUMMARY and DIAGNOSTICS.