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
6K
Total users
1.4K
Monthly active users
3.6 hours
Issues response
13 days ago
Last modified
Categories
Share
Indeed Jobs Scraper
Collect Indeed job listings as structured dataset records.
Use it to compare roles and salaries, monitor company hiring, or build a job dataset. You can search Indeed or look up jobs that you already know.
Each job can include its title and description, Indeed and application URLs, occupation and skill labels, work arrangement, salary, benefits, location, company profile, application details, hiring signals, requirements, and source metadata. The available fields depend on the selected data depth and the job.
Search for jobs
Start with a keyword and location
Enter a keyword and location. Select a search mode when you need more than the default basic data.
{"keyword": "data analyst","location": "New York, NY","country": "US","maxItems": 50,"sort": "date"}
Search within a postal-code radius
{"keyword": "software engineer","location": "10001","country": "US","radius": "25","radiusUnit": "miles","maxItems": 50}
Search in kilometres
{"keyword": "developer","location": "Berlin","country": "DE","radius": "50","radiusUnit": "km"}
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.
{"keyword": "title:(\"Senior Data Engineer\") -intern","location": "United States","maxItems": 100}
{"keyword": "company:Google","location": "San Francisco, CA","maxItems": 100}
Search expressions can be combined:
| 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.
Choose the data depth
| Mode | Use it when | Added data | Available result range | Filter behaviour |
|---|---|---|---|---|
basic | You need essential job data and broad search coverage. | Standard job, company, salary, location, and classification fields. | Up to 1,000 or more results when Indeed makes them available. | A non-empty date filter takes precedence over job type and remote filters. |
detailed | You need hiring insights and detailed requirements. | Available hiring insights, benefits, and requirements with strength levels. | Up to 1,000 or more results when Indeed makes them available. | A non-empty date filter takes precedence over job type and remote filters. |
rich | You need the extra fields from Indeed's rich search route. | Available salary details, working hours, application count, employer responsiveness, sponsorship, and branding. | Up to approximately 450 results. | Date, job-type, and remote filters can be combined. |
Use rich to combine the date, job-type, and remote filters:
{"keyword": "title:(\"Software Engineer\") -intern","location": "Austin, TX","country": "US","maxItems": 100,"radius": "50","radiusUnit": "miles","sort": "date","fromDays": "7","jobType": "fulltime","remote": "hybrid","searchMode": "rich"}
Look up known jobs
Copy the jk value from an Indeed URL and use it as a job key:
{"jobKeys": ["5e5dafc2a80c214d"],"country": "US"}
Lookups return full job data for active and expired jobs. Use them to check
whether known jobs are still open: signals.isExpired is true when Indeed has
closed the listing.
When jobKeys is not empty, search fields are ignored. searchMode still
controls the detail request.
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 passed to Indeed. |
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. When non-empty, search fields are ignored. |
searchMode | string | basic | basic, detailed, or rich. See the mode table above. |
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.
Complete input reference example
Job output
Each dataset item is one job. A saved full job item is not available here. This sample shows selected values only. Use the field reference for the full output contract.
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}. |
Limits
- When
jobKeysis non-empty, lookup mode ignores keyword, location, filters, andmaxItems.searchModestill controls whether the Actor fetches additional job details. maxItems: 0removes the Actor-set cap. The run still ends when Indeed has no more results.- Some results do not contain all rich-only fields.
- Detailed mode can save the standard job record when extra detail is unavailable.
- Indeed does not show all fields on every job. Missing values use
null, empty arrays, or empty maps, as shown in the field reference. - Broad keyword matching can include related roles. Use
title:(...)when title matching is important. - Indeed can change or remove listings, so a result can disappear after collection.