# Yelp Scraper: Reputation Monitor (`maximedupre/yelp-reputation-monitor`) Actor

Monitor public Yelp businesses with URLs, or find them with one category and location query. Get structured profiles, review evidence, sentiment themes, attention signals, repeat-run changes, and competitor comparisons.

- **URL**: https://apify.com/maximedupre/yelp-reputation-monitor.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 business assessments

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🧭 Yelp reputation monitoring for local businesses

Yelp Reputation Monitor is for local business owners, reputation teams, agencies, and multi-location operators who need to review public Yelp locations. It returns structured business profiles, review evidence, sentiment and themes, attention signals, repeat-run changes, and competitor comparisons. This gives your team one dataset to review instead of checking each page by hand.

**Use cases**

- Track changes across a list of public locations with **[Yelp Reputation Monitoring](https://apify.com/maximedupre/yelp-reputation-monitor/examples/yelp-reputation-monitoring)**.
- Check rating signals for a public Yelp business with **[Yelp Rating Monitoring](https://apify.com/maximedupre/yelp-reputation-monitor/examples/yelp-rating-monitoring)**.
- Review public Yelp feedback for themes and sentiment with **[Yelp Review Analysis](https://apify.com/maximedupre/yelp-reputation-monitor/examples/yelp-review-analysis)**.
- Find business profiles from public Yelp pages with **[Yelp Business Scraper](https://apify.com/maximedupre/yelp-reputation-monitor/examples/yelp-business-scraper)**.
- Compare an anchor location with competitor URLs using **[Yelp Competitor Analysis](https://apify.com/maximedupre/yelp-reputation-monitor/examples/yelp-competitor-analysis)**.

#### 📊 Yelp business reputation data

Each dataset row represents one public Yelp business location. Core fields include the business name, public page URL, Yelp business ID, address, categories, rating, review count, monitoring history, changes, and incidents. When the related options are used, a row can also include profile enrichment, public reviews, review analysis, attention ranking, competitor comparison, and shared complaint themes.

The review analysis is based on the public review evidence found for the business. Rows with review analysis report the number of public reviews found and analyzed and any sample limitation, so you can judge those results in context.

#### ▶️ Run a Yelp reputation check

Choose Business URLs for known locations, or choose Category and location for one Yelp discovery query. The first eligible occurrence of a discovered business is saved. If the same source business appears again through another submitted URL or discovery path, later matches are ignored.

Review evidence is on by default. Profile enrichment is optional. Add competitor URLs when you want a comparison within the submitted set. Repeat the same watchlist in later runs to build history and see material changes. Early runs can have limited history because there are fewer earlier observations to compare.

To keep a run smaller when you need only a sample, set Maximum locations to a smaller number. Leave it empty to process every available location until the source is exhausted.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findBusinessesBy` | string | Chooses `businessUrls` for known locations or `categoryLocation` for one category and location query. |
| `businessUrls` | array of objects | Public Yelp business page URLs to track. Required when `findBusinessesBy` is `businessUrls`. |
| `businessUrls[].url` | string | One public Yelp business page URL. |
| `competitorUrls` | array of objects | Optional public Yelp pages to compare with the first business URL. Supplied competitors are also tracked. |
| `competitorUrls[].url` | string | One public Yelp business page URL for the comparison set. |
| `category` | string | One category for the Yelp discovery query, such as `restaurants` or `dentists`. Required when `findBusinessesBy` is `categoryLocation`. |
| `location` | string | One city, area, or address for the Yelp discovery query. Required when `findBusinessesBy` is `categoryLocation`. |
| `includeProfileEnrichment` | boolean | Adds public contact information, hours, open state, and other business attributes when Yelp provides them. |
| `includeReviewEvidence` | boolean | Returns public review records with full text, star rating, date, language, and available reviewer context. |
| `maxLocations` | integer | Stops after this many business locations. Leave it empty to process every available location until the source is exhausted. |

**How the choices work**

Use only the fields for the selected `findBusinessesBy` choice. The first URL in `businessUrls` is the anchor when competitor URLs are supplied. A category and location run makes one discovery query, not several independent queries.

**Successful input example**

This example is copied from a successful run.

```json
{
  "findBusinessesBy": "businessUrls",
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/corner-austin-8"
    }
  ],
  "includeProfileEnrichment": false,
  "includeReviewEvidence": false,
  "maxLocations": 1
}
```

#### 🧾 Output

Each dataset row is one business location. The successful runs show three useful shapes:

- A core row has business details, monitoring data, and incidents.
- A review row adds public reviews, review analysis, and any attention or shared-theme signals found in the run.
- An enriched comparison row adds profile details and the comparison with submitted competitor URLs.

Optional fields appear when the related input is enabled or when the run finds the related signal. The tables below use readable dotted paths for nested fields. The examples are genuine rows from successful runs.

**Run output link**

| Field | Type | What it does |
| --- | --- | --- |
| `actorOutput` | string | Opens the structured business results dataset for this run. |

**Core business row**

| Field | Type | What it does |
| --- | --- | --- |
| `businessName` | string | Business name shown on the public Yelp page. |
| `businessUrl` | string | Public Yelp page for the business. |
| `yelpBusinessId` | string | Stable Yelp identifier used to join the business across runs. |
| `location` | object | Public address details for the business. |
| `location.displayAddress` | string | Full address shown on the public Yelp page. |
| `location.streetAddress` | string | Street part of the address. |
| `location.city` | string | City in the address. |
| `location.state` | string | State or region in the address. |
| `location.postalCode` | string | Postal code in the address. |
| `location.country` | string | Country in the address. |
| `categories` | array of strings | Business categories shown on Yelp. |
| `rating` | number | Overall star rating shown on Yelp. |
| `reviewCount` | integer | Number of reviews shown on Yelp. |
| `monitoring` | object | History and material changes for this business. |
| `monitoring.history` | array of objects | Earlier observations of the rating and review count. |
| `monitoring.history[].observedDate` | string | Date of an earlier observation. |
| `monitoring.history[].rating` | number | Rating in an earlier observation. |
| `monitoring.history[].reviewCount` | integer | Review count in an earlier observation. |
| `monitoring.changes` | array of objects | Material changes found by comparing observations. |
| `monitoring.changes[].kind` | string | Change type, such as `ratingMovement`, `ratingRecovery`, `newReviews`, or `recurringTheme`. |
| `monitoring.changes[].observedDate` | string | Date when the change was found. |
| `monitoring.changes[].fromRating` | number | Earlier rating used for a rating change, when present. |
| `monitoring.changes[].toRating` | number | Newer rating used for a rating change, when present. |
| `monitoring.changes[].theme` | string | Review theme that appeared again across observations, when present. |
| `monitoring.changes[].evidenceReviewIds` | array of strings | Review IDs that support the change, when Yelp provides them. |
| `incidents` | array of objects | Reputation signals grouped into followable incidents. |
| `incidents[].incidentId` | string | Stable ID for following an incident across runs. |
| `incidents[].theme` | string | Reputation theme connected to the incident. |
| `incidents[].signalType` | string | Signal type, such as `complaintTheme`, `ratingDrop`, or `reviewPattern`. |
| `incidents[].severity` | integer | Deterministic severity score from 1 to 5. |
| `incidents[].state` | string | Incident state, such as `new`, `recurring`, `unresolved`, or `resolved`. |
| `incidents[].firstObservedDate` | string | First date when the incident was found. |
| `incidents[].lastObservedDate` | string | Latest date when the incident was found. |
| `incidents[].evidenceReviewIds` | array of strings | Review IDs that support the incident, when Yelp provides them. |

**Example business profile**

This unshortened row is copied from a successful run.

```json
{
  "businessName": "Corner Restaurant",
  "businessUrl": "https://www.yelp.com/biz/corner-austin-8",
  "yelpBusinessId": "Ye1lObLkfsb5-QhdSJYo7Q",
  "location": {
    "displayAddress": "110 East 2nd St\nAustin, TX 78701",
    "streetAddress": "110 East 2nd St",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78701",
    "country": "US"
  },
  "categories": [
    "Bars",
    "Coffee & Tea",
    "Acai Bowls"
  ],
  "rating": 3.9,
  "reviewCount": 976,
  "monitoring": {
    "history": [
      {
        "observedDate": "2026-08-29",
        "rating": 3.9,
        "reviewCount": 976
      }
    ],
    "changes": []
  },
  "incidents": []
}
```

**Review analysis row**

| Field | Type | What it does |
| --- | --- | --- |
| `businessName` | string | Business name shown on the public Yelp page. |
| `businessUrl` | string | Public Yelp page for the business. |
| `yelpBusinessId` | string | Stable Yelp identifier used to join the business across runs. |
| `location` | object | Public address details for the business. |
| `location.displayAddress` | string | Full address shown on the public Yelp page. |
| `location.streetAddress` | string | Street part of the address. |
| `location.city` | string | City in the address. |
| `location.state` | string | State or region in the address. |
| `location.postalCode` | string | Postal code in the address. |
| `location.country` | string | Country in the address. |
| `categories` | array of strings | Business categories shown on Yelp. |
| `rating` | number | Overall star rating shown on Yelp. |
| `reviewCount` | integer | Number of reviews shown on Yelp. |
| `monitoring` | object | History and material changes for this business. |
| `monitoring.history` | array of objects | Earlier observations of the rating and review count. |
| `monitoring.history[].observedDate` | string | Date of an earlier observation. |
| `monitoring.history[].rating` | number | Rating in an earlier observation. |
| `monitoring.history[].reviewCount` | integer | Review count in an earlier observation. |
| `monitoring.changes` | array of objects | Material changes found by comparing observations. |
| `monitoring.changes[].kind` | string | Change type, such as `ratingMovement`, `ratingRecovery`, `newReviews`, or `recurringTheme`. |
| `monitoring.changes[].observedDate` | string | Date when the change was found. |
| `monitoring.changes[].fromRating` | number | Earlier rating used for a rating change, when present. |
| `monitoring.changes[].toRating` | number | Newer rating used for a rating change, when present. |
| `monitoring.changes[].theme` | string | Review theme that appeared again across observations, when present. |
| `monitoring.changes[].evidenceReviewIds` | array of strings | Review IDs that support the change, when Yelp provides them. |
| `incidents` | array of objects | Reputation signals grouped into followable incidents. |
| `incidents[].incidentId` | string | Stable ID for following an incident across runs. |
| `incidents[].theme` | string | Reputation theme connected to the incident. |
| `incidents[].signalType` | string | Signal type, such as `complaintTheme`, `ratingDrop`, or `reviewPattern`. |
| `incidents[].severity` | integer | Deterministic severity score from 1 to 5. |
| `incidents[].state` | string | Incident state, such as `new`, `recurring`, `unresolved`, or `resolved`. |
| `incidents[].firstObservedDate` | string | First date when the incident was found. |
| `incidents[].lastObservedDate` | string | Latest date when the incident was found. |
| `incidents[].evidenceReviewIds` | array of strings | Review IDs that support the incident, when Yelp provides them. |
| `reviews` | array of objects | Public review records found for the business. |
| `reviews[].reviewId` | string | Stable Yelp ID for the review. |
| `reviews[].reviewUrl` | string | Public URL that opens the review. |
| `reviews[].text` | string | Full public review text. |
| `reviews[].rating` | number | Star rating given in the review. |
| `reviews[].date` | string | Date shown for the review. |
| `reviews[].language` | string | Language of the review text. |
| `reviews[].reviewer` | object | Public reviewer details that Yelp makes available. |
| `reviews[].reviewer.name` | string | Reviewer name shown on Yelp. |
| `reviews[].reviewer.profileUrl` | string | Public Yelp profile URL for the reviewer. |
| `reviews[].reviewer.reviewCount` | integer | Number of reviews shown for the reviewer. |
| `reviews[].reviewer.location` | string | Reviewer location shown on Yelp. |
| `reviews[].reviewer.eliteYears` | array of integers | Yelp Elite years shown for the reviewer. |
| `reviews[].sentiment` | string | Deterministic sentiment label for the review. |
| `reviewAnalysis` | object | Deterministic findings from the review sample. |
| `reviewAnalysis.overallSentiment` | string | Overall sentiment label for the analyzed sample. |
| `reviewAnalysis.themes` | array of objects | Complaint and praise themes ordered by mentions. |
| `reviewAnalysis.themes[].theme` | string | Theme found in the reviews. |
| `reviewAnalysis.themes[].kind` | string | Whether the theme is a `complaint` or `praise`. |
| `reviewAnalysis.themes[].mentionCount` | integer | Number of analyzed reviews that mention the theme. |
| `reviewAnalysis.sample` | object | Counts and limitation for the review sample. |
| `reviewAnalysis.sample.availableReviewCount` | integer | Public reviews found for analysis. |
| `reviewAnalysis.sample.analyzedReviewCount` | integer | Public reviews used for analysis. |
| `reviewAnalysis.sample.limitation` | string | Note about review evidence that was not analyzed, when present. |
| `attention` | object | Current attention rank and reasons, when found. |
| `attention.rank` | integer | Business rank in the attention queue, starting at 1. |
| `attention.reasons` | array of strings | Reasons for the current attention rank. |
| `portfolioThemeMatches` | array of objects | Complaint themes also found for other monitored businesses, when present. |
| `portfolioThemeMatches[].theme` | string | Shared complaint theme. |
| `portfolioThemeMatches[].otherBusinessUrls` | array of strings | Public Yelp URLs for other businesses with the theme. |

**Example review analysis**

This row is shortened. It keeps real business, review, analysis, and attention values. The string `"..."` marks omitted array contents.

```json
{
  "businessName": "Emerald Restaurant",
  "businessUrl": "https://www.yelp.com/biz/emerald-restaurant-austin",
  "yelpBusinessId": "VaMeR7sRwfAU6Fkb7K1QwA",
  "location": {
    "displayAddress": "13614 W Hwy 71\nAustin, TX 78738",
    "streetAddress": "13614 W Hwy 71",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78738",
    "country": "US"
  },
  "categories": [
    "Irish",
    "Steakhouses"
  ],
  "rating": 3.3,
  "reviewCount": 199,
  "monitoring": {
    "history": [],
    "changes": []
  },
  "incidents": [
    {
      "incidentId": "incident-c41c8cba1ef29adc9f79",
      "theme": "food",
      "signalType": "complaintTheme",
      "severity": 2,
      "state": "new",
      "firstObservedDate": "2026-08-29",
      "lastObservedDate": "2026-08-29",
      "evidenceReviewIds": [
        "H3Ln8uTeo02kHfyAYUDJvQ",
        "sQjWLORr0v1-Ym6Onb7PFQ"
      ]
    },
    "..."
  ],
  "reviews": [
    {
      "reviewId": "7GIupG375oFaNbL0egXLxQ",
      "reviewUrl": "https://www.yelp.com/biz/emerald-restaurant-austin?hrid=7GIupG375oFaNbL0egXLxQ",
      "text": "Came here with my wife and dad right before the pandemic. Their food and service was consistently 5 stars.",
      "rating": 5,
      "date": "2025-08-06",
      "language": "en",
      "reviewer": {
        "name": "Zack K.",
        "profileUrl": "https://www.yelp.com/user_details?userid=JvvynhtAX2652a2ah5PSYA",
        "reviewCount": 75,
        "location": "Austin, TX"
      },
      "sentiment": "positive"
    },
    "..."
  ],
  "reviewAnalysis": {
    "themes": [
      {
        "theme": "food",
        "kind": "praise",
        "mentionCount": 5
      },
      {
        "theme": "service",
        "kind": "praise",
        "mentionCount": 5
      },
      {
        "theme": "wait time",
        "kind": "praise",
        "mentionCount": 3
      },
      {
        "theme": "food",
        "kind": "complaint",
        "mentionCount": 2
      },
      {
        "theme": "service",
        "kind": "complaint",
        "mentionCount": 2
      },
      {
        "theme": "atmosphere",
        "kind": "praise",
        "mentionCount": 1
      },
      {
        "theme": "atmosphere",
        "kind": "complaint",
        "mentionCount": 1
      },
      {
        "theme": "price and value",
        "kind": "praise",
        "mentionCount": 1
      },
      {
        "theme": "price and value",
        "kind": "complaint",
        "mentionCount": 1
      },
      {
        "theme": "wait time",
        "kind": "complaint",
        "mentionCount": 1
      }
    ],
    "sample": {
      "availableReviewCount": 199,
      "analyzedReviewCount": 10,
      "limitation": "The first 10 of 199 public reviews were analyzed."
    },
    "overallSentiment": "positive"
  },
  "attention": {
    "rank": 1,
    "reasons": [
      "newNegativeReviews"
    ]
  }
}
```

**Enriched comparison row**

| Field | Type | What it does |
| --- | --- | --- |
| `businessName` | string | Business name shown on the public Yelp page. |
| `businessUrl` | string | Public Yelp page for the business. |
| `yelpBusinessId` | string | Stable Yelp identifier used to join the business across runs. |
| `location` | object | Public address details for the business. |
| `location.displayAddress` | string | Full address shown on the public Yelp page. |
| `location.streetAddress` | string | Street part of the address. |
| `location.city` | string | City in the address. |
| `location.state` | string | State or region in the address. |
| `location.postalCode` | string | Postal code in the address. |
| `location.country` | string | Country in the address. |
| `categories` | array of strings | Business categories shown on Yelp. |
| `rating` | number | Overall star rating shown on Yelp. |
| `reviewCount` | integer | Number of reviews shown on Yelp. |
| `profile` | object | Extra public details when profile enrichment is enabled. |
| `profile.phoneNumber` | string | Public phone number shown on the business page. |
| `profile.websiteUrl` | string | Business website URL shown on Yelp. |
| `profile.hours` | array of objects | Opening times shown on Yelp. |
| `profile.hours[].day` | string | Day for an opening time. |
| `profile.hours[].openTime` | string | Local opening time. |
| `profile.hours[].closeTime` | string | Local closing time. |
| `profile.hours[].isOvernight` | boolean | Whether the opening time ends on the next day. |
| `profile.isOpenNow` | boolean | Whether Yelp marks the business as open when read. |
| `profile.attributes` | object | Business attributes and values that Yelp provides. |
| `reviews` | array of objects | Public review records found for the business. |
| `reviews[].reviewId` | string | Stable Yelp ID for the review. |
| `reviews[].reviewUrl` | string | Public URL that opens the review. |
| `reviews[].text` | string | Full public review text. |
| `reviews[].rating` | number | Star rating given in the review. |
| `reviews[].date` | string | Date shown for the review. |
| `reviews[].language` | string | Language of the review text. |
| `reviews[].reviewer` | object | Public reviewer details that Yelp makes available. |
| `reviews[].reviewer.name` | string | Reviewer name shown on Yelp. |
| `reviews[].reviewer.profileUrl` | string | Public Yelp profile URL for the reviewer. |
| `reviews[].reviewer.reviewCount` | integer | Number of reviews shown for the reviewer. |
| `reviews[].reviewer.location` | string | Reviewer location shown on Yelp. |
| `reviews[].reviewer.eliteYears` | array of integers | Yelp Elite years shown for the reviewer. |
| `reviews[].sentiment` | string | Deterministic sentiment label for the review. |
| `reviewAnalysis` | object | Deterministic findings from the review sample. |
| `reviewAnalysis.overallSentiment` | string | Overall sentiment label for the analyzed sample. |
| `reviewAnalysis.themes` | array of objects | Complaint and praise themes ordered by mentions. |
| `reviewAnalysis.themes[].theme` | string | Theme found in the reviews. |
| `reviewAnalysis.themes[].kind` | string | Whether the theme is a `complaint` or `praise`. |
| `reviewAnalysis.themes[].mentionCount` | integer | Number of analyzed reviews that mention the theme. |
| `reviewAnalysis.sample` | object | Counts and limitation for the review sample. |
| `reviewAnalysis.sample.availableReviewCount` | integer | Public reviews found for analysis. |
| `reviewAnalysis.sample.analyzedReviewCount` | integer | Public reviews used for analysis. |
| `reviewAnalysis.sample.limitation` | string | Note about review evidence that was not analyzed, when present. |
| `monitoring` | object | History and material changes for this business. |
| `monitoring.history` | array of objects | Earlier observations of the rating and review count. |
| `monitoring.history[].observedDate` | string | Date of an earlier observation. |
| `monitoring.history[].rating` | number | Rating in an earlier observation. |
| `monitoring.history[].reviewCount` | integer | Review count in an earlier observation. |
| `monitoring.changes` | array of objects | Material changes found by comparing observations. |
| `monitoring.changes[].kind` | string | Change type, such as `ratingMovement`, `ratingRecovery`, `newReviews`, or `recurringTheme`. |
| `monitoring.changes[].observedDate` | string | Date when the change was found. |
| `monitoring.changes[].fromRating` | number | Earlier rating used for a rating change, when present. |
| `monitoring.changes[].toRating` | number | Newer rating used for a rating change, when present. |
| `monitoring.changes[].theme` | string | Review theme that appeared again across observations, when present. |
| `monitoring.changes[].evidenceReviewIds` | array of strings | Review IDs that support the change, when Yelp provides them. |
| `incidents` | array of objects | Reputation signals grouped into followable incidents. |
| `incidents[].incidentId` | string | Stable ID for following an incident across runs. |
| `incidents[].theme` | string | Reputation theme connected to the incident. |
| `incidents[].signalType` | string | Signal type, such as `complaintTheme`, `ratingDrop`, or `reviewPattern`. |
| `incidents[].severity` | integer | Deterministic severity score from 1 to 5. |
| `incidents[].state` | string | Incident state, such as `new`, `recurring`, `unresolved`, or `resolved`. |
| `incidents[].firstObservedDate` | string | First date when the incident was found. |
| `incidents[].lastObservedDate` | string | Latest date when the incident was found. |
| `incidents[].evidenceReviewIds` | array of strings | Review IDs that support the incident, when Yelp provides them. |
| `attention` | object | Current attention rank and reasons, when found. |
| `attention.rank` | integer | Business rank in the attention queue, starting at 1. |
| `attention.reasons` | array of strings | Reasons for the current attention rank. |
| `competitorComparison` | object | Position and pressure signals for the submitted comparison set. |
| `competitorComparison.role` | string | Whether the business is the `anchor` or a `competitor`. |
| `competitorComparison.position` | integer | Position within the submitted comparison set. |
| `competitorComparison.ratingDifference` | number | Rating difference from the anchor business. |
| `competitorComparison.pressureLevel` | string | Deterministic pressure level for the comparison. |
| `competitorComparison.overtakeSignal` | string | Whether the comparison shows an `ahead`, `close`, or `behind` position. |
| `portfolioThemeMatches` | array of objects | Complaint themes also found for other monitored businesses, when present. |
| `portfolioThemeMatches[].theme` | string | Shared complaint theme. |
| `portfolioThemeMatches[].otherBusinessUrls` | array of strings | Public Yelp URLs for other businesses with the theme. |

**Example enriched comparison**

This row is shortened. It keeps real profile, review, analysis, monitoring, incident, attention, comparison, and shared-theme values. The string `"..."` marks omitted array or object contents.

```json
{
  "businessName": "Emerald Restaurant",
  "businessUrl": "https://www.yelp.com/biz/emerald-restaurant-austin",
  "yelpBusinessId": "VaMeR7sRwfAU6Fkb7K1QwA",
  "location": {
    "displayAddress": "13614 W Hwy 71\nAustin, TX 78738",
    "streetAddress": "13614 W Hwy 71",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78738",
    "country": "US"
  },
  "categories": [
    "Irish",
    "Steakhouses"
  ],
  "rating": 3.3,
  "reviewCount": 199,
  "profile": {
    "phoneNumber": "(512) 963-4272",
    "websiteUrl": "http://theemeraldrestaurant.com",
    "hours": [
      {
        "day": "Mon",
        "openTime": "5:00 PM",
        "closeTime": "10:00 PM",
        "isOvernight": false
      },
      "..."
    ],
    "isOpenNow": false,
    "attributes": "..."
  },
  "reviews": [
    {
      "reviewId": "7GIupG375oFaNbL0egXLxQ",
      "reviewUrl": "https://www.yelp.com/biz/emerald-restaurant-austin?hrid=7GIupG375oFaNbL0egXLxQ",
      "text": "Came here with my wife and dad right before the pandemic. Their food and service was consistently 5 stars.",
      "rating": 5,
      "date": "2025-08-06",
      "language": "en",
      "reviewer": {
        "name": "Zack K.",
        "profileUrl": "https://www.yelp.com/user_details?userid=JvvynhtAX2652a2ah5PSYA",
        "reviewCount": 75,
        "location": "Austin, TX"
      },
      "sentiment": "positive"
    },
    "..."
  ],
  "reviewAnalysis": {
    "themes": [
      {
        "theme": "food",
        "kind": "praise",
        "mentionCount": 5
      },
      {
        "theme": "service",
        "kind": "praise",
        "mentionCount": 5
      },
      {
        "theme": "wait time",
        "kind": "praise",
        "mentionCount": 3
      },
      {
        "theme": "food",
        "kind": "complaint",
        "mentionCount": 2
      },
      {
        "theme": "service",
        "kind": "complaint",
        "mentionCount": 2
      },
      {
        "theme": "atmosphere",
        "kind": "praise",
        "mentionCount": 1
      },
      {
        "theme": "atmosphere",
        "kind": "complaint",
        "mentionCount": 1
      },
      {
        "theme": "price and value",
        "kind": "praise",
        "mentionCount": 1
      },
      {
        "theme": "price and value",
        "kind": "complaint",
        "mentionCount": 1
      },
      {
        "theme": "wait time",
        "kind": "complaint",
        "mentionCount": 1
      }
    ],
    "sample": {
      "availableReviewCount": 199,
      "analyzedReviewCount": 10,
      "limitation": "The first 10 of 199 public reviews were analyzed."
    },
    "overallSentiment": "positive"
  },
  "monitoring": {
    "history": [
      {
        "observedDate": "2026-08-29",
        "rating": 3.3,
        "reviewCount": 199
      }
    ],
    "changes": [
      {
        "kind": "recurringTheme",
        "observedDate": "2026-08-29",
        "theme": "food",
        "evidenceReviewIds": [
          "H3Ln8uTeo02kHfyAYUDJvQ",
          "sQjWLORr0v1-Ym6Onb7PFQ"
        ]
      },
      "..."
    ]
  },
  "incidents": [
    {
      "incidentId": "incident-c41c8cba1ef29adc9f79",
      "theme": "food",
      "signalType": "complaintTheme",
      "severity": 2,
      "state": "recurring",
      "firstObservedDate": "2026-08-29",
      "lastObservedDate": "2026-08-29",
      "evidenceReviewIds": [
        "H3Ln8uTeo02kHfyAYUDJvQ",
        "sQjWLORr0v1-Ym6Onb7PFQ"
      ]
    },
    "..."
  ],
  "attention": {
    "rank": 1,
    "reasons": [
      "recurringComplaint",
      "newNegativeReviews"
    ]
  },
  "competitorComparison": {
    "role": "anchor",
    "position": 1,
    "ratingDifference": 0,
    "pressureLevel": "medium",
    "overtakeSignal": "close"
  },
  "portfolioThemeMatches": [
    {
      "theme": "food",
      "otherBusinessUrls": [
        "https://www.yelp.com/biz/jims-restaurants-austin-6",
        "https://www.yelp.com/biz/little-mexico-restaurant-austin",
        "https://www.yelp.com/biz/hestia-austin",
        "https://www.yelp.com/biz/creeks-restaurant-austin",
        "https://www.yelp.com/biz/champions-austin-restaurant-and-bar-austin"
      ]
    },
    "..."
  ]
}
```

#### 💳 Pricing

The pricing panel shows the current event prices.

**Business assessment**

One charge applies to each successfully processed public Yelp business location.

**Review**

One charge applies to each public Yelp review returned by the run.

#### 🔌 Integrations

**Dataset access**

Open Business results from the run output to inspect structured rows. Use Apify's dataset tools or API to read and export the data.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What does the Actor read?

It reads publicly accessible Yelp business and review pages. Private or login-gated Yelp content is outside the product boundary.

##### How do I monitor several locations?

Choose Business URLs and add the public Yelp pages you want to track. Run the same watchlist again later to compare observations and see material changes.

##### How is category discovery different from a watchlist?

Category and location makes one Yelp discovery query. Business URLs track the locations you submit. A run does not accept several independently configured category or location searches.

##### What happens when I add competitor URLs?

The first Business URL is the anchor location. Competitor URLs are also tracked, and the output can include each location's position, rating difference, pressure level, and overtake signal within the submitted set.

##### What does review evidence include?

When review evidence is enabled, a row can include full review text, star rating, date, language, public reviewer context, and a deterministic sentiment label. The analysis also reports the number of public reviews found and analyzed.

##### What does profile enrichment add?

It can add public contact information, hours, open state, and other business attributes when Yelp provides them.

##### Why can monitoring history be short?

History depends on earlier successful observations of the same business. The first run has little or no earlier data to compare, so later runs provide more context.

##### Can I process every available location?

Yes. Leave Maximum locations empty to process every available location until the source is exhausted. A number stops the run after that many locations.

##### How can I keep a run smaller?

Set Maximum locations to the number you need. You can also turn off review evidence when you only need business and monitoring fields, or leave profile enrichment off.

##### Does this post or draft Yelp replies?

No. It reads public Yelp data and returns structured analysis. It does not post, draft, dispute, or solicit review responses, and it does not give fake-review or business-quality verdicts.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~yelp-reputation-monitor/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Yelp Business Review Scraper](https://apify.com/maximedupre/yelp-business-reviews)**: Collect full-text review rows for review-focused work.
- **[Yelp Scraper](https://apify.com/rigelbytes/yelp-scraper)**: Pull Yelp business listings and optional profile details from a search or URL.
- **[Yelp Reviews Scraper](https://apify.com/piotrv1001/yelp-reviews-scraper)**: Collect full review text, ratings, dates, photos, and reviewer profiles from a business page.
- **[Yelp Reviews Scraper](https://apify.com/api-ninja/yelp-reviews-scraper)**: Sort or filter review collection from public business URLs or IDs.
- **[Yelp Reviews Scraper - Sentiment, Topics, Competitor Delta](https://apify.com/seibs.co/yelp-reviews-pro)**: Explore per-review sentiment, topic clusters, trends, and competitor deltas.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findBusinessesBy` (type: `string`):

Choose Business URLs for a supplied watchlist, or Category and location for one Yelp discovery query.

## `businessUrls` (type: `array`):

Enter one or more public Yelp business page URLs to track. This field is required for this choice. If you add competitor URLs, the first URL is the anchor location.

## `competitorUrls` (type: `array`):

Optionally add public Yelp business page URLs to compare with the first Business URL. These locations are also tracked when supplied.

## `category` (type: `string`):

Enter one category for the Yelp search, such as restaurants or dentists. This field is required for this choice.

## `location` (type: `string`):

Enter one city, area, or address for the Yelp search. This field is required for this choice.

## `includeProfileEnrichment` (type: `boolean`):

Add public contact information, hours, open state, and other business attributes when Yelp provides them.

## `includeReviewEvidence` (type: `boolean`):

Return public review records with full text, star rating, date, language, and available reviewer context.

## `maxLocations` (type: `integer`):

Stop after this many business locations. Leave it empty to process every available location until the source is exhausted.

## Actor input object example

```json
{
  "findBusinessesBy": "categoryLocation",
  "category": "restaurants",
  "location": "Austin, TX",
  "includeProfileEnrichment": false,
  "includeReviewEvidence": true,
  "maxLocations": 10
}
```

# Actor output Schema

## `actorOutput` (type: `string`):

Open the structured business results from this run.

# 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 = {
    "findBusinessesBy": "categoryLocation",
    "category": "restaurants",
    "location": "Austin, TX",
    "maxLocations": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/yelp-reputation-monitor").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 = {
    "findBusinessesBy": "categoryLocation",
    "category": "restaurants",
    "location": "Austin, TX",
    "maxLocations": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/yelp-reputation-monitor").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 '{
  "findBusinessesBy": "categoryLocation",
  "category": "restaurants",
  "location": "Austin, TX",
  "maxLocations": 10
}' |
apify call maximedupre/yelp-reputation-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/yelp-reputation-monitor"
        }
    }
}

```

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/5kjpvDxQoiBhdDRhO/builds/Lvg95xfJ0ElzxeZDh/openapi.json
