---
title: "Get run status + summary"
method: GET
path: "/api/v1/runs/{runId}"
tags: ["runs"]
---

# Get run status + summary

`GET /api/v1/runs/{runId}`

## Request

- Base URL: `https://index365.co`
- URL: `https://index365.co/api/v1/runs/{runId}`
- Auth: HTTP bearer

Poll this until status is terminal. Completed runs are immutable and served with a cacheable Cache-Control; in-flight runs are no-store.

## Path parameters

- `runId` string, uuid, required

## Response `200`

Run envelope.

- object: Run status + summary. score/severityCounts are null until status=completed. score is also null when scoreStatus=unverified because source-only evidence cannot support a numeric claim.
  - `schemaVersion` integer
  - `product` 'ai_readiness' | 'marketing_signal' | 'marketing_signal_v2' | 'website_security'
  - `runId` string, uuid
  - `projectId` string, uuid, nullable
  - `status` 'pending' | 'running' | 'completed' | 'failed' | 'failed_auto_credit' | 'refunded'
  - `progressPct` integer
  - `currentStep` string, nullable
  - `url` string
  - `scanMode` string, nullable
  - `model` string, nullable
  - `costUsd` number
  - `error` string, nullable
  - `createdAt` string, date-time
  - `startedAt` string, date-time, nullable
  - `completedAt` string, date-time, nullable
  - `score` integer, nullable
  - `scoreStatus` 'unverified' | 'null', nullable: unverified when source-only page evidence needs rendered verification.
  - `band` 'Weak' | 'Fair' | 'Good' | 'Excellent' | 'null', nullable: Marketing Signal runs only: the band for `score`.
  - `coverageLine` string: Marketing Signal runs only: what the run graded, as a sentence.
  - `restated` boolean: Marketing Signal runs only: true when this run stored a different headline, which happens on runs scored before the corrected weighting.
  - `restatementNote` string
  - `legacyStoredScore` integer, nullable: Marketing Signal runs only: the headline this run stored. For reconciliation, never for display.
  - `severityCounts` object, nullable
  - `findingsTotal` integer, nullable
  - `coverage` object, nullable: Present for a local on-page scan (CLI `scan local`): { mode: 'local_on_page', notEvaluated: [...] } lists the checks not run (DNS/TLS/redirects/foundation files/email auth/response-header security). Null for a normal full scan.
    - `mode` 'local_on_page'
    - `notEvaluated` string[]
  - `humanUrl` string
  - `links` object
    - `self` string
    - `findings` string
    - `report` string

## Other responses

- `401`: Missing/unknown/revoked API key.
- `403`: Key lacks the required scope (error.code=insufficient_scope).
- `404`: Resource not found in this organization.
- `429`: Rate limit exceeded (60 req/min per key). Honor Retry-After.

---

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