---
title: "Get a journey run"
method: GET
path: "/projects/{projectId}/journey-runs/{runId}"
tags: ["Swarm runs"]
---

# Get a journey run

`GET /projects/{projectId}/journey-runs/{runId}`

The full record, including per-session `attempts` and `targetSummaries`.

Read `canceled` before reporting a failure: a stopped run carries `status: "failed"`.

## Response `200`

The run.

- JourneyRun
  - `id` string, required
  - `projectId` string, required
  - `journeyId` string, required
  - `waveId` string — The batch this run was launched with. Sibling runs of one co-launched wave share it; a solo relaunch is a wave of one. Absent on a run launched without one.
  - `status` 'running' | 'completed' | 'partial' | 'failed' | 'rate_limited', required — Poll until it leaves `running`.
  - `canceled` boolean, required — True when somebody STOPPED this run. **Check this before showing a run as a failure**: a cancelled run reports `status: "failed"`, because cancellation is recorded as a marker rather than a status of its own.
  - `stale` boolean, required — True when the runner went silent and the watchdog settled the run. Distinct from a run that failed while still reporting.
  - `error` string — Raw marker behind `canceled` / `stale`.
  - `summary` JourneyRunSummary, required
    - `total` integer, required — Targets × `sessionsPerTarget`, fixed at launch.
    - `succeeded` integer, required
    - `failed` integer, required
    - `rateLimited` integer, required
  - `targets` JourneyRunTarget[], required
    - `hostId` string, required
    - `hostName` string
    - `targetId` string — Execution identity. TWO TARGETS CAN SHARE A `hostId` — two environments may resolve to the same host with different servers — so this, not `hostId`, is what identifies a target within a run.
    - `modelId` string
  - `persona` object — The persona AS PINNED AT LAUNCH, from the run's immutable snapshot — not the persona's current values, which may have been edited since.
    - `personaId` string, nullable
    - `name` string, nullable
    - `role` string, nullable
  - `attempts` JourneyRunAttempt[] — Per-session execution records. Present on the single-run read only — lists stay compact.
    - `chatSessionId` string, nullable, required — `null` until the attempt claims a session.
    - `hostId` string, required
    - `targetId` string, nullable, required
    - `sessionIndex` integer, required
    - `status` 'pending' | 'running' | 'succeeded' | 'failed' | 'rate_limited', required — `pending` → `running` → terminal. A `pending` attempt cannot jump straight to a terminal state.
    - `errorCode` string, nullable, required
    - `errorMessage` string, nullable, required — Capped and redacted before it reaches this response.
  - `targetSummaries` object[] — The same counts as `summary`, broken down per target.
    - `hostId` string, required
    - `targetId` string
    - `total` integer, required
    - `succeeded` integer, required
    - `failed` integer, required
    - `rateLimited` integer, required
  - `createdAt` number, required — Epoch milliseconds.
  - `lastHeartbeatAt` number — Epoch milliseconds of the runner's last check-in. A long-stale heartbeat on a `running` run is what the watchdog acts on.
  - `insights` InsightsEnvelope — The common insights envelope, shared by eval runs, swarm waves and user-testing windows. One shape for three producers, so a caller writes the reading code once. An ABSENT envelope and `status: "not_available"` mean the same thing and both are normal: the field is an enrichment, and a caller who may not have it gets the resource without it rather than an error.
    - `schemaVersion` 1, required
    - `scope` InsightScope, required — What this envelope is about. The extra fields depend on `kind`.
      - `kind` 'eval_run' | 'swarm_wave' | 'user_testing_window', required
      - `id` string, required
      - `runId` string — `swarm_wave` only.
      - `scenarioId` string — `user_testing_window` only.
      - `windowStartAt` integer — `user_testing_window` only.
      - `windowEndAt` integer — `user_testing_window` only.
    - `status` 'not_available' | 'not_requested' | 'pending' | 'completed' | 'failed', required — `not_available` means this deployment cannot produce insights at all — treat an ABSENT envelope the same way. `not_requested` means nobody has asked. `pending` means one is running: poll, do not re-request.
    - `reasonCode` string, nullable, required
    - `retryable` boolean, required — Whether asking again could produce a different answer. False on a `failed` envelope means the input, not the attempt, was the problem.
    - `error` object, nullable, required
      - `code` string, required
      - `message` string, required
    - `generatedAt` integer, nullable, required
    - `updatedAt` integer, nullable, required
    - `summary` string, nullable, required
    - `coverage` object, required — READ THIS BEFORE QUOTING ANY FINDING. `truncated` and `lowConfidence` are the difference between "this happens" and "this happened in the part we looked at".
      - `unit` 'iterations' | 'sessions', required
      - `analyzed` integer, required
      - `total` integer, required
      - `gradedCount` integer
      - `feedbackCount` integer
      - `truncated` boolean, required — The analysis saw `analyzed` of `total`, not all of it.
      - `lowConfidence` boolean, required — Too little was analyzed to generalize. Findings still stand as observations of what WAS seen.
    - `findings` ActionableFinding[], required
      - `id` string, required — Stable remediation id (`rf_<16 hex>`). Survives dynamic error values, so the same problem keeps the same id across runs — dismiss it once and it stays dismissed.
      - `signalFingerprint` string, required — The registry signal this derives from. Several findings can share one.
      - `title` string, required
      - `category` 'unknown' | 'tool_contract' | 'tool_runtime' | 'capability_gap' | 'workflow' | 'agent_behavior' | 'test_design' | 'environment', required
      - `attribution` 'unknown' | 'server_contract' | 'server_runtime' | 'server_capability' | 'agent_or_prompt' | 'test_design' | 'environment', required — WHOSE problem this is. `server_*` points at the MCP server; `agent_or_prompt` and `test_design` point back at the caller.
      - `actionTarget` 'investigate' | 'mcp_server' | 'agent_configuration' | 'eval_case' | 'environment', required — What you would change to fix it.
      - `actionability` 'informational' | 'investigate' | 'ready', required — `ready` means the finding names a specific target and change. `investigate` means it does not yet. `informational` means there is nothing to do.
      - `severity` 'info' | 'low' | 'medium' | 'high', required
      - `confidence` 'low' | 'medium' | 'high', required
      - `observed` string, required — DETERMINISTIC observation — counts and identities, never model prose. This is the part you can verify yourself.
      - `rootCause` string
      - `recommendation` string, required
      - `acceptanceCriteria` string[], required — How you would know the fix worked.
      - `affected` object, required — How much of the analyzed population hit this. Read it as a ratio — `1/40` and `38/40` are different problems.
        - `count` integer, required
        - `total` integer, required
        - `unit` 'iterations' | 'sessions', required
      - `patternSlug` string
      - `target` object — Present only when a server (and, for tool surfaces, a tool) resolved against the pinned snapshot. Required for `mcp_server` / `ready`.
        - `serverId` string, required
        - `toolName` string
        - `surface` 'description' | 'input_schema' | 'output_schema' | 'handler' | 'server_instructions' | 'capability', required
        - `fieldPath` string
        - `snapshotHash` string, required — The pinned snapshot the target resolved against, so a finding cannot silently re-point at a definition that changed after it was written.
        - `currentDefinition` object
          - `description` string
          - `inputSchemaJson` string
          - `outputSchemaJson` string
          - `truncated` boolean, required
      - `evidence` ActionableFindingEvidence[], required
        - `sessionId` string
        - `iterationId` string
        - `kind` 'tool_error' | 'transcript' | 'feedback' | 'judge' | 'contrast', required
        - `excerpt` string, required — Scrubbed and clipped at the producer. Never a full transcript.
        - `toolName` string
        - `errorCode` string
    - `currentFindings` ActionableFinding[] — Absent on a deployment that predates findings. The always-available observation view: findings assembled from deterministic evidence plus any identity-matching model enrichment, populated INDEPENDENTLY of `status`. Read `currentFindings ?? findings` — and treat an explicit `[]` as a real "nothing here needs a change" rather than falling back to the generated array.
      - `id` string, required — Stable remediation id (`rf_<16 hex>`). Survives dynamic error values, so the same problem keeps the same id across runs — dismiss it once and it stays dismissed.
      - `signalFingerprint` string, required — The registry signal this derives from. Several findings can share one.
      - `title` string, required
      - `category` 'unknown' | 'tool_contract' | 'tool_runtime' | 'capability_gap' | 'workflow' | 'agent_behavior' | 'test_design' | 'environment', required
      - `attribution` 'unknown' | 'server_contract' | 'server_runtime' | 'server_capability' | 'agent_or_prompt' | 'test_design' | 'environment', required — WHOSE problem this is. `server_*` points at the MCP server; `agent_or_prompt` and `test_design` point back at the caller.
      - `actionTarget` 'investigate' | 'mcp_server' | 'agent_configuration' | 'eval_case' | 'environment', required — What you would change to fix it.
      - `actionability` 'informational' | 'investigate' | 'ready', required — `ready` means the finding names a specific target and change. `investigate` means it does not yet. `informational` means there is nothing to do.
      - `severity` 'info' | 'low' | 'medium' | 'high', required
      - `confidence` 'low' | 'medium' | 'high', required
      - `observed` string, required — DETERMINISTIC observation — counts and identities, never model prose. This is the part you can verify yourself.
      - `rootCause` string
      - `recommendation` string, required
      - `acceptanceCriteria` string[], required — How you would know the fix worked.
      - `affected` object, required — How much of the analyzed population hit this. Read it as a ratio — `1/40` and `38/40` are different problems.
        - `count` integer, required
        - `total` integer, required
        - `unit` 'iterations' | 'sessions', required
      - `patternSlug` string
      - `target` object — Present only when a server (and, for tool surfaces, a tool) resolved against the pinned snapshot. Required for `mcp_server` / `ready`.
        - `serverId` string, required
        - `toolName` string
        - `surface` 'description' | 'input_schema' | 'output_schema' | 'handler' | 'server_instructions' | 'capability', required
        - `fieldPath` string
        - `snapshotHash` string, required — The pinned snapshot the target resolved against, so a finding cannot silently re-point at a definition that changed after it was written.
        - `currentDefinition` object
          - `description` string
          - `inputSchemaJson` string
          - `outputSchemaJson` string
          - `truncated` boolean, required
      - `evidence` ActionableFindingEvidence[], required
        - `sessionId` string
        - `iterationId` string
        - `kind` 'tool_error' | 'transcript' | 'feedback' | 'judge' | 'contrast', required
        - `excerpt` string, required — Scrubbed and clipped at the producer. Never a full transcript.
        - `toolName` string
        - `errorCode` string
    - `observationState` 'ready' | 'partial' | 'unavailable' — How much of the population `currentFindings` describes — distinct from `status`, which describes a model GENERATION. `unavailable` means nothing could be measured, which is NOT the same as an empty `currentFindings`.
    - `observationCoverage` object — Coverage for `currentFindings`, describing ITS population. Deliberately separate from `coverage`, whose counters describe the generation's population.
      - `unit` 'iterations', required
      - `analyzed` integer, required
      - `total` integer, required
      - `gradedCount` integer, required
      - `exclusions` object, required — Counted reasons an iteration was left out, keyed by reason. An OPEN map: a new exclusion class must not require a consumer change to keep validating.
    - `unifiedFindings` object — Absent on a deployment that predates findings. Its PRESENCE says the deployment serves findings; `snapshot: null` says this run has none built yet — two different answers a caller must not conflate.
      - `capability` 'unified_findings_v1', required
      - `analysis` object — The trace analysis pipeline's progress while one exists for the run. Absent when none has been requested.
        - `phase` 'reading' | 'grouping' | 'checking' | 'done' | 'failed', required
        - `progress` object, required
          - `done` integer, required
          - `total` integer, required
          - `unit` 'iterations', required
        - `models` string[], required
        - `completeness` object, required
          - `iterationReports` integer, required
          - `total` integer, required
          - `missingTraces` integer, required
      - `snapshot` object, nullable, required — The built findings snapshot: its deterministic findings, per-finding provenance, and any pipeline-verified mechanisms. `null` means none has been built for this run.
      - `job` object, nullable, required — The in-flight or last-failed operation, so a refusal never renders as a completed analysis.
      - `canBuild` boolean, required
      - `canEnrich` boolean, required
    - `runHealth` object — Swarm only. Launch outcomes never appear as findings — a run that could not start is an operational fact, not something the server under test did.
      - `targets` object[], required
        - `subjectKind` 'environment' | 'host', required
        - `subjectId` string, required
        - `subjectLabel` string, required
        - `attempted` integer, required
        - `succeeded` integer, required
        - `failed` integer, required
        - `rateLimited` integer, required
    - `truncation` object, required — What this RESPONSE dropped to stay a sane size, as distinct from what the ANALYSIS did not look at (`coverage`).
      - `truncated` boolean, required
      - `omittedFindings` integer, required
      - `omittedEvidence` integer, required
      - `contractTruncated` boolean, required
    - `journeyFindings` SwarmJourneyFindings
      - `contractVersion` 1, required
      - `generatedAt` integer, required
      - `sourceRevision` string, required
      - `pipelineVersion` integer, required
      - `extractionVersion` integer, required
      - `extractionModel` string, required
      - `reasoningModel` string, required
      - `summaryKind` 'notLaunched' | 'broken' | 'friction' | 'landed' | 'ungraded' | 'unread', required — `notLaunched`, `broken`, `friction`, `landed`, `ungraded`, `unread`
      - `population` object, required
        - `configured` integer, required
        - `started` integer, required
        - `read` integer, required
        - `unread` integer, required
        - `withdrawn` integer, required
        - `limited` integer, required
        - `graded` integer, required
      - `coverageNotes` string[], required
      - `disclosure` object, required
        - `rail` 'gateway' | 'openrouter', required
        - `evidenceSent` string[], required
      - `personas` object[], required
        - `persona` object, required
          - `personaRefId` string, nullable, required
          - `name` string, required
        - `disposition` 'notRun' | 'blockedConnecting' | 'lostFindingTool' | 'blockedCallingTool' | 'blockedByResponse' | 'goalMissed' | 'goalMetWithFriction' | 'goalMet' | 'notMeasured', required — `notRun`, `blockedConnecting`, `lostFindingTool`, `blockedCallingTool`, `blockedByResponse`, `goalMissed`, `goalMetWithFriction`, `goalMet`, `notMeasured`
        - `tone` 'fail' | 'warn' | 'ok' | 'muted', required
        - `goalRunIds` string[], required
      - `findings` SwarmJourneyFinding[], required
        - `id` string, required
        - `basis` 'verifiedMechanism' | 'sessionReport' | 'populationFact', required — `verifiedMechanism`, `sessionReport`, `populationFact`
        - `scopeLevel` 'session' | 'goal' | 'persona' | 'target' | 'wave', required — `session`, `goal`, `persona`, `target`, `wave`
        - `persona` object, required
          - `personaRefId` string, nullable, required
          - `name` string, required
        - `goal` object, required
          - `runId` string, required
          - `journeyRefId` string, required
          - `title` string, required
        - `target` object, required
          - `kind` 'environment' | 'host', required
          - `id` string, required
          - `label` string, required
          - `modelId` string, nullable, required
        - `population` object, required
          - `count` integer, required
          - `total` integer, required
          - `unit` 'sessions', required
        - `sessionIds` string[], required
        - `citations` string[], required
        - `verdictSeen` 'passed' | 'failed' | 'inconclusive' | 'notEstablished', required
        - `chainStage` 'connection' | 'discovery' | 'selection' | 'call' | 'response' | 'userValue', nullable, required — `connection`, `discovery`, `selection`, `call`, `response`, `userValue`
        - `chainStageState` 'passed' | 'failed' | 'notReached' | 'notMeasured' | 'notApplicable', nullable, required — `passed`: passed; `failed`: failed; `notReached`: never ran (an earlier stage failed); `notMeasured`: not measured; `notApplicable`: not applicable to this case
        - `chainStageBasis` 'derived' | 'reported' | 'unmeasured', required
        - `disposition` 'notRun' | 'blockedConnecting' | 'lostFindingTool' | 'blockedCallingTool' | 'blockedByResponse' | 'goalMissed' | 'goalMetWithFriction' | 'goalMet' | 'notMeasured', required — `notRun`, `blockedConnecting`, `lostFindingTool`, `blockedCallingTool`, `blockedByResponse`, `goalMissed`, `goalMetWithFriction`, `goalMet`, `notMeasured`
        - `tone` 'fail' | 'warn' | 'ok' | 'muted', required
        - `coverageNotes` string[], required
        - `outcomePhrase` string, nullable, required
        - `mechanismPhrase` string, nullable, required
        - `fixPhrase` string, nullable, required
        - `reportExcerpt` object, nullable, required
          - `actual` string, required
          - `account` string, nullable
          - `citations` string[], required
        - `mechanismId` string, nullable, required
        - `signal` 'outputTruncated' | 'hallucinatedTool' | 'toolErrored' | 'noToolCalled' | 'turnCapReached', nullable — `outputTruncated`, `hallucinatedTool`, `toolErrored`, `noToolCalled`, `turnCapReached`
      - `verification` object
        - `proposed` integer, required
        - `confirmed` integer, required
        - `rejected` integer, required
        - `unverified` integer, required
        - `omitted` integer, required
    - `journeyFindingsJob` SwarmJourneyFindingsJob
      - `status` 'pending' | 'completed' | 'failed' | 'skipped', required
      - `errorCode` string
      - `updatedAt` integer, required
  - `verdictSummary` union
    - object
      - `status` 'pending', required
      - `pendingSessions` integer, required
      - `updatedAt` integer, required
    - object
      - `status` 'decided', required
      - `decision` EvalVerdictDecision, required
        - `verdictPolicyVersion` 2, required
        - `verdict` 'passed' | 'failed' | 'inconclusive', required
        - `reasons` string[], required
        - `validity` object, required
          - `policy` object, required
            - `coverage` union, required
              - …
            - `minCompletionRate` number, required
            - `maxEvaluatorErrorRate` number, required
          - `holds` boolean, required
          - `configuredTrials` integer, required
          - `attemptedTrials` integer, required
          - `eligibleTrials` integer, required
          - `completionRate` union, required
            - object
              - …
            - object
              - …
          - `evaluatorErrorRate` union, required
            - object
              - …
            - object
              - …
        - `cases` object[], required
          - `caseId` string, required
          - `executionVariant` object
            - `model` string, required
            - `provider` string
          - `configuredTrials` integer, required
          - `attemptedTrials` integer, required
          - `eligibleTrials` integer, required
          - `passedTrials` integer, required
          - `failedTrials` integer, required
          - `effectivePassThreshold` number, required
          - `passRate` union, required
            - object
              - …
            - object
              - …
          - `completionRate` union, required
            - object
              - …
            - object
              - …
          - `observedStability` union, required
            - object
              - …
            - object
              - …
          - `mixedVerdict` boolean, required
          - `verdict` 'passed' | 'failed' | 'inconclusive', required
          - `reason` 'configuredTrialsNotAttempted' | 'noGradeableTrials' | 'eligibleTrialsBelowMinimum' | 'completionRateBelowMinimum' | 'completionRateNotMeasured' | 'evaluatorErrorRateAboveMaximum' | 'evaluatorErrorRateNotMeasured' | 'caseHasNoEligibleTrials' | 'casePassRateMetThreshold' | 'casePassRateBelowThreshold' | 'allMeasuredCasesMetThreshold', required — Why the verdict is what it is. The validity reasons are evaluated FIRST and make a run `inconclusive`; the task reasons decide `passed` / `failed` once validity holds. `configuredTrialsNotAttempted` — some configured trial never ran. `noGradeableTrials` — nothing in the suite was gradeable. `eligibleTrialsBelowMinimum` — the explicit `minEligibleTrials` was not reached. `completionRateBelowMinimum` — measured, and under the floor. `completionRateNotMeasured` — nothing was attempted, so the floor is unsatisfiable; a not-measured rate never passes one. `evaluatorErrorRateAboveMaximum` — the grader failed too often for the run to describe the server. `evaluatorErrorRateNotMeasured` — the same unsatisfiable case for the ceiling. `caseHasNoEligibleTrials` — a case graded nothing, which is inconclusive even at `passThreshold: 0`. `casePassRateMetThreshold` — a case's own passing reason. `casePassRateBelowThreshold` — a case failed its threshold, and so therefore did the suite. `allMeasuredCasesMetThreshold` — the suite's only passing reason.
      - `updatedAt` integer, required
    - object
      - `status` 'notEstablished', required
      - `reason` 'gradingNotConfigured', required
      - `updatedAt` integer, required
    - object
      - `status` 'integrityFailed', required
      - `reason` string, required
      - `updatedAt` integer, required
  - `report` SwarmReport
    - `contractVersion` 1, required
    - `runId` string, required
    - `verdict` 'passed' | 'failed' | 'inconclusive' | 'notEstablished', required
    - `verdictSource` 'policyV2' | 'none', required
    - `decision` EvalVerdictDecision
      - `verdictPolicyVersion` 2, required
      - `verdict` 'passed' | 'failed' | 'inconclusive', required
      - `reasons` string[], required
      - `validity` object, required
        - `policy` object, required
          - `coverage` union, required
            - object
              - …
            - object
              - …
          - `minCompletionRate` number, required
          - `maxEvaluatorErrorRate` number, required
        - `holds` boolean, required
        - `configuredTrials` integer, required
        - `attemptedTrials` integer, required
        - `eligibleTrials` integer, required
        - `completionRate` union, required
          - object
            - `state` 'measured', required
            - `value` number, required
            - `numerator` integer, required
            - `denominator` integer, required
            - `exclusions` object, required
              - …
          - object
            - `state` 'notMeasured', required
            - `value` 'null', nullable, required
            - `numerator` 0, required
            - `denominator` 0, required
            - `exclusions` object, required
              - …
        - `evaluatorErrorRate` union, required
          - object
            - `state` 'measured', required
            - `value` number, required
            - `numerator` integer, required
            - `denominator` integer, required
            - `exclusions` object, required
              - …
          - object
            - `state` 'notMeasured', required
            - `value` 'null', nullable, required
            - `numerator` 0, required
            - `denominator` 0, required
            - `exclusions` object, required
              - …
      - `cases` object[], required
        - `caseId` string, required
        - `executionVariant` object
          - `model` string, required
          - `provider` string
        - `configuredTrials` integer, required
        - `attemptedTrials` integer, required
        - `eligibleTrials` integer, required
        - `passedTrials` integer, required
        - `failedTrials` integer, required
        - `effectivePassThreshold` number, required
        - `passRate` union, required
          - object
            - `state` 'measured', required
            - `value` number, required
            - `numerator` integer, required
            - `denominator` integer, required
            - `exclusions` object, required
              - …
          - object
            - `state` 'notMeasured', required
            - `value` 'null', nullable, required
            - `numerator` 0, required
            - `denominator` 0, required
            - `exclusions` object, required
              - …
        - `completionRate` union, required
          - object
            - `state` 'measured', required
            - `value` number, required
            - `numerator` integer, required
            - `denominator` integer, required
            - `exclusions` object, required
              - …
          - object
            - `state` 'notMeasured', required
            - `value` 'null', nullable, required
            - `numerator` 0, required
            - `denominator` 0, required
            - `exclusions` object, required
              - …
        - `observedStability` union, required
          - object
            - `state` 'measured', required
            - `value` number, required
            - `numerator` integer, required
            - `denominator` integer, required
            - `exclusions` object, required
              - …
          - object
            - `state` 'notMeasured', required
            - `value` 'null', nullable, required
            - `numerator` 0, required
            - `denominator` 0, required
            - `exclusions` object, required
              - …
        - `mixedVerdict` boolean, required
        - `verdict` 'passed' | 'failed' | 'inconclusive', required
        - `reason` 'configuredTrialsNotAttempted' | 'noGradeableTrials' | 'eligibleTrialsBelowMinimum' | 'completionRateBelowMinimum' | 'completionRateNotMeasured' | 'evaluatorErrorRateAboveMaximum' | 'evaluatorErrorRateNotMeasured' | 'caseHasNoEligibleTrials' | 'casePassRateMetThreshold' | 'casePassRateBelowThreshold' | 'allMeasuredCasesMetThreshold', required — Why the verdict is what it is. The validity reasons are evaluated FIRST and make a run `inconclusive`; the task reasons decide `passed` / `failed` once validity holds. `configuredTrialsNotAttempted` — some configured trial never ran. `noGradeableTrials` — nothing in the suite was gradeable. `eligibleTrialsBelowMinimum` — the explicit `minEligibleTrials` was not reached. `completionRateBelowMinimum` — measured, and under the floor. `completionRateNotMeasured` — nothing was attempted, so the floor is unsatisfiable; a not-measured rate never passes one. `evaluatorErrorRateAboveMaximum` — the grader failed too often for the run to describe the server. `evaluatorErrorRateNotMeasured` — the same unsatisfiable case for the ceiling. `caseHasNoEligibleTrials` — a case graded nothing, which is inconclusive even at `passThreshold: 0`. `casePassRateMetThreshold` — a case's own passing reason. `casePassRateBelowThreshold` — a case failed its threshold, and so therefore did the suite. `allMeasuredCasesMetThreshold` — the suite's only passing reason.
    - `undecidedReason` 'executionPending' | 'gradingPending' | 'gradingNotConfigured' | 'verdictSummaryUnavailable' | 'integrityFailed'
    - `execution` object, required
      - `unit` 'sessions', required
      - `configured` integer, required
      - `reported` integer, required
      - `started` integer, required
      - `notStarted` integer, required
      - `unknown` integer, required
      - `completed` integer, required
      - `interrupted` integer, required
      - `neverLaunched` boolean, required
    - `goalGrading` object, required
      - `unit` 'sessions', required
      - `reported` integer, required
      - `passed` integer, required
      - `failed` integer, required
      - `pending` integer, required
      - `unavailable` integer, required
      - `notRequested` integer, required
      - `waitingForDecisiveGrading` integer, required
    - `observations` object[], required
      - `evaluatorId` string, required
      - `predicateType` 'toolDescriptionsPresent' | 'toolAnnotationsPresent' | 'toolNamesUnique' | 'noDeprecatedToolExposed' | 'toolInputSchemasWellFormed' | 'toolOutputSchemasPresent' | 'toolCalledWith' | 'toolCalledAtLeastOnce' | 'toolNeverCalled' | 'onlyToolsCalled' | 'firstToolWas' | 'toolCallCountUnder' | 'toolCalledBefore' | 'noDeprecatedToolCalled' | 'noDestructiveToolCalled' | 'argumentsMatchToolSchema' | 'noRepeatedIdenticalCall' | 'noToolErrors' | 'toolLatencyUnder' | 'toolResultContains' | 'toolResultMatchesSchema' | 'toolResultSizeUnder' | 'toolErrorNamesInput' | 'fullPageHasContinuation' | 'responseCloseTo' | 'responseContains' | 'responseMatches' | 'finalAssistantMessageNonEmpty' | 'tokenBudgetUnder' | 'turnCountUnder' | 'widgetRendered' | 'widgetRenderLatencyUnder' | 'widgetNoConsoleErrors' | 'noEndingQuestion', required
      - `role` 'advisory' | 'required', required
      - `stage` 'connection' | 'discovery' | 'selection' | 'call' | 'response' | 'userValue', required — The stage this observation was read from, and the only stage it is evidence ABOUT. `connection` — the server was reachable and the session initialized. `discovery` — its tools and resources were listed and readable. `selection` — the model chose the right tool for the request. `call` — the call was made with usable arguments. `response` — the server returned data the model could use. `userValue` — the user's actual request was satisfied.
      - `unit` 'sessions', required
      - `total` integer, required
      - `passed` integer, required
      - `failed` integer, required
      - `pending` integer, required
      - `unavailable` integer, required

## 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.

## Changes

- **2026-09-21** `ee79c934cffb` — 2 warning
  - added the new `analysisUnavailable` enum value to the `insights/allOf[#/components/schemas/InsightsEnvelope]/journeyFindings/allOf[#/components/schemas/SwarmJourneyFindings]/coverageNotes/items/` response property for the response status `200`
  - added the new `analysisUnavailable` enum value to the `insights/allOf[#/components/schemas/InsightsEnvelope]/journeyFindings/allOf[#/components/schemas/SwarmJourneyFindings]/findings/items/coverageNotes/items/` response property for the response status `200`
- …earlier changes not shown

[Full history](https://skmtc.dev/mcpjam/apis/mcpjam-api/changes/projects/:projectId/journey-runs/:runId/get.md)

---

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