Indeed Jobs Scraper - Most Comprehensive
Pricing
from $0.04 / 1,000 jobs
Indeed Jobs Scraper - Most Comprehensive
🔥 ~$0.05/1K jobs 🔥 Extract accurate, structured job data from Indeed. Get ALL page results, not just the first page. 60+ fields per job with pre-parsed salary, verified company profiles, GPS coordinates, and hiring signals. 54 countries. Fast, low cost
Pricing
from $0.04 / 1,000 jobs
Rating
4.3
(6)
Developer
Kai
Maintained by CommunityActor stats
38
Bookmarked
7.2K
Total users
1.5K
Monthly active users
3.6 hours
Issues response
4 days ago
Last modified
Categories
Share
Scrape Indeed job listings from 62 countries, with up to 190 fields per job: full descriptions, parsed salaries, skills and certifications as structured tags, complete company profiles, and apply links.
Choose from three data depths: basic, detailed, and rich. The deepest one, rich, adds hiring signals that other Indeed scrapers do not collect: reposts, employer responsiveness, hires needed, required and preferred skills, and sponsored jobs.
Starting at $0.04 per 1,000 jobs.
Why this scraper?
| This scraper | Other Indeed scrapers | |
|---|---|---|
| Price per 1,000 jobs | $0.04 | $0.07-6 |
| Hiring signals: employer responsiveness, hires needed, required or preferred requirements, resume type | Yes | Only a few return any of them |
| Skill and attribute codes as key and label pairs | Yes | A few, without the hiring signals |
| Company profile: CEO, revenue, size, industry, and rating | Yes | Most |
| Working hours as minimum and maximum hours | Yes | None |
| Employer branding reasons | Yes | None |
Indeed search expressions: title:, company:, and exclusions | Documented and tested | Not documented |
| Sponsored placements in search results, with their result position | Yes | A few return a sponsored flag |
| The sponsoring employer's ID, also when a sponsored job appears as an organic result | Yes | None |
| Date, job type, and remote filters together | Yes | Some |
| Direct lookup | By job key, for active and expired jobs | A few, by job URL |
Use cases
Recruiting and staffing leads
Find companies that hire now, with their size, revenue, website, and hiring needs.
{"keyword": "title:(\"registered nurse\")","location": "New York, NY","country": "US","sort": "date","fromDays": "3","maxItems": 100,"searchMode": "rich"}
Use company.name, company.size, company.revenue, company.urls.website,
company.socialLinks, signals.numHires, and apply.url.
Job market research
Compare salaries, skills, benefits, and requirements by role and region.
{"keyword": "title:(\"data analyst\")","location": "New York, NY","country": "US","maxItems": 500}
Use salary.min, salary.max, salary.period, classification.skills,
benefits, requirements.educationLevel, and
requirements.experienceLevel.
Hiring and labor market analytics
Track who hires, how fast they respond, which roles they repost, and how many people they need. Run the same input on an Apify schedule, and compare the results over time.
{"keyword": "title:(\"software engineer\") -intern","location": "Seattle, WA","country": "US","sort": "date","fromDays": "7","jobType": "fulltime","maxItems": 100,"searchMode": "rich"}
Use signals.isRepost, signals.isLatestPost, signals.numHires,
signals.employerResponsive, signals.hiringInsights, and dates.onIndeed.
Recruitment advertising intelligence
See which employers pay to promote jobs, for which searches, and at which result positions.
{"keyword": "nurse","location": "New York, NY","country": "US","maxItems": 100,"searchMode": "rich"}
Keep jobs where signals.isSponsored is true. Use
signals.sponsoredEmployerKey, meta.scrapingInfo.page,
meta.scrapingInfo.index, and company.brandingReasons.
Job boards and aggregators
Publish fresh listings with full descriptions, parsed salaries, addresses, and coordinates.
{"keyword": "software engineer","location": "United States","country": "US","sort": "date","fromDays": "1","maxItems": 0}
Use title.text, description.html, salary.text, location, urls.apply,
and dates.onIndeed. dates.onIndeed is the time the job reached Indeed, and
fromDays filters on this date.
Job monitoring
Check whether known jobs are still open. Copy the jk value from an Indeed
URL, and use it as a job key:
{"jobKeys": ["5e5dafc2a80c214d"],"country": "US"}
signals.isExpired is true when Indeed has closed the listing. Lookups
return full job data for active and expired jobs. A lookup ignores the search
fields, the filters, and maxItems. searchMode still sets the data depth.
Choose a data depth
| Mode | Fields | Results per search | Sponsored placements | Date, job type, and remote filters | Best for |
|---|---|---|---|---|---|
basic (default) | ~165 | Up to 1,000 or more | Not included | A date filter replaces the other two | Large searches, fastest |
detailed | ~170 | Up to 1,000 or more | Not included | A date filter replaces the other two | Hiring insights at full search size |
rich | ~190 | Up to about 450 | Included | All three work together | The most data per job |
Every job includes (basic):
- Job: title, normalized title, full description as text and HTML, snippet, reference number
- Links: Indeed job URL, employer job URL, apply URL
- Classification: job types, occupations, primary occupation, skills, languages, and all Indeed attributes as key and label pairs
- Salary: salary text, parsed minimum, maximum, or exact amount, currency, period, and extras such as bonuses
- Benefits: benefit labels, such as health insurance, 401(k), and paid time off
- Work arrangement: remote flag, shifts, schedules, travel
- Location: full address, city, state, county, postal code, country, latitude, and longitude
- Company: name, industry, size, revenue, descriptions, website, logos, ratings and review counts, CEO, social links, and response rate
- Apply: Easy Apply flag, apply scopes
- Dates: posted date, date on Indeed, expiry date, age text
- Signals: expired, urgent hire, and high-volume hiring flags, and the sponsoring employer's ID for sponsored jobs
- Requirements: experience level, education level, certifications, and other labeled requirements
- Metadata: source, language, locale, search keyword, search location, result page and position
Detailed adds, when Indeed supplies them:
- Hiring insights: candidates needed and hiring-event flag
- Employer-provided attributes and occupations
- Required documents, remote work type, and job photos
Rich adds everything in detailed, plus:
| Field | What you get | Example value |
|---|---|---|
signals.isRepost, signals.isLatestPost | Whether the employer posted this job before, and whether this is the newest post | true, true |
signals.employerResponsive | Indeed marks the employer as responsive to applicants | true |
signals.hiringInsights.employerLastReviewed | Days since the employer last reviewed applications | "4" |
signals.numHires | Number of people the employer wants to hire | 3 |
signals.isSponsored | Whether the job appeared as a paid placement in this search. See sponsored jobs | true |
signals.isNew | Indeed shows the job as new | true |
signals.hiringTags | Hiring tags such as fair-chance hiring | ["Fair chance"] |
requirements.attributes | Skills and qualifications, each marked required or preferred | {"label": "AWS", "requirementStrength": "preferred"} |
requirements.physicalRequirements | Physical requirements of the job | ["Ability to lift 50 pounds"] |
workArrangement.workingHours | Minimum and maximum hours for each period | {"minimumHours": 20, "period": "WEEKLY"} |
apply.resumeType | Whether Indeed Apply needs a resume | "required" |
locationCount | Number of locations for the same posting | 4 |
company.brandingReasons, company.featuredEmployer | Employer branding on Indeed | ["PAID_BRANDING"] |
salary.extracted, salary.snippet | Indeed's own salary parse and salary text | {"min": 152200, "max": 243700, "type": "YEARLY"} |
company.parentEmployer | Parent company name, key, and Indeed page | {"name": "...", "key": "..."} |
Rich mode also adds more benefits, job types, shifts, and schedules to the fields that every job includes.
Search options
Match the jobs you mean
Plain keywords use broad matching and can include related roles. Use Indeed search expressions when title or company matching is important.
| Expression | Meaning |
|---|---|
"data engineer" | Exact phrase in the posting. |
title:(data engineer) | Both words in the title. |
title:("data engineer") | Exact phrase in the title. |
title:("data engineer" or "data scientist") | Either phrase in the title. |
nurse -travel | Include nurse and exclude travel. |
company:Google | Jobs for the specified company expression. |
Indeed supports and, or, not, exclusions, quotes, and parentheses. You
can combine them.
Search within a radius
{"keyword": "software engineer","location": "10001","country": "US","radius": "25","radiusUnit": "miles","maxItems": 50}
Set radiusUnit to km for kilometers.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
keyword | string | empty | Job title, skill, company expression, or search expression. |
location | string | empty | City, state, postal code, or other location text. |
country | string | US | Indeed country site. Allowed codes are listed below. |
maxItems | integer | 20 | Maximum jobs to save. Minimum 0. Use 0 for no Actor-set result cap. |
radius | string | 35 | Search distance. |
radiusUnit | string | miles | miles or km. |
sort | string | relevance | relevance or date. |
fromDays | string | empty | Any time, or jobs from the last 1, 3, 7, or 14 days. |
jobType | string | empty | Any type, fulltime, parttime, contract, temporary, or internship. |
remote | string | empty | Any arrangement, remote, or hybrid. |
jobKeys | string[] | [] | Indeed job keys for direct lookup. |
searchMode | string | basic | basic, detailed, or rich. See Choose a data depth. |
proxyConfig | object | {"useApifyProxy":true} | Apify connection configuration accepted by the Actor. |
Allowed country codes:
US, UK, CA, AU, IN, DE, FR, JP, BR, MX, IT, ES, NL, BE, CH, AT, SG, HK, IE, NZ, AR, BH, CL, CN, CO, CZ, DK, FI, GR, HU, ID, IL, KW, LU, MY, MA, NO, OM, PE, PH, PL, PT, QA, RO, SA, ZA, KR, SE, TW, TR, UA, AE, VE, VN, CR, EC, EG, NG, PA, PK, TH, UY.
Output
Each dataset item is one job. Every documented field is present in every job.
Sample rich job
This redacted rich-mode job is from Visa in Bellevue, WA. Long arrays and maps keep a few items. Square brackets mark values removed from the documentation. It is not a saved Dataset item.
Full field reference
| Field | Type and contents |
|---|---|
id | string. Indeed job key. |
refNum | string or null. Source reference number. |
title | object. text is a string; normalized is a string or null. |
urls | object. indeed is a string. external, apply, and clickTracking are strings or null. |
description | object. text and html are strings or null. |
snippet | string or null. |
classification | object. Contains the classification fields in the rows below. |
classification.jobType | string[]. |
classification.occupations | object with dynamic string keys and string labels. |
classification.primaryOccupation | {key: string, label: string} or null. |
classification.occupationMostLikelySuid | string or null. |
classification.skills, classification.languages | Array of {key: string, label: string} objects. |
classification.attributes | object. all is a dynamic string-to-string map. employerProvided is an array of {key: string, label: string} or null. |
classification.employerProvidedOccupations | Array of {key: string, label: string} objects or null. |
workArrangement | object. isRemote is boolean. locationType, remoteWorkType, and workSchedule are strings or null. shift, schedule, and travel are string arrays. remoteAttributes and workingSystem are arrays of {key: string, label: string}. |
workArrangement.workingHours | object or null. displayType, period, and source are strings; minimumHours and maximumHours are numbers. |
salary | object. text, minCents, maxCents, exactCents, currency, period, source, and detailed are strings or null. min, max, and exact are numbers or null. estimated is boolean. extras is string[]. |
salary.extracted | {min: number, max: number, type: string} or null. |
salary.snippet | {currency: string, source: string, text: string} or null. |
benefits | string[]. |
socialInsurance | object with dynamic string keys and string labels. |
apply | object. url, indeedApplyKey, and resumeType are strings or null; isEasyApply is boolean; scopes is string[]; organicApplyStarts is a number or null. |
location | object. formatted, formattedShort, fullAddress, city, state, stateName, admin2Code, admin2Name, admin3Code, admin3Name, admin4Code, admin4Name, postalCode, streetAddress, country, and countryName are strings or null. latitude and longitude are numbers or null. |
locationCount | number or null. |
company | object. Contains the company fields in the rows below. |
company text and list fields | name, key, sourceName, tier, industry, size, revenue, briefDescription, fullDescription, brandColor, stockSymbol, and phone are strings or null. sectors, customContents, and addresses are string arrays. brandingReasons is string[] or null. |
company flags | subsidiaryOptOut and featuredEmployer are booleans or null. |
company.urls | object. website and indeed are strings or null. |
company.logos | object. square, rectangular, header, header1960x400, and headerAltText are strings or null. squareSizes is {url64: string, url96: string, url128: string, url256: string} or null. |
company.ratings | object. overall, count, and reviewCount are numbers or null. count is the number of star ratings; reviewCount is the number of written reviews. They often differ. |
company.ceo | {name: string or null, photoUrl: string or null} or null. |
company.socialLinks | object. facebook, twitter, and instagram are strings or null. |
company.responsiveness | object or null. averageResponseTimeDays, responseRate, and lastActivityTimeInDays are numbers or null; isActivelyReviewed is boolean or null. |
company.parentEmployer | object or null. name and key are strings; indeedUrl is a string or null; subsidiaryOptOut is boolean or null. |
photos | string[] or null. Job-level image URLs. |
dates | object. posted, onIndeed, validThrough, and age are strings or null; postedToday is boolean. |
signals | object. isExpired, isUrgentHire, and isHighVolumeHiring are booleans. sponsoredEmployerKey is a string or null. isSponsored, isBrandedJob, isRepost, isLatestPost, isPlacement, isNew, employerResponsive, and jobPageExists are booleans or null. applyCount and numHires are numbers or null. hiringTags is string[]. |
signals.matchScores | Array of {key: string, value: string} objects. |
signals.hiringInsights | object or null. numOfCandidates is a number or null; employerLastReviewed and recurringHireText are strings or null; isHiringEvent is boolean. |
requirements | object. certifications, qualifications, physicalRequirements, eligibility, ageRequirement, and experienceDuration are string arrays. experienceLevel and educationLevel are strings or null. |
requirements.attributes | Array of {key: string, label: string, provenance: string, requirementStrength: string} objects or null. |
requiredDocuments | Array of {key: string, label: string} objects or null. |
meta | object. source is a string or null; language, locale, and scrapedAt are strings; workSetting is string[]. |
meta.feed | {isDradis: boolean, sourceType: string or null}. |
meta.search | object. keyword and location are strings or null. |
meta.scrapingInfo | {page: number, index: number}. |
FAQ
How many jobs can I collect?
maxItems is an upper limit, not a required result count. Indeed can return
fewer jobs. Set maxItems to 0 to remove the Actor limit. The run then ends
when Indeed has no more results. See Choose a data depth
for the result range of each mode.
Does rich mode include sponsored jobs?
Yes. Rich mode returns the paid placements in each search, with
signals.isSponsored set to true. The flag shows how the job appeared in
this search. The same job can be sponsored in one search and organic in
another. Use it to track ad placements, or to remove promoted listings.
signals.sponsoredEmployerKey is Indeed's ID for the employer that sponsors
the job. It stays on the job in every search and in lookups, also when the job
appears as an organic result.
Indeed selects the sponsored placements, so they can fall outside the title
expression and the job type filter. They count toward maxItems. To analyze
only organic results, keep jobs where signals.isSponsored is false.
Why are some fields empty?
Indeed does not show all fields on every job. Missing values are null, [],
or {}, as shown in the field reference. Some rich
jobs do not have every rich-mode field. In detailed mode, a job can have only
the basic fields when extra detail is unavailable.
Can a job disappear after I collect it?
Yes. Indeed can change or remove listings at any time. Use a lookup to check whether a job is still open.