Quarra
Guide · Glassdoor

Glassdoor API alternative: the reviews of any company, with the sub-ratings

Glassdoor says it no longer supports API partnerships. Here is what it still offers, and how to get the reviews of any company with their six sub-ratings and the company's replies, compare two employers, or follow only the new reviews.

Checked against Glassdoor's Help Center and Research page, and measured on November 4, 2026.

Open Glassdoor Reviews Scraper on ApifyErrors and reviews outside your filters are not charged, a run that finds nothing costs only its start, and you can cap the cost of a run.

The short answer

Glassdoor no longer takes API partners. Its Help Center says, in an article updated November 26, 2024, “Glassdoor no longer supports API partnerships”, and the one use of API keys we found described there is employers connecting their Glassdoor reviews to Sprout Social. To get the reviews of any company, with the six sub-ratings, pros, cons, job title, location and the company's reply, our Glassdoor Reviews Scraper delivers them from a company link or name, with no Glassdoor account or API key. Two employers over 7 days, 220 reviews, took a 27-second run.

What Glassdoor offers today

From Glassdoor's Help Center articles Glassdoor API and Sprout Social Integration and its Research page, read on November 4, 2026:

OptionWhat you getCatch
API partnershipsNone offered: “Glassdoor no longer supports API partnerships.” The article sends questions about Glassdoor's data to its Research page.The article is dated November 26, 2024. It says nothing about how to apply.
Employer Center API keysA key created by an Employer Administrator lets an employer “view and respond to Glassdoor reviews” from Sprout Social, per an article updated April 6, 2026.For employers with an Employer Center account. The article describes no other use of the keys.
Research pageArticles and a newsletter from Glassdoor Economic Research, which describes “the latest insights and research on today’s labor market”.The page lists articles. It names no API, dataset or request form.
Our Glassdoor Reviews ScraperEvery review of a company, back to the oldest (very large companies may need several runs), or only those since a date. Rating, six sub-ratings, pros, cons, job title, location, tenure, the company's reply.Paid per review delivered. Glassdoor's terms and privacy law apply to how you use the data.

Compare two employers over the same week

This script reads the reviews posted in the last 7 days about Amazon and Walmart and prints them side by side: the average rating, the six sub-ratings, the share who recommend the company, the share of 1 and 2 stars, and how often and how fast the company replied:

import statistics
from datetime import datetime
from decimal import Decimal
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/glassdoor-reviews-scraper").call(
    run_input={
        "startUrls": [
            "https://www.glassdoor.com/Reviews/Amazon-Reviews-E6036.htm",
            "https://www.glassdoor.com/Reviews/Walmart-Reviews-E715.htm",
        ],
        "since": "7 days",
        "maxReviewsPerCompany": 500,
    },
    max_total_charge_usd=Decimal("2.00"),
)
reviews = [r for r in client.dataset(run.default_dataset_id).iterate_items()
           if r["type"] == "review" and r["status"] == "ok"]


def when(s):
    return datetime.fromisoformat(s.replace("Z", "+00:00"))


def mean(rs, key):
    values = [r[key] for r in rs if r[key] is not None]
    return round(statistics.mean(values), 2) if values else None


def percent(part, whole):
    return round(100 * part / whole) if whole else None


def hours_to_reply(rs):
    delays = [(when(r["employerResponseDate"]) - when(r["date"])).total_seconds() / 3600
              for r in rs if r["employerResponseDate"]]
    return round(statistics.median(delays)) if delays else None


rows = [
    ("Reviews", len),
    ("Oldest review", lambda rs: min(r["date"] for r in rs)[:10]),
    ("Average rating", lambda rs: mean(rs, "rating")),
    ("Work/life balance", lambda rs: mean(rs, "workLifeBalanceRating")),
    ("Culture and values", lambda rs: mean(rs, "cultureAndValuesRating")),
    ("Diversity and inclusion", lambda rs: mean(rs, "diversityAndInclusionRating")),
    ("Career opportunities", lambda rs: mean(rs, "careerOpportunitiesRating")),
    ("Compensation and benefits", lambda rs: mean(rs, "compensationAndBenefitsRating")),
    ("Senior management", lambda rs: mean(rs, "seniorManagementRating")),
    ("% who recommend", lambda rs: percent(
        sum(r["recommend"] == "positive" for r in rs),
        sum(r["recommend"] is not None for r in rs))),
    ("% of 1 or 2 stars", lambda rs: percent(sum(r["rating"] <= 2 for r in rs), len(rs))),
    ("% with a company reply", lambda rs: percent(sum(bool(r["employerResponse"]) for r in rs), len(rs))),
    ("Median hours to reply", hours_to_reply),
]

companies = sorted({r["companyName"] for r in reviews})
print(f"{'':28}" + "".join(f"{c:>12}" for c in companies))
for label, fn in rows:
    values = [fn([r for r in reviews if r["companyName"] == c]) for c in companies]
    print(f"{label:28}" + "".join(f"{str(v):>12}" for v in values))

Tested with apify-client 3.4 on November 4, 2026: 220 reviews in a 27-second run, the output below. max_total_charge_usd keeps the run under $2.00 whatever the companies post. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

Reviews dated October 28 to November 3, 2026AmazonWalmart
Reviews16258
Oldest review2026-10-282026-10-28
Average rating3.463.38
Work/life balance3.183.42
Culture and values3.183.16
Diversity and inclusion3.713.84
Career opportunities3.683.5
Compensation and benefits3.923.34
Senior management3.163.16
% who recommend5955
% of 1 or 2 stars1921
% with a company reply048
Median hours to replyNone38

A few things the table does not say by itself. Among the 162 Amazon reviews delivered, none carries a company reply; among Walmart's 58, 28 do. The recommend question was left blank on 60 of Amazon's reviews and 25 of Walmart's, and the script leaves those out of the percentage. A sub-rating the reviewer skipped comes as null, never 0, and is left out of the average. Without a language set you get every language: 15 of Amazon's 162 reviews were not in English, so add "languages": ["en"] to compare English reviews only. And a week is a sample: with 58 reviews on one side, a gap of 0.08 stars is too small to read. Widen since and maxReviewsPerCompany before you conclude anything.

Only the new reviews, every day

The Actor has no watch mode: it does not remember what it delivered before. Schedule it on Apify with a window longer than the interval, and keep the review IDs you have already seen. reviewId is unique on Glassdoor and does not change between runs. This script reads the last 2 days of Walmart reviews, appends the ones it has not seen to a file and prints what is new. Run it once a day:

import json
from pathlib import Path
from apify_client import ApifyClient

SEEN = Path("seen-review-ids.json")
seen = set(json.loads(SEEN.read_text())) if SEEN.exists() else set()

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/glassdoor-reviews-scraper").call(run_input={
    "startUrls": ["https://www.glassdoor.com/Reviews/Walmart-Reviews-E715.htm"],
    "since": "2 days",
    "maxReviewsPerCompany": 100,
})
delivered = [r for r in client.dataset(run.default_dataset_id).iterate_items()
             if r["type"] == "review" and r["status"] == "ok"]
new = [r for r in delivered if r["reviewId"] not in seen]

with open("new-reviews.jsonl", "a", encoding="utf-8") as f:
    for r in new:
        f.write(json.dumps(r, ensure_ascii=False) + "\n")
SEEN.write_text(json.dumps(sorted(seen | {r["reviewId"] for r in delivered})))

print(len(delivered), "delivered,", len(new), "new,",
      sum(r["rating"] <= 2 for r in new), "of them at 1 or 2 stars")

On November 4, 2026, two executions about 13 seconds apart. The first printed 13 delivered, 13 new, 3 of them at 1 or 2 stars. The second delivered the same 13 reviews and printed 13 delivered, 0 new, 0 of them at 1 or 2 stars. Both runs were charged for their 13 reviews, $0.06 each on the Free plan, because a review is charged every time it is delivered. At that rate a daily schedule costs about $1.83 a month on the Free plan. A window of 1 day would cost less but leaves no margin when a run is late or fails. If a company posts more than maxReviewsPerCompany reviews in the window, the newest are kept and the run says so in its status: raise the number.

Whole history

Leave since out, leave maxReviewsPerCompany empty and raise maxItems, which is 1,000 by default for all companies together, to read a company back to its first review:

{
  "startUrls": ["https://www.glassdoor.com/Reviews/MOD-Pizza-Reviews-E366264.htm"],
  "maxItems": 5000
}

On November 4, 2026, this input read MOD Pizza from its newest review back to its oldest, dated July 14, 2014: 1,795 reviews in 17 seconds, 1,795 distinct review IDs, and the same 1,795 as the company's review count in the run summary. Reading it in full costs $7.72 on the Free plan and $7.36 on Business.

Limits

  • No reviewer name, profile or ID. Names and signatures in the company's replies are removed by a name-recognition step that is good but not perfect, so treat a reply as text that may still hold a name.
  • Reviews only: no salaries, interview reports or job listings.
  • Dates are delivered in UTC. Glassdoor gives review times without a time zone; the Actor converts them to UTC from US Pacific time, which is our measurement, not a Glassdoor statement.
  • A company given by name works when exactly one company has that name. With several matches you get a free error record that lists them, and you then use the link.
  • Glassdoor sorts reviews in seven languages (en, fr, de, nl, pt, es, it). The very few written in another language come with language set to null.
  • A single rating filter is applied by Glassdoor itself. Several ratings and the keywords filter are applied by the Actor, so a rare word on a large company means reading many pages. Reviews that do not match are not charged; bound the reading with since or maxReviewsPerCompany.
  • A date far in the past on a very large company is looked up in each language and can cost more than one run can cover. The run says so; pick one or two languages.
  • If Glassdoor limits access during a run, the run says so in its status and keeps what it delivered. Running it again later gives the rest.
  • Glassdoor's terms and privacy law apply to how you use the data.

What it costs

Apify planPer 1,000 reviews
Free$4.30
Starter$4.30
Scale$4.20
Business and above$4.10

Plus $0.005 per run start at the default memory. The 220 reviews of the comparison cost $0.95 on the Free plan and $0.91 on Business. Reviews outside your filters, a review given more than once in the same run and error records are not charged.

Questions

Does Glassdoor have an API?

Not one you can apply to. Its Help Center article “Glassdoor API”, updated November 26, 2024, says “Glassdoor no longer supports API partnerships.” Employers can create API keys in the Employer Center to connect Sprout Social, per an article updated April 6, 2026.

How do I get all the reviews of a company?

Give the Actor the company link or its name, leave Max reviews per company empty and raise Max results in total. It reads back to the oldest review: 1,795 of 1,795 for MOD Pizza on November 4, 2026.

Can I get the name of the reviewer?

No. The Actor delivers no reviewer name, profile or ID, and removes names from the company's replies. The review ID and link let you find a review on Glassdoor.

Do I need a Glassdoor account or an API key?

No. You need an Apify account and its API token.

Run it on the Apify Store

Reviews cost $4.30 per 1,000 on the Free and Starter plans ($4.20 on Scale, $4.10 on Business and above), plus $0.005 per run at the default memory. Errors and reviews outside your filters are not charged, a run that finds nothing costs only its start, and you can set a maximum cost per run.