Indeed Jobs Scraper - API, Salary & Benefits
Pricing
from $4.00 / 1,000 job listings
Indeed Jobs Scraper - API, Salary & Benefits
Fast API-first Indeed job scraper with full descriptions, salaries, annualized pay, benefits, skills, work arrangement, seniority, company details, emails, and apply links. Search multiple keywords across 50+ countries with remote, job type, salary, date, radius, and title-match filters.
Pricing
from $4.00 / 1,000 job listings
Rating
2.2
(2)
Developer
Newbs
Maintained by CommunityActor stats
14
Bookmarked
448
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Indeed Jobs Scraper: salary, benefits, descriptions, and company data
Collect structured public job listings from Indeed without managing a browser. This API-first Indeed scraper returns full job descriptions, advertised and annualized salary ranges, benefits, skills, work arrangement, seniority, company details, public contact emails, and apply links.
Search multiple keywords in one run across more than 50 Indeed country sites. Filter by location radius, posting age, remote or hybrid work, job type, salary availability, minimum annualized pay, experience level, and exact title phrase.
Use the results for recruiting research, job board feeds, salary benchmarking, hiring-market intelligence, company lead generation, or recurring job alerts. Export the Apify dataset as JSON, CSV, Excel, XML, HTML, or RSS, or connect it to an API, webhook, schedule, Make, Zapier, or n8n.
This Actor is not affiliated with, endorsed by, or sponsored by Indeed.
Pricing
The Actor costs $0.004 per successfully saved job, equal to $4 per 1,000 results. Apify platform usage is billed separately to the user, including compute, storage operations, data transfer, and any proxy traffic used by the run. Apify's recommended $0.00005 Actor-start event is also enabled; in return, Apify waives the first five seconds of compute.
You are charged the result event only when a job is written to the default dataset. Empty searches, jobs rejected by filters, and duplicate jobs do not create billable result events. Set Apify's maximum charge per run to cap event spending; the Actor stops additional searches when that limit is reached.
Why use this Indeed scraper?
- Rich job data: full text and HTML descriptions, salary ranges, benefits, skills, schedules, job attributes, and application URLs.
- Useful compensation fields: original pay period, currency, estimated-pay flag, and annualized minimum and maximum.
- Recruiting-ready company data: company profile, review page, website, industry, employee count, revenue, locations, logo, and public emails when available.
- Precise search controls: keyword, country, city, radius, posting age, work arrangement, job type, salary, seniority, and title phrase.
- Multi-keyword speed: concurrent structured API searches with global job deduplication.
- Operational visibility: every result includes source and quality metadata; every run writes a keyword-level summary to
OUTPUT. - Automation-safe empty searches: a valid search with no jobs succeeds as
EMPTY. Real source failures remain visible as failures.
Common use cases
- Monitor newly posted jobs for selected roles, locations, or companies.
- Compare advertised salaries and benefits across markets.
- Find companies actively hiring for a technology or function.
- Enrich a job board, CRM, spreadsheet, database, or analytics pipeline.
- Analyze remote, hybrid, and on-site hiring demand.
- Track skills, tools, seniority, and job-type trends.
- Build scheduled job alerts and downstream webhooks.
Input
| Field | Type | Default | Description |
|---|---|---|---|
job | string array | Required | Job titles, keywords, skills, or company-related phrases. |
country | string | united states | Indeed country site and API market. |
city | string | Empty | City, state, region, postal code, or broad location. |
radiusMiles | integer | 50 | Search radius from 0 to 100 miles. |
numberOfResults | integer | 5 | Maximum accepted jobs per keyword. |
postedWithinDays | integer | 0 | Maximum posting age; 0 includes all available dates. |
sortType | string | date | date or relevance. |
remoteMode | string | any | any, remote, hybrid, or on-site. |
jobTypes | string array | Empty | Full-time, part-time, contract, temporary, internship, commission, volunteer, or per diem. |
experienceLevel | string | Any | Entry, mid, or senior heuristic classification. |
requireSalary | boolean | false | Keep only listings with exposed compensation. |
minimumAnnualSalary | number | 0 | Minimum annualized maximum pay in the market's currency. |
strictKeywordMatch | boolean | false | Require the full keyword phrase in the job title. |
deduplicateJobs | boolean | true | Remove duplicate jobs across keywords. |
uniqueCompanies | boolean | false | Keep the first accepted job from each company. |
includeDataQuality | boolean | true | Add completeness and field-availability metadata. |
failOnNoResults | boolean | false | Fail instead of accepting a valid empty result. |
maxConcurrency | integer | 3 | Concurrent keyword searches, from 1 to 10. |
maxRequestRetries | integer | 3 | Structured API attempts per keyword, from 1 to 8. |
overfetchFactor | integer | 5 | Extra source records scanned to fill filtered searches. |
proxy | object | Residential | Apify or custom proxy configuration. |
The experience and work-arrangement filters use normalized Indeed attributes plus title, location, and description signals. minimumAnnualSalary converts hourly pay with 2,080 hours/year, daily pay with 260 days/year, weekly pay with 52 weeks/year, and monthly pay with 12 months/year.
Quick start
{"job": ["software engineer", "data scientist", "product manager"],"country": "united states","city": "","numberOfResults": 5,"postedWithinDays": 7,"sortType": "date","deduplicateJobs": true,"includeDataQuality": true,"proxy": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Filtered salary and remote search
{"job": ["software engineer"],"country": "united states","city": "","radiusMiles": 50,"numberOfResults": 25,"remoteMode": "remote","jobTypes": ["full-time"],"requireSalary": true,"minimumAnnualSalary": 120000,"postedWithinDays": 14,"overfetchFactor": 10}
Output
The default dataset contains one item per accepted job. Fields can include:
searchKeyword,searchPosition, and normalizedsearchQuerytitle,jobKey,jobDate,jobType,workArrangement, andexperienceLevelformattedLocationand directindeedJobLinksalary.salaryText, period, min, max, currency, estimated flag, and annualized valuesbenefits,skills,attributes,emails, and work schedulejobDescriptionandsanitizedJobDescriptionapplicationInfo.externalApplyUrl- company profile, reviews, website, industry, size, revenue, locations, logo, and description
sourceextraction metadatadataQualitycompleteness score and field counts
Fields that Indeed does not expose for a specific listing use N/A, null, an empty string, or an empty array as appropriate.
{"searchKeyword": "software engineer","searchPosition": 1,"title": "Senior Software Engineer","subTitle": "Example Company","formattedLocation": "Remote","workArrangement": "remote","experienceLevel": "seniorLevel","jobType": "Full-time","salary": {"salaryText": "$120,000 - $150,000 a year","salaryType": "year","salaryMin": 120000,"salaryMax": 150000,"currency": "USD","isEstimated": false,"annualizedSalaryMin": 120000,"annualizedSalaryMax": 150000},"benefits": ["401(k)", "Dental insurance", "Paid holidays"],"skills": ["Python", "React", "AWS"],"emails": [],"indeedJobLink": "https://www.indeed.com/viewjob?jk=example","applicationInfo": {"directApply": null,"externalApplyUrl": "https://example.com/apply"},"jobDescription": "Full public job description...","company": {"companyName": "Example Company","companyOverviewLink": "https://www.indeed.com/cmp/example","companyReviewLink": "https://www.indeed.com/cmp/example/reviews","companyWebsite": "https://example.com/"},"source": {"extractionMethod": "indeed-graphql","endpoint": "https://apis.indeed.com/graphql","countryCode": "US"},"dataQuality": {"hasSalary": true,"hasBenefits": true,"hasDescription": true,"completenessScore": 1}}
Run summary and diagnostics
The Actor writes OUTPUT to the default key-value store. It reports:
- Overall status and duration
- Result, raw scan, filtered, duplicate, and failed-keyword counts
- Per-keyword
SUCCEEDED,EMPTY,FILTERED, orFAILEDstatus - Attempt method and safe error message
- Whether the maximum pay-per-event charge was reached and the run stopped early
An empty dataset is not automatically evidence of blocking. Check OUTPUT: EMPTY means Indeed returned a valid empty search, FILTERED means source jobs were found but none matched your filters, CHARGE_LIMIT_REACHED means the user-defined spending limit stopped additional results, and FAILED means the source request did not complete.
API and automation
Save frequently used input as an Apify Task, then run it on a schedule. Use webhooks to send completed datasets to a database or workflow.
curl "https://api.apify.com/v2/acts/newbs~Indeed-Job-Scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"job":["data engineer"],"country":"united states","numberOfResults":25}'
For synchronous API usage, use Apify's run-and-get-dataset-items endpoint. For larger searches, start an asynchronous run and read the dataset after the run succeeds.
Tips
- Start with 5-10 results to validate a new search, then increase the limit.
- Use specific phrases such as
senior backend engineerfor cleaner results. - Enable
strictKeywordMatchonly when title precision matters more than coverage. - Increase
overfetchFactorfor restrictive combinations such as remote plus salary plus job type. - Keep residential proxy enabled on Apify unless you provide a reliable custom proxy.
- Keep
deduplicateJobsenabled for overlapping keyword lists. - Use
uniqueCompaniesfor company lead lists rather than job inventory. - Schedule
sortType: "date"withpostedWithinDaysfor recurring monitoring.
FAQ
Does it return full job descriptions?
Yes. The structured Indeed response includes HTML, and the Actor returns both HTML and normalized plain text.
Does it return salary and benefits?
Yes, when Indeed exposes them. Salary includes parsed and annualized values. Benefits are combined from structured attributes and the public description.
Why are some salary or company fields empty?
Indeed does not publish the same fields for every employer, country, or listing. The Actor does not invent missing values. Use dataQuality to filter for complete records.
Can it search multiple job titles?
Yes. Keywords are processed concurrently, and searchKeyword identifies the search that produced each row.
Does an empty search fail?
Not by default. Valid empty searches finish successfully and are marked EMPTY in OUTPUT. Enable failOnNoResults when an empty dataset should break an automation.
Responsible use
This Actor extracts publicly available job-posting data. Results can contain employer-provided content or public contact information. Your use must comply with applicable laws, privacy requirements, contractual obligations, and platform terms.