Review Monitor

Give it a watchlist of hotels, local businesses, apps or SaaS products (their pages on Booking.com, Agoda, Trip.com, Tripadvisor, Google Maps, Google Hotels, Yelp, Google Play, the App Store, Capterra or TrustRadius) and every run returns what changed since the last one: an alert row per new 1★ or 2★ review and a summary row per entity with rating drift, 30-day vs lifetime average, owner-reply rate and lag, review velocity and, for apps, per-version rating regressions.

Sample output

One row as the API returns it. Long text is shortened here; names inside text read [name].

Show the sample as
Download
Sample row, one field per line
FieldValue
rowTypesummary
statuschanged
platformappstore
entityId618783545-us
inputhttps://apps.apple.com/us/app/slack/id618783545
nameSlack
urlhttps://apps.apple.com/us/app/slack/id618783545
checkedAt2026-10-21T22:59:28.653Z
previousCheckAt2026-10-21T22:54:50.343Z
rating4.14
previousRating4.14
ratingChange0

Call it from code or from your agent

This is the request. Small runs answer in the same call; large ones return a run ID.

TerminalOpens at launch
curl -X POST https://scrapers-api.arcadiumdata.io/v1/scrapers/reputation-monitor/runs \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "startUrls": [
        "https://www.booking.com/hotel/gb/the-savoy.html",
        "https://www.yelp.com/biz/katzs-delicatessen-new-york",
        "https://apps.apple.com/us/app/slack/id618783545"
      ],
      "maxReviewsPerEntity": 50
    }
  }'
$10.0011,000 checks: $10.00, plus the run start fee of $0.001. A failed or empty run costs $0.

What each row holds

Every row says what it is in rowType: check rows are charged, coverage and error rows are free.

The check 53 fields

The check
FieldTypeWhat it holds
platformstringSource: booking, tripadvisor, googleplay, appstore, yelp, capterra or trustradius.
entityIdstringNative id of the entity on its source (hotel id, place id, app id, business id, product id).
checkedAtstringISO timestamp of this run's check.
entityNameAlert rows: name of the hotel, business, app or product.
entityUrlAlert rows: public page of the entity.
reviewIdAlert rows: stable review id '<Platform>___<native id>'.
reviewUrlAlert rows: public link to the review, null when the source has none.
dateAlert rows: review date (YYYY-MM-DD).
titleAlert rows: review title, null when the source has none. Personal data is redacted.
textAlert rows: review text. Emails, phone numbers and names in greetings are redacted.
prosAlert rows: what the reviewer liked (Booking, Capterra, TrustRadius), null elsewhere.
consAlert rows: what the reviewer disliked (Booking, Capterra, TrustRadius), null elsewhere.
languageAlert rows: review language code when the source states it.
appVersionAlert rows: app version the review was written for (app stores), null elsewhere.
ownerRepliedAlert rows: true when the owner or developer has already replied.
ownerReplyAlert rows: the owner's reply text (redacted), null when there is none.
changeTypeAlert rows: 'new' = first seen this run; 'edited' = a known review whose rating was edited down into the alert band.
statusstringSummary rows: 'baseline' (first run, history recorded, no alerts), 'changed' (new or edited reviews) or 'unchanged'.
namestringSummary rows: name of the hotel, business, app or product.
urlstringSummary rows: public page of the entity.
previousCheckAtstringSummary rows: ISO timestamp of the previous run with this watchlist name, null on a baseline.
ratingnumberRating on 1-5 (Booking and TrustRadius 1-10 scores are halved) as the source states it now. Alert rows: the review's rating.
previousRatingnumberSummary rows: the source's average rating at the previous run.
ratingChangenumberSummary rows: rating minus previousRating (stars). Negative = the average went down.
reviewCountnumberSummary rows: review count the source states (app stores: the number of star ratings).
previousReviewCountnumberSummary rows: reviewCount at the previous run.
reviewCountChangenumberSummary rows: reviewCount minus previousReviewCount, the true number of new reviews/ratings even beyond the read limit.
newReviewsnumberSummary rows: reviews first seen this run (0 on a baseline).
editedReviewsnumberSummary rows: known reviews whose text or rating changed since they were seen.
newNegativeReviewsnumberSummary rows: alert rows written for this entity this run.
newReviewsAvgRatingnumberSummary rows: average rating of this run's new and edited reviews, null when there are none.
avgRating30dnumberSummary rows: average rating of the reviews dated in the last 30 days (from the remembered history).
previousAvgRating30dnumberSummary rows: avgRating30d at the previous run.
reviews7dnumberSummary rows: reviews dated in the last 7 days.
reviews30dnumberSummary rows: reviews dated in the last 30 days (a lower bound when windowComplete30d is false).
reviewsPrior30dSummary rows: reviews dated 31-60 days ago, to compare velocity.
reviewsPerWeeknumberSummary rows: review velocity, reviews30d per week.
avgRatingLifetimenumberSummary rows: lifetime average: the source's stated rating, or for app stores (whose rating counts silent star ratings) the average of the remembered written reviews.
lifetimeSourcestringSummary rows: 'site' (the source's stated average) or 'sample' (average of the remembered reviews).
rating30dVsLifetimenumberSummary rows: avgRating30d minus avgRatingLifetime. Negative = recent reviews are worse than usual.
ownerReplyRate90dnumberSummary rows: share (0-1) of the last 90 days' reviews with an owner reply; null on TrustRadius (no replies).
replySample90dSummary rows: number of reviews ownerReplyRate90d is based on.
medianReplyLagDaysnumberSummary rows: median days from review to owner reply (Tripadvisor, Yelp, app stores); null where the source does not date replies.
replyLagSampleSummary rows: number of replies medianReplyLagDays is based on.
unansweredNegative30dnumberSummary rows: reviews of the last 30 days at or below the alert rating without an owner reply.
appVersionsarraySummary rows (apps): up to 5 newest versions in the history: [{ version, reviews, avgRating, firstSeen }].
versionRegressionSummary rows (apps): { version, avgRating, reviews, previousVersion, previousAvgRating, previousReviews, delta } when the newest version (5+ reviews) averages 0.5+ stars below the one before; else null.
windowComplete30dbooleanSummary rows: true when the history reaches back 30 days, so the 30-day figures are exact; false = based on the newest reviews read.
windowComplete60dSummary rows: same for 60 days (reviewsPrior30d).
historyReviewsnumberSummary rows: reviews remembered for this entity (facts only: date, rating, reply; no text).
historySincestringSummary rows: date of the oldest remembered review.
flagsarraySummary rows: what needs attention: new_negative, rating_drop, recent_below_lifetime, version_regression, unanswered_negative, velocity_spike. Empty on a baseline.
scrapedAtError rows: ISO timestamp of the failure.
Coverage rows, free 1 fields
Coverage rows, free
FieldTypeWhat it holds
stopReasonstringSummary rows: why reading stopped: 'onlyNew' (reached reviews seen before), 'limit' (max reviews per entity), 'end' (no more reviews), 'budget' or 'error'.
Error rows, free 3 fields
Error rows, free
FieldTypeWhat it holds
inputstringThe URL you entered for this entity.
codeError rows: invalid_input, not_found, blocked, unavailable or no_match.
messageError rows: what went wrong, in plain words.

What it can't do

  • It does not return reviewer names, profile links or photos.
  • It reads only what the site shows to a visitor without an account.
  • Reviews the site has removed or hidden are not returned.

What you send

Every field is optional. The example request above fills the ones shown here.

Main input fields
FieldTypeWhat it does
startUrlsarrayExample: ["https://www.booking.com/hotel/gb/the-savoy.html", "https://play.google.com/store/apps/details?id=com.Slack"]. One URL per hotel, business, app or product. Sources: Booking.com, Agoda or Trip.com hotel, Tripadvisor place, Google Hotels hotel (google.com/travel/hotels/entity/...), Google Maps place (a place link, maps.app.goo.gl link or maps.google.com/?cid=...), Google Play app, App Store app, Yelp business, Capterra product, TrustRadius product. Max 2,000. Required.
maxReviewsPerEntityintegerExample: 100. Newest reviews read per entity and run; the first run uses them as history for the 30-day and reply metrics. Later runs stop at the last seen review, usually after one page. Raise it for apps with hundreds of reviews a day. 10-2,000. Also accepted as `maxReviews`, `maxItemsPerQuery` or `maxReviewsPerHotel` (other review actors; clamped to 10-2,000). Default 100.
More options (5)
More input fields
FieldTypeWhat it does
stateKeystringExample: `hotels-london`. Names the saved state (1-40 letters, digits or dashes), so several watchlists run side by side. Each run is compared with the last run of the same name. A new name starts a new baseline.Default "default"
alertMaxRatingintegerExample: 2 = one alert row per new 1★ or 2★ review. Allowed 1-4. Booking, Agoda, Trip.com and TrustRadius 1-10 scores are halved to the 1-5 scale first.Default 2
languagestringExample: `en`. Google Play shows reviews per language (code such as en, de, pt-BR). Other sources return every language.Default "en"
countrystringExample: `us`. Two-letter storefront for Google Play, and for App Store URLs without a country.Default "us"
includeErrorRowsbooleanDefault on. Adds a free `error` row (code + message) for every URL that could not be read or is not supported, so a failure is never silent.Default true

Questions people ask before they top up

What does a run cost?

Each check costs $0.01, which is $10.00 per 1,000. A run that delivers rows also pays a $0.001 start fee.

Negative review alerts: $1.50 per 1,000. First check of an entity: $9.00 per 1,000.

A run that returns rows costs at least $0.005, start fee included. Failed runs, empty runs and duplicate rows cost $0. You set the most a run may cost, and it stops there.

Do you ever return personal data?

Not about reviewers or users. Reviewer names, profile links, photos, emails and phone numbers are not collected. When a name appears inside a review or a reply, it is replaced with [name].

Job titles and company sizes stay where a site shows them, because they describe a role rather than a person. On YouTube, channel names and URLs are the publisher labels YouTube shows publicly.

How fresh is the data?

Each run reads the live site when you start it, so rows are as current as the site itself.

More from Reviews

  • Rating, sub-ratings, pros, cons, tenure, current or former employee

    $3.00per 1,000 reviews

  • Score, pros, cons, traveler type, room, nights, hotel reply

    $1.00per 1,000 reviews

  • Rating, title, text, sub-ratings, trip type, owner reply

    $0.75per 1,000 reviews

  • Rating, room, service and location scores, translation, reply

    $0.50per 1,000 reviews

  • Score, text, translation, traveler type, room, nights, reply

    $1.00per 1,000 reviews

  • Rating, text, language, reactions, owner reply

    $0.25per 1,000 reviews