🎯 A customizable, anti-detection cloud browser powered by self-developed Chromium designed for web crawlers and AI Agents.πŸ‘‰Try Now
Back to Blog

How to Monitor Brand Sentiment Across AI Answer Engines

James Thompson
James Thompson

Scraping and Proxy Management Expert

29-Jun-2026

TL;DR:

  • Brand sentiment in AI answers is a different signal from citation share. Being cited tells you a source was used; sentiment tells you how your brand is described in the answer a buyer actually reads β€” and the two can disagree.
  • One prompt, every engine, one envelope. The Scrapeless LLM actors (scraper.chatgpt, scraper.copilot, scraper.perplexity, scraper.gemini, and the rest) share an endpoint and a { status, task_id, task_result } shape, so a single capture loop covers them all.
  • Sentiment is computed from the answer text, not the citations. Find the brand name in result_text, read the words around each mention, and score the surrounding context β€” no model key required for a transparent lexicon baseline.
  • The picture varies by engine. In one live capture of the prompt "Is Scrapeless a good tool for web scraping?", the same brand read positive on two engines, neutral on a third, and negative on a fourth β€” the kind of split a single-engine check would miss.
  • It runs on a schedule. Capture, detect, score, and store each run with its task_id and timestamp; the series over weeks is the brand-perception trend.
  • Free to start. New Scrapeless accounts include free trial credits β€” sign up at app.scrapeless.com.

Pipeline at a glance

When a buyer asks an AI assistant about your product, the assistant decides two things: whether to mention you, and how. "X is the most reliable option" and "X is powerful but expensive and hard to learn" are both mentions; only one helps you. Citation tracking counts the first dimension. This pipeline measures the second.

The build is three stages on top of the Universal Scraping API:

  1. Capture β€” run a fixed brand-intent prompt across the AI answer engines through their Scrapeless actors; store each raw answer.
  2. Detect β€” find every mention of the brand in the answer text and pull the surrounding context window.
  3. Score β€” rate the sentiment of each mention's context and aggregate to one number per engine.

The output is a per-engine sentiment score you can chart over time, alongside the raw mentions that produced it. For the citation-share companion metric β€” which sources the engines pull from β€” see the AI Overview scraper guide.


What You Can Do With It

  • Catch a negative framing before it spreads. If one engine starts describing your brand around words like "expensive" or "hard to learn", you see it in the score before it shows up in lost deals.
  • Compare perception across engines. The assistant your buyers use may not be the one that likes you most; a side-by-side score tells you where to focus.
  • Tie sentiment to content changes. Capture before and after publishing a comparison page or docs rewrite, and watch whether the framing moves.
  • Separate "mentioned" from "mentioned well". A high mention count with a flat sentiment score is a different problem than a low mention count β€” and calls for a different fix.
  • Feed a dashboard. The per-engine score and the mention rows drop straight into a database or a chart.

Why the Scrapeless LLM actors

Each AI assistant is a JavaScript application behind authentication and anti-automation defenses; capturing the answer yourself means rendering, sign-in, and proxy rotation per platform. The Scrapeless LLM actors run that surface server-side and return the answer as a field. For a sentiment pipeline specifically, they bring:

  • A shared { status, task_id, task_result } JSON envelope across every engine, so one capture loop and one parser cover the whole set.
  • result_text as markdown β€” the exact text the brand is described in, ready to scan for mentions.
  • Residential egress in 195+ countries, so a pinned country captures the answer a real user in that market would read.
  • No browser to run or keep signed in β€” one HTTP endpoint, one x-api-token header.

Pricing for the actor line is usage-based with free trial credits on signup β€” current tiers are on the pricing page. Get your API key on the free plan at app.scrapeless.com.


Prerequisites

  • A Scrapeless account and API key (free plan includes trial credits) β€” app.scrapeless.com.
  • The key in your environment:
bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"
  • Python 3 with requests. The sentiment step uses only the standard library, so there is no model key to manage for the baseline.

Stage 1 β€” Capture the answers

One loop covers every engine, because the actors share an endpoint and an envelope. The per-engine differences live in the input map β€” Grok takes a reasoning mode, Perplexity wants web_search, Copilot takes its own mode. The answer text lands in result_text for ChatGPT, Copilot, Perplexity, Gemini, and AI Mode.

python Copy
import json
import os
import time

import requests

ENDPOINT = "https://api.scrapeless.com/api/v2/scraper/execute"
HEADERS = {
    "Content-Type": "application/json",
    "x-api-token": os.environ["SCRAPELESS_API_KEY"],
}

BRAND = "Scrapeless"
PROMPT = "Is Scrapeless a good tool for web scraping, and what are its strengths and weaknesses?"
COUNTRY = "US"

ENGINES = {
    "chatgpt": {"actor": "scraper.chatgpt", "extra": {}},
    "copilot": {"actor": "scraper.copilot", "extra": {"mode": "smart"}},
    "perplexity": {"actor": "scraper.perplexity", "extra": {"web_search": True}},
    "gemini": {"actor": "scraper.gemini", "extra": {}},
}

with open("answers.jsonl", "w", encoding="utf-8") as out:
    for platform, spec in ENGINES.items():
        payload = {"actor": spec["actor"], "input": {"prompt": PROMPT, "country": COUNTRY, **spec["extra"]}}
        data = requests.post(ENDPOINT, headers=HEADERS, json=payload, timeout=300).json()
        result = data.get("task_result") or {}
        out.write(json.dumps({
            "platform": platform,
            "brand": BRAND,
            "prompt": PROMPT,
            "captured_at": int(time.time()),
            "status": data.get("status"),
            "task_id": data.get("task_id"),
            "result_text": result.get("result_text") or "",
        }) + "\n")
        print(f"{platform}: {data.get('status')} ({len(result.get('result_text') or '')} chars)")

Each line of answers.jsonl is one engine's answer, keyed by task_id for the audit trail.

Get your API key on the free plan: app.scrapeless.com


Stage 2 and 3 β€” Detect mentions and score sentiment

Find the brand in each answer, read a window of text around every mention, and score that context against a small positive/negative lexicon. The lexicon baseline is transparent and needs no model key; swap in a model-based scorer later if you want nuance.

python Copy
# score.py β€” answers.jsonl -> per-engine sentiment
import json
import re

POSITIVE = {"best", "great", "powerful", "reliable", "easy", "fast", "robust", "excellent",
            "strong", "good", "effective", "scalable", "flexible", "recommended", "leading",
            "top", "efficient", "affordable"}
NEGATIVE = {"expensive", "slow", "difficult", "limited", "weak", "poor", "lacking", "unreliable",
            "complex", "costly", "drawback", "weakness", "con", "cons", "issue", "problem", "downside"}
WINDOW = 120  # characters of context on each side of a mention

rows = []
for line in open("answers.jsonl", encoding="utf-8"):
    record = json.loads(line)
    brand = record["brand"].lower()
    text = (record.get("result_text") or "").lower()
    hits = [m.start() for m in re.finditer(re.escape(brand), text)]
    pos = neg = 0
    for i in hits:
        context = text[max(0, i - WINDOW): i + WINDOW]
        words = set(re.findall(r"[a-z]+", context))
        pos += len(words & POSITIVE)
        neg += len(words & NEGATIVE)
    total = pos + neg
    sentiment = (pos - neg) / total if total else 0.0
    label = "positive" if sentiment > 0.15 else "negative" if sentiment < -0.15 else "neutral"
    rows.append({"platform": record["platform"], "mentions": len(hits),
                 "pos_signals": pos, "neg_signals": neg,
                 "sentiment": round(sentiment, 3), "label": label})
    print(f"{record['platform']:11} mentions={len(hits):3} sentiment={sentiment:+.3f} ({label})")

json.dump(rows, open("sentiment.json", "w"), indent=2)

A single live capture of the Scrapeless prompt produced a split that one engine alone would have hidden:

Engine Mentions Sentiment Reading
ChatGPT 18 +0.52 positive
Copilot 38 βˆ’0.02 neutral
Perplexity 40 +0.39 positive
Gemini 19 βˆ’0.60 negative

The mention counts and the sentiment move independently: Copilot's 38 mentions landed neutral, while Gemini's smaller set of 19 mentions skewed sharply negative. Counting citations would have missed both facts. Because each engine generates its answer fresh, the exact figures shift run to run β€” the positive/neutral/negative split across engines is the durable signal, not any single number.


Scheduling and scaling the series

Run capture.py then score.py on a schedule β€” daily or weekly β€” and append each run's rows to a store keyed by captured_at and task_id. A few notes from the live runs:

  • Answers vary run to run, so a single capture is a sample, not a verdict. The trend across the series is the signal.
  • Pin the country so the score reflects a market you care about and stays comparable across runs.
  • Treat the lexicon as a baseline. It is transparent and fast; for finer reads (sarcasm, conditional praise) score the same context windows with a model and keep the lexicon as a cross-check.
  • Keep the raw mentions. When a score moves, the stored context windows tell you which phrases moved it.

Conclusion: measure how the AI describes you

Citation tracking tells you the assistant used your page; sentiment tracking tells you whether the buyer who read the answer came away with a good impression. The Scrapeless LLM actors make the second measurable: one capture loop, the answer text as a field, and a transparent scorer turn "how do the AI engines talk about us?" into a number you can chart.

Ready to Build Your AI-Answer Data Pipeline?

Join our community to claim a free plan and connect with developers building AI-answer pipelines: Discord Β· Telegram.

Sign up at app.scrapeless.com for free trial credits, and point the pipeline at the brands, prompts, and markets you need to monitor.

FAQ

Q: How is brand sentiment different from share of citation?

A: Share of citation counts whether your domain is used as a source; sentiment reads how your brand is described in the answer text. A brand can be cited often but described flatly, or described warmly while barely cited β€” the two metrics answer different questions.

Q: Do I need a model API key for the sentiment step?

A: No. The baseline scorer uses a transparent positive/negative lexicon over a context window, so it runs on the standard library alone. A model-based scorer is an optional upgrade, not a requirement.

Q: Why did the same brand score differently on each engine?

A: Each engine synthesizes its own answer from its own sources and phrasing, so the words around your brand differ. That divergence is exactly what the pipeline surfaces β€” the assistant your buyers use may frame you differently from the one you assumed.

Q: Is scraping AI answers legal?

A: The actors read publicly available answer content. As with any scraping, restrict use to public data, respect each platform's terms, avoid personal data, and consult a lawyer if a use case is unclear.

Q: Can I track more than one brand?

A: Yes. Run the same capture with a competitor-neutral prompt and score multiple brand strings against the same answers to compare framing side by side in your own records.

At Scrapeless, we only access publicly available data while strictly complying with applicable laws, regulations, and website privacy policies. The content in this blog is for demonstration purposes only and does not involve any illegal or infringing activities. We make no guarantees and disclaim all liability for the use of information from this blog or third-party links. Before engaging in any scraping activities, consult your legal advisor and review the target website's terms of service or obtain the necessary permissions.

Most Popular Articles

Catalogue