Indeed Jobs Scraper — salary & posting age as numbers
Pricing
from $5.00 / 1,000 job postings
Indeed Jobs Scraper — salary & posting age as numbers
Scrape Indeed search results into typed rows: salary parsed into min, max, period and a yearly estimate, posting age as a number of days, company rating, benefits and remote flag. Includes a hard cap on results so a run can never bill you more than you asked for.
Pricing
from $5.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Henry Crawl
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Indeed Jobs Scraper — salary, posting age and rating as numbers
Scrape Indeed search results into rows you can sort and filter immediately. Salary
arrives as salaryMin, salaryMax, salaryPeriod and a yearly estimate, posting age
as a number of days, and company rating as a number — not as English strings you have
to parse yourself.
What you get per job
| Field | Example | Notes |
|---|---|---|
jobKey | d8123dc510d5b757 | Indeed's own id, use it to deduplicate across runs |
title | Warehouse Associate - Day Shift | |
company | Berlin Packaging | |
companyRating | 3.8 | Parsed to a number when Indeed shows it |
location | Chicago, IL | |
isRemote | false | |
salaryText | $18 - $22 an hour | Original string, kept for reference |
salaryMin / salaryMax | 18 / 22 | Numbers |
salaryPeriod | hour | hour, day, week, month, year |
salaryCurrency | USD | |
salaryYearlyEstimate | 41600 | Normalised so hourly and yearly postings are comparable |
jobType | Full-time | |
benefits | ["Health insurance","401(k)"] | The benefit chips Indeed shows on the card |
postedDaysAgo | 3 | 0 means posted today |
postedDateApprox | 2026-07-31 | Derived from the posting age |
isUrgentlyHiring, isEasyApply | true | |
snippet | Short description shown on the card | |
jobUrl | Direct link to the posting | |
searchQuery, searchLocation, pageNumber | Provenance of every row | |
indeedDomain, proxyCountry, scrapedAt | The exact context the data was captured in |
Input
{"queries": ["warehouse associate", "forklift operator"],"location": "Chicago, IL","indeedDomain": "www.indeed.com","proxyCountry": "US","datePosted": "last_3_days","jobType": "full_time","maxJobs": 1000}
Or paste Indeed search URLs directly in startUrls.
Filters available: country site, location and radius, date posted, job type, remote only, minimum salary, and sorting by relevance or date.
Why salary comes back as numbers
A job feed is only useful if you can rank it. Hourly and yearly postings are not
comparable as strings, so salaryYearlyEstimate converts both to the same basis
(hourly × 2,080, weekly × 52, monthly × 12). The original salaryText is always kept
so you can audit any conversion.
Country matters
Indeed is country-specific in two independent ways. indeedDomain picks which
national site to search, and proxyCountry decides where the request appears to come
from — which affects both results and currency. They default to the United States.
Residential proxies are used by default: Indeed refuses datacenter IP ranges.
The result cap is real
maxJobs stops the run at exactly that number. The run also stops on its own if three
consecutive pages return nothing usable, so a layout change cannot quietly turn into a
long, expensive run.
Runs fail loudly, not silently
Every run writes a DIAGNOSTICS record with the block rate, bytes per item and the
fill rate of every output field:
{ "itemsExtracted": 500, "blockRate": "0%", "fieldCoverage": { "salaryMin": "62%", "company": "100%" } }
If nothing was extracted, or more than half the pages were blocked, the run is marked failed with the reason. An empty column that looks like data is worse than an error.
Typical uses
- Salary benchmarking by role, city and employer
- Tracking which companies are hiring, and how fast their postings turn over
- Feeding a niche job board or a recruiting pipeline
- Labour market research on posting volume and pay trends
Notes and limits
salaryMin,companyRatingandbenefitsonly appear where Indeed shows them, and are reported asnullelsewhere rather than guessed.postedDateApproxis derived from a relative age ("3 days ago"), so it is accurate to the day, not the hour.- Keep
maxConcurrencylow. Indeed authorises by session.
Support
If a field stops filling or you need a filter that is not exposed, open an issue on the actor page with the input you used.