How to Track Your Brand's Rank in AI Recommendation Lists
Expert Network Defense Engineer
TL;DR:
- AI assistants answer "best tool for X" with a ranked list, and your position in it is a measurable number. Being on the list at all β and where β decides whether a buyer who asks ever sees you.
- One prompt, several engines, one envelope. The Scrapeless LLM actors (
scraper.chatgpt,scraper.perplexity,scraper.gemini, and the rest) share an endpoint and a{ status, task_id, task_result }shape, so a single loop captures each engine's ranked answer. - The metric is your brand's rank per engine β absent is a valid, important result. Parse the ordered list out of the answer, find your brand, and record its position; "not ranked" on an engine is the gap to close, not a missing data point.
- Rank is independent of citation share. An engine can cite your page yet leave you off its recommendation list; the two metrics answer different questions and should be tracked separately.
- It runs on a schedule. Re-capture the same buying-intent prompt over time and watch your position move as your content and reputation change.
- 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 for the best tool in your category, the answer is an ordered list β first pick, second pick, and so on. That ordering is the modern equivalent of a search ranking, except there is no page two and no way to scroll for more. Either you are in the list, near the top, or you are invisible to that buyer.
This pipeline turns that ordering into a number you can track. Three stages on top of the Universal Scraping API:
- Capture β run a fixed "best [category]" prompt across the AI answer engines through their Scrapeless actors; store each answer.
- Parse β pull the ordered list out of each answer's markdown (numbered items and ranked headings).
- Locate β find your brand in each list and record its position, or
absentwhen it is not there.
The output is a per-engine rank for your brand. For the companion metric β which sources the engines cite β see the AI Overview scraper guide.
What You Can Do With It
- Know whether you're on the list at all. The first question is binary: does the assistant name you when asked for the best in your category? Track that per engine.
- Watch your position move. Once you're on a list, rank is the dial β capture on a schedule and see whether you climb or slip.
- Find the engine that ignores you. Rank often differs across assistants; the one that leaves you off is where the visibility work is most urgent.
- Tie rank to content work. Capture before and after a launch or a docs push, and measure whether the position responds.
- Brief leadership with a number. "We rank 4th on one engine and are absent on two" is a clearer status than a screenshot.
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 rank tracking specifically, they bring:
- A shared
{ status, task_id, task_result }envelope across engines, so one loop and one parser cover the whole set. result_textas markdown β the numbered list survives intact, which is what the parser reads.- Residential egress in 195+ countries, so a pinned
countrycaptures the ranking a real user in that market sees through forwarded proxy headers. - 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 parse and locate steps use only the standard library.
Stage 1 β Capture the ranked answers
One loop covers every engine, because the actors share an endpoint and an envelope. The answer text lands in result_text as markdown, the numbered list intact.
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"],
}
PROMPT = "What are the best web scraping APIs in 2026? Give a ranked list."
COUNTRY = "US"
ENGINES = {
"chatgpt": {"actor": "scraper.chatgpt", "extra": {}},
"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,
"prompt": PROMPT,
"captured_at": int(time.time()),
"status": data.get("status"),
"result_text": result.get("result_text") or "",
}) + "\n")
print(f"{platform}: {data.get('status')}")
Stage 2 and 3 β Parse the list and locate your brand
Pull the ordered items out of each answer, then find your brand's position. The script prints only your own brand's rank β the rest of the list stays in the raw capture, not your report.
python
# rank.py β answers.jsonl -> your brand's rank per engine
import json
import re
BRAND = "Scrapeless"
def ranked_items(text):
# numbered list items: "1. Name", "### 2. Name", "3) **Name**"
items = re.findall(r"(?:^|\n)\s*(?:#{2,4}\s*)?(\d{1,2})[.\)]\s*\**([A-Za-z0-9][^\n*:]{1,40})", text)
return [(int(n), name.strip()) for n, name in items]
for line in open("answers.jsonl", encoding="utf-8"):
record = json.loads(line)
items = ranked_items(record["result_text"])
position = next((n for n, name in items if BRAND.lower() in name.lower()), None)
rank = position if position is not None else "absent"
print(f"{record['platform']:11} list_size={len(items):2} {BRAND}_rank={rank}")
A live run on "best web scraping APIs in 2026" returned ordered lists from all three engines β and Scrapeless was absent from every one of them. That is not a null result; it is the finding. For this category and prompt, a buyer asking any of the three assistants would never be shown the brand, which makes "get onto the list" the concrete, measurable goal β and rank the metric that tells you when the work lands.
| Engine | List size | Scrapeless rank |
|---|---|---|
| ChatGPT | 11 | absent |
| Perplexity | 10 | absent |
| Gemini | 7 | absent |
Scheduling and scaling the series
Run capture.py then rank.py on a schedule and append each run keyed by captured_at. A few notes from the live runs:
- Absent is a tracked value, not a gap in the data. Record it the same way you record a number, so the day it becomes a rank you can see the change.
- Answers regenerate, so rank wobbles. Track the trend across runs, not a single capture.
- Pin the
country. Recommendation lists shift by market; keep the value in your records so the series stays comparable. - Vary the prompt deliberately. "Best [category]" and "best [category] for [use case]" can return different lists β track the prompts that match how your buyers actually ask.
Conclusion: rank is the scoreboard for AI recommendations
Search gave you a rank you could measure; AI assistants gave you a list you mostly cannot see β until you capture it. The Scrapeless LLM actors make the recommendation list a structured field, so "are we on it, and where?" becomes a number you track over time. And when the honest answer is "absent," that is the clearest brief a growth team can get.
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 buying-intent prompts and markets your brand competes in.
FAQ
Q: How is rank different from citation share?
A: Citation share counts whether the engine used your page as a source; rank is your position in the engine's recommendation list. An engine can cite you without recommending you, or recommend you without citing your own domain β different questions, tracked separately.
Q: What does "absent" mean, and is it a failure of the scraper?
A: It means your brand was not in the engine's ordered list for that prompt β a real, common result, not a scraper error. The capture succeeded; the list simply did not include you. That absence is the most actionable signal the pipeline produces.
Q: Why does my rank change between runs?
A: Each engine regenerates its answer, so the ordering varies. Track the trend across runs rather than reacting to a single capture.
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 rank for a specific market?
A: Yes. Pass a two-letter country code in the input to pin the run to residential egress in that market, so the rank reflects what a local buyer would see.
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.



