# Read build status

Read durable build status and SHA-256 hashes. Ready is recorded only after every result object is stored. Transient sandbox infrastructure failures before the command starts are retried automatically with the same build id, and the command runs at most once; if the infrastructure keeps failing, the build fails with build_infrastructure_unavailable and a new build of the same source can be requested.

`GET /api/platform/v1/apps/{appId}/builds/{buildId}`

Required permission: `project:read`.

## Parameters

| Name | In | Type | Required | Description |

| --- | --- | --- | --- | --- |

| `appId` | path | `string` | Yes | — |

| `buildId` | path | `string` | Yes | — |

## Example request

```bash
curl --request GET \
  --url https://api.hoplite.sh/api/platform/v1/apps/appId/builds/buildId \
  --header "X-Api-Key: $HOPLITE_API_KEY"
```

## 200 response

Success

Content type: `application/json`. Response type: `object`.

| Field | Type | Required | Constraints | Description |
| --- | --- | --- | --- | --- |
| `ok` | `boolean` | Yes | true | — |
| `build` | `object` | Yes | — | — |
| `build.id` | `string` | Yes | — | — |
| `build.projectId` | `string` | Yes | — | — |
| `build.threadId` | `string` | Yes | — | — |
| `build.sourceId` | `string` | Yes | — | — |
| `build.command` | `string` | Yes | — | — |
| `build.outputDirectory` | `string` | Yes | — | — |
| `build.timeoutSeconds` | `number` | Yes | — | — |
| `build.status` | `string` | Yes | queued · building · ready · failed | — |
| `build.error` | `string` | Yes | — | Failure code when status is failed. build_command_failed, build_timeout and build_invalid_output describe the build itself; read the logs. build_infrastructure_unavailable means Hoplite's sandbox infrastructure failed, on every retry or after the command started; creating a new build of the same source can succeed. build_execution_failed is any other unexpected failure. |
| `build.artifactSha256` | `string` | Yes | — | — |
| `build.artifactByteSize` | `number` | Yes | — | — |
| `build.manifestSha256` | `string` | Yes | — | — |
| `build.logSha256` | `string` | Yes | — | — |
| `build.createdAt` | `string` | Yes | — | — |
| `build.startedAt` | `string` | Yes | — | — |
| `build.finishedAt` | `string` | Yes | — | — |

```json

```

## Status codes

- `200` — Success

- `400` — Invalid request

- `401` — Authentication required

- `403` — Permission, app scope or entitlement denied

- `404` — App, source or thread not found

- `409` — Idempotency conflict or request in progress

- `413` — Request too large

- `503` — Source storage or execution unavailable