Indeed Jobs Scraper - API, Salary & Benefits avatar

Indeed Jobs Scraper - API, Salary & Benefits

Pricing

from $4.00 / 1,000 job listings

Go to Apify Store
Indeed Jobs Scraper - API, Salary & Benefits

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

Newbs

Maintained by Community

Actor stats

14

Bookmarked

448

Total users

1

Monthly active users

8 days ago

Last modified

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

FieldTypeDefaultDescription
jobstring arrayRequiredJob titles, keywords, skills, or company-related phrases.
countrystringunited statesIndeed country site and API market.
citystringEmptyCity, state, region, postal code, or broad location.
radiusMilesinteger50Search radius from 0 to 100 miles.
numberOfResultsinteger5Maximum accepted jobs per keyword.
postedWithinDaysinteger0Maximum posting age; 0 includes all available dates.
sortTypestringdatedate or relevance.
remoteModestringanyany, remote, hybrid, or on-site.
jobTypesstring arrayEmptyFull-time, part-time, contract, temporary, internship, commission, volunteer, or per diem.
experienceLevelstringAnyEntry, mid, or senior heuristic classification.
requireSalarybooleanfalseKeep only listings with exposed compensation.
minimumAnnualSalarynumber0Minimum annualized maximum pay in the market's currency.
strictKeywordMatchbooleanfalseRequire the full keyword phrase in the job title.
deduplicateJobsbooleantrueRemove duplicate jobs across keywords.
uniqueCompaniesbooleanfalseKeep the first accepted job from each company.
includeDataQualitybooleantrueAdd completeness and field-availability metadata.
failOnNoResultsbooleanfalseFail instead of accepting a valid empty result.
maxConcurrencyinteger3Concurrent keyword searches, from 1 to 10.
maxRequestRetriesinteger3Structured API attempts per keyword, from 1 to 8.
overfetchFactorinteger5Extra source records scanned to fill filtered searches.
proxyobjectResidentialApify 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"]
}
}
{
"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 normalized searchQuery
  • title, jobKey, jobDate, jobType, workArrangement, and experienceLevel
  • formattedLocation and direct indeedJobLink
  • salary.salaryText, period, min, max, currency, estimated flag, and annualized values
  • benefits, skills, attributes, emails, and work schedule
  • jobDescription and sanitizedJobDescription
  • applicationInfo.externalApplyUrl
  • company profile, reviews, website, industry, size, revenue, locations, logo, and description
  • source extraction metadata
  • dataQuality completeness 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, or FAILED status
  • 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 engineer for cleaner results.
  • Enable strictKeywordMatch only when title precision matters more than coverage.
  • Increase overfetchFactor for restrictive combinations such as remote plus salary plus job type.
  • Keep residential proxy enabled on Apify unless you provide a reliable custom proxy.
  • Keep deduplicateJobs enabled for overlapping keyword lists.
  • Use uniqueCompanies for company lead lists rather than job inventory.
  • Schedule sortType: "date" with postedWithinDays for 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.

Other job data Actors