How to Monitor Brand Sentiment Across AI Answer Engines
Scraping and Proxy Management Expert
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_idand 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:
- Capture β run a fixed brand-intent prompt across the AI answer engines through their Scrapeless actors; store each raw answer.
- Detect β find every mention of the brand in the answer text and pull the surrounding context window.
- 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_textas markdown β the exact text the brand is described in, ready to scan for mentions.- Residential egress in 195+ countries, so a pinned
countrycaptures the answer a real user in that market would read. - No browser to run or keep signed in β one HTTP endpoint, one
x-api-tokenheader.
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
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
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
# 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
countryso 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.



