---
title: "Get an AI-visibility audit subject"
method: GET
path: "/v1/trust/audit/subjects/{id}"
tags: ["Trust"]
---

# Get an AI-visibility audit subject

`GET /v1/trust/audit/subjects/{id}`

## Request

- Base URL: `https://api.prod.keyban.io`
- URL: `https://api.prod.keyban.io/v1/trust/audit/subjects/{id}`
- Auth: API key in header `X-Api-Key`

Drill down into a single tracked product: its full snapshot history (chronological) and the raw audit material (per-query ranks, competitors, technical checks, recommendations) of the most recent snapshot.

## Path parameters

- `id` string, required

## Response `200`

- AuditSubjectDetailDto
  - `id` string, uuid, required: UUID of the audit subject (the tracked product), distinct from the UUID of the passport it wraps.
  - `passportId` string, uuid, required: UUID of the DPP passport this subject tracks. A passport is tracked by at most one subject.
  - `productName` string, required: Commercial name of the tracked product, read live from the passport (not frozen at recruitment, unlike `category`).
  - `webPageUrl` string, nullable, required: Merchant product page (PDP) the audits crawl, read live from the passport. Never null in practice — a passport without a parsable URL is not recruited — but nullable to survive a passport edited after recruitment.
  - `category` string, required: Product category the subject was classified under at recruitment time (`schemeID:code`), or `uncategorized` when the passport had none. Frozen: later edits to the passport category do not change it. Drives the stratified sampling across the catalogue.
  - `language` string, nullable, required: ISO 639-1 code of the language the frozen audit prompts are written in, resolved at baseline from the merchant page (`<html lang>` cross-checked against the page text, product data as fallback). Null while `baseline_pending`, or when no signal allowed a decision.
  - `state` 'baseline_pending' | 'active' | 'archived', required: Lifecycle state: `baseline_pending` (recruited, T0 audit not captured yet, passport still held back as draft), `active` (T0 captured, passport live, re-audited weekly), `archived` (audits stopped, quota slot freed).
  - `recruitedAt` string, date-time, required: When the product was recruited as an audit subject (at its publish attempt).
  - `baseline` object, nullable, required: The T0 snapshot (first audit, captured before the passport went live). Null while the subject is still `baseline_pending`.
    - `auditedAt` string, date-time, required: When this snapshot was captured (audit run completion time), not when this response was generated.
    - `geo` integer, required: Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.
  - `latest` object, nullable, required: Most recent snapshot (the baseline itself, or a later weekly re-audit). Null while the subject is still `baseline_pending`.
    - `auditedAt` string, date-time, required: When this snapshot was captured (audit run completion time), not when this response was generated.
    - `geo` integer, required: Composite GEO (Generative Engine Optimization) score of this snapshot, the weighted combination of the four axes.
  - `delta` integer, nullable, required: `latest.geo` minus `baseline.geo`. Null only when there is no baseline yet — a delta of 0 (no movement since T0) is a real, distinct value.
  - `snapshots` object[], required: Every snapshot ever captured for this subject (the baseline plus every weekly re-audit since), oldest first.
    - `id` string, uuid, required: UUID of this snapshot.
    - `kind` 'baseline' | 'scheduled', required: `baseline`: the T0, captured before go-live, at most one per subject. `scheduled`: a later weekly re-audit.
    - `visibility` integer, required: Visibility axis (0-100): how often and how highly the product surfaces in generative-engine answers for its frozen queries.
    - `competitive` integer, required: Competitive axis (0-100): the product's share of visibility relative to the competitor domains found on the same queries.
    - `technicalReadiness` integer, required: Technical-readiness axis (0-100): page exploitability by crawlers/agents (passing technical checks minus missing schema.org markup).
    - `answerability` integer, required: Answerability axis (0-100): how well the page content pre-answers buyer questions (specs, reviews, FAQ, comparisons).
    - `geo` integer, required: Composite GEO score (0-100), the weighted combination of the four axes above.
    - `sources` string[], required: External engines that actually served this audit. An engine down at audit time is simply absent here rather than failing the audit, as long as at least one engine answered each query.
    - `auditedAt` string, date-time, required: When this snapshot was captured.
  - `details` object, nullable, required: Raw audit material (per-query ranks, competitors, technical checks, recommendations) of the most recent snapshot only — not repeated for every historical snapshot in `snapshots`. Null when the subject has no snapshot yet.
    - `queries` object[], required: Per-query results for the frozen query set, one entry per query.
      - `text` string, required: Purchase-intent prompt, phrased as a shopper would ask an AI assistant, frozen at recruitment so weekly scores stay comparable.
      - `intent` 'category' | 'brand' | 'comparison' | 'problem' | 'quality' | 'origin' | 'warranty' | 'certification', required: Shopping intent family the query covers. One query per family max, frozen at recruitment. Generic purchase intents: `category` (the product type or use case), `brand` (this brand specifically), `comparison` (this product against alternatives), `problem` (a need the product solves). Proof-seeking intents — where certified product data has a chance to weigh: `quality` (proven quality or reliability), `origin` (provenance, made-in), `warranty` (guarantee, after-sales), `certification` (certified or verified product claims).
      - `ranks` object, required: Rank of the tracked product in each engine that answered this query (null = the engine answered but the product domain was absent from its results). An engine missing from this object did not answer the query at all.
      - `visibility` integer: Visibility score (0-100) this single query earned: 100 when the product ranked in the top 3, 50 in the top 10, 0 beyond. The snapshot `visibility` axis is the mean of these. Absent on snapshots captured before per-query scores were recorded.
      - `competitive` integer: Competitive score (0-100) this single query earned: the product's rank weight divided by the summed rank weights of every domain seen on the query. The snapshot `competitive` axis is the mean of these. Absent on snapshots captured before per-query scores were recorded.
      - `top` object[]: The three best-ranked domains on this query, the tracked product included when it made the cut, merged across engines by best rank (ties broken alphabetically). Absent on snapshots captured before leaders were recorded.
        - `domain` string, required: Domain of one of the best-ranked results, the audited product's own domain included when it made the cut.
        - `rank` integer, required: Best rank the domain reached on this query across the engines that answered it.
    - `competitors` object[], required: Competitor domains found across the query set, capped to the 15 best-ranked, sorted by best rank first.
      - `domain` string, required: Competitor domain (distinct from the subject own domain) seen in at least one query result.
      - `bestRank` integer, required: Best (lowest) rank this domain achieved across all queries.
      - `queries` string[], required: Query texts where this competitor domain appeared.
    - `pageChecks` object[], required: Individual technical-readiness checks run against the product page, backing the `technicalReadiness` axis.
      - `id` string, required: Stable identifier of the technical check.
      - `status` 'pass' | 'warn' | 'fail', required: Outcome of the check: `pass` (no issue), `warn` (suboptimal but not disqualifying), `fail` (missing or broken).
    - `answerabilitySignals` object, required: Individual content signals detected on the page (e.g. presence of specs, reviews, FAQ), backing the `answerability` axis.
    - `recommendations` object[], required: Suggested actions to improve the score, derived from the failed/warned checks and missing answerability signals. Capped to the 5 most urgent.
      - `priority` 'high' | 'medium' | 'low', required: Urgency of the recommended fix.
      - `action` string, required: Human-readable action to take.

---

[API](https://skmtc.dev/keyban/apis/keyban-rest-apis.md) · [All operations](https://skmtc.dev/keyban/apis/keyban-rest-apis/llms.txt) · [OpenAPI document](https://skmtc.dev/keyban/apis/keyban-rest-apis/revisions/0bb79a1da961?raw)
