Indeed Job Scraper - turning a job search into structured rows
Indeed is the largest job board in the world, and for most roles in most markets it is where a vacancy appears first. Its search is built for browsing: you type a title and a place, apply a filter or two, and scroll. That works when you are looking for one job. It works badly when the question is a market-wide one - what is the going rate for this role in this city, which employers are hiring for it right now, how has that changed since last month. The Indeed Job Scraper answers those by turning a search into a table: one row per listing, carrying the title, the employer, the location, the advertised pay, the contract type, the posting age, a snippet of the description, the listing URL and Indeed's own job key.
The design of this service puts the filtering where it belongs - on Indeed. An Indeed search URL encodes its own parameters: the keywords as q, the location as l (a postcode or a city and state), a radius around that location, a job-type filter covering full-time, part-time, contract, internship and temporary, a posted-within filter, and a choice between relevance and date ordering. Build the search you want on Indeed, copy the URL, and the run inherits all of it. That is not only convenient, it is the cheapest way to work: narrowing a search costs nothing, while exporting a broad one costs rows.
Two properties of Indeed's data are worth planning for before you build anything on the export. The first is the job key. Every posting on Indeed carries a jk identifier - the value you see in a viewjob link - and it comes through as job_key. That is the column to deduplicate on. Matching on title and company looks equivalent but is not, because the same role is often advertised more than once, sometimes by a recruitment agency and the employer simultaneously, and a text match will either merge two genuine vacancies or split one. The identifier will not. The second is posting age: Indeed writes it relatively on the results card rather than as a date, so it describes the listing at the moment of the run and cannot be compared across runs made at different times. Record your run date and derive real dates from it.
Two further caveats keep the analysis honest. Salary on Indeed is sometimes a figure the employer entered and sometimes a range Indeed models when the employer left it out; the card labels which, and that label travels in the salary string, so it should survive into your data rather than being parsed away - employer-stated pay and estimated pay answer different questions and should not be averaged together. And Indeed interleaves sponsored placements with organic results, meaning position in the list reflects advertising spend as well as relevance. Neither is a flaw to work around; both are simply how the board works, and knowing them is the difference between a defensible salary benchmark and a misleading one. Start free: your first 500 rows cost nothing and need no credit card.