---
title: "List swarm findings"
method: GET
path: "/projects/{projectId}/journey-findings"
tags: ["Swarm insights"]
---

# List swarm findings

`GET /projects/{projectId}/journey-findings`

Criteria that keep failing, tracked across waves. One finding is one problem OVER TIME — `occurrenceCount` and `status` carry the history, so do not treat repeat appearances as separate problems.

## Request body

- object
  - `cursor` string — Opaque pagination cursor from a previous response's `nextCursor`. Don't parse it.

## Response `200`

A page of findings.

- SwarmFindingPage
  - `items` SwarmFinding[], required
    - `id` string, required
    - `fingerprint` string, required — Stable identity across waves — this is what makes a streak a streak rather than a new finding each time.
    - `dimension` string, required
    - `subject` object, required
      - `kind` string, required
      - `id` string, required — Identity. The fingerprint is built from this, never from the label.
      - `label` string, required — Display only; refreshed on every firing so renames show through.
    - `status` 'new' | 'recurring' | 'regressed' | 'resolved', required — A LIFECYCLE: first seen, seen again, came back after being resolved, stopped firing. Note what is NOT here — `dismissed` is not a status. Dismissal is the orthogonal `dismissedAt` below, so a finding can be both recurring and dismissed.
    - `occurrenceCount` integer, required
    - `lastSeenWaveId` string, required
    - `firstSeenAt` number, required — Epoch milliseconds.
    - `lastSeenAt` number, required — Epoch milliseconds.
    - `resolvedAt` number, nullable, required — Epoch milliseconds.
    - `dismissedAt` number, nullable, required — Epoch milliseconds. ORTHOGONAL to `status` — dismissing hides a finding from your view without claiming it stopped happening.
    - `updatedAt` number, required — Epoch milliseconds.
  - `nextCursor` string — Present only when another page exists.

## Other responses

- `401` — Missing, invalid, revoked, or orphaned key (`UNAUTHORIZED`) — or the **target MCP server** needs an OAuth grant (`OAUTH_REQUIRED`), which is a property of the server, not your key.
- `403` — Key is valid but not allowed to do this.
- `404` — Unknown project, server, or resource.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `500` — Something failed on MCPJam's side.

---

[API](https://skmtc.net/mcpjam/apis/mcpjam-api.md) · [All operations](https://skmtc.net/mcpjam/apis/mcpjam-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mcpjam/mcpjam-api/revisions/7d1aff84ce3b/schema)
