Open data · version 2 · 2026-08-25

What Romanian GEO agencies declare, technically

We pointed the scanner we use on client sites at the sites of the agencies selling AI optimisation. 27 agencies measured, 2 we could not measure and do not enter with a low score. We are in the table too.

The conflict of interest, stated up front

gr.AI publishes this index and appears in it. On the first v2 run (24 August 2026) we scored 75. We then fixed our own site with exactly the method we sell and reached 90 (25 August). Both figures are in the table; our score is self measured and not independently verified. On equal scores we place ourselves last.

We are measuring a market we compete in. There is no good answer to that, only an honest one: the method is public, we include ourselves, and anyone can rerun the measurement and contradict us. If you prefer a ranking without the measurer in it, skip our row; the rest of the table does not change.

What this page measures and what it does not

Two different things are measured. The access block (50 points): what a machine can actually obtain, meaning content in raw HTML without JavaScript, what the server answers a retrieval crawler, what robots.txt declares. The declaration block (50 points): what the site says about itself, meaning valid structured data, a complete organisation, linked profiles, marked reviews, author and date.

Not measured: the quality of their services, the results they got for clients, or the competence of their teams. A low score here does not mean a weak agency, it means a site that declares little. These are different things and we do not confuse them.

The measurements

AgencyScorev1ContentBot accessrobotsSchemasameAsReviewsAuthor+datellms.txt
Trifu Media906·clean
gr.AIus9093(-3)4·clean
SEOzilla852·clean
ALLSoft Agency805··clean
DWF804··
Limitless801··auto
Marketing Lab8093(-13)3··auto
Space Media803··clean
TUYA Digital8079(+1)6··
VIVINET801··auto
TargetWeb773·
Data Revolt754··
Digital Craft752··auto
SEO Cherry7590(-15)5·auto
AI Engine Optim7084(-14)···
BlueDot Fusion70···clean
Klain70···auto
OptimizareAI7093(-23)···clean
AgentieGEO65···clean
BrandScan6590(-25)···clean
Danco Vision65·5··clean
MDA Digital653··clean
Omniflux65···
GEO Agency62···
iAgency60···
NION55···
SEONIQ55···

yes · · no · blocks a retrieval crawler · score 0 to 100, measured 2026-08-25 · the v1 column is from 2026-08-05
llms.txt is a diagnostic, it is not scored: clean = written by a person, auto = generated by a plugin, = absent.
Score descending. On equal scores the order is alphabetical, and gr.AI is placed last among the agencies sharing that score.

What we could not measure

The domains below receive no score. A site that is down, or that filters our connection, is not a badly optimised site; it is a site we could not read. Entering it with a low score would be a false measurement, not a finding.

The Markersanti bot protection on: edge:ClaudeBot, edge:PerplexityBot, llms.txt, robots.txt
Upswingserver error (HTTP 500)

What the numbers show

25 out of 27 do not mark up their reviews in the format machines read. It is the signal an AI assistant leans on when comparing two suppliers. The ones that have it: Trifu Media and SEOzilla. The rest, ourselves included, do not. Until recently nobody had it; now it has started to be taken, which makes it more urgent, not less.

6 out of 27 block or degrade a retrieval crawler, while their own robots.txt says it is allowed. This is the difference version 1 could not see: what a site declares and what the machine actually receives are two things, and when they disagree, the second one is the truth.

On llms.txt: 11 files written by a person, 6 generated automatically by an SEO plugin, 10 absent. The binary tick in v1 put the first two categories in the same box, even though a file written by a person and a 60 KB dump of articles from 2022 are not the same thing. That is why llms.txt left the score and stayed on as a diagnostic.

Corrections after publication

An index that penalises unverified claims is not allowed to hide its own mistakes. Every correction stays here, with its date and its reason.

  • TargetWeb was listed as “unmeasurable, no response / DNS did not resolve”. That was wrong twice over: DNS did resolve, and the site does respond. Remeasured, it scores 77/100 and enters the table.

    The scanner put the same label on any network error without distinguishing between them. On the 25 August run the real cause was a timeout, not DNS. We fixed the scanner: it now reports the cause it actually measured (DNS, timeout, TLS, connection refused). The rule we apply to everyone else applies to us: a plausible false measurement is worse than a missing one.

What changed since version 1

Version 1 measured six things, all of them in the category of what the site declares. Version 2 adds the layer that was missing and that matters more: what the machine can actually take. The scores moved a lot, in both directions. The v1 column stays in the table so the size of the move is visible.

  • Added: real access at the edge (15 points). We request the page as OAI-SearchBot, PerplexityBot and ClaudeBot and compare against a browser control. A negative verdict is reconfirmed after a pause, because an isolated 403 is often rate limiting rather than policy.
  • Added: content in raw HTML (20 points). AI crawlers do not execute JavaScript. A site that delivers its text only through JS is empty to them.
  • Added: sameAs, author and freshness. Entity resolution, and evidence that the page is kept current.
  • Removed from the score: llms.txt. There is no public evidence that the major engines use it in production, and Google says explicitly that it is not required. We keep reporting it as a diagnostic. We do have an llms.txt, so removing it from the score costs us relative advantage. That is exactly why the removal is credible.
  • Removed from the score: FAQ. Rich results restricted by Google, and usefulness for extraction that is plausible but undemonstrated.
  • New rule: no score for what cannot be measured. A 5xx, dead DNS, or an anti bot challenge page served with HTTP 200 takes the row out of the ranking; it does not earn a low score.

Methodology: rerun the measurement yourself

No paid tool needed. Replace yoursite.com with the site being checked.

  1. Save the front page without executing JavaScript and count the words left. Under 100 means the machine has nothing to read.
  2. Request the page with a bot user agent and compare it with a browser. If the bot gets 403 and the browser gets 200, that is a block at the edge. Repeat after ten seconds before drawing a conclusion.
  3. Open robots.txt. A block means Disallow on the root inside the bot's own group. The bot's own group beats the wildcard, and an Allow on the root cancels it.
  4. Look in the page source for the JSON-LD block, then inside it for sameAs, AggregateRating, author and dateModified.
  5. Try llms.txt. If it exists, look at whether a person wrote it or a plugin generated it: search for “Generated by”.
curl -A "Mozilla/5.0 (compatible; PerplexityBot/1.0)" -I https://yoursite.com/

Want the same analysis on your own site?

Write to us

You are in the table and a measurement looks wrong to you? Write to contact@gr-ai.ro saying which one and we will recheck it in public. We have been wrong twice already. First: an old version of the scanner wrongly reported a site as blocking AI crawlers when its robots.txt explicitly allowed them. Second: until 24 August 2026 this page showed the date of the last deploy as the measurement date, reading it from the file system, which resets on every publication. The date now comes from the data file, written at the same time as the measurement.