---
title: "One run's own event log, whatever workspace it is in"
method: GET
path: "/v1/admin/runs/{id}/events"
tags: ["runs"]
---

# One run's own event log, whatever workspace it is in

`GET /v1/admin/runs/{id}/events`

## Request

- Base URL: `https://api.hyperresearch.ai`
- URL: `https://api.hyperresearch.ai/v1/admin/runs/{id}/events`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `hr_session`

The run log as the RunAgent Durable Object holds it, unredacted: `internal_detail`, the raw failure text, the `fanout` and `wave-fanout` measurements, `role_loop_no_answer`, `synthesis_fallback`, and every `error` event. THE ONE CROSS-WORKSPACE READ on this API. It answers for any run id, which is the point: the per-call diagnostics the pipeline writes are invisible to `wrangler tail` (a Workflow step’s console output does not reach it), the Observability query API needs a token scope this project does not hold, the AI Gateway runs with `collect_logs: false`, and D1 holds no event rows — so before this endpoint a diagnosis needed a key bound to the run’s own workspace, and a run in a workspace nobody held a key for could not be read at all. Owner session, or an API key with `admin:read` (`admin` implies it). Every call writes an `operator.run_events.read` audit row naming the run and how many events were returned, and nothing else. Read only: there is no write on this path.

## Path parameters

- `id` string, required

## Query parameters

- `after` integer, nullable: Return events with `seq` strictly greater than this. Omit to start at the beginning.
- `limit` integer: Page size, 1–1000 (default 200). The Durable Object caps its own page at 1000.
- `kinds` string: Comma-separated kinds to keep, matched against both the event `type` and its `kind` — `provider_rejected,error` or `fanout,wave-fanout` or just `step`. Filtering happens AFTER the page is fetched, so `next_after` still advances past events that were filtered out and a page can come back empty with `has_more` true.

## Response `200`

A page of the run log

- OperatorRunEvents
  - `run_id` string, required
  - `workspace_id` string, required
  - `status` string, required: The control row status at the moment of the read.
  - `after` integer, required
  - `limit` integer, required
  - `kinds` string[], nullable, required
  - `scanned` integer, required: Events the page held before the `kinds` filter.
  - `count` integer, required: Events returned after the filter.
  - `next_after` integer, required: Cursor for the next page: the highest `seq` scanned, filtered or not.
  - `has_more` boolean, required: True when the page came back full, so there is certainly more log behind it.
  - `events` OperatorRunEvent[], required
    - `seq` integer, required: Monotonic within the run. The `after` cursor is a seq, exclusive.
    - `ts` string, nullable, required
    - `type` string, required: The stored event type: `step`, `fetch`, `note`, `llm`, `spend`, `escalation`, `verify`, `levers`, `chapter`, `finish`, `error`, `done`, `counters`, `warning`.
    - `kind` string, required: What this event is CALLED, which is the token `kinds=` filters on: a `warning`’s `code` (`role_loop_no_answer`, `synthesis_fallback`, `provider_rejected`), a `step`’s `status` (`fanout`, `wave-fanout`, `verify-failed`, `blocked`), else the type itself.
    - `step` string, nullable, required
    - `chapter` string, nullable, required
    - `data` object, required: Every remaining field of the stored event, unfiltered — `message`, `internal_detail`, `code`, `reason`, `role`, `model`, token counts, fan-out numbers, request shapes. This is the operator surface; the public `GET /v1/runs/{id}/events` allowlist is deliberately narrower and stays that way.

## Other responses

- `400`: Invalid request
- `401`: Authentication failed
- `403`: Insufficient scope or plan
- `404`: Not found
- `429`: Rate limited or over quota
- `500`: Internal error

---

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