Hyperresearch · Schema

RunSummary

Artificial IntelligenceSearchResearchData

Properties

Name Type Description
id string
project_id stringnull
query_preview stringnull
display_title stringnull
status string
tier string
profile string
price_cents integer
billed boolean
included boolean True when an included (trial) run covered this run, so it metered at $0. The server’s answer to "Included in trial" — never inferred from `price_cents`. Alias of `included_in_trial`.
included_in_trial boolean Same value as `included`, spelled the way the console reads it.
trial_tier stringnull Which included-run allowance was claimed (`light`/`full`), or null.
complimentary boolean True when an operator grant comped this run (0041). The same field and the same value `GET /v1/runs/{id}` publishes, so a list row can print "Complimentary" beside the price.
charged_cents integernull What the billing ledger metered for this run, refunds included. `0` for a trial-covered run; `null` when no ledger row exists yet — which is NOT the same as zero.
sources_fetched integernull The same number the run detail reports in `progress.sources_fetched`. Null until the run has reported one. Also in `counters`.
notes_written integernull
counters object
step_id stringnull The step this run is on, cached from the RunAgent; null when it is not running.
step_name stringnull That step in human words (the shared step → name map), or null.
step_detail stringnull The unit inside that step, in customer words: "Chapter 2 of 4 · Depth investigation", "Writing section 3 of 9". The same string `GET /v1/runs/{id}` reports as `step.detail`, cached from the RunAgent (
chapters_total integernull How many chapters this run's plan has. A count of the PLAN, so it outlives the run and a finished Deep row still says how many chapters the customer got. Null means the run is not chaptered (or settle
report_words integernull Word count of the finished report; null while there is no report.
blocked_on stringnull One customer-safe sentence saying what a `blocked` run is waiting for a person to do, and null on every other status. The same value `GET /v1/runs/{id}` reports, so a list row can prompt for a resume
blocked_code stringnull The machine gate id behind `blocked_on` — `step::`, `verify:`, `fetch_budget`, `model_budget` or `provider:`. Branch on this; print `blocked_on`.
wait_reason stringnull Why a `blocked` run is waiting on US rather than on a person: it is clearing the condition by itself and will carry on with no action from the caller, and nothing has been charged. Present only while
recovering objectnull Present, non-null, while a `running`/`blocked` run is being RECOVERED: our infrastructure interrupted it and we are resuming it from where it stopped, on the same run id, at no extra charge (Deep auto
failure_reason stringnull Why this run ended badly, in one customer-safe sentence; null for a healthy run. For a `blocked` run this is `blocked_on`, matching the run status view. The raw text is `failure_detail` on the run det
aborted_by stringnull The user id that asked for the abort, or null for a run nobody stopped, a run stopped by an unattributed API key, or one stopped before this field existed. Published so a client can say "Stopped by yo
failure_request_id stringnull
channel string
dry_run boolean True when this run was a DRY RUN: the orchestration was real but the model provider and the fetch/search vendors were mocked, so the report is synthetic and the price is $0. Server truth (the run’s `d
created_at string
started_at stringnull
finished_at stringnull
duration_ms integernull Wall time from start (or creation) to finish; null while the run is unfinished. Settled in the same statement that writes `finished_at`, and carried on the terminal stream event, so a watching page an
version_of stringnull The newest run asking the same question, or null when this run IS that run. Label a row “Earlier version” if and only if this is set. Grouped by normalised question text, or by an explicit rerun paren
version_group string Stable key for the version group, so a client can bucket a page in one pass.
receipt_summary object
View JSON Schema on GitHub

JSON Schema

hyperresearch-ai-run-summary-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/hyperresearch-ai/json-schema/hyperresearch-ai-run-summary-schema.json",
  "title": "RunSummary",
  "x-generated": "2026-11-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/hyperresearch-ai-openapi.json#/components/schemas/RunSummary",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "project_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "query_preview": {
      "type": [
        "string",
        "null"
      ]
    },
    "display_title": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "tier": {
      "type": "string"
    },
    "profile": {
      "type": "string"
    },
    "price_cents": {
      "type": "integer"
    },
    "billed": {
      "type": "boolean"
    },
    "included": {
      "type": "boolean",
      "description": "True when an included (trial) run covered this run, so it metered at $0. The server’s answer to \"Included in trial\" — never inferred from `price_cents`. Alias of `included_in_trial`."
    },
    "included_in_trial": {
      "type": "boolean",
      "description": "Same value as `included`, spelled the way the console reads it."
    },
    "trial_tier": {
      "type": [
        "string",
        "null"
      ],
      "description": "Which included-run allowance was claimed (`light`/`full`), or null."
    },
    "complimentary": {
      "type": "boolean",
      "description": "True when an operator grant comped this run (0041). The same field and the same value `GET /v1/runs/{id}` publishes, so a list row can print \"Complimentary\" beside the price."
    },
    "charged_cents": {
      "type": [
        "integer",
        "null"
      ],
      "description": "What the billing ledger metered for this run, refunds included. `0` for a trial-covered run; `null` when no ledger row exists yet — which is NOT the same as zero."
    },
    "sources_fetched": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The same number the run detail reports in `progress.sources_fetched`. Null until the run has reported one. Also in `counters`."
    },
    "notes_written": {
      "type": [
        "integer",
        "null"
      ]
    },
    "counters": {
      "$ref": "#/$defs/RunCounters"
    },
    "step_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "The step this run is on, cached from the RunAgent; null when it is not running."
    },
    "step_name": {
      "type": [
        "string",
        "null"
      ],
      "description": "That step in human words (the shared step → name map), or null."
    },
    "step_detail": {
      "type": [
        "string",
        "null"
      ],
      "description": "The unit inside that step, in customer words: \"Chapter 2 of 4 · Depth investigation\", \"Writing section 3 of 9\". The same string `GET /v1/runs/{id}` reports as `step.detail`, cached from the RunAgent (0035). Null on a flat run and once the step stops."
    },
    "chapters_total": {
      "type": [
        "integer",
        "null"
      ],
      "description": "How many chapters this run's plan has. A count of the PLAN, so it outlives the run and a finished Deep row still says how many chapters the customer got. Null means the run is not chaptered (or settled before the column existed) — never zero."
    },
    "report_words": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Word count of the finished report; null while there is no report."
    },
    "blocked_on": {
      "type": [
        "string",
        "null"
      ],
      "description": "One customer-safe sentence saying what a `blocked` run is waiting for a person to do, and null on every other status. The same value `GET /v1/runs/{id}` reports, so a list row can prompt for a resume without fetching the run."
    },
    "blocked_code": {
      "type": [
        "string",
        "null"
      ],
      "description": "The machine gate id behind `blocked_on` — `step:<id>:<check>`, `verify:<check>`, `fetch_budget`, `model_budget` or `provider:<name>`. Branch on this; print `blocked_on`."
    },
    "wait_reason": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "provider_billing",
        "provider_rate_limit",
        "provider_outage",
        "platform_capacity",
        "platform_transient",
        "vault_unavailable",
        null
      ],
      "description": "Why a `blocked` run is waiting on US rather than on a person: it is clearing the condition by itself and will carry on with no action from the caller, and nothing has been charged. Present only while a run is waiting; absent or null on every other run, including a block that does need the customer to act. Branch on its PRESENCE, not on the class."
    },
    "recovering": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "attempt": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Which automatic recovery this is (1, 2, 3), or null while a stalled run is being handed over and the attempt is not yet claimed."
        }
      },
      "required": [
        "attempt"
      ],
      "description": "Present, non-null, while a `running`/`blocked` run is being RECOVERED: our infrastructure interrupted it and we are resuming it from where it stopped, on the same run id, at no extra charge (Deep automatic recovery). Absent or null on every other run. While set, `wait_reason` is null and `blocked_on` is not a gate: the run needs nothing from anyone. Branch on its PRESENCE."
    },
    "failure_reason": {
      "type": [
        "string",
        "null"
      ],
      "description": "Why this run ended badly, in one customer-safe sentence; null for a healthy run. For a `blocked` run this is `blocked_on`, matching the run status view. The raw text is `failure_detail` on the run detail, owner/admin only."
    },
    "aborted_by": {
      "type": [
        "string",
        "null"
      ],
      "description": "The user id that asked for the abort, or null for a run nobody stopped, a run stopped by an unattributed API key, or one stopped before this field existed. Published so a client can say \"Stopped by you.\" on its own terms rather than inferring it from the sentence; `failure_reason` is already narrowed for the caller."
    },
    "failure_request_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "channel": {
      "type": "string"
    },
    "dry_run": {
      "type": "boolean",
      "description": "True when this run was a DRY RUN: the orchestration was real but the model provider and the fetch/search vendors were mocked, so the report is synthetic and the price is $0. Server truth (the run’s `dry_run` channel), never inferred from a zero price — a trial run and a fixture run are also $0 and are not dry. Always false in production, where dry runs cannot be created."
    },
    "created_at": {
      "type": "string"
    },
    "started_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "finished_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "duration_ms": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Wall time from start (or creation) to finish; null while the run is unfinished. Settled in the same statement that writes `finished_at`, and carried on the terminal stream event, so a watching page and a reloaded one never differ (E2E8-13)."
    },
    "version_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "The newest run asking the same question, or null when this run IS that run. Label a row “Earlier version” if and only if this is set. Grouped by normalised question text, or by an explicit rerun parent — never by project (E2E8-10)."
    },
    "version_group": {
      "type": "string",
      "description": "Stable key for the version group, so a client can bucket a page in one pass."
    },
    "receipt_summary": {
      "$ref": "#/$defs/ReceiptSummary"
    }
  },
  "required": [
    "id",
    "project_id",
    "query_preview",
    "display_title",
    "status",
    "tier",
    "profile",
    "price_cents",
    "billed",
    "included",
    "included_in_trial",
    "trial_tier",
    "charged_cents",
    "sources_fetched",
    "notes_written",
    "counters",
    "step_id",
    "step_name",
    "report_words",
    "blocked_on",
    "failure_reason",
    "aborted_by",
    "failure_request_id",
    "channel",
    "dry_run",
    "created_at",
    "started_at",
    "finished_at",
    "duration_ms",
    "version_of",
    "receipt_summary"
  ],
  "$defs": {
    "ReceiptSummary": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "passed": {
          "type": "integer",
          "minimum": 0,
          "description": "Checks that ran and met their bar. A warning is NOT a pass (E2E8-01)."
        },
        "warning": {
          "type": "integer",
          "minimum": 0,
          "description": "Checks that ran and recorded a finding below our own target. Informational; see `attention` for what a reader should act on."
        },
        "failed": {
          "type": "integer",
          "minimum": 0,
          "description": "Checks that ran and did not meet their bar."
        },
        "skipped": {
          "type": "integer",
          "minimum": 0,
          "description": "Checks with nothing to judge (\"not applicable\"). Counted apart from the three above."
        },
        "attention": {
          "type": "integer",
          "minimum": 0,
          "description": "Findings a reader should act on before relying on the report: cited statements that say more than their sources support (above 3 and 3% of those checked), a chapter without its full research pass, a retracted source, or final checks that did not run. Absent on a summary cached before this field existed."
        }
      },
      "required": [
        "passed",
        "warning",
        "failed",
        "skipped"
      ],
      "description": "What this report’s own verification receipt came to, in four counts — so a row or a card can show that a report needs a second look without opening it (E2E10-07). Null means no receipt is known for this run (it did not produce one, or it finished before the counts were stored); null is NOT a pass."
    },
    "RunCounters": {
      "type": "object",
      "properties": {
        "sources_fetched": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Sources this run KEPT; the same number `progress.sources_fetched` and the `counters` stream event report (E2E4-02)."
        },
        "notes_written": {
          "type": [
            "integer",
            "null"
          ]
        },
        "candidates_seen": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Candidates considered, kept or not. Always >= `sources_fetched` when both are known."
        },
        "fetch_attempts": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Physical fetch attempts — requests that actually went out. A vault lookup is not one, so this can be lower than `candidates_seen` (E2E7-02)."
        },
        "sources_listed": {
          "type": [
            "integer",
            "null"
          ],
          "description": "DEPRECATED spelling of `candidates_seen`, emitted in step with it. Read `candidates_seen`."
        },
        "steps_done": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Steps finished. Step progress lives in the run’s Durable Object and this list will not open one per row (E2E2-24), so the RunAgent writes it through to the control row on every step transition (0026). NULL for a run that has not reported one yet — a client that finds it null can still derive the scale from the tier."
        },
        "steps_total": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Steps this run’s tier executes, from the same write-through. NULL when the run has not reported one yet."
        }
      },
      "required": [
        "sources_fetched",
        "notes_written",
        "candidates_seen",
        "fetch_attempts",
        "sources_listed",
        "steps_done",
        "steps_total"
      ],
      "description": "Everything a list row counts, in one place, cached from the RunAgent: the same numbers `GET /v1/runs/:id` reports in `progress`, a few seconds behind at most, so a list card never has to fetch the run to show them (E2E2-13/E2E2-24). `sources_fetched`/`notes_written` above are the same numbers, kept flat for existing clients."
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/hyperresearch-ai-run-summary"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.