Indeed Jobs Scraper - Complete Results
Pricing
from $0.75 / 1,000 results
Indeed Jobs Scraper - Complete Results
Scrape Indeed jobs by keyword & location in 62 countries: full job description, salary, job type, benefits, skills, GPS, company website, size, revenue & rating. Measured 10,000 jobs in under 2 minutes. Returns the count you ask for, not page one. JSON, CSV, Excel, API.
Pricing
from $0.75 / 1,000 results
Rating
0.0
(0)
Developer
Alwin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
17 days ago
Last modified
Categories
Share
Indeed Jobs Scraper
Scrapes job listings from Indeed and returns the number you asked for — not a partial first page.
Ask for 1,000 jobs, get 1,000. Ask for more than exist and it tells you so, rather than handing back a short dataset and letting you assume that was everything.
Why this one
Indeed caps any single search at about a thousand results. Most scrapers accept that ceiling, which is why you see descriptions like "returns over 1000 results on average — on a good day."
This one goes past it. Each search is read to its end, then widened across the surrounding towns and common title variations, and everything is merged and de-duplicated. Measured on live runs:
| Request | Delivered | Time |
|---|---|---|
nurse across 5 US metros, 10,000 jobs | 10,000 unique | 112 s |
warehouse in Dallas, 3,000 jobs | 3,000 unique | 32 s |
| 2 titles × 2 cities, 1,500 jobs | 1,500 unique | 7 s |
Every one of those rows carried the full job description and Indeed's own coordinates.
Two things follow from that:
- You get the count you requested, assuming the jobs exist.
- When they don't exist, you're told. The run reports how many locations it searched and why it stopped, so a short result is a fact about the job market rather than a mystery about the scraper.
You are billed per row delivered — $0.75 per 1,000 jobs. A run that comes back empty costs you the $0.00005 it took to start it.
Input
| Field | Description |
|---|---|
query | Job title or keywords, e.g. registered nurse |
location | City, or City, ST in the US and Canada |
queries | Several job titles, searched in every location |
locations | Several cities, each also expanded across nearby towns |
country | Which Indeed site to search — 62, all measured |
maxItems | How many jobs you want back. Default 50 |
postedWithinDays | Only jobs posted in the last N days. Empty for all ages |
includeDescription | Full description text on every row. On by default; set false to leave it out |
radiusKm | How far around the location to reach. Default 100, max 300 |
maxSubLocations | How many nearby towns to search across. Default 120 |
strictRelevance | Drop jobs that don't contain your search words. Off by default |
{"query": "registered nurse","location": "New York, NY","country": "us","maxItems": 1000}
Leave query empty to get every job in an area. Leave location empty to search a whole country.
Several titles and cities in one run
Paste lists instead of orchestrating one run per city from your own code:
{"queries": ["registered nurse", "nurse practitioner", "paramedic"],"locations": ["New York, NY", "Chicago, IL", "Houston, TX", "Phoenix, AZ"],"maxItems": 50000}
Every title is searched in every city, and results are de-duplicated across all of them, so a job listed in two of your cities is delivered and billed once. Coverage is spread evenly rather than depth-first: the run works across your whole list at once, so if it stops at your target the rows come from every city you asked for, not from the first two.
Local names work — München, Göteborg, Montréal, Warszawa — as do Austin, Texas and Toronto, Ontario written out in full.
Running on a schedule: only what is new
Set postedWithinDays and you pay for fresh postings instead of re-buying the same jobs every morning:
{"query": "warehouse associate","locations": ["Dallas, TX", "Denver, CO", "Atlanta, GA"],"postedWithinDays": 1,"maxItems": 5000}
Indeed applies the filter before it sends results, so this is not a run that fetches everything and throws most of it away — the search itself is smaller. Measured on one live search: nurse around New York holds 7,938 jobs in total and 194 posted in the last day.
It also reaches postings a broad search does not show you. An unfiltered search is ordered by relevance and stops before it gets to the newest jobs, so 40 of the 42 jobs returned for the last day were absent from the unfiltered results entirely. Worth setting even for a one-off run if what you want is what is new.
Output
Fields depend on the search method. The default (auto) delivered 47 distinct fields on a measured 10,000-job run, a median of 38 per row, every row with its full description, coordinates and, where Indeed has them, the employer's website, size, revenue and rating. pages delivers up to 73 distinct fields, adding the page-only ones marked (pages) below, at a fraction of the speed. One row from the page reader:
{"position": "Registered Nurse - ICU","company": "NewYork-Presbyterian","location": "New York, NY 10032","city": "New York","state": "NY","postalCode": "10032","latitude": 40.7143,"longitude": -74.006,"salary": "$110,000 - $145,000 a year","salaryMin": 110000,"salaryMax": 145000,"salaryPeriod": "YEARLY","salaryCurrency": "USD","salaryIsEstimated": false,"jobType": "Full-time","remoteType": "REMOTE_HYBRID","companyRating": 3.9,"companyReviewCount": 1203,"benefits": ["401(k)", "Health insurance", "Paid time off"],"urgentlyHiring": true,"employerResponseTimeHours": 6,"easyApply": true,"applyMethod": "indeed","atsProvider": "Greenhouse","requiredSkills": ["BLS Certification", "Registered Nurse (RN) License"],"preferredSkills": ["Critical care experience", "Bachelor's degree"],"skills": ["Acute care", "BLS Certification", "Care coordination", "Triage"],"hoursMin": 36,"hoursMax": 40,"hoursPeriod": "WEEKLY","isSponsored": true,"sponsoredBidScore": 73218,"companyLogoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/...","postedAt": "3 days ago","postedDate": "2026-09-22T00:00:00.000Z","url": "https://www.indeed.com/viewjob?jk=4798efd1d9b83baa"}
What that gets you that a plain title-and-company dump does not:
What the job actually asks for. skills carries every qualification Indeed has tagged the listing with, on 100% of rows on the default method. (pages) requiredSkills and preferredSkills carry the employer's own split between essential and nice-to-have, and skills carries every qualification Indeed has tagged the listing with — measured on 98% of rows, median 29 entries. Structured, so you can filter on it, rather than a paragraph of prose you have to parse.
The employer's hiring system (pages). atsProvider names the applicant tracking system behind the listing — Greenhouse, Lever, Workday, iCIMS, SmartRecruiters, BambooHR, UKG, Paycom and twenty more. If you sell to recruiters, that is a qualified lead list falling out of a job scrape. Present on about a third of US rows, and far less outside the US — see the country table below before you buy it for that. Where the vendor is unrecognised you still get atsHost.
Salary you can compute on. salaryMin / salaryMax / salaryPeriod / salaryCurrency as numbers, plus salaryIsEstimated so you can tell Indeed's own estimates apart from figures the employer actually published. That distinction matters for benchmarking and nobody else surfaces it.
Paid placements, and how hard they are bid (pages). isSponsored separates ads from organic results, and sponsoredBidScore carries Indeed's own auction value for the placement — zero on every organic row, non-zero on every sponsored one. The unit is Indeed's, not published anywhere, so treat it as relative: it tells you which employers are spending hardest on which roles.
Location you can map. City, state and postcode split into separate fields, Indeed's own per-job coordinates on nearly every row, a street address where the employer gave one, and (pages) the nearest transit station in metros that have one.
Hiring signals. urgentlyHiring, hiresNeeded, employerResponseTimeHours, applyCount, and exact weekly hours where they are stated — the fields that tell you which postings are live rather than stale.
Non-US markets publish less salary, but not less detail. Indeed publishes pay on most US listings and on few German or Swedish ones. The requirement fields fill that gap: a German run measured skills on 40 of 40 rows, in German, at 34 fields per row.
Company context. Rating, review count, logo, and links to the employer's Indeed profile.
Fields with no value are omitted rather than returned as empty strings, so your schema stays clean.
Full job descriptions and company data — on every row
Every row now carries the complete job description (description, measured at a median of 3,970 characters on a live 100-row run, 100 of 100 rows), alongside Indeed's ~200-character snippet. It is fetched in bulk, a page of jobs at a time, so it does not cost you rows or slow the run the way a per-job fetch would. Set "includeDescription": false if you don't want the text.
The same step adds what a lead list needs about the employer, measured on that run:
| Field | What it is | Coverage |
|---|---|---|
companyWebsite | The employer's own website | 75% |
companySize | Headcount band, e.g. 51 to 200 | 79% |
companyRevenue | Revenue band, e.g. $5M to $25M (USD) | 59% |
companyIndustry, companyDescription | Industry and a short company summary | varies |
companyRating, companyReviewCount | Indeed company rating | 91% |
latitude, longitude | Per-job coordinates from Indeed (coordinatesSource: "indeed") | 100% |
streetAddress, occupations, isHighVolumeHiring, language | Where available | varies |
If that step fails on a page, its rows are still delivered with every search-page field, and coordinates fall back to the city centre. If you explicitly set "includeDescription": true, rows still missing a description get their job page fetched one by one, which is slower and returns fewer rows per run.
What arrives in each country
Every one of the 62 markets has been run and measured, not assumed. Each returned its full 40 of 40 rows with a job title on every row. The numbers below are from one sweep on the same day with no search term, so they describe what a market publishes generally rather than what one profession publishes — and the differences are about employers, not about the scraper.
Local spellings work throughout, in any script: München, Göteborg, Warszawa, São Paulo, 東京, 서울, กรุงเทพฯ, Αθήνα, القاهرة, תל אביב.
Americas
| Country | Rows | Fields | Salary | Skills | Coords |
|---|---|---|---|---|---|
| United States | 40/40 | 35 | 98% | 98% | 83% |
| Canada | 40/40 | 37 | 95% | 98% | 88% |
| Mexico | 40/40 | 34 | 95% | 93% | 70% |
| Brazil | 40/40 | 31 | 75% | 83% | 100% |
| Argentina | 40/40 | 26 | 38% | 0% | 83% |
| Chile | 40/40 | 26 | 23% | 0% | 100% |
| Colombia | 40/40 | 25 | 28% | 0% | 88% |
| Peru | 40/40 | 30 | 90% | 0% | 100% |
| Venezuela | 40/40 | 24 | 0% | 0% | 83% |
| Ecuador | 40/40 | 19 | 23% | 0% | 100% |
| Costa Rica | 40/40 | 22 | 0% | 0% | 75% |
| Panama | 40/40 | 19 | 0% | 0% | 100% |
| Uruguay | 40/40 | 19 | 3% | 0% | 100% |
Europe
| Country | Rows | Fields | Salary | Skills | Coords |
|---|---|---|---|---|---|
| United Kingdom | 40/40 | 32 | 85% | 93% | 83% |
| Ireland | 40/40 | 37 | 78% | 68% | 95% |
| Germany | 40/40 | 33 | 55% | 70% | 100% |
| France | 40/40 | 29 | 70% | 85% | 95% |
| Netherlands | 40/40 | 25 | 35% | 70% | 60% |
| Belgium | 40/40 | 26 | 35% | 73% | 93% |
| Switzerland | 40/40 | 23 | 13% | 75% | 60% |
| Austria | 40/40 | 21 | 0% | 10% | 88% |
| Spain | 40/40 | 28 | 58% | 73% | 100% |
| Italy | 40/40 | 31 | 88% | 83% | 88% |
| Portugal | 40/40 | 30 | 50% | 33% | 90% |
| Sweden | 40/40 | 23 | 5% | 55% | 95% |
| Norway | 40/40 | 22 | 0% | 38% | 90% |
| Denmark | 40/40 | 22 | 0% | 43% | 83% |
| Finland | 40/40 | 20 | 0% | 0% | 88% |
| Poland | 40/40 | 23 | 15% | 75% | 100% |
| Czechia | 40/40 | 26 | 75% | 0% | 98% |
| Hungary | 40/40 | 21 | 5% | 0% | 95% |
| Romania | 40/40 | 18 | 0% | 0% | 95% |
| Greece | 40/40 | 21 | 0% | 0% | 95% |
| Ukraine | 40/40 | 19 | 10% | 0% | 93% |
| Turkey | 40/40 | 29 | 55% | 0% | 85% |
| Luxembourg | 40/40 | 20 | 8% | 0% | 30% |
Asia-Pacific
| Country | Rows | Fields | Salary | Skills | Coords |
|---|---|---|---|---|---|
| Australia | 40/40 | 24 | 20% | 78% | 30% |
| New Zealand | 40/40 | 22 | 0% | 5% | 98% |
| India | 40/40 | 33 | 93% | 90% | 100% |
| Singapore | 40/40 | 27 | 65% | 38% | 83% |
| Hong Kong | 40/40 | 20 | 13% | 63% | 70% |
| Malaysia | 40/40 | 30 | 88% | 0% | 85% |
| Philippines | 40/40 | 33 | 93% | 75% | 90% |
| Pakistan | 40/40 | 30 | 98% | 0% | 100% |
| Indonesia | 40/40 | 20 | 0% | 0% | 98% |
| Thailand | 40/40 | 19 | 18% | 0% | 90% |
| Vietnam | 40/40 | 18 | 8% | 0% | 85% |
| Japan | 40/40 | 30 | 58% | 65% | 100% |
| South Korea | 40/40 | 21 | 18% | 0% | 100% |
| Taiwan | 40/40 | 23 | 50% | 0% | 48% |
| China | 40/40 | 20 | 0% | 0% | 100% |
Middle East & Africa
| Country | Rows | Fields | Salary | Skills | Coords |
|---|---|---|---|---|---|
| South Africa | 40/40 | 23 | 33% | 0% | 70% |
| Nigeria | 40/40 | 30 | 98% | 0% | 90% |
| Egypt | 40/40 | 25 | 45% | 0% | 78% |
| Morocco | 40/40 | 19 | 0% | 0% | 98% |
| United Arab Emirates | 40/40 | 30 | 73% | 5% | 98% |
| Saudi Arabia | 40/40 | 28 | 48% | 0% | 100% |
| Qatar | 40/40 | 30 | 73% | 0% | 75% |
| Kuwait | 40/40 | 25 | 0% | 0% | 90% |
| Bahrain | 40/40 | 27 | 0% | 0% | 83% |
| Oman | 40/40 | 22 | 0% | 0% | 90% |
| Israel | 40/40 | 17 | 0% | 0% | 100% |
Salary is the field that varies most, and it is entirely the market. Employers in Pakistan, Nigeria, India and the US publish pay on nearly every listing. In Indonesia, New Zealand, Austria, Denmark, Norway, Finland, Greece and much of the Gulf they publish almost none. No scraper can return a figure the employer never posted; where salary is thin, skills and requiredSkills carry the detail instead.
Coordinates average 87% and are weakest in Australia, Luxembourg and Taiwan (around 30-48%), because those listings often name a suburb or district that is not a city in the place dataset. Where a job's own district is unknown, the surrounding city is used, so the point is city-level — see the note below.
atsProvider is a US, UK, Canadian and Italian field. It comes from the employer's apply integration: 58% in Italy, 10-15% in the US, UK and Canada, and zero or near-zero across most of Asia, Latin America and the Gulf. If the employer's hiring system is what you're buying, this is a Western dataset.
Russia is not available. Indeed withdrew from the country and ru.indeed.com returns a block page to everyone, so it has been removed from the list rather than left in to fail.
Notes and limits
Two search methods. searchMethod: "auto" (the default) reads Indeed's own structured job data: 100 jobs per request, the full description included, and no dependence on residential proxies. If Indeed ever refuses it, the run switches by itself to reading search pages, which is slower and needs the residential proxy, and says so in the log. searchMethod: "pages" forces the page reader. Choose it only if you need the fields that exist only on the pages: atsProvider, isSponsored / sponsoredBidScore, applyCount, transit stops, working hours and the employer's required-versus-preferred skills split.
Keep the residential proxy configured. The default search does not need it, but the page reader does, and it is the fallback. Changing it to datacenter makes the fallback return nothing.
Reach is set by the job market. A search is read until Indeed has nothing more for it (about a thousand per search), then widened across nearby towns and title variations. maxSubLocations and radiusKm control how far the widening goes; a run that comes back short says why at the end.
The run tells you its own ceiling at the start, before spending anything, and says why it stopped at the end — so a short dataset is never a mystery.
Locations are chosen for spread, not size. Around New York the most populous places within reach are Brooklyn, Queens, Manhattan and the Bronx — one job market under several names, which would bill you repeatedly for the same listings. Towns are picked with a minimum separation between them instead, so a 40-town request reaches Bridgeport, Stamford, Edison, Trenton, Toms River and Danbury across three states. Where a radius is too tight to fill the count at that spacing, the spacing gives way rather than the count, so some near-neighbours do come back on dense requests.
Indeed's matching is loose, and this returns what Indeed returns. A search for nurse also brings back paramedics, EMTs and occasionally an electrician — that is Indeed's ranking, not a fault in the scraper. Set strictRelevance to drop anything that doesn't contain your search words. Be aware it will also drop RN, since the word "nurse" doesn't appear in it; abbreviated titles are the price of strictness, which is why it's off by default.
Coordinates come from Indeed itself on nearly every row (coordinatesSource: "indeed"): 100% of rows on the measured US runs, and above 85% in most of the 62 markets. Where Indeed gives none, the city centre from a bundled place dataset is used instead, and a row that cannot be placed at all carries no coordinates rather than a guess.
How much does it cost to scrape Indeed?
$0.75 per 1,000 jobs, plus $0.00005 to start a run. Nothing else — no compute charge, no proxy charge, no charge for the pages that get blocked and retried along the way.
| What you ask for | What you pay |
|---|---|
| 50 jobs (the default) | $0.04 |
| 1,000 jobs | $0.75 |
| 10,000 jobs | $7.50 |
| 100,000 jobs | $75.00 |
You are charged per row that lands in your dataset, so the run costs what the data costs and nothing more. If Indeed rate-limits every request and the run comes back empty, you pay the $0.00005 it took to start. If you ask for 5,000 jobs in a town that only holds 900, you pay for 900.
Duplicates are removed before anything is charged, so a job that appears in three of the cities you searched is delivered once and billed once.
A measured 10,000-job run finished in under two minutes. Very large requests are limited by how many matching jobs Indeed actually holds, not by the scraper.
Tips
Ask for what you need, not the maximum. The run stops the moment it reaches your target, and everything it has not fetched by then is free. A high maxSubLocations costs nothing on a small run.
Use the lists for volume. queries and locations reach much further than a bigger radius does, because a genuinely different city returns genuinely different jobs while a wider radius mostly returns the same ones.
On a schedule, set postedWithinDays. A daily run without it re-buys the whole job market every morning. With it you pay for the new postings and nothing else, and every row still carries postedDate as a real timestamp so you can filter or de-duplicate on your side.
Leave strictRelevance off unless you have looked at the data. It removes the off-topic rows, and it also removes RN from a nursing search. A junk row you can filter later; a real row that never arrives you will never notice.
Need ATS or sponsored-listing data? Set searchMethod to pages. It is slower and returns fewer jobs per run, so pair it with a modest maxItems.
FAQ
Is scraping Indeed legal? This collects publicly visible job listings — no login, no personal data, nothing behind an account. Public data collection is broadly lawful in the EU and US, but you are responsible for what you do with the output, particularly under GDPR if you combine it with personal data. If you are unsure, take advice.
Why did I get fewer jobs than I asked for? Almost always because Indeed does not have that many for your search. The run says so explicitly in the log, along with how many locations it searched and why it stopped. Widening the radius or adding cities is what increases the number.
Why does a search for one job title return others? That is Indeed's own matching, not this scraper. A search for nurse returns paramedics and EMTs on Indeed's own website too. strictRelevance filters them out if you want that.
Can I get the full job description? Yes, and it is on by default at no extra cost: description holds the complete text. The structured version is there too: requiredSkills, preferredSkills and skills, which are easier to filter on than prose.
Can I search several countries in one run? No — one run covers one Indeed site. Run it once per country; you are billed per row either way, so it costs the same.
Does it work outside the US? Yes, and all 62 markets have been measured on live runs rather than assumed — see the country table above for exactly what arrives in each. You can type the local name of the city: München, Göteborg, Montréal, Warszawa. Expect fewer salary fields in many markets, because fewer employers there publish pay — in Indonesia, New Zealand, Austria and several Gulf states, almost none do.
Support
Found a field that's empty when it shouldn't be, or a count that looks wrong? Open an issue. I use this myself and fix things quickly.