---
title: "Batch reputation lookup (auth required)"
method: POST
path: "/reputation/batch"
tags: ["Reputation"]
---

# Batch reputation lookup (auth required)

`POST /reputation/batch`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/reputation/batch`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Mnemom-Api-Key`

Returns reputation rows for up to 50 agent ids. Requires API key or bearer JWT (rate-limited as `search_batch` — 30/min per auth principal). Private-visibility agents return a stub row with `score: null`.

## Request body

- object
  - `agent_ids` string[], required

## Response `200`

Scores (private rows return stubs).

- object
  - `scores` union[], required
    - union
      - ReputationScore: Agent reputation row computed by the reputation worker's 6-hour cron. Grade alphabet: `AAA AA+ AA A+ A B+ B C+ C D NR` (NR = not-rated, insufficient data). Score is an integer 0–1000.
        - `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
      - object
        - `agent_id` string
        - `visibility` 'private'
        - `score` unknown
        - `grade` unknown

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Cross-origin write refused (`cross_origin_rejected`). A state-changing request that carries the browser session cookie must come from a first-party origin (`Origin`, or failing that `Referer`) and must not send a form-style body (text/plain, urlencoded, multipart) the operation does not declare. Bearer and API-key callers are never subject to this check.
- `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)
