# SA AI Visibility Index, Edition 2: method note

Published with Edition 2 on 9 October 2026. Publication was pre-registered for 6 October 2026; it is three days late.
Page: https://aiv.autoalphaadvisory.co.za/research/sa-ai-visibility-index

Edition 2 uses Edition 1's method with three changes: which answers count, how a change between editions is judged
when that first rule moves, and how websites are tested for AI crawlers. This note sets out each one with its counts.
The full methodology is at `/research/sa-ai-visibility-index/methodology`.

## 1. Which answers count

The panel is Edition 1's, unchanged: 3 verticals, 36 buyer questions each, the same four engines, 3 runs per question,
432 answers per vertical and 1,296 in all. The sweep was pre-registered for 15 September 2026 and ran on
25 September 2026, ten days late.

Since September our runs record, for every answer, whether the engine actually searched the web. Two engines often
chose not to:

| Engine (model) | Answers | Searched | Declined to search |
|---|---|---|---|
| ChatGPT (gpt-4o-mini, OpenAI API, web search offered) | 324 | 173 | 151 |
| Claude (claude-haiku-4-5, Anthropic API, web search offered) | 324 | 293 | 31 |
| Gemini (gemini-2.5-flash) | 324 | 324 | 0 |
| Perplexity (sonar) | 324 | not reported per answer; sources cited on all 324 | counted |

An answer given without searching comes from the model's training data, not from the web search the consumer product
runs, so Edition 2 leaves those answers out of every figure (internal decision D-109, 23 September 2026). That leaves
1,114 answers: property 375, legal 378, accounting 361.

Edition 1 could not tell whether an engine searched, so it counted every answer. Any comparison between the two editions
therefore crosses a change of rule.

## 2. How a change is judged

Fixed before the sweep (pre-registration, 3 September 2026): a share of mention moving by fewer than 5 percentage points
is "no change", and so is a rank swap between brands fewer than 5 points apart. Shares are compared unrounded
(answers naming the brand ÷ answers), against Edition 1 as restated on 3 September 2026.

Because of section 1, every Edition 2 share was also recomputed with the declined answers put back, which is Edition 1's
rule, through the same export code. A move is reported as movement only if it is 5 points or more, in the same
direction, under both rules. Where the two rules disagree, the row is marked on the page and not reported as a change.
ChatGPT's and Claude's per-engine columns are not compared across editions at all.

| Vertical | Brand | Edition 1 | Edition 2 | Change | Change, Edition 1's rule | Reported as |
|---|---|---|---|---|---|---|
| Property | Property24 (platform) | 15.3% | 9.6% | −5.7 | −5.1 | down |
| Accounting | Xero (platform) | 16.0% | 8.9% | −7.1 | −7.4 | down |
| Accounting | BDO South Africa | 27.8% | 22.2% | −5.6 | −3.5 | depends on the rule |
| Accounting | SNG Grant Thornton | 12.5% | 7.5% | −5.0 | −3.2 | depends on the rule |
| Accounting | Deloitte South Africa | 13.9% | 6.1% | −7.8 | −4.4 | depends on the rule |

Every other tracked brand and platform is "no change" under both rules, and no rank swap is 5 points apart under both.

The rule matters most in accounting because of where our ChatGPT arm searched. It searched on all 27 of its answers to
city questions (Cape Town, Johannesburg, Sandton, Pretoria, Durban, Gqeberha, the Winelands) and named local practices
from its sources, none of them among the twelve tracked firms. It declined to search in 61 of its 81 answers to
national questions and answered those from memory, naming BDO in 24 of them, Deloitte in 19 and PwC in 17. Edition 2
keeps only the searched answers, so ChatGPT names no tracked accounting firm in this edition. This records what the API
model did; the ChatGPT app may behave differently.

## 3. Engines and models

The same models were requested as in Edition 1. ChatGPT and Claude reported the same dated model on every Edition 2
answer (gpt-4o-mini-2024-07-18 and claude-haiku-4-5-20251001). Gemini and Perplexity report only the model name we
asked for, so a change of model behind the same name is invisible for them. Edition 1 did not record the model the
provider ran, so a change between the editions cannot be ruled out for any engine. No engine is marked "not
comparable", but that check could only have caught a change inside Edition 2, on ChatGPT or Claude.

Edition 2's Perplexity answers were collected on Perplexity's Sonar chat-completions endpoint, as in Edition 1. After
the sweep our Perplexity arm moved to Perplexity's Agent API with the same model (internal decision D-110,
25 September 2026). That is a different instrument, so Perplexity's change from Edition 2 to Edition 3 will be reported
as not comparable.

## 4. Reading the answers

Every answer is read by the same extraction model and prompt as in Edition 1 (gpt-4o-mini, temperature 0), which lists
the brands it names and whether each is recommended. An extracted brand counts only if the answer names it in its own
text, with cited URLs removed, or the question named it (the filter introduced in the 3 September restatement, applied
to both editions). It removed 63 tracked-brand hits in property, 9 in legal and 13 in accounting. No extraction failed
(0 of 1,114).

A known limit, the same in both editions: the extractor sometimes returns no brands for an answer that lists several.
Checked against a plain name match, 3 Edition 2 accounting answers name a tracked brand the extractor missed (Edition 1:
4); property and legal have none in either edition. Each affected brand loses at most one answer, under 0.3 points of
share. Misses that name only untracked firms mean the "named without being tracked" counts are undercounts, in both
editions.

## 5. Website tests for AI crawlers

Each tracked brand's homepage is fetched twice each by six visitors: a normal browser (the control), GPTBot,
ClaudeBot, PerplexityBot, OAI-SearchBot and Claude-SearchBot. Robots.txt is read once. Edition 2 publishes two verdicts
(internal decision D-111, 1 October 2026):

| Column | Crawlers | Rules |
|---|---|---|
| `ai_crawler_status` (Edition 1 method) | GPTBot, ClaudeBot, PerplexityBot | served or refused at the time of the fetch; a 403 counts only when both fetches get it; robots.txt not read. Unchanged from Edition 1 so the editions compare like for like. |
| `ai_search_crawler_status` (new) | OAI-SearchBot, Claude-SearchBot, PerplexityBot, the crawlers behind each engine's search answers | a reproduced 403 or a robots.txt opt-out counts as a block; when the normal browser is refused on both fetches, a crawler's 403 is "not tested", never a block |

Where the browser was refused on both fetches, the Edition 1-method label is kept as the method produces it, so the
columns stay comparable, and footnoted on the page; the CSV marks it in `browser_refused`. In Edition 2 that applies to
Bowmans, Cliffe Dekker Hofmeyr and PwC South Africa.

**Request spacing and dates.** Edition 1, and a first Edition 2 run on 1 October 2026, paused 0.4 seconds between
requests. In the 1 October run four sites answered some crawler fetches with 429 (too many requests): Adams & Adams,
DSC Attorneys, STBB and The Beancounter. Re-probed on 2 October with 10 seconds between requests, Adams & Adams and STBB
served every crawler, DSC Attorneys refused our normal browser as well, and The Beancounter still answered GPTBot,
ClaudeBot and OAI-SearchBot with 429. Short spacing can cause a throttle, so every later run used 10 seconds: a full run
on 2 October 2026 and a re-run on publication day, 9 October 2026.

Property and legal publish the 9 October run. Property did not change from 2 October. Legal changed on three sites:
DSC Attorneys served our browser again but answered GPTBot, ClaudeBot and OAI-SearchBot with 429 on both fetches;
Adams & Adams answered one ClaudeBot fetch with 429; STBB served every crawler. Accounting publishes the 2 October run.
The 9 October accounting run stopped after 13 of its 14 sites, when our machine ran short of memory, before it wrote its
results. Its log gives the same verdicts as 2 October for 12 of those 13 sites; The Beancounter's 429s fell on ClaudeBot
and OAI-SearchBot that day, not GPTBot and OAI-SearchBot.

A 429 is published as "throttled at measurement time": it describes that day, not a standing policy, and the same site
can throttle a different crawler a week later. Edition 1's results were taken at 0.4 seconds, so a change in a throttle
or block label between the editions may reflect our spacing rather than a change on the site.

**Limits that stand.** Our fetches come from our own servers, not from the crawler operators' published IP ranges, so a
rule keyed to those ranges at a host or CDN is not tested. The browser control is a plain HTTPS client sending a Chrome
user agent; bot protection that checks more than the user agent can refuse it, which is when the search verdict says
"not tested". A site that does not answer at all is "not tested", never "visible".

## 6. Files

The three CSVs at this address carry one row per tracked brand: share of mention, shortlist share, conviction, the
counts behind them, both crawler verdicts (`ai_crawler_status`, `ai_search_crawler_status`), `browser_refused` (yes when
a normal browser was refused on both fetches) and the share per engine. Edition 1's restated CSVs stay at
`/research/sa-ai-visibility-index/edition-2026-07/`.
