Concepts¶
Identifiers¶
Every resource in URLs, request bodies, JSON responses, CSV exports and webhook payloads is addressed by an
opaque public id: a type prefix plus 16 random base32 characters (80 bits), e.g. rep_3iysz2mrrf63fq3z.
| Resource | Prefix | Resource | Prefix |
|---|---|---|---|
| organization | org_ |
job | job_ |
| project | prj_ |
API key (record id, not the secret) | key_ |
| report | rep_ |
feedback | fb_ |
| audit | aud_ |
invite | inv_ |
Ids are not sequential and say nothing about volume. Treat them as opaque strings (max 24 characters). Old
integer ids (/v1/reports/49, X-Project-ID: 1) return 404 since #142.
Rules¶
A rule is one observable practice turned into one yes/no question, e.g. "Is the same keyword repeated unnaturally?".
Rules come from Google spam policies (layer spam), the SQRG Lowest/Low criteria (layer quality) or describe
context (layer context). Each rule has an id, a version ver (bumped when its wording changes) and sources.
Categories¶
Every rule also has a category, which decides the report section and its own risk level:
| Category | What it covers | In the report |
|---|---|---|
spam |
Google spam policies | Spam risk stamp |
quality |
SQRG Lowest/Low criteria (and the context labels) | Quality risk, beside the stamp |
helpful |
Google's "helpful, reliable, people-first content" self-assessment (QR-HC-*, C4-PURPOSE) |
Helpful content risk, beside the stamp |
Only spam sets the stamp; quality and helpful content are not spam-policy violations. Site audits accept
categories (default: all) to check only some of them - fewer rules per page, lower cost and less time. Context labels (YMYL, transactions, UGC, utility page) always run.
Presets preset:spam, preset:quality, preset:helpful (whole category) and preset:spam-quick are available
wherever rules is accepted. Older stored reports get their category from the rule id when rendered.
Browse them in the Rules catalog.
Rating scales (multiple choice)¶
Some rules (answer_type: choice) ask for one lettered option instead of 0/1, e.g. Page Quality on the SQRG
scale Lowest, Lowest+, Low, Low+, Medium, Medium+, High, High+, Highest (letters A-I). Each option has an anchor
from the SQRG with its section and page. The model still answers with one token; code computes the
distribution (normalised over the option letters, coverage = their raw sum), the most likely
level (modal), the expected position on the scale (expected) and the uncertainty (entropy, 0 = certain,
1 = flat). The model never outputs numbers.
| Rule | Scale | Category |
|---|---|---|
QR-PQ |
Page Quality, 9 levels | quality |
QR-MCQ |
Main content quality, Lowest-Highest | quality |
QR-EEAT-EXPERIENCE, QR-EEAT-EXPERTISE, QR-EEAT-TRUST |
E-E-A-T, separate scales Lowest-Very high (Authoritativeness needs reputation research, not assessed) | quality |
C6-YMYL-LEVEL |
YMYL degree: not / possibly / clearly (label; supersedes the 0/1 C1-YMYL, which stays for compatibility) |
quality |
C7-PAGE-PURPOSE |
Page purpose, a list (label) | quality |
Reports show a distribution bar per scale under choices in the JSON. The default findings view shows the labels and
a scale only when P(Lowest/Low) ≥ 0.5; site audits show the mean Page Quality distribution, Page Quality per URL
pattern, the pages likely Lowest/Low and the E-E-A-T profile (weakest page per scale). Scales are not part of the
risk levels and are uncalibrated (a separate calibration is planned). Each choice rule costs like one rule.
Every rule also has plain-language texts for people (English and Polish): a short title, a one-to-two sentence
summary of what we check, why it matters for Google and for your business, and how to fix it. Reports,
the panel, CSV exports and the catalog show the title and summary first; the rule id is secondary. These texts are
never sent to the model, so editing them does not change ver or scores.
Kinds¶
kind says what an answer 1 means:
| kind | 1 means |
Report section |
|---|---|---|
violation |
the problem is present on the page | violations, quality_signals |
info |
a neutral label applies (YMYL, payments, UGC) | labels |
positive |
a good signal is present (clear page purpose) | positives |
Scores: raw, not calibrated¶
The model answers only 0 or 1. From the first-token log-probabilities the service computes
score_raw = P(1) / (P(0) + P(1)), plus z (log-odds) and coverage (P(0) + P(1); below 0.9 the model wanted to
say something else). score_raw is a ranking, not a probability. probability is filled only when the scoring
has been calibrated against labelled pages. The verdict and thresholds are computed in code.
Evidence ✓/✗¶
For violation rules with a high score_raw the service asks for verbatim quotes from the page and checks each quote
against the page text in code. Verified quotes are shown with ✓, unverified with ✗. A high score with no verified
quote is flagged unsupported ("No evidence") and deserves extra scepticism.
Not assessed¶
Some practices (cloaking, link schemes across sites, expired-domain history…) cannot be judged from the content of a
single page. They are listed in every report under not_assessed with a reason, so absence of a score is explicit.
Method version¶
The service picks the inference setup itself; it is not selectable and not shown in reports. Scores are comparable
within one method version: every report records profile.prompt_ver, and rules carry their own ver.