Skip to content

Text Analytics: Sentiment, Topics & Keywords

Try for free

Score the sentiment of reviews, comments, posts or any text column, and get emotion, topics, keywords, your own categories with aspect sentiment, and a run summary. Texts, datasets of other runs, CSV/JSON files or web pages, in any language.

💬 Text Analytics: Sentiment, Topics & Keywords

Text Analytics reads reviews, comments, posts, survey answers or any text column and tells you how people feel: positive, neutral or negative with scores, the main emotion, topics, keywords, and the sentiment about your own categories (price, quality, delivery …). Paste texts, point it at the results of another run, or give it CSV/JSON files and web pages. Any language, no setup, no API keys. From $1.74 per 1,000 texts, plus AI model usage.

✨ Why use Text Analytics?

  • 🎯 Sentiment you can sort by: a label plus positive, neutral and negative scores and one score from -1 to 1 for every text.
  • 🧭 Aspect sentiment on your terms: list your own categories and see which ones each text talks about, and whether it praises or criticises each one.
  • 🌍 Any language: German reviews, Spanish comments and Japanese posts are scored the same way; topics and summaries come back in one language of your choice.
  • 🔗 Works on your scraped data: give it the dataset of any review, comment or post run and keep every original field next to the analysis.
  • 📊 A report for the whole run: sentiment shares, net sentiment, top topics, top keywords and per-category sentiment in one summary record.
  • ⚡ Fast in bulk: texts are analysed in parallel batches; in our tests 1,000 short posts took about 35 seconds and 10,000 about 7 minutes.

🎯 Use cases

  • 🛍️ Product reviews: find what buyers praise and what makes them return items, per product or per category.
  • 📣 Social listening: score the comments under your posts, a competitor's posts or a campaign hashtag.
  • 🎧 Support tickets and chats: spot angry customers first and see which topics cause the most frustration.
  • 📝 Survey and NPS answers: turn open answers into topics and sentiment you can count.
  • 📰 News and articles: tone of headlines or full articles about a brand, a person or a market.
  • 🏨 App store, hotel and restaurant reviews: track sentiment by aspect (staff, cleanliness, price, location) over time.

🚀 How to use

  1. Put your texts in Texts (one per line), or paste a Dataset ID from another run, or add File or page links (CSV, JSON, JSON Lines, text files or web pages).
  2. For datasets and files, name the Text fields that hold the text (for example commentText), or leave it empty to pick the field automatically.
  3. Choose what to get: emotion, topics and keywords are on by default; add Your categories for aspect sentiment, or turn on the one-sentence summary.
  4. Click Start. Each text becomes one row; the run summary is saved as the OUTPUT record.
  5. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldWhat it does
textsTexts to analyse, one per item
datasetIdDataset ID of another run whose rows you want analysed
fileUrlsLinks to CSV, TSV, JSON, JSON Lines or text files, or web pages
textFieldsField(s) or column(s) that hold the text; dotted paths work; several are joined
maxItemsStop after this many texts (empty = all)
emotions, topics, keywordsExtra analysis per text (on by default)
categoriesYour own categories for aspect sentiment
summaryOne-sentence summary per text (off by default)
outputLanguageLanguage of topics and summaries (default English)
modelThe AI model used (default google/gemini-2.5-flash-lite)
includeSourceItemKeep the original dataset or file row in item (default on)
{
  "texts": [
    "Arrived two days early and the quality is even better than in the photos. Very happy!",
    "The battery died after a week and support never answered my emails. Waste of money."
  ],
  "categories": ["price", "quality", "delivery", "customer service"]
}

Analysing the results of another run:

{
  "datasetId": "YOUR_DATASET_ID",
  "textFields": ["text"],
  "summary": true
}

📤 Output

FieldDescription
textThe analysed text
sentimentpositive, neutral or negative
sentimentScorePositive minus negative score, from -1 (very negative) to 1 (very positive)
positiveScore, neutralScore, negativeScoreThe model's probability for each sentiment (they add up to 1)
confidenceThe highest of the three scores
emotionStrongest emotion: joy, love, gratitude, surprise, anger, sadness, fear, disgust, disappointment or neutral
topics1 to 3 short topic labels
keywordsUp to 5 key words or phrases from the text
categoriesWhich of your categories the text talks about
aspectsSentiment per mentioned category, e.g. {"quality": "positive", "delivery": "negative"}
summaryOne-sentence summary (when turned on)
languageISO 639-1 code of the text's language (und for emoji-only texts)
source, sourceIndexWhere the text came from (input, a dataset ID or a file link) and its row number there
itemThe original dataset or file row (datasets and files)
textLength, truncatedLength of the text in characters, and whether it was longer than what one request reads
modelThe AI model that analysed the text
errorWhy a text could not be analysed (these rows are free)
[
  {
    "text": "Arrived two days early and the quality is even better than in the photos. Very happy!",
    "language": "en",
    "sentiment": "positive",
    "sentimentScore": 0.93,
    "positiveScore": 0.95,
    "neutralScore": 0.03,
    "negativeScore": 0.02,
    "confidence": 0.95,
    "emotion": "joy",
    "topics": [
      "product quality",
      "delivery"
    ],
    "keywords": [
      "Arrived two days early",
      "quality is even better",
      "Very happy"
    ],
    "categories": [
      "delivery",
      "quality"
    ],
    "aspects": {
      "delivery": "positive",
      "quality": "positive"
    },
    "textLength": 85,
    "truncated": false,
    "source": "input",
    "sourceIndex": 0,
    "model": "google/gemini-2.5-flash-lite",
    "error": null
  },
  {
    "text": "The battery died after a week and support never answered my emails. Waste of money.",
    "language": "en",
    "sentiment": "negative",
    "sentimentScore": -0.94,
    "positiveScore": 0.01,
    "neutralScore": 0.04,
    "negativeScore": 0.95,
    "confidence": 0.95,
    "emotion": "disappointment",
    "topics": [
      "product quality",
      "customer service"
    ],
    "keywords": [
      "battery died",
      "support never answered",
      "Waste of money"
    ],
    "categories": [
      "quality",
      "customer service"
    ],
    "aspects": {
      "quality": "negative",
      "customer service": "negative"
    },
    "textLength": 83,
    "truncated": false,
    "source": "input",
    "sourceIndex": 1,
    "model": "google/gemini-2.5-flash-lite",
    "error": null
  }
]

Run summary

Every run also saves a summary to the OUTPUT record of its key-value store: sentiment counts and shares, average score, net sentiment (share positive minus share negative), languages, emotions, the top 25 topics and keywords, and for each of your categories how often it was mentioned and with which sentiment. Trimmed example from the run above:

{
  "textsAnalyzed": 6,
  "sentimentCounts": {
    "positive": 2,
    "neutral": 2,
    "negative": 2
  },
  "sentimentShare": {
    "positive": 0.3333,
    "neutral": 0.3333,
    "negative": 0.3333
  },
  "averageSentimentScore": -0.015,
  "netSentiment": 0,
  "topTopics": [
    {
      "topic": "product quality",
      "count": 2
    },
    {
      "topic": "customer service",
      "count": 2
    },
    {
      "topic": "delivery",
      "count": 1
    }
  ],
  "categories": {
    "quality": {
      "mentions": 2,
      "positive": 1,
      "neutral": 0,
      "negative": 1
    },
    "customer service": {
      "mentions": 2,
      "positive": 1,
      "neutral": 0,
      "negative": 1
    }
  }
}

💰 Pricing

You pay per analysed text. Empty texts and texts that could not be analysed are free.

EventFreeStarterScaleBusiness
Analysed text (per 1,000)$3.40$2.84$2.29$1.74

The AI model usage and compute of the run are billed on top as run usage. With the default model a short review or comment uses well under a tenth of a cent of AI model usage; a larger model or the summary option uses more. Example: 1,000 product reviews cost $3.40 on the Free plan and $1.74 on Business, plus a few cents of AI model and compute usage. Set a maximum cost per run to stay in budget: the run stops cleanly when it is reached and keeps everything analysed so far.

❓ FAQ

How accurate is the sentiment? It comes from a current AI language model that reads each text in context, so sarcasm, negation ("not bad at all"), emojis and mixed reviews are taken into account. The scores are the model's own confidence, not a calibrated probability; for borderline texts check the neutralScore.

Which languages work? Practically every written language. The language of each text is detected and returned; topics and summaries are written in the language you set.

Can I analyse the results of a scraper automatically? Yes. Add an integration or webhook to the scraper run that starts this one with datasetId set to the run's defaultDatasetId. Set textFields to the field that holds the text, for example text, commentText or reviewText.

How many texts can one run analyse? As many as you give it: there is no cap. Large datasets and files are read page by page and results are saved as they come, in the input order. Use Max texts to try a sample first.

What happens with very long texts? Each text is analysed whole up to 100,000 characters. Longer texts are analysed on their first 100,000 characters and marked truncated: true.

Do I need an API key or a proxy? No. The AI model is reached through Scrape.ly, and its usage is billed to your Scrape.ly account. Texts go through the Scrape.ly AI model gateway to the model provider to be analysed; the results are stored in your own run storage.

Can I use it through the API or on a schedule? Yes. Start it through the API, the CLI, MCP clients or a schedule like any other actor, and export the results in JSON, CSV, Excel or HTML.

⚠️ Limits

  • Sentiment and emotions are judged by an AI model. It is very good on reviews and comments, but it can misread insider jokes, very short texts ("ok") or texts that need missing context.
  • One text is read up to 100,000 characters; anything after that is not analysed (truncated: true).
  • JSON documents are read whole and can be up to 60 MB; CSV, JSON Lines and text files are read row by row and can be up to 200 MB each.
  • Web pages are fetched without a browser: pages that build their text with JavaScript or block automated visitors return little or no text.
  • On the Free plan the platform limits AI model usage per day; when that allowance is used up the run stops and keeps what it analysed.

Related actors

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.