Software Reviews

Type a product name like "Slack" or paste a mix of links and get its reviews from Capterra (and optionally Software Advice), Google Play and the App Store in one dataset, one row shape: rating, title, text, pros, cons, date, the reviewer's role and company size where the site has them.

Sample output

Example row It shows the shape of the output. The values are made up, not taken from a run.

Show the sample as
Download
Sample row, one field per line
FieldValue
rowTypereview
platformgoogleplay
reviewIdGooglePlay___a1b2c3d4-0000-0000-0000-000000000000
productNameSlack
date2026-10-14
textNotifications are finally reliable on my phone.
ratingOverall4
extras{"inputProduct":"Slack"}
titlenull
reviewerCompanySizenull

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/software-reviews/runs \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "products": [
        "Slack"
      ],
      "sources": [
        "capterra",
        "googleplay",
        "appstore"
      ],
      "maxReviewsPerSource": 9
    }
  }'
$1.5011,000 reviews: $1.50, 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: review rows are charged, coverage and error rows are free.

The review 32 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.
titleReview headline, null when the site has none.
textstringReview text in the language it was written in. Null when the review has no text.
prosWhat the reviewer liked, for sites that ask separately (Capterra, TrustRadius, Glassdoor, Booking). Null otherwise.
consWhat 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.
ratingsSub-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.
adviceToOthersAdvice 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.
languageLanguage 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.
inputTypeSummary rows: whether the input was a product 'name' or a URL.
vendorSummary rows: vendor name of the matched product.
matchConfidenceSummary rows: how sure the name match is per source, e.g. { capterra: 'high', googleplay: 'high' }.
sourcesSummary rows: per source { name, rating, reviewCount, status, reviewsPushed }.
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.
entityIdThe 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.

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
productsarray of stringSoftware product names, e.g. Slack or Asana. Each name is looked up on Capterra / Software Advice and in the Google Play and App Store catalogs. An app is used only when it is confidently the same product; otherwise that source returns a free 'no_match' row.
sourcesarray of stringWhich sources to search when you give product names. Capterra, Google Play and App Store are on by default. Software Advice shows largely the same reviews as Capterra, so it is opt-in; duplicates are dropped and never charged. Links in 'Start URLs' are always read, whatever is chosen here. Default: capterra, googleplay, appstore.
maxReviewsPerSourceintegerMaximum number of reviews to collect from each source for each product (up to 50,000). Default: 100.
More options (11)
More input fields
FieldTypeWhat it does
startUrlsarrayProduct pages from Capterra, Software Advice, GetApp, Google Play or the App Store. Each link is routed to its source by host. A Google Play package id (com.slack) or an App Store id (618783545) also works. Can be combined with product names. Example: https://www.capterra.com/p/135003/Slack/.
sortstring (one of 6)Most recent first, or most helpful first (each store's own relevance ranking). The names most_recent, most_helpful, highest_rated and lowest_rated from similar actors also work; the two rating sorts are not supported and use Most recent.Default "recent"
appCountrystringTwo-letter storefront country for Google Play and the App Store, e.g. us, gb, de. Leave empty for us (or the country in an App Store link).
languagestringLanguage of the Google Play reviews, e.g. en or pt-BR.Default "en"
dateFromstringOnly keep reviews published on or after this date (YYYY-MM-DD, or a relative span such as 30 days or 2 months; empty = no filter). With 'Most recent' sorting, paging stops once reviews are older.
onlyNewReviewsbooleanReturn only reviews not delivered by earlier runs that used the same state key. Uses the 'Most recent' sort order. Skipped reviews are not charged.Default false
stateKeystringName of the incremental state used by 'Only new reviews' (letters, digits and dashes, up to 40 characters). Use different keys for independent schedules. Example: weekly-monitoring.Default "default"
includeSummaryRowsbooleanAdd one row with rowType 'summary' (not charged) per product: the rating and review count each source shows, and how confident the match is.Default true
includeErrorRowsbooleanAdd one row with rowType 'error' (not charged) for each input or source that could not be scraped, e.g. no confident app match.Default true
includeCoverageRowsbooleanAdd one free row with rowType 'coverage' per product or source: the review total the site states, how many were delivered, why paging ended and whether anything is missing. Not charged.Default true
markEditedbooleanWith 'Only new reviews': also deliver reviews seen before whose text changed in the last 7 days, marked extras.changeType 'edited'. Edited reviews are charged like new ones.Default true

Questions people ask before they top up

What does a run cost?

Each review costs $0.0015, which is $1.50 per 1,000. A run that delivers rows also pays a $0.001 start fee.

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.

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

Yes, with the onlyNewReviews option. Return only reviews not delivered by earlier runs that used the same state key. Uses the 'Most recent' sort order. Skipped reviews are not charged.

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