Reviews API

Reviews from hotel, travel, employer and software sites. Every review scraper returns the same columns, so rows from different sites go into one table.

Three review sites, one set of columns.Names inside text read [name].
Sample rows from the Reviews family
platformproductNameratingOveralldatetext or pros
TrustRadiusAsana52022-12-15Asana is used to manage all the internal activities at my company...
Booking.comThe Savoy52026-09-30prosStaff went out of their way for us.
GlassdoorGoogle32026-10-19prosGood wlb pay rsu and free snacks

11 scrapers in Reviews

One price per 1,000 rows each. Pick one to see its sample, input and fields.

Scrapers in this family and their prices
ScraperPrice per 1,000One row isStart fee per run
Glassdoor Reviews$3.00a review$0.024
Booking.com Reviews$1.00a review$0.001
Tripadvisor Reviews$0.75a review$0.001
Google Hotels Reviews$0.50a review$0.001
Agoda and Trip.com Reviews$1.00a review$0.001
Yelp Reviews$0.25a review$0.001
TrustRadius Reviews$2.00a review$0.001
Software Reviews$1.50a review$0.001
Hotel Reviews, All Sites$1.00a review$0.001
Capterra Products$2.00a product$0.001
Review Monitor$10.00a check$0.001

Shared fields

46 fields with the same names on every review scraper. Capterra Products and Review Monitor return products and checks, not reviews, so their columns differ.

The review 28 fields

The review
FieldTypeWhat it holds
reviewIdstringStable review id in the form '<Platform>___<native id>'. Use it to deduplicate between runs.
reviewIdSource'native' when the id comes from the site, 'derived' when it is a hash of the content (less stable).
reviewUrlLink to the single review, null when the site has none.
titlestringReview headline, null when the site has none.
textReview text in the language it was written in. Null when the review has no text.
prosstringWhat the reviewer liked, for sites that ask separately (Capterra, TrustRadius, Glassdoor, Booking). Null otherwise.
consstringWhat the reviewer disliked, for sites that ask separately. Null otherwise.
ratingOverallnumberOverall rating on a 0 to 5 scale (Booking: its 1-10 score divided by 2, original in extras.score10). Null when missing.
ratingsobjectSub-ratings as an object, e.g. { value: 5, cleanliness: 4 }. Keys depend on the site; empty object when there are none.
datestringDate the review was written, ISO format yyyy-mm-dd. Null if unknown.
reviewerRoleJob title or role the reviewer states. No names. Null if not given.
reviewerIndustryIndustry the reviewer states. Null if not given.
reviewerCompanySizeCompany size bracket of the reviewer, e.g. '51-200 employees'. Null if not given.
reviewerTimeUsedHow long the reviewer used the product, as the site words it. Null if not given.
switchedFromProduct the reviewer switched from, null if not given.
alternativesConsideredAlternatives the reviewer considered, comma-separated, null if not given.
reasonForChoosingWhy the reviewer chose this product, free text, null if not given.
reasonForSwitchingWhy the reviewer left the previous product, free text, null if not given.
adviceToOthersstringAdvice the reviewer gives others (Glassdoor: advice to management), null if not given.
incentivizedTrue when the site marks the review as incentivized (for example a gift card). Null when the site does not say.
incentiveThe site's raw incentive label, null if none.
reviewerVerifiedTrue when the site marks the review as verified. Null when the site does not say.
vendorResponseReply of the owner, vendor, developer or employer, null when there is none.
helpfulVotesNumber of helpful or useful votes, null when the site shows none.
languagestringLanguage of the review text as a two-letter code, null if unknown.
countryCountry of the reviewer or the storefront where it applies (lower case code), otherwise null. No personal data.
extrasobjectSite-specific extras, e.g. trip type, visit date, translated text, photo URLs, owner reply date. Keys are listed in the README.
scrapedAtISO timestamp of when the row was collected.
What it is about 5 fields
What it is about
FieldTypeWhat it holds
platformstringSource site, lower case, e.g. 'tripadvisor', 'capterra', 'googleplay', 'appstore'.
productNamestringName of the reviewed hotel, business, product or app.
productUrlPage of the reviewed hotel, business, product or app on the source site.
entityIdstringThe site's own id of the reviewed entity (place id, product id, app id).
productSummary of the reviewed entity repeated on each row: { platform, entityId, name, url, rating, reviewCount, category, vendor, website }. rating and reviewCount are the site's overall figures.
Coverage rows, free 9 fields
Coverage rows, free
FieldTypeWhat it holds
statedCoverage rows: total the site states for the entity, null when it does not say.
deliveredCoverage rows: number of rows delivered for the entity in this run.
skippedSeenCoverage rows: items skipped because an earlier run already delivered them (only-new mode).
duplicatesCoverage rows: repeats the site returned that were dropped.
stopReasonCoverage rows: why reading stopped. limit (your maximum reached), end (no more pages), dateFrom (older than your date), onlyNew (reached already delivered items), budget (run charge limit), cap (site-side depth limit), error (ended by a failure), filter (ended with a filter active).
capSourceCoverage rows: who limited the result, 'user' (your maximum or budget) or 'site' (a limit of the website). Null if nobody.
shortfallCoverage rows: true when the result may be incomplete: fewer rows than the site states with no maximum or filter set, an error, or the site's paging changed during the run. shortfallReason says which.
shortfallReasonCoverage rows: why shortfall is true. below_stated (fewer rows than the site states, no maximum or filter), error (ended by a failure), unstable_paging (the site changed its list while it was read, so rows inside the range read may be missing even though your maximum or date ended the run). Null when shortfall is false.
pagingGapsCoverage rows: number of pages the site served inconsistently that could not be repaired by re-reading. Above 0 means shortfallReason unstable_paging.
Error rows, free 3 fields
Error rows, free
FieldTypeWhat it holds
inputError and coverage rows: the input (URL, id or search text) the row is about. Example: 'https://www.example.com/page'.
codeError rows: machine-readable reason. One of invalid_input (fix the input), not_found (page does not exist), blocked (site refused, retry later), unavailable (temporary error, retry later), filter_unsupported (the filter cannot be applied on this site), no_match (name search found nothing).
messageError rows: short human-readable explanation. Do not parse it, use code.

Call any of them the same way

Only the scraper name and its input change between scrapers in Reviews. The API opens at launch.

Terminal
curl -X POST https://scrapers-api.arcadiumdata.io/v1/scrapers/glassdoor-reviews/runs \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "startUrls": [
        {
          "url": "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
        }
      ],
      "maxReviewsPerCompany": 20
    }
  }'

Questions people ask before they top up

Do rows from different review sites really share columns?

Yes. Every review scraper returns the same fields, such as ratingOverall, date, title, text, pros and cons. A field the site does not have is null. Fields only one site has go under extras.

Capterra Products and Review Monitor return product rows and check summaries, so their columns differ.

Can I get only the reviews added since my last run?

Yes. Every scraper here that returns reviews has an option named onlyNewReviews. It is listed under Input on each scraper page.

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.

What am I charged for when a run fails or finds nothing?

Nothing. You pay for rows we deliver, at the price on the scraper's page, plus a small start fee on runs that deliver rows. A run that returns rows costs at least $0.005. Failed runs, empty runs and duplicate rows cost $0.