Indeed Jobs Scraper - Complete Results avatar

Indeed Jobs Scraper - Complete Results

Pricing

from $0.75 / 1,000 results

Go to Apify Store
Indeed Jobs Scraper - Complete Results

Indeed Jobs Scraper - Complete Results

Pricing

from $0.75 / 1,000 results

Rating

0.0

(0)

Developer

Alwin

Alwin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 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 roughly one page of 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 works around it. A broad search is split into many narrower ones across the surrounding towns, each staying under the cap, and the results are merged and de-duplicated. Coverage comes from breadth, not from paging deeper into a wall.

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

FieldDescription
queryJob title or keywords, e.g. registered nurse
locationCity, or City, ST in the US and Canada
queriesSeveral job titles, searched in every location
locationsSeveral cities, each also expanded across nearby towns
countryWhich Indeed site to search — 62, all measured
maxItemsHow many jobs you want back. Default 50
postedWithinDaysOnly jobs posted in the last N days. Empty for all ages
includeDescriptionAdd the full description text. Off by default — read the note below
radiusKmHow far around the location to reach. Default 100, max 300
maxSubLocationsHow many nearby towns to search across. Default 120
strictRelevanceDrop 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

62 distinct fields across a run, whichever of them Indeed published for each listing — typically 36 on a US job and as many as 48 on the richest, fewer where a country publishes less. Measured on a 4,451-job run across ten US metros. One row:

{
"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. 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. 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. 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, with coordinates on 87% of rows measured across all 62 markets, plus 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

Every row carries snippet, which is Indeed's own preview and caps at about 200 characters. Set includeDescription and you get description as well — the complete text, measured at a median of 4,300 characters across live jobs, with pay, benefits and requirements as the employer wrote them.

{
"query": "registered nurse",
"location": "Brooklyn, NY",
"includeDescription": true,
"maxItems": 200
}

The trade-off, stated plainly. The description is not on the search page, so each job needs its own page fetched. A search request returns about 57 jobs; a description request returns one. Indeed limits how many requests it will answer, so a run with descriptions returns hundreds of jobs rather than thousands before it starts being refused. Keep maxItems modest, or run in batches.

If a job page can't be fetched, that row is still delivered with all its other fields and the run tells you how many arrived without a description. You are never billed for a row you didn't get.


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

CountryRowsFieldsSalarySkillsCoords
United States40/403598%98%83%
Canada40/403795%98%88%
Mexico40/403495%93%70%
Brazil40/403175%83%100%
Argentina40/402638%0%83%
Chile40/402623%0%100%
Colombia40/402528%0%88%
Peru40/403090%0%100%
Venezuela40/40240%0%83%
Ecuador40/401923%0%100%
Costa Rica40/40220%0%75%
Panama40/40190%0%100%
Uruguay40/40193%0%100%

Europe

CountryRowsFieldsSalarySkillsCoords
United Kingdom40/403285%93%83%
Ireland40/403778%68%95%
Germany40/403355%70%100%
France40/402970%85%95%
Netherlands40/402535%70%60%
Belgium40/402635%73%93%
Switzerland40/402313%75%60%
Austria40/40210%10%88%
Spain40/402858%73%100%
Italy40/403188%83%88%
Portugal40/403050%33%90%
Sweden40/40235%55%95%
Norway40/40220%38%90%
Denmark40/40220%43%83%
Finland40/40200%0%88%
Poland40/402315%75%100%
Czechia40/402675%0%98%
Hungary40/40215%0%95%
Romania40/40180%0%95%
Greece40/40210%0%95%
Ukraine40/401910%0%93%
Turkey40/402955%0%85%
Luxembourg40/40208%0%30%

Asia-Pacific

CountryRowsFieldsSalarySkillsCoords
Australia40/402420%78%30%
New Zealand40/40220%5%98%
India40/403393%90%100%
Singapore40/402765%38%83%
Hong Kong40/402013%63%70%
Malaysia40/403088%0%85%
Philippines40/403393%75%90%
Pakistan40/403098%0%100%
Indonesia40/40200%0%98%
Thailand40/401918%0%90%
Vietnam40/40188%0%85%
Japan40/403058%65%100%
South Korea40/402118%0%100%
Taiwan40/402350%0%48%
China40/40200%0%100%

Middle East & Africa

CountryRowsFieldsSalarySkillsCoords
South Africa40/402333%0%70%
Nigeria40/403098%0%90%
Egypt40/402545%0%78%
Morocco40/40190%0%98%
United Arab Emirates40/403073%5%98%
Saudi Arabia40/402848%0%100%
Qatar40/403073%0%75%
Kuwait40/40250%0%90%
Bahrain40/40270%0%83%
Oman40/40220%0%90%
Israel40/40170%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

Use a residential proxy. Indeed refuses datacenter address ranges outright. The default configuration is correct; changing it to datacenter will return nothing. If you already have a residential provider, switch to Custom proxies and paste your own URLs — at volume that is usually cheaper per gigabyte than routing through the platform.

Reach is set by locations, not pages. Indeed serves about 55 jobs per search and refuses to page deeper, so coverage comes from searching more places. maxSubLocations and radiusKm are the levers; there is no deeper page to fetch.

A single run realistically delivers a few thousand jobs, and the limit is the proxy, not the search. Indeed rate-limits per address, so a large run works through addresses until the pool stops answering. Measured on ten US metros with one job title: 4,451 jobs in 20 minutes, from 721 searches of which 284 got through — the first 16 minutes had no outright failures at all, and then refusals became total within four. Runs needing up to roughly 280 searches (the 1,000 and 5,000-job runs) complete cleanly.

So if you want tens of thousands of jobs, split the work across several runs rather than asking one run for everything — by city, or by day using postedWithinDays. Bringing your own residential provider raises the ceiling a lot, because the platform pool is shared with everyone else scraping the same site. You are billed per row either way, so a run that stops short costs you only what it delivered.

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 are city-level, and on 87% of rows. Indeed does not publish street addresses, so latitude / longitude locate the city rather than the office - and where a listing names a district the place dataset does not hold, the surrounding city is used. Rows whose location cannot be placed at all carry 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 forWhat 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.

The larger figures in that table are prices per row, not promises about a single run — see the note on proxy limits below. Tens of thousands of jobs is a job for several runs, and costs the same per row either way.


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.

Bring your own proxies at volume. Residential bandwidth is essentially the whole cost of running this. If you already pay a provider, switch to Custom proxies and paste your URLs.


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? Not currently. Indeed does not include the description in the search response, so it would need a separate request per job and a separate price. What you get instead is the structured version: requiredSkills, preferredSkills and skills, which are on almost every row and 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.