Summarize reviews
Nobody reads five hundred reviews start to finish, so most of what customers actually say gets skimmed at three stars and ignored. This endpoint reads the full batch and returns a genuine summary — recurring praise, recurring complaints, and the specific details that show up again and again — instead of a star average that flattens all of it.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
The star average lies by omission
A 4.1-star rating tells you almost nothing about whether customers love the product and hate the shipping, or love the shipping and are lukewarm on the product itself — two very different businesses that can share the same number. Reviews carry that distinction in plain language, but only if someone actually reads them, which at real volume nobody consistently does.
What goes in, what comes back
You POST a batch of review text — pulled from a marketplace export, a review platform or your own product feedback form — and the task groups them by theme, surfaces the phrases and specifics that recur across many reviews rather than one loud outlier, and separates what's working from what's genuinely broken. The output reads like a summary a careful person would write after actually reading all of them, because that's functionally what happened.
Who reaches for this
Product teams deciding what to fix next without guessing from a handful of recent reviews they happened to skim. Marketing teams looking for the specific language customers use, which is almost always better copy than anything written in-house. Sellers on a marketplace trying to understand a sudden rating drop across a batch of new reviews without reading every one manually.
Reviews as a genre have their own history
Consumer reviews as a mass phenomenon are barely three decades old, born with early online marketplaces that let strangers rate strangers' products at scale for the first time — before that, word of mouth was slow and local. That scale is exactly what makes reviews valuable and exactly what makes them unreadable past a certain volume; this endpoint exists at the point where the value and the unreadability collide.
Feeding an automated feedback loop
Because the summary returns as structured data through a webhook, it can populate a weekly product digest, trigger an alert when a new theme of complaints emerges, or feed directly into our feedback analysis endpoint for deeper theme and sentiment breakdowns, without anyone manually exporting a spreadsheet first.
What you can do with it
Weekly product digests
A product team gets a running summary of new reviews each week instead of spot-checking a handful and hoping they're representative.
Understanding a rating drop
A seller whose average rating dropped this month feeds in recent reviews to see exactly which recurring complaint is driving it.
Mining customer language for copy
A marketing team pulls recurring phrases from summarized reviews to use the exact words customers already use to describe the product's value.
Comparing feedback across product lines
A brand with several product lines summarizes reviews for each separately to see which one has a genuinely different set of recurring issues.
FAQ
How does the review summarizer API work?
You POST a batch of review text to /text/review-summary, the task runs asynchronously, and you receive a thematic summary of recurring praise and complaints via webhook or signed link.
Is there a free trial?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How many reviews can I summarize at once?
Reviews are billed per request plus per batch, so you can submit a large batch at once and the price scales with the number of reviews included.
What formats can I submit reviews in?
Plain text works directly; exports from marketplaces or review platforms just need the review text extracted into the request.
Does it separate positive from negative themes?
Yes, the summary groups recurring praise and recurring complaints separately so you can see both sides without them blending together.
Am I charged if the summarization fails?
No. Failed tasks retry automatically up to three times and are never charged; you only pay for summaries actually delivered.
How is this different from just reading the star rating?
A star average collapses everything into one number; this endpoint returns the actual recurring reasons behind that number, in the customers' own words.
Can I combine it with sentiment or theme analysis?
Yes, review summaries pair naturally with our feedback analysis endpoint for a deeper breakdown of sentiment and priority per theme.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/review-summary \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/review-summary", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/review-summary",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/review-summary", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/review-summary", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"input": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.review_summary",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |