# Glassdoor Reviews Change Insights - What Changed for Employees (`ntriqpro/glassdoor-reviews-change-insights`) Actor

Glassdoor reviews you already scraped, compared period by period: rating change per company and month and the complaint topics that rose (pay, layoffs, management…) with quotes. AI explanations, summaries on paid plans. 1 company, 24 months, 600 reviews, 20 AI explanations: about $2.42 on BRONZE.

- **URL**: https://apify.com/ntriqpro/glassdoor-reviews-change-insights.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** AI, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.60 / 1,000 company × period compareds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Glassdoor Reviews Change Insights - What Changed for Employees

Turn the Glassdoor reviews you already scraped into a **period-by-period change report**. For each company and month (or quarter) you get one row: the **average rating against the period before**, the **share of reviews complaining about each topic** — pay, benefits, management, culture, work-life balance, workload, layoffs and job security, remote and office policy, career growth, communication, processes — and how it moved, the **complaints that rose** with the **review sentences that show them** (and their review IDs), the ones that eased, the **sample size** and a **low-sample flag**. On paid plans an **AI explanation** says what changed for employees and why, every claim resting on review sentences quoted word for word and checked by code, and a **summary row per company** shows the whole trend.

Feed it the dataset of a Glassdoor reviews scraper run as it is — the fields of `memo23`, `kaix`, `getdataforme`, `automation-lab` and `scrapifier` Glassdoor scrapers are recognised by themselves — or Indeed / Comparably reviews, a CSV or JSON export, or reviews you paste. Nothing is scraped by this Actor.

**What a default run costs:** 1 company, 24 months, 600 reviews, AI on (20 months with enough reviews) ≈ **$2.42** on the BRONZE plan ($0.004 run start + 600 × $0.0016 review rows + 24 × $0.024 period rows + 20 × $0.04 AI explanations + $0.08 company summary). With the rules only (`aiExplanations: false`, `companySummaries: false`): **$1.54**. The run-start fee covers reading the first 1,000 rows of your sources; every further 1,000 rows read is one `rows-read` event ($0.002 on BRONZE). Your run's maximum charge is always respected, and it buys the company × period rows first.

### Free plan and paid plans

| | Free plan (preview) | Paid Apify plan (Starter and up) |
|---|---|---|
| Company × period change rows (rating, sub-ratings, topic shares and their change, rising and easing complaints with quotes) | **one teaser**: the verdict of one company × period of your input and one quote — every number and every other period locked | every period, up to `maxPeriodsPerCompany` per company (default 24, up to 120) |
| Review rows (topics, evidence sentences) | locked | every review, up to `maxReviews` (default 5,000, 50,000 a run) |
| AI explanation of each change (what changed and why, with quotes) | locked — a free run asks no model | on by default, for up to `aiMaxPeriods` periods (1,000 a run) |
| Company summary rows (rating first to last, best and worst period, complaint trends, top rising topics, quotes, AI headlines) | locked | one per company with 2+ periods |
| What you see about your input | in the `free-plan-preview` row: how many companies, company × periods and reviews your input holds, how many periods have a comparison and enough reviews for a verdict, how many rows, AI explanations and summaries a paid run with **your** settings would give, and its price estimate (BRONZE) — with what it rests on (rows read, partial or whole) | — |
| Reading | up to 5,000 source rows | up to `maxItemsPerSource` a source, `maxReviews` reviews |
| Price | `run-started` (and `rows-read` past the first 1,000 rows) — the teaser and the preview are not charged | all six events, with plan discounts |

The full paid output — every field — is in the fixed example below and in the `example` field of the `free-plan-preview` row.

Plan discounts on every event:

| Apify plan | Discount |
|---|---|
| FREE | list price |
| BRONZE | 20% |
| SILVER | 35% |
| GOLD, PLATINUM, DIAMOND | 48% |

#### Rules and AI on the same period (fixed example)

Eight made-up reviews of a made-up company, four in August and four in September 2026. The rules part is what this Actor's rules return for them. **The AI part is the measured model answer for these reviews** (`claude-haiku-5-5`, 2026-10-16), checked by our code like every paid answer.

- rules (September vs August): average rating 2.25 (before 4, change −1.75), verdict `worse`; rising complaint **Layoffs & job security**: 75% of reviews (before 0%, +75 points, new), quotes "Layoffs in September and nobody knows who is next.", "After the reorg the workload doubled and there is no job security.", "More layoffs announced, management does not communicate."; easing: **Career growth & training** (50% → 0%).
- AI: "Layoffs, a heavier workload and a return-to-office mandate now dominate employee reviews, where earlier reviews praised pay, flexibility and career prospects." — three changes for the worse: `layoffs` (quotes "More layoffs announced, management does not communicate.", "Layoffs in September and nobody knows who is next."), `workload` ("After the reorg the workload doubled and there is no job security.") and `remote` ("Return to office mandate with two weeks notice."), each from the current period.

The same example is in the `example` field of every `free-plan-preview` row.

### What it is for

- **HR and people analytics**: see month by month what employees started to complain about, with the sentences to quote in a report.
- **Employer-brand and recruiting teams**: catch a turn for the worse (a reorg, a return-to-office mandate, layoffs) as soon as it shows in reviews.
- **Competitive and investment research**: compare several companies with the same rows and summaries.

It describes **workplaces**, never people: it does not identify reviewers, read job titles, places or names, or predict who will leave.

### How to use it

1. Run a Glassdoor (or Indeed) reviews scraper, or export reviews as CSV/JSON.
2. Put the dataset ID in `datasetIds` (or the file address in `csvUrls`/`jsonUrls`, or paste reviews into `reviews`).
3. Choose `period` (month or quarter) and `compareTo` (the period before, or the same period a year before). Optionally keep only some `companies`.
4. Run. Filter the dataset by `recordType`: `period` rows are the change report, `review` rows the classified reviews, `company-summary` rows the trend (a free run gives one `period-preview` row and the `free-plan-preview` row).
5. If a run stopped at its maximum charge, its `charge-limit-reached` row gives `nextStartAtPeriod`: run the same input with `startAtPeriod` set to it for the rest.

### Input

| Field | Default | What it does |
|---|---|---|
| `datasetIds` | — | Datasets of review scraper runs in your account (read with this run's token) |
| `csvUrls`, `jsonUrls` | — | Public CSV / JSON / JSONL files, up to 20 MB each |
| `reviews` | 12 made-up reviews | Reviews pasted as JSON objects in a scraper's shape (up to 50,000 a run; more are left out with an `input-limit` notice) |
| `companies` | all | Keep only these companies (letter case and spacing aside) |
| `defaultCompany` | — | Company of rows that do not name one (a one-company export) |
| `period` | `month` | `month` or `quarter` |
| `compareTo` | `previous` | `previous` (the period before; when it has no review, the latest earlier one — the row says which) or `year-ago` |
| `minReviews` | 5 | Fewer reviews than this in a period (or its comparison) → `lowSample: true` (still a row, no AI explanation) |
| `minShareChange` | 10 | Percentage points a complaint share must grow to count as rising (and at least 2 reviews) |
| `maxPeriodsPerCompany` | 24 | Newest periods per company that become rows |
| `startAtPeriod` | 0 | Skip the first this many company × periods of the run's list (paid plans) — to go on after a run that stopped at its maximum charge |
| `maxReviews` | 5,000 | Reviews read in one run (paid plans; up to 50,000) |
| `aiExplanations` | `true` | AI explanation of each change (paid plans) |
| `aiMaxPeriods` | 200 | At most this many AI explanations a run (up to 1,000) |
| `companySummaries` | `true` | One summary row per company (paid plans) |
| `maxItemsPerSource` | 20,000 | Rows read from one dataset or file (past the first 1,000 rows of the run, every 1,000 read is one `rows-read`) |

Fields recognised by themselves: company `employer.shortName`, `employer.name`, `employerName`, `employer_short_name`, `companyName`, `company`; date `reviewDateTime`, `postedAt`, `review_date_time`, `reviewDate` ("Mar 15, 2026"), `date`, `datePublished` (ISO, "March 15, 2026", "15 Mar 2026", "2026/03/15", "03/15/2026", Unix time); rating `ratingOverall`, `ratings.overall`, `rating_overall`, `rating`; sub-ratings (work-life balance, culture and values, senior leadership, compensation and benefits, career opportunities, diversity and inclusion) in all those spellings; recommendation; `pros`, `cons`, `summary`/`headline`; one-text reviews `text`, `reviewText`, `review`; `reviewId`/`review_id`; review address. A CSV header in dotted form (`employer.shortName`, `content.pros`, `ratings.overall`, as a flattened export writes it) is read as that field. Job, salary and notice rows are left out.

### Output

Every row has a `recordType`.

**`period`** — one company and period: `company`, `period` (`2026-09` or `2026-Q3`), `periodStart`, `periodEnd`, `comparedTo`, `comparedToBasis` (`previous-period`, `latest-earlier-period`, `same-period-last-year`), `reviews`, `previousReviews`, `lowSample`, `verdict` (`worse`, `better`, `mixed`, `steady`, `baseline` when there is nothing to compare with), `rating` (`average`, `previousAverage`, `change`), `subRatings`, `recommendShare`, `topics[]` (complaint and praise counts and shares per topic, before and after), `complaintsRising[]` (`topic`, `label`, `share`, `previousShare`, `changePoints`, `reviews`, `new`, `evidence[]` with `quote`, `reviewId`, `reviewUrl`), `complaintsEasing[]`, `praiseFalling[]`, `ai` (paid: `status: "explained"`, `headline`, `changes[]` with `topic`, `direction`, `explanation`, `quotes[]`; or why there is none), `billedEvents`.

**`review`** — one review: `company`, `period`, `reviewedAt`, `rating`, `subRatings`, `recommend`, `headline`, `pros`, `cons`, `text`, `topics` (`complaints[]`, `praise[]`), `evidence[]` (`topic`, `side`, `field`, `quote`, `start`, `end` — the quote is the review's own text at that place), `reviewId`, `reviewUrl`, `billedEvents`.

**`period-preview`** (free plan) — one company and period: `company`, `period`, `comparedTo`, `reviews`, `previousReviews`, `lowSample`, `verdict` and one `evidence` quote (`topic`, `quote`, `reviewId`); every other field is `{ locked: true, paid: "…" }` with what a paid run gives there (and how many: rising complaint topics, review rows…). Not charged.

**`company-summary`** (paid) — `company`, `periods`, `firstPeriod`, `lastPeriod`, `reviews`, `lowSamplePeriods`, `verdicts`, `rating` (`first`, `last`, `change`, `best`, `worst`), `complaintTrends[]` (`risingPeriods`, `firstShare`, `lastShare`, `change`, `persistent`), `topRising`, `quotes`, `aiHeadlines`.

Notice rows (`noticeCode`, `message`) and one `limits` row (the run's numbers) are messages, never charged.

Shares are percentages of a period's reviews, counted with an English word list: they are rule estimates, not probabilities. Reviews in other languages raise fewer topics (the rating change is still exact).

### AI explanation (optional, paid plans)

For each period with a comparison and at least `minReviews` reviews on both sides, the model (`claude-haiku-5-5`, Anthropic) gets the rule numbers and up to 12 reviews of the period and 6 of the one before (pros, cons, headline — with e-mail addresses and phone numbers removed; **never job titles, places, authors or employer replies**). Its answer is used only when every quote is in the review it names, letter for letter, a change for the worse quotes a review of the current period, and every number it writes is in the data. Anything else is thrown away and not charged. **When AI is on, review texts are sent to Anthropic's API (USA).** Turn it off with `aiExplanations: false`.

Measured before release (2026-10-16, 24 periods: 20 of a public Glassdoor export of two companies, 4 of made-up Korean reviews): 23 answers passed the checks (95.8%), 2 of them "no clear change"; one Korean answer was thrown away for its shape; no refusal. Explanations that fail are not charged, so an AI estimate is an upper bound.

### Pricing

Pay per event (list price = FREE plan; plan discounts above):

| Event | What it is | List price | BRONZE |
|---|---|---|---|
| `run-started` | once per run with something to read, charged before reading; covers the first 1,000 source rows | $0.005 | $0.004 |
| `rows-read` | every further 1,000 dataset or file rows read (also rows that are not reviews or not of your `companies`; a file counts one row per 2,000 bytes if that is more) | $0.0025 | $0.002 |
| `review-classified` | one review row with its topics (also when none is found) | $0.002 | $0.0016 |
| `period-compared` | one company × period change row (also a baseline or low-sample one) | $0.03 | $0.024 |
| `change-explained` | one AI explanation that passed the checks (paid plans) | $0.05 | $0.04 |
| `company-summary` | one company summary row (paid plans) | $0.10 | $0.08 |

Not in it: your Apify plan and the runs of the scrapers that made your data. The maximum charge buys the company × period rows first (with their AI explanations from what is left after every period row), then the company summaries, then the review rows; a paid run whose maximum charge does not pay for the run-start fee and one comparison reads nothing and charges nothing, and the reading stops before it would eat the money of the comparisons. Results are delivered first and charged after, and a row is never charged twice. A restarted run first checks the platform's own charge count against the rows it already delivered; if some of them are not shown as charged, it does not charge them again and stops there. The run-start fee and the rows-read charges of a restarted run are never charged a second time: what the run's record lists from before the restart and the count does not show yet is counted against your maximum charge as spent, and reading does not go past what the count confirms (run the same input again as a new run for the rest). If a charge call fails, nothing more is delivered until the platform's own count shows it went through; if it does not show it, that charge is not made again and the run stops. Two runs started at the same time on the same input each deliver and each charge.

### Limits and good to know

- 50 datasets and files a run; 20 MB a file; 50,000 reviews a run (paid).
- A free run reads up to 5,000 source rows and shows one teaser (a verdict and one quote); the `free-plan-preview` row says what a paid run would give and cost. When the free run did not read your input whole, the estimate is for the part it read and says so (`basis.isPartial`), with a rules-only floor for the whole input.
- `lowSample` periods are compared and charged (the comparison is the product) but get no AI explanation.
- CSV files are read by the CSV rules (RFC 4180 quotes); the delimiter (`,` `;` tab `|`) is the one most of the first 50 rows agree with, a file with none is read as one column, `.tsv` addresses are read as tab-separated. Empty cells at the end of a row are ignored and a shorter row gets empty cells. A row with more cells than the header row is left out, not charged, with a `source-parse-error` notice (`rowsSkipped`, `firstLine`). At a row that is not valid CSV (a quote that is never closed, or text right after a closing quote) reading of that file stops: the rows before it are read; from the line it starts on (`notReadFromLine`, with `restNotRead: true`; that source's `readCut` is `"csv-errors"`) nothing is read — not tried, not found invalid — and nothing is charged, its bytes included. Fix the quotes in that row and run again for the rest.

### Responsibility

Unofficial tool, not affiliated with, endorsed by or sponsored by Glassdoor, Indeed, Comparably or any site the reviews come from. It analyses only the reviews you supply and sends no messages. You are responsible for having the right to process these reviews (including any personal data in them) and for complying with the law and the terms of the sites they come from; you are the data controller for this output. Topics, shares and verdicts are automated estimates about a workplace, not facts about any person; nothing here identifies or rates a reviewer.

# Actor input Schema

## `datasetIds` (type: `array`):

IDs of datasets in your Apify account with company reviews (for example a Glassdoor reviews scraper run). They are read with this run's own token; reading is covered by the run-start fee. Common fields are found by themselves: company (employer.shortName, employerName, companyName…), date (reviewDateTime, postedAt, reviewDate "Mar 15, 2026"…), rating (ratingOverall, ratings.overall, rating), pros, cons, summary/headline, reviewId. Job, salary and notice rows of other Actors are left out. Job title, location and author fields are never read.

## `csvUrls` (type: `array`):

Public http(s) addresses of CSV files with one review per row and a header row (headers are matched without letter case, spaces or underscores: "Rating Overall" = ratingOverall). Up to 20 MB a file; addresses inside private networks are refused.

## `jsonUrls` (type: `array`):

Public http(s) addresses of JSON (an array, or an object with items/data/results/reviews) or JSONL files, one review per entry, in the shape of any of the scrapers above.

## `reviews` (type: `array`):

Reviews pasted here as JSON objects in a scraper's shape, for example { "employer": { "shortName": "Acme" }, "reviewDateTime": "2026-09-02", "ratingOverall": 2, "pros": "…", "cons": "…", "reviewId": 123 }. The prefill is made-up reviews of a made-up company.

## `companies` (type: `array`):

Company names to keep (letter case and spacing aside, the exact name the scraper wrote). Empty: every company in the sources.

## `defaultCompany` (type: `string`):

For an export of one company whose rows do not name it.

## `period` (type: `string`):

One row per company and month, or per company and quarter.

## `compareTo` (type: `string`):

previous: the period just before (when it has no review, the latest earlier period that has one — the row says which). year-ago: the same period a year before.

## `minReviews` (type: `integer`):

A period (or the one it is compared with) with fewer reviews than this is flagged lowSample. It is still compared and charged; it gets no AI explanation.

## `minShareChange` (type: `integer`):

A topic counts as a rising complaint when the share of reviews complaining about it grew by at least this many points (and at least 2 reviews raise it).

## `maxPeriodsPerCompany` (type: `integer`):

The newest this many periods of each company become rows (older periods still serve as the comparison of the oldest row).

## `startAtPeriod` (type: `integer`):

Skip the first this many company×periods of the run's list (companies in the order they first appear, each company's periods newest first) to go on from where a run stopped at its maximum charge: that run's charge-limit-reached row gives the exact value (`nextStartAtPeriod`). Skipped periods are not delivered or charged; their reviews still serve as the comparison of the next period. The reading is charged again (the run reads the same sources).

## `maxReviews` (type: `integer`):

Reviews read and classified in one run, in source order. A free run reads up to 5,000 source rows and shows one teaser.

## `aiExplanations` (type: `boolean`):

For every period with a comparison and enough reviews on both sides: what changed for employees and why, each change resting on review sentences quoted word for word and checked by code; an answer that fails the checks is thrown away and not charged. $0.04 each on BRONZE. When on, review texts (pros, cons, headline — never job title, location or author) are sent to Anthropic's API (USA).

## `aiMaxPeriods` (type: `integer`):

At most this many periods get an AI explanation in one run.

## `companySummaries` (type: `boolean`):

One row per company with two or more period rows: rating first to last, best and worst period, complaint trends, the topics that rose most, quotes and the AI headlines. $0.08 each on BRONZE.

## `maxItemsPerSource` (type: `integer`):

At most this many rows are read from one dataset or file. Reading the first 1,000 rows of the run is in the run-start fee; every further 1,000 rows read (also rows that are not reviews or not of your `companies`) is one rows-read event. A run stops reading when its maximum charge would no longer pay for the comparisons of what it read.

## Actor input object example

```json
{
  "reviews": [
    {
      "reviewId": "ex-101",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-03T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Fair pay and flexible hours.",
      "cons": "Promotions are slow."
    },
    {
      "reviewId": "ex-102",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-09T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Supportive manager, good benefits.",
      "cons": "Too many meetings."
    },
    {
      "reviewId": "ex-103",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-14T10:00:00.000",
      "ratingOverall": 5,
      "pros": "Remote friendly, smart colleagues.",
      "cons": "Career growth could be faster."
    },
    {
      "reviewId": "ex-104",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-20T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Good benefits.",
      "cons": "Pay is below market."
    },
    {
      "reviewId": "ex-105",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-25T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Great culture.",
      "cons": "Some processes are slow."
    },
    {
      "reviewId": "ex-106",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-29T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Flexible schedule.",
      "cons": "Not much training."
    },
    {
      "reviewId": "ex-107",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-02T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Colleagues are still great.",
      "cons": "Layoffs this month and nobody knows who is next."
    },
    {
      "reviewId": "ex-108",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-08T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Benefits are fine.",
      "cons": "After the reorg the workload doubled and there is no job security."
    },
    {
      "reviewId": "ex-109",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-12T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Smart colleagues.",
      "cons": "Return to office mandate with two weeks notice."
    },
    {
      "reviewId": "ex-110",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-17T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Free snacks.",
      "cons": "More layoffs announced and management does not communicate."
    },
    {
      "reviewId": "ex-111",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-22T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Good pay.",
      "cons": "Stress is high since the layoffs."
    },
    {
      "reviewId": "ex-112",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-27T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Nice office.",
      "cons": "Leadership has no clear direction."
    }
  ],
  "period": "month",
  "compareTo": "previous",
  "minReviews": 5,
  "minShareChange": 10,
  "maxPeriodsPerCompany": 24,
  "startAtPeriod": 0,
  "maxReviews": 5000,
  "aiExplanations": true,
  "aiMaxPeriods": 200,
  "companySummaries": true,
  "maxItemsPerSource": 20000
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "reviews": [
        {
            "reviewId": "ex-101",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-03T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Fair pay and flexible hours.",
            "cons": "Promotions are slow."
        },
        {
            "reviewId": "ex-102",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-09T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Supportive manager, good benefits.",
            "cons": "Too many meetings."
        },
        {
            "reviewId": "ex-103",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-14T10:00:00.000",
            "ratingOverall": 5,
            "pros": "Remote friendly, smart colleagues.",
            "cons": "Career growth could be faster."
        },
        {
            "reviewId": "ex-104",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-20T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Good benefits.",
            "cons": "Pay is below market."
        },
        {
            "reviewId": "ex-105",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-25T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Great culture.",
            "cons": "Some processes are slow."
        },
        {
            "reviewId": "ex-106",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-08-29T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Flexible schedule.",
            "cons": "Not much training."
        },
        {
            "reviewId": "ex-107",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-02T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Colleagues are still great.",
            "cons": "Layoffs this month and nobody knows who is next."
        },
        {
            "reviewId": "ex-108",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-08T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Benefits are fine.",
            "cons": "After the reorg the workload doubled and there is no job security."
        },
        {
            "reviewId": "ex-109",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-12T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Smart colleagues.",
            "cons": "Return to office mandate with two weeks notice."
        },
        {
            "reviewId": "ex-110",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-17T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Free snacks.",
            "cons": "More layoffs announced and management does not communicate."
        },
        {
            "reviewId": "ex-111",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-22T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Good pay.",
            "cons": "Stress is high since the layoffs."
        },
        {
            "reviewId": "ex-112",
            "employer": {
                "shortName": "Northwind Labs (example)"
            },
            "reviewDateTime": "2026-09-27T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Nice office.",
            "cons": "Leadership has no clear direction."
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/glassdoor-reviews-change-insights").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "reviews": [
        {
            "reviewId": "ex-101",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-03T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Fair pay and flexible hours.",
            "cons": "Promotions are slow.",
        },
        {
            "reviewId": "ex-102",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-09T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Supportive manager, good benefits.",
            "cons": "Too many meetings.",
        },
        {
            "reviewId": "ex-103",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-14T10:00:00.000",
            "ratingOverall": 5,
            "pros": "Remote friendly, smart colleagues.",
            "cons": "Career growth could be faster.",
        },
        {
            "reviewId": "ex-104",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-20T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Good benefits.",
            "cons": "Pay is below market.",
        },
        {
            "reviewId": "ex-105",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-25T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Great culture.",
            "cons": "Some processes are slow.",
        },
        {
            "reviewId": "ex-106",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-08-29T10:00:00.000",
            "ratingOverall": 4,
            "pros": "Flexible schedule.",
            "cons": "Not much training.",
        },
        {
            "reviewId": "ex-107",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-02T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Colleagues are still great.",
            "cons": "Layoffs this month and nobody knows who is next.",
        },
        {
            "reviewId": "ex-108",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-08T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Benefits are fine.",
            "cons": "After the reorg the workload doubled and there is no job security.",
        },
        {
            "reviewId": "ex-109",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-12T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Smart colleagues.",
            "cons": "Return to office mandate with two weeks notice.",
        },
        {
            "reviewId": "ex-110",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-17T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Free snacks.",
            "cons": "More layoffs announced and management does not communicate.",
        },
        {
            "reviewId": "ex-111",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-22T10:00:00.000",
            "ratingOverall": 3,
            "pros": "Good pay.",
            "cons": "Stress is high since the layoffs.",
        },
        {
            "reviewId": "ex-112",
            "employer": { "shortName": "Northwind Labs (example)" },
            "reviewDateTime": "2026-09-27T10:00:00.000",
            "ratingOverall": 2,
            "pros": "Nice office.",
            "cons": "Leadership has no clear direction.",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/glassdoor-reviews-change-insights").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "reviews": [
    {
      "reviewId": "ex-101",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-03T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Fair pay and flexible hours.",
      "cons": "Promotions are slow."
    },
    {
      "reviewId": "ex-102",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-09T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Supportive manager, good benefits.",
      "cons": "Too many meetings."
    },
    {
      "reviewId": "ex-103",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-14T10:00:00.000",
      "ratingOverall": 5,
      "pros": "Remote friendly, smart colleagues.",
      "cons": "Career growth could be faster."
    },
    {
      "reviewId": "ex-104",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-20T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Good benefits.",
      "cons": "Pay is below market."
    },
    {
      "reviewId": "ex-105",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-25T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Great culture.",
      "cons": "Some processes are slow."
    },
    {
      "reviewId": "ex-106",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-08-29T10:00:00.000",
      "ratingOverall": 4,
      "pros": "Flexible schedule.",
      "cons": "Not much training."
    },
    {
      "reviewId": "ex-107",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-02T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Colleagues are still great.",
      "cons": "Layoffs this month and nobody knows who is next."
    },
    {
      "reviewId": "ex-108",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-08T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Benefits are fine.",
      "cons": "After the reorg the workload doubled and there is no job security."
    },
    {
      "reviewId": "ex-109",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-12T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Smart colleagues.",
      "cons": "Return to office mandate with two weeks notice."
    },
    {
      "reviewId": "ex-110",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-17T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Free snacks.",
      "cons": "More layoffs announced and management does not communicate."
    },
    {
      "reviewId": "ex-111",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-22T10:00:00.000",
      "ratingOverall": 3,
      "pros": "Good pay.",
      "cons": "Stress is high since the layoffs."
    },
    {
      "reviewId": "ex-112",
      "employer": {
        "shortName": "Northwind Labs (example)"
      },
      "reviewDateTime": "2026-09-27T10:00:00.000",
      "ratingOverall": 2,
      "pros": "Nice office.",
      "cons": "Leadership has no clear direction."
    }
  ]
}' |
apify call ntriqpro/glassdoor-reviews-change-insights --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/glassdoor-reviews-change-insights"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gmIOKc3KlUHdPNkdX/builds/VaXNz4tpU55ulY9CL/openapi.json
