Indeed Reviews Scraper

What staff say
about a company, as rows.

Indeed carries employee reviews for hundreds of thousands of employers - a star rating, a written review, the reviewer's job title and location, and how many people found it helpful. This service turns a company's review page into a table: one row per review, twenty-one columns, with a stable review id you can deduplicate repeat pulls on.

one-time 500 free rows$0.002 per row aftertwenty-one columns per reviewCSV · JSON · Excel
Read this first

You give it a company,
not a search.

The input is one employer's review page, and the size of the run is something you set rather than something you discover.

The query is a company. You can pass the full URL of an Indeed company page - https://www.indeed.com/cmp/TEKsystems - or just the identifier from it, TEKsystems. The published reference puts the batching ceiling at 1000 queries in one request, so a list of employers is a single job rather than a thousand of them.

How many reviews come back is yours to choose. The documented limit defaults to 100 reviews per query, and it is the parameter that decides your bill, because billing follows rows. Two other controls shape the slice rather than its size: sort takes helpfulness or rating_desc, and cutoff takes the oldest timestamp you care about - the reference notes that using cutoff overrides sort and returns the newest records first.

That distinction matters because a company's review page is usually far longer than anything you want to export. Every row we pulled carried review_count, the total Indeed holds for that employer, alongside the handful we had actually asked for - and the two numbers were nowhere near each other. Decide the depth deliberately; the export will not decide it for you.

livescraper.app · what shapes a run
A company URL, or just its Indeed id
Up to 1000 companies in one request
limit - reviews per company, 100 by default
sort - helpfulness or rating_desc
cutoff overrides sort, newest first!
Depth is a parameter, and it is what you pay for.
How it works

A company in,
its reviews out.

No search to build and no filters to reproduce - you name the employer and say how deep to go.

  1. STEP 1Find the employer on Indeed and open its company page.
  2. STEP 2Copy the URL, or just the identifier that follows /cmp/.
  3. STEP 3Sign in to Livescraper and open the Indeed Reviews Scraper.
  4. STEP 4Set how many reviews per company you want, and a sort order if you need one.
  5. STEP 5Paste the company, pick your format and click Get Data.

Several companies at once is the same job - the reference allows up to 1000 queries in a single request.

What you get back

Twenty-one columns,
one review each.

The header we measured, in order. Where a description quotes a fill rate it is counted from 40 real reviews of a single employer - which is enough to establish that a column exists and what shape it takes, and not enough to tell you how often it is populated for a company that is not that one.

query
The company you submitted, echoed on every row so an export covering several employers stays separable.
company
The employer name as Indeed spells it on the company page.
aggregate_rating
The company's overall star rating - a number with one decimal, describing the employer rather than the review. It is the same value on every row of that company's export.
review_count
How many reviews Indeed holds for that employer in total. Also company-level and repeated on every row, and it is normally much larger than the number of rows you asked for. Read it as the size of the pool, not of your export.
rating
The reviewer's own star rating, a whole number from 1 to 5. This is the per-review score, and it arrives as a JSON number.
title
The short headline the reviewer gave the review.
review
The body of the review, as written. Lengths ranged from a couple of lines to several thousand characters across our rows, so budget for a long text column rather than a label.
job_title
The role the reviewer held. Optional on Indeed's form - populated on 32 of our 40 rows.
location
Where the reviewer worked, and reviewer-entered rather than normalised. Our 40 rows carried a mix of "City, ST", bare state names and lowercase free text. Treat it as a string to clean, never as a key. Populated on 29 of 40.
date
The review date, written the way Indeed displays it - July 1, 2026 - not as an ISO date. Parse it before sorting.
current_employee
A true/false flag for whether the reviewer still worked there when they wrote it. A real boolean, not a string.
helpful
How many readers marked the review helpful.
unhelpful
How many marked it unhelpful. Both counters arrive as numbers.
comp_benefits_rating
The reviewer's score for pay and benefits, 1 to 5 - one of five optional category ratings.
culture_rating
The reviewer's score for company culture.
management_rating
The reviewer's score for management.
job_security_rating
The reviewer's score for job security and advancement.
worklife_rating
The reviewer's score for work-life balance. These five behave as one block - see the note below - and unlike rating they arrive as strings.
url
The direct link to that review on Indeed.
review_id
Indeed's identifier for the review - a sixteen-character hex string. On every row we measured it was also the ?id= at the end of url, and all 40 were distinct.
status
A per-row outcome flag from the export layer. It is not part of Indeed's data.

The five category ratings are one field, not five. On our 40 rows comp_benefits_rating, culture_rating, management_rating, job_security_rating and worklife_rating were populated on exactly the same 17 rows and empty on the same 23 - never a partial set. Indeed asks for them as an optional block, so plan for all five or none rather than testing each column. They also arrive as strings while rating arrives as a number, which is the kind of difference a spreadsheet hides and a script does not.

Before you build

Four things this data
will do to you.

Each of these is measured from the 40 reviews we hold. They are properties of Indeed's review form and of the export, not opinions about it.

review_id is the key, and it is already in the URL

Every review carries a sixteen-character review_id, and on all 40 of our rows it was exactly the ?id= at the end of that review's url. All 40 were distinct. That makes it the column to deduplicate on when you pull the same employer again - and it also means you can reconstruct the link from the id, or recover the id from a link somebody sent you, without a lookup.

The date is prose, not a date

date comes through as July 1, 2026 - the wording Indeed prints on the review - and every one of our rows matched that shape. It sorts alphabetically into nonsense and it will not group by month until you parse it. Do that on the way in. The reviews themselves arrived newest first in both of our runs, which is convenient but is not a substitute for a real date column.

Two of the columns describe the company, not the review

aggregate_rating and review_count are employer-level facts repeated on every row - the company's overall score and how many reviews Indeed holds for it. Averaging aggregate_rating across your rows just returns itself, and counting rows is not counting reviews: on our export the pool that review_count described was many times larger than the slice we had asked for. Group by company before you use either.

job_title and location are optional and unnormalised

Indeed lets a reviewer leave both out, and many do: across our 40 rows job_title was present on 32 and location on 29. What is there is free text - our locations included "City, ST" pairs, bare state names and lowercase typing. Neither column is safe to join on or to facet by without cleaning, and neither is safe to assume: filtering on location silently drops the reviewers who never filled it in.

Common workflows

Three jobs people
run this for.

Where a company's reviews are more useful as a table than as an endless scroll.

Employer brand

Read your own reviews properly

Your Indeed page is the first thing a candidate checks and the last thing anyone reads systematically. Exported, it becomes something you can actually work: split by current_employee to separate leavers from staff, group by job_title to see which function is unhappy, and read the five category scores where reviewers left them rather than guessing which one is dragging the average down.

People ops · Employer brand
Competitive intelligence

Compare yourself against the employers you lose to

Batch a list of the companies you compete with for candidates - the reference allows up to a thousand in one request - and pull the same depth of reviews for each. aggregate_rating gives you the headline comparison for free, and the review bodies tell you what the number is made of. That is a far more honest benchmark than a salary survey, because nobody wrote it for you.

Talent · Strategy
Monitoring

Watch for a change instead of a snapshot

Pull the same company on a schedule and deduplicate on review_id; what accumulates is only the new reviews. That turns a static page into a signal - a run of low ratings from one job title, or a sudden burst after a reorganisation, is visible in the diff long before it moves the average that everyone else is looking at.

People analytics
Pricing

Pay for the rows
you actually pull.

No subscription, no minimum, no per-seat licence. Your first 500 rows are on us - after that it is pay-as-you-go.

Free tier

500 free rows - $0

For every new account, one time. No credit card. All scrapers unlocked. At the documented default of 100 reviews per company that is five employers pulled in full before you pay anything.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 reviews. Because limit sets how many reviews come back per company, your bill is something you choose up front rather than something you discover afterwards - a hundred employers at fifty reviews each is the same spend as fifty employers at a hundred.

Most popular
Enterprise

Custom · scheduled monitoring

Volume pricing, SLAs, dedicated workers and tailored onboarding for teams tracking employer sentiment across a large list of companies on a repeating schedule. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

One site is
one point of view.

Employees review their employers in more than one place, and each site attracts a slightly different person. These two cover the ground Indeed does not.

The legal bit

Is it legal to collect
employee reviews?

Short answer: yes, with one thing to be careful about that does not apply to most of our scrapers.

Indeed's company review pages are public. Anyone can read them without an account, and collecting publicly visible pages for research is long-settled practice. As long as the data is publicly available and the process does not disrupt the site, there are no federal laws against it.

The care is warranted because reviews are written by people, and unlike a job listing a review can be about a person. Indeed does not attach a name - there is no author column in this export - but job_title, location and date together can narrow a small team to one individual, and the review body sometimes names a manager. If you are publishing or sharing anything derived from this, aggregate it. If you are storing it, treat it as personal data even though no name is in the file.

Indeed's terms restrict automated access, so this remains a question of terms. We touch nothing behind a login, run no third-party trackers on the data layer, and your exports self-delete after 30 days.

livescraper.app · principles
Public company pages only
No reviewer name in any column
Nobody is contacted, nothing is posted
GDPR-aligned by default
Exports self-delete (30 days)
No name in the file is not the same as anonymous.
Frequently asked

What people ask
before signing up.

The questions we hear most. Something else? Talk to us - humans write the answers, not bots.

What do I submit - a search, or a company?+
A company. The published reference accepts a full Indeed company URL such as https://www.indeed.com/cmp/TEKsystems, or just the identifier from it, TEKsystems. It supports batching with up to 1000 queries in a single request, so a list of employers is one job.
Which columns will the export contain?+
Twenty-one, in this order: query, company, aggregate_rating, review_count, rating, title, review, job_title, location, date, current_employee, helpful, unhelpful, comp_benefits_rating, culture_rating, management_rating, job_security_rating, worklife_rating, url, review_id and status. One row per review. That header was identical on every run of ours that carried this shape, populated or not.
How many reviews do I get per company?+
As many as you ask for. The documented limit defaults to 100 reviews per query, and since billing follows rows it is the parameter that sets your bill. Note that review_count on each row tells you how many reviews Indeed holds for that employer in total, which is usually a much bigger number than the slice you pulled - do not read one as the other.
Can I control which reviews I get?+
Partly. sort accepts helpfulness or rating_desc, and cutoff takes the oldest timestamp you want, which per the reference overrides sort and returns the newest records first. fields narrows the columns. In both of our own runs, with no sort set, the reviews arrived newest first.
Why are the five category ratings often empty?+
Because Indeed asks for them as an optional block. On our 40 rows comp_benefits_rating, culture_rating, management_rating, job_security_rating and worklife_rating were filled on exactly the same 17 rows and empty on the same 23 - never some but not others. So test one of them, not five, and expect a substantial share of reviews to carry only the overall rating. One more trap: the five arrive as strings while rating arrives as a number.
How do I avoid duplicates when I pull a company again?+
Deduplicate on review_id. It is Indeed's own sixteen-character identifier for the review, it was distinct on all 40 of our rows, and it was also the ?id= at the end of that review's url on every one of them. Matching on reviewer text or date instead will merge genuinely different reviews, because short reviews repeat and many share a date.
Is the reviewer's name included?+
No. There is no author or username column - Indeed does not attach one to these reviews, and nothing in the export invents it. Be aware, though, that job_title, location and date in combination can still identify someone at a small employer, so aggregate before you publish.
What does it cost?+
The first 500 rows on a new account are free and one-time; after that it is $0.002 per row - about $2 per 1,000 reviews - pay-as-you-go with no subscription. Credits do not expire and there is no monthly reset.

Find out what your people
actually say.

Name the employer, set how deep to go, and get the reviews as rows - rating, body, job title, location, the five category scores and a stable id to track them by. Your first 500 rows are free.

Indeed Reviews Scraper - employee reviews of a company as structured rows

Indeed holds employee reviews for a very large number of employers, and for many companies it is the review page a candidate reads before an interview and a competitor reads before a poaching campaign. The page itself is built for browsing one review at a time: a star rating, a headline, a paragraph or two, a job title where the reviewer supplied one, and a helpfulness counter. That works when you are reading. It works badly when the question is about the whole page - which function is unhappy, whether the score is moving, what the difference is between what leavers say and what current staff say. The Indeed Reviews Scraper answers those by turning a company's review page into a table: one row per review, twenty-one columns, with a stable identifier you can track a review by across pulls.

The input is an employer rather than a search, which makes this service unusually simple to drive. The published reference accepts either a full company URL or the bare identifier that appears in it, and it allows up to a thousand queries in a single request, so comparing a field of competitors is one job rather than a hundred. The depth of each pull is a parameter - the documented limit defaults to a hundred reviews per company - and because billing follows rows, that parameter is also your bill. Two further controls shape which reviews you get rather than how many: a sort that accepts helpfulness or rating-descending, and a cutoff timestamp that, per the reference, overrides the sort and returns the newest records first.

Three properties of the data are worth knowing before you build on it, and all three are visible in the export we measured. The first is that two of the twenty-one columns are not about the review at all: aggregate_rating and review_count describe the employer and repeat unchanged on every row, so averaging the first across your rows returns itself, and the second describes a pool that is normally much larger than the slice you exported. The second is that the five category ratings - pay and benefits, culture, management, job security and work-life balance - behave as a single optional block: on our rows they were populated together on the same seventeen reviews and absent together on the other twenty-three, never partially. They also arrive as strings while the overall rating arrives as a number. The third is that the date is written as Indeed prints it, in the style July 1, 2026, rather than as an ISO date, so it needs parsing before it will sort or group.

Two honest caveats about the evidence behind this page. Everything counted above comes from forty reviews of one employer, which is enough to establish what a column is and what shape its values take, and not enough to tell you how often any column is filled for a company that is not that one - the fill rates are illustrative, not predictive. And this scraper meets Indeed's anti-bot defences: most of our own attempts returned nothing at all, with the reason recorded in the status column, and the service is listed internally as needing a residential proxy. Runs can fail and retries are normal. What does not vary is the shape of the export, which was identical on every run that carried it. Start free: your first 500 rows cost nothing and need no credit card.