# Read a wire run

`wire.run.retrieve`

Shows where a run stands: its status, each step's state with what it wrote and found, the Product once composed, and the refusal when it failed.

Callers: the account owner's CLI login, or an agent token with blueprints:read, or a personal access token with blueprints:read.

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

Principal `user_session`. Idempotency `not_required`. Environment `sandbox`.

## Input

| Field | In | Type | Description |
| --- | --- | --- | --- |
| `runId` required | path | `string` | Wire run ID, such as wrn_sandbox_... |
| `tenantId` required | query | `string` | Organization tenant ID |
| `X-Hyperscale-Environment` | header | `sandbox \| live` |  |

## Output

| Field | Type | Description |
| --- | --- | --- |
| `runId` required | `string` | Wire run ID, such as wrn_sandbox_... |
| `tenantId` required | `string` | Organization tenant ID |
| `packKey` required | `string` | A pack's key: its file name in the packs directory, without .json |
| `brdDigest` required | `string` | SHA-256 of the BRD after whitespace normalisation: trimmed, every run of whitespace one space |
| `productId` required | `string \| null` | The Core's Product, once compose has run; null before |
| `requestedBy` required | `string` | The user id of the analyst who ran it |
| `status` required | `pending \| running \| done \| failed` |  |
| `steps` required | `object[]` | compose, records and tests, in order. compose counts the Product it made or found; records counts lifecycle records; tests counts the first SIT cycle, its run results and the records that hang on that cycle. tests stays pending while the Core's checks run |
| `attempts` required | `integer` | How many times the sweep has taken the run's current step; it starts again at each step and each rerun, and a sweep that finds the Core's checks still running does not count |
| `refusal` required | `object \| null` | Why a failed run stopped: wire_run_failed with the refusal the step met in details.cause, such as a compile refusal and its diagnostics, or when the Core's checks never settled; wire_pack_invalid when the pack cannot be written; wire_pack_check_unknown when a test case names a check the Core's results lack |
| `createdAt` required | `string` |  |
| `updatedAt` required | `string` |  |
| `finishedAt` required | `string \| null` |  |

## Request sample

Only a signed-in person may call this: the CLI after hyperscale auth login, or curl with a personal access token (hyperscale_pat_...) with blueprints:read or an agent token with blueprints:read. The agent's grant must span every Product the call reads. A Product key cannot, so the SDK, which signs in with a Product key or a customer session, has no sample for it.

### curl

```shell
curl --request GET 'https://hyperscale0.ai/v1/wire/runs/resource_sandbox_example0001' \
  --header "Authorization: Bearer $HYPERSCALE_TOKEN" \
  --header 'X-Hyperscale-Environment: sandbox'
```

### CLI

```shell
hyperscale api call wire.run.retrieve \
  --input '{"runId":"resource_sandbox_example0001"}'
```

## Errors

| Code | HTTP | Cause |
| --- | --- | --- |
| `approval_rejected` | 403 | A person rejected the call or returned it to the maker, so it never runs. |
| `approval_required` | 202 | The call waits for decisions: an agent's call over its grant waits on its delegator, and a program action under `requires approval` waits on distinct people other than the maker. |
| `environment_mismatch` | 403 | The session was issued for sandbox or live and the request targets the other environment. |
| `internal_error` | 500 | Hyperscale hit an unexpected server-side condition and hid internal implementation details from this audience. |
| `invalid_request` | 400 | The request does not match the API reference. |
| `method_not_allowed` | 405 | The route exists, but not for the request's HTTP method. |
| `missing_required_permission` | 403 | The signed-in member's current role does not grant the permission required for this operation. |
| `missing_required_scope` | 403 | The credential is valid but does not grant one or more operation scopes. |
| `not_found` | 404 | No Hyperscale route matched the requested path and method. |
| `oauth_client_not_admitted` | 403 | The bearer is an OAuth client token, and this operation does not admit the oauth2_client principal. |
| `rate_limited` | 429 | The credential sent more than its limit in the current 60-second window: 600 requests per API key or session, 1,200 per IP address. Every response carries `x-ratelimit-limit`, `x-ratelimit-remaining` and `x-ratelimit-reset` (Unix seconds). |
| `resource_not_found` | 404 | The requested resource does not exist in the credential's visible scope. |
| `resource_reader_unavailable` | 503 | A generated read model could not serve the request at this moment. |
| `state_conflict` | 409 | The operation conflicts with the current durable state of the resource. |
| `tenant_mismatch` | 403 | The request mixed tenant-owned identifiers across tenant boundaries. |
| `tenant_not_found` | 404 | The credential resolved to a tenant Hyperscale cannot find. |
| `unauthorized` | 403 | The request did not include a valid Hyperscale bearer credential for this environment. |
| `agent_token_expired` | 401 | The agent token is real, but its grant ended. A grant lasts 30 days, or 7 days unused. `details.expiresAt` holds the date in ISO 8601 and `details.agentName` names the agent. |
| `agent_token_replaced` | 401 | The account owner ran `hyperscale agent setup` again for this agent, which replaced this token with a newer one. `details.agentName` names the agent and `details.replacedAt` holds the date. |
| `device_login_expired` | 401 | The bearer is the account owner's own device login from `hyperscale auth login`, not an agent token. Its access token lasts an hour and the CLI refreshes it; the login itself ends after 30 days, or 7 days unused. `details.expiresAt` holds when it ended in ISO 8601. |
| `invalid_credentials` | 401 | Hyperscale could not accept the account or credential request. Signup, login, and bearer authentication use one 401 for every case they reject, so the response exposes no credential-specific reason or registered-email verdict. The single exception is a key that is real but homed in the other environment: because the presented secret already matched a stored key, the message names the mismatch instead of leaving a working credential looking unknown. A bearer that matched nothing gets text that fits its prefix (an agent token, a refresh token, a personal access token, a session or no Hyperscale token at all), which says only what the caller sent, never whether a credential like it exists. |
| `session_expired` | 401 | The session behind this request has ended. A console session ends 30 days after sign-in, or after 12 hours with no request. An admin or customer session ends 24 hours after sign-in, or after 15 minutes with no request. A personal access token ends at the `expiresAt` set when it was created. |
| `session_required` | 401 | This operation needs a person signed in through the browser or the `hyperscale` CLI. A Product API key cannot call it. The request carried no session, or its token matched no live session. |
| `session_revoked` | 401 | The session or personal access token behind this request was ended before its expiry. Sign-out, `user.session.revoke`, a password reset, a role change, removal from the team, user suspension and `personal_access_token.revoke` all end sessions. |
| `tenant_status_forbidden` | 409 | The company is suspended or closed, so every credential bound to it is refused, reads included. `details.tenantId` names the company. |
| `wire_pack_check_unknown` | 422 | A test case in the pack names a check the pack's HSX program does not declare, so the run could not take its result from the Core's checks. details.cases lists each case and the check it names. |
| `wire_pack_invalid` | 422 | The pack cannot be written as this company: a record names a role no member can play, or a record breaks the pack's own rules. details.cause.message names what failed. |
| `wire_run_failed` | 422 | A step of the run met a refusal it cannot pass, such as the pack's HSX failing to compile. details.step names the step and details.cause holds the refusal with its diagnostics. |

[All operations](/docs/operations/index.md)

For agents: [OpenAPI document](https://hyperscale0.ai/openapi.json) · [MCP manifest](https://hyperscale0.ai/.well-known/mcp.json) · [HTTP API guide](https://hyperscale0.ai/docs/api.md) · [MCP guide](https://hyperscale0.ai/docs/mcp.md)
