---
title: "Compare 2–10 agents' reputation scores"
method: GET
path: "/reputation/compare"
tags: ["Reputation"]
---

# Compare 2–10 agents' reputation scores

`GET /reputation/compare`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/reputation/compare`
- Auth: none required

Returns the reputation rows for the given agent ids (comma-separated, 2–10). Private-visibility agents are silently filtered out. Public endpoint, cached 5 min.

## Query parameters

- `ids` string, required

## Response `200`

Comparison result.

- object
  - `agents` ReputationScore[], required
    - `agent_id` string, required
    - `score` integer, nullable, required
    - `grade` string, nullable, required: AAA–D or NR.
    - `tier` string, nullable
    - `is_eligible` boolean, required
    - `checkpoint_count` integer, required
    - `checkpoint_accounting` object, nullable: Structured breakdown of how checkpoints were counted toward the score. `analyzed` is the scoring population; `excluded` buckets are mutually exclusive and `analyzed + synthetic + insufficient_thinking + quarantined = total`. Null for legacy rows computed before this field existed.
      - `total` integer, required: All checkpoints recorded for the agent.
      - `analyzed` integer, required: Checkpoints that counted toward the score (drives the X/50 eligibility gauge).
      - `excluded` object, required
        - `synthetic` integer, required: Synthetic (`ic-synthetic-*`) checkpoints.
        - `insufficient_thinking` integer, required: Zero-analysis checkpoints (no extraction confidence, thinking tokens, or analysis duration).
        - `quarantined` integer, required: Checkpoints referenced by a non-expired enforce advisory; excluded from scoring entirely.
      - `re_evaluated` object: How many of the agent's checkpoints carry each kind of re-evaluation annotation (counted over `total`, not the analyzed subset). Observability only — these are not an exclusion bucket and do not enter the score arithmetic. Absent on scores computed before this breakdown existed.
        - `corrected_clear` integer, required: Checkpoints explicitly corrected to `clear` (`re_evaluation_metadata.corrected_verdict = 'clear'`).
        - `corrected_non_clear` integer, required: Checkpoints corrected to a NON-clear verdict — a cross-turn escalation or a reviewer reclassification to `review_needed`/`boundary_violation`. These count against the score per the correction, not as exonerations; a non-zero value is why this agent's score differs from the pre-MNE-2156 calculation.
        - `resolved_no_correction` integer, required: Checkpoints re-evaluated with NO recorded correction — the trust-recovery convention, scored as `clear`.
    - `confidence` 'insufficient' | 'low' | 'medium' | 'high', required
    - `components` object[], required
      - `key` 'integrity_ratio' | 'compliance' | 'drift_stability' | 'trace_completeness' | 'coherence_compatibility', required
      - `label` string
      - `score` number, required
      - `weight` number, required
      - `weighted_score` number, required
      - `factors` unknown[]
        - unknown
    - `computed_at` string, date-time, nullable
    - `next_compute_at` string, date-time, nullable: Next scheduled recompute — the 00/06/12/18 UTC cron slot strictly after `computed_at` (`floor(computed_at/6h)*6h + 6h`). Null when `computed_at` is null.
    - `trend_30d` number, nullable
    - `visibility` 'public' | 'private', required: Reputation-publication axis — whether this agent's Trust Rating is published. Every registered agent's reputation is `public` by accountability standard (the default; that is the whole point of a portable, verifiable rating); `private` is a rare owner opt-out that 403s the read to non-owners. This is DISTINCT from `Agent.public` (the identity-record visibility axis) — they share the word "public" but govern different things.
    - `claimed` boolean
    - `agent_name` string, nullable
    - `a2a_trust_extension` object: A2A trust extension for interop. Only present on `GET /reputation/{agent_id}` (not on batch/compare rows).
      - `extension_uri` string
      - `provider` string
      - `score` number
      - `grade` string
      - `confidence` string
      - `verified_url` string, uri
      - `badge_url` string, uri
      - `methodology_url` string, uri
      - `last_updated` string, date-time

## Other responses

- `400`: Bad request
- `404`: Resource not found
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.

---

[API](https://skmtc.dev/mnemom/apis/mnemom-api.md) · [All operations](https://skmtc.dev/mnemom/apis/mnemom-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemom/apis/mnemom-api/revisions/274b7a6ea182?raw)
