# Best API for product review sentiment: 5 credits (https://www.socialcrawl.dev/blog/best-api-product-review-sentiment) > Ten Amazon reviews came back labelled at 5 credits. The best API for product review sentiment is that review page, and turning labels off still cost 5. The best API for product review sentiment is a review-page call whose rows already carry a label read from the title and text. On 2026-10-11 UTC, the SocialCrawl API returned 10 labelled reviews from `GET /v1/amazon/reviews?asin=B0FQFB8FMG&country=us` at 5 credits with `extra_credits` 0, and the same URL with `judgments=off` cost another 5 credits with `cached: false`. Which call fits depends on whether you already have the review text. - Label on the reviews this call returned: `GET /v1/amazon/reviews` and `GET /v1/tripadvisor/reviews` labelled every row, `extra_credits` 0. Only those two paths were called. - Text or audio you already store: AssemblyAI and the other text-in listicles below score that input. They do not return a review page. - A pile of unlabelled Amazon review text: Rainforest `type=reviews`, or Bright Data's Amazon reviews scraper. Those pages document text and ratings, not a sentiment level or an issue enum. Bright Data prices records, and the page states two different free allowances. - One Trustpilot business unit's stars, title, and text, labelled later: The `all-reviews` example has no sentiment level or issue enum. - Official Amazon review text from PA-API 5: The customer-reviews URL now documents deprecation and HTTP 403, not a reviews schema. The Creators API introduction URL returned HTTP 405, so review text there is unverified. A stack of review cards with a gold star row beside a shorter coral sentiment bar, and a crumpled contradiction flag lying flat, showing product review sentiment kept apart from the stars. ## What does product review sentiment analysis return on the review text? SocialCrawl's unified schema puts `sentiment` (`level`, `score_0_1`, `confidence`, `rating_mismatch`) and `issue` (`label`, `confidence`) on the review row. The [review list labels](/en/docs/labels) page reads sentiment from the title and the text, never from the stars. The review row lists `level` on a 0 to 4 scale and does not name 0 as very negative or 4 as very positive. That gloss is only on the comment sentiment row. The review object also carries `rating_mismatch`. Question, purchase intent, and complaint labels are not on that review object. The worked JSON on the labels page is a TikTok comment, so the object below is from this pull. `rating_mismatch` is documented as `true` when the words clearly contradict the stars, and as `null` when there is no rating. On these 20 labelled rows the value was boolean `false`. Documented issue labels are `product_defect`, `sizing_or_fit`, `shipping_or_delivery`, `customer_service`, `price_or_value`, `missing_feature`, `other`, `none`, or `null` when unsure. Both labelled calls returned `data.labels` with presets `sentiment` and `issue`, `mode` `default`, `status` `complete`, `methodology_version` `labels/1`, `rows` 10, `labelled` 10, `pending` 0, `unjudged` 0, and `extra_credits` 0. Every labelled row had `computed.labels` as an object. Those were the only keys under `labels`. The docs describe a `pending` state for unfinished rows. These two reports were `complete`. Amazon review `RRX675LFB6Y4T` is 5 stars at level 2. ```json { "sentiment": { "level": 2, "score_0_1": 0.56, "confidence": 0.61, "rating_mismatch": false }, "issue": { "label": "sizing_or_fit", "confidence": 0.83 } } ``` This pull did not read the title or the body, so it does not say the flag should have been true. ### What was called on 2026-10-11? Three GETs against `https://www.socialcrawl.dev`, all HTTP 200, at 2026-10-11T15:53:01Z, 2026-10-11T15:53:31Z, and 2026-10-11T15:54:30Z. Call 1 was `GET /v1/amazon/reviews` with `asin=B0FQFB8FMG` and `country=us`. The ASIN is the Amazon docs example. `country=us` was sent on purpose. The [Amazon reviews endpoint](/en/docs/amazon) defaults country to US. Call 2 added `judgments=off` 30 seconds later. Call 3 was `GET /v1/tripadvisor/reviews` with the hotel `url_path` from the Tripadvisor docs. `depth` was not sent. Those docs default depth to 10 and price the endpoint at 1 credit. `dry_run` was not sent. Call 3 also omitted `sort_by`, `rating`, `visit_type`, `translate`, `label`, and `judgments`. Pages move, so a later call can differ or come back as a 0-credit cache hit. The docs name `label=none` beside `judgments=off` as the switch for a pre-label page. `label=none` was not called. An open envelope of review cards that already wear colored label chips, next to a hopper of unlabeled cards, for a review sentiment analysis API that returns the label with the page. ## Which review sentiment analysis API returns labels on the same call as the review page? [LLMAPI](https://llmapi.ai/best-sentiment-analysis-apis/), [AssemblyAI](https://www.assemblyai.com/blog/best-apis-for-sentiment-analysis), [AltexSoft](https://www.altexsoft.com/blog/sentiment-analysis-tools/), and [AbstractAPI](https://www.abstractapi.com/guides/other/best-sentiment-analysis-apis) start from text you already have. AssemblyAI treats the transcript as the hard part. [Datastreamer](https://datastreamer.io/5-best-review-apis-no-scraping-required-to-integrate-review-data-feeds/) sells review feeds and lists sentiment as an enrichment bullet. None of the five shows the review and the label in one response. You still fetch the review if you use a review sentiment analysis API from that set. ### What did the three calls cost? | Call | Credits | `extra_credits` | `cached` | Labels | | --- | --- | --- | --- | --- | | Amazon default | 5 (`credits_remaining` 38684) | 0 | false | 10 of 10 labelled | | Amazon `judgments=off` | 5 (`credits_remaining` 38679) | No page report | false | `computed` absent, not `labels` null. Same 10 ids, same order, same stars. `data.labels` absent | | Tripadvisor default | 1 (`credits_remaining` 38678) | 0 | false | 10 of 10 labelled | `credits_used` was 5, then 5, then 1. 38689 - 5 - 5 - 1 = 38678. A later `GET /v1/credits/balance` returned balance 38678 and `credits_used` 0. `extra_credits` 0 means the labels added nothing on top of the page price. `judgments=off` was still a 5-credit charge with `cached: false`. Amazon docs say a hit inside 5 minutes costs 0 credits. This pair was 30 seconds apart and was not a hit. `data.labels.cached` was 0 on Amazon and 3 on Tripadvisor. That field is the per-row label store, not the HTTP cache, and Tripadvisor was still billed 1 credit. Doc prices that match the pull: Amazon reviews 5 credits, Tripadvisor reviews 1 credit. Trustpilot reviews are listed at 5 credits on SocialCrawl (`domain=monzo.com`), so that path was not the cheaper documented call. Trustpilot was not called. Bright Data prices records, not credits. The [Amazon reviews scraper](https://brightdata.com/products/web-scraper/amazon/reviews) says "5K records per month" free, no card, "$1.5/1K record", and Scale at "$499 /month" for 384,000 records with "$1.3/1K" extra. The banner says "5k requests/month for free." Record and request are different units. "Sentiment" on that page is a use-case heading, not a field in the sample. Rainforest and official Trustpilot have no sourced price here. Both Amazon bodies had `data.total` null, `dropped` 0, `page_size` 10, and `has_more` false. Null `data.total` leaves the archive size unknown. Ten reviews were still in the body. ### What do you send? ```bash curl -sS "https://www.socialcrawl.dev/v1/amazon/reviews?asin=B0FQFB8FMG&country=us" \ -H "x-api-key: $SOCIALCRAWL_API_KEY" ``` ```bash curl -sS "https://www.socialcrawl.dev/v1/amazon/reviews?asin=B0FQFB8FMG&country=us&judgments=off" \ -H "x-api-key: $SOCIALCRAWL_API_KEY" ``` The Tripadvisor curl is with the hotel sample further down, and it uses the same `x-api-key` header. Call 1 items had `computed` and `review`. Call 2 items had only `review`. Amazon and Tripadvisor use one response format on the labelled calls. | | Review list with labels (called) | Text-in sentiment API (listicles) | Review fetch, no label field (their docs) | | --- | --- | --- | --- | | What you send | Amazon `asin` and `country`, or a Tripadvisor `url_path` | Text you already have. AssemblyAI's hard case is audio | Rainforest `type=reviews` plus an ASIN. Bright Data, a review URL or ASIN. Trustpilot, a business unit id | | Review and label together | Yes. 10 of 10 rows, `computed.labels` an object | No review is fetched | Text or counts. No sentiment level or issue enum on those pages | | Sentiment keys | `level`, `score_0_1`, `confidence`, `rating_mismatch` | Polarity, or an aspects sketch | Not on the sourced pages | | Issue keys | `label`, `confidence`, closed set | Free-text aspects, or none | Missing | | Label price vs the page | `extra_credits` 0. Labels off left Amazon at 5 credits | Separate product. Prices not cited | Bright Data per 1K records, free lines in conflict. Others not sourced | | Stars vs the words | Level counts differ from star counts. Flag false on all 20 rows | No star field in those listicles | Stars or a histogram. No mismatch flag on the sourced pages | ### A labelled review list Both pages use the same keys. The labels added no credits on top of the page price, and each labelled page was one HTTP call. Only two paths were called. Amazon is a top page of about 10, with helpful votes from 2 to 919, and the Tripadvisor sample is a hotel. `judgments=off` still costs 5 credits. The flag stayed false. Use this to group the reviews this endpoint returned. ### A text or audio sentiment API Use this for warehouse text or audio you already store. You still fetch the review. Those pages give a polarity or free-text aspects, priced as their own product. They do not document this issue enum or a mismatch flag. ### A review fetch with no label on the row Rainforest documents `type=reviews` on its [common parameters](https://docs.trajectdata.com/rainforestapi/product-data-api/parameters/common) page, updated 18 Dec 2025. The reviews-parameters URL it links returned HTTP 404. Bright Data documents review text and ratings. Trustpilot `all-reviews` documents stars, title, and text. PA-API 5's old reviews URL is a 403. Use this when you need more than one top page of unlabelled text and you will label it yourself. ## Does an Amazon reviews API return sentiment, or only stars? On this pull, an Amazon reviews API sentiment result carried stars and a level on every row. Stars were 8 at 5 and 2 at 4. Levels were 7 at 4, 2 at 3, and 1 at 2. No row used level 0 or 1. Issues were `none` 7, `sizing_or_fit` 2, and `product_defect` 1. This page did not use `shipping_or_delivery`, `customer_service`, `price_or_value`, `missing_feature`, or `other`. A label missing from these rows can still exist on the API. `score_0_1` in response order was 1, 1, 0.56, 0.95, 0.92, 0.99, 1, 0.7, 0.97, 0.81. Sum 8.90. Mean 0.89 on these ten only. The 5-star level-2 row is `RRX675LFB6Y4T`. Helpful votes ran from 2 to 919. `entity_id` was `B0FQFB8FMG` on every row, `verified` true on all 10, `language` and `original_language` null on all 10, `source` null. This pull names no language for them. `/v1/amazon/product` was not called, so there is no catalogue title. The Amazon docs call this the top reviews, usually about 10, with no page parameter. `next_cursor` was null. Call 2 kept the same ids, order, and stars, dropped `computed` and `data.labels`, and stayed at 5 credits. The Amazon reviews API sentiment result was call 1. Documented `country` values are US, GB, CA, DE, FR, IT, ES, JP, IN, MX, BR, AU, and NL, default US. The Amazon docs call MX the least reliable. An empty or missing ASIN is a refunded empty list or a refunded 404. `review.entity_id` is the ASIN you asked for. The labels doc also names Walmart, Target, and Sephora review paths. Those were not called. This is the label call, separate from the [Amazon product data APIs](/en/blog/best-amazon-product-data-apis-2026) roundup. The [PA-API 5 customer-reviews URL](https://webservices.amazon.com/paapi5/documentation/customer-reviews.html) shows deprecation, not a reviews schema. Calls get HTTP 403 `AccessDeniedException` ("Product Advertising API is deprecated"). Footer © 1996-2025. Former review fields are not on the page. The Creators API introduction URL returned HTTP 405, so review text there is unverified and left out. [Discussion 3083](https://github.com/amzn/selling-partner-api-models/discussions/3083) on the Selling Partner API models, opened 31 Oct 2022, was still unanswered as fetched. sungolivia wrote that day that reviews were not available via SP-API at that moment. Replies through 16 Dec 2024 still ask. The thread is older than 12 months. Rainforest's common-page example is `type=reviews&amazon_domain=amazon.com&asin=B073JYC4XM&review_stars=all_critical`. That ASIN is theirs, and the page has no sentiment level or issue taxonomy. Bright Data lists review URL, ASIN, product name, product rating, review rating, title, review text, author, date, verified purchase, and helpful votes. Its 2026-10-07 sample shows `product_rating` and a star histogram, not review text. Sample inputs use `max_reviews` of 20 and of 10. ## What does a Trustpilot reviews API return besides the rating? Trustpilot was not called. A Trustpilot reviews API in the official docs has two shapes, and neither was measured here. The [business-units example](https://developers.trustpilot.com/business-units-api-(public)/) is described as including reviews, then shows `numberOfReviews` (total, TrustScore count, one- through five-star counts) and `score.trustScore` / `score.stars`. Title and body are not in that example. The [all-reviews page](https://developers.trustpilot.com/business-units-api) takes a business unit id, `pageToken`, and an API key, skips customer emails and order IDs, and shows `stars`, `title`, `text`, `language`, `isVerified`, `companyReply`, and `consumer.displayName`. No sentiment level, no issue enum, no sourced price. The 5-credit doc price is why the live review-site call was the Tripadvisor hotel, not a Trustpilot measurement. G2's [API page](https://documentation.g2.com/docs/g2-api), updated 5 May 2026, says it gives access to product, category, and review data. That page does not document a sentiment or issue schema, and the OpenAPI body was not extracted. Yelp was not called. Its docs page prints no credit price and no business id. The hotel call returned 10 reviews, all labelled, at 1 credit, `extra_credits` 0, `cached: false`. ```bash curl -sS "https://www.socialcrawl.dev/v1/tripadvisor/reviews?url_path=Hotel_Review-g60763-d23462501-Reviews-Margaritaville_Times_Square-New_York_City_New_York.html" \ -H "x-api-key: $SOCIALCRAWL_API_KEY" ``` The `url_path` is the Margaritaville Times Square example on the [Tripadvisor reviews endpoint](/en/docs/tripadvisor). `data.total` was 10, `dropped` 0, `page_size` 10, `has_more` false, `next_cursor` null. `entity_id` was that `url_path`. `verified` and `source` were null on all 10. Stars were 2 at 1, 2 at 3, and 6 at 5. Levels were 3 at 0, 1 at 2, 2 at 3, and 4 at 4. No level 1, and no 2-star or 4-star row. Issues were `none` 4, `customer_service` 3, `product_defect` 2, and `sizing_or_fit` 1. One hotel row was `sizing_or_fit`. The text was not read, so the pull does not explain it. `score_0_1` in order was 0, 0.99, 0.5, 0.99, 0.01, 0.76, 0.03, 0.83, 1, 0.92. Sum 6.03. Mean 0.603 on these ten only. `language` was `en` on all 10. `original_language` was `en` on nine and `nl` on review `1078984333`, the only `translated: true` row: 3 stars, level 0, `score_0_1` 0.01, sentiment confidence 0.98, `rating_mismatch` false, issue `customer_service`, issue confidence 0.95. The label is on the English text in the response. `data.labels.cached` was 3, and the call still cost 1 credit. A 2025-12-17 review is second, so the page is not newest-first. Sort was not sent. ### Which paths does the labels doc name, and which two were called? The "Review lists" sentence names 22 paths and 18 prefixes. Those numbers count that sentence. Prefixes in doc order: amazon, walmart, target, wayfair, home_depot, sephora, aliexpress, kohls, klarna, google_shopping, tiktokshop, trustpilot, g2, yelp, google, tripadvisor, google_play, app_store. Klarna's two paths share a prefix. Tripadvisor's four paths share a prefix. `google`, `google_shopping`, and `google_play` stay separate because the doc writes three segments. `/v1/amazon/reviews`, `/v1/walmart/reviews`, `/v1/target/reviews`, `/v1/wayfair/reviews`, `/v1/home_depot/reviews`, `/v1/sephora/reviews`, `/v1/aliexpress/reviews`, `/v1/kohls/reviews`, `/v1/klarna/reviews`, `/v1/klarna/reviews/pro`, `/v1/google_shopping/reviews`, `/v1/tiktokshop/product/reviews`, `/v1/trustpilot/reviews`, `/v1/g2/reviews`, `/v1/yelp/business/reviews`, `/v1/google/business/extended-reviews`, `/v1/tripadvisor/reviews`, `/v1/tripadvisor/restaurant/reviews`, `/v1/tripadvisor/attraction/reviews`, `/v1/tripadvisor/cruise/reviews`, `/v1/google_play/app-reviews`, `/v1/app_store/app-reviews`. Called: `/v1/amazon/reviews` and `/v1/tripadvisor/reviews`. The labels doc says other endpoints have no `judgments` parameter. This pull did not test that. These two were the ones with a printed price and an id already on the page. G2's example is `GET /v1/g2/seller?id=hubspot`, with no credit price. Yelp prints neither a price nor a business id. No slug was guessed. ## When should you scrape product reviews instead of calling a labelled API? People type the search query "scrape product reviews api" when they want the review text past one top page. This labelled Amazon call was one page of about 10. If you are grouping the reviews this call returned, use the labelled page. The label added no credits, and `judgments=off` did not lower the Amazon charge. You pay the page price once per uncached call. If the text or the audio is already stored, use a text or audio sentiment API. The listicles do not show stars or this issue enum. If you need an Amazon archive past one helpful page, use Bright Data's per-record fetch or Rainforest `type=reviews`, then label it yourself. This Amazon endpoint had `has_more` false and `data.total` null. If you need your own Trustpilot title and text, use official `all-reviews`, then a separate step for a level. That step was not priced here. If you wanted PA-API 5 to return the review text, the URL that could be verified documents a 403. The listicles start from text you paste in. The best API for product review sentiment, when the label has to sit on the review you still have to fetch, is the review-page call. On 2026-10-11 the default Amazon page and the default Tripadvisor hotel page came back with sentiment and issue on every row, at 5 credits and 1 credit, `extra_credits` 0. The Amazon page with judgments off cost the same 5. Paths past those two are the doc list above. The mismatch flag was on every labelled row and true on none of them. ## Frequently asked questions ### What is the best API for product review sentiment if you need labels on the review text? Use the review-list call when the label has to sit on the row, and a text API when you already have the text. Measured here: `GET /v1/amazon/reviews` for `B0FQFB8FMG` (10 rows, 5 credits, `extra_credits` 0) and `GET /v1/tripadvisor/reviews` for the docs hotel (10 rows, 1 credit, `extra_credits` 0). The other doc-list paths were not called. ### Does product-review sentiment come from the stars or from the title and text? The labels doc reads the title and the text. Amazon stars on this page were 8 at 5 and 2 at 4. Levels were 7 at 4, 2 at 3, and 1 at 2. `RRX675LFB6Y4T` was 5 stars at level 2, `rating_mismatch` false. The flag was false on all 20 labelled rows. ### Which issue labels can a review page return (defect, fit, shipping, service, price, missing feature)? Documented values are `product_defect`, `sizing_or_fit`, `shipping_or_delivery`, `customer_service`, `price_or_value`, `missing_feature`, `other`, `none`, or `null` when unsure. Amazon used `none`, `sizing_or_fit`, and `product_defect`. The hotel page added `customer_service`. A label that did not appear on these 20 rows can still exist on the API. ### Does a review sentiment analysis API cost extra on top of the review page? `extra_credits` was 0 on both labelled calls. `judgments=off` was another 5 credits, `cached: false`. Tripadvisor's `data.labels.cached` of 3 was still billed 1 credit. A text-in API is a separate product, and its price is not cited here. ### Can an Amazon reviews API return sentiment without a separate NLP call? On this uncached page, yes. Labels were on the review response at 5 credits, with no second request. PA-API 5's customer-reviews URL documents HTTP 403. Rainforest and Bright Data document review text without this issue enum. ### Does a Trustpilot reviews API use the same label shape as other review sites? Trustpilot was not called. The labels doc puts the same sentiment and issue presets on the review-list paths, including Trustpilot. Amazon and Tripadvisor were measured, and their label keys matched. Official `all-reviews` shows stars, title, and text. ### How is this different from a comment sentiment analysis API? [Comment sentiment analysis](/en/blog/comment-sentiment-analysis-api) is social comments. Review lists return five sentiment levels from the title and the text, plus `rating_mismatch`, and an issue label. They do not return question, purchase intent, or complaint labels.