# Read a write receipt

Scoped to the organization and stable calling principal. Settled receipts are retained for at least seven days, after which their keys can be reused. Retrying an unsettled key reconciles it: a resource the first request created settles the receipt, and proven absence lets the same key dispatch again. This receipt records HTTP dispatch; a 202 result still requires reading its run or resource until the underlying work completes.

`GET /api/operations/{id}`

## Parameters

| Name | In | Type | Required | Description |

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

| `id` | path | `string` | Yes | — |

## Example request

```bash
curl --request GET \
  --url https://api.hoplite.sh/api/operations/id \
  --header "X-Api-Key: $HOPLITE_API_KEY"
```

## 200 response

Successful response

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

| Field | Type | Required | Constraints | Description |
| --- | --- | --- | --- | --- |
| `ok` | `boolean` | Yes | constant true | — |
| `operation` | `object` | Yes | — | — |
| `operation.id` | `string` | Yes | — | — |
| `operation.operation` | `string` | Yes | — | — |
| `operation.reconciliation` | `object \| null` | Yes | — | — |
| `operation.reconciliation.Option 1` | `object` | No | — | — |
| `operation.reconciliation.Option 1.kind` | `string` | Yes | — | — |
| `operation.reconciliation.Option 1.id` | `string` | Yes | — | — |
| `operation.reconciliation.Option 1.threadId` | `string` | No | — | — |
| `operation.reconciliation.Option 1.runId` | `string \| null` | No | — | — |
| `operation.reconciliation.Option 1.status` | `string` | No | — | — |
| `operation.reconciliation.Option 2` | `null` | No | — | — |
| `operation.execution` | `object \| null` | Yes | — | — |
| `operation.execution.Option 1` | `object` | No | — | — |
| `operation.execution.Option 1.threadId` | `string` | Yes | — | — |
| `operation.execution.Option 1.runId` | `string` | Yes | — | — |
| `operation.execution.Option 1.status` | `string` | Yes | queued · running · waiting · completed · failed · cancelled | — |
| `operation.execution.Option 1.finishedAt` | `string<date-time> \| null` | Yes | — | — |
| `operation.execution.Option 2` | `null` | No | — | — |
| `operation.state` | `string` | Yes | dispatched · succeeded · rejected · unknown | — |
| `operation.statusCode` | `number \| null` | Yes | — | — |
| `operation.result` | `getApiOperationResponseschema0 \| null` | Yes | — | — |
| `operation.result.Option 1` | `getApiOperationResponseschema0` | No | — | — |
| `operation.result.Option 1.Option 1` | `string` | No | — | — |
| `operation.result.Option 1.Option 2` | `number` | No | — | — |
| `operation.result.Option 1.Option 3` | `boolean` | No | — | — |
| `operation.result.Option 1.Option 4` | `null` | No | — | — |
| `operation.result.Option 1.Option 5` | `getApiOperationResponseschema0[]` | No | — | — |
| `operation.result.Option 1.Option 5.Recursive value` | `getApiOperationResponseschema0` | No | — | Recursive schema; see /docs/openapi.json. |
| `operation.result.Option 1.Option 6` | `object` | No | — | — |
| `operation.result.Option 1.Option 6.[key]` | `getApiOperationResponseschema0` | No | — | — |
| `operation.result.Option 1.Option 6.[key].Recursive value` | `getApiOperationResponseschema0` | No | — | Recursive schema; see /docs/openapi.json. |
| `operation.result.Option 2` | `null` | No | — | — |
| `operation.createdAt` | `string<date-time>` | Yes | — | — |
| `operation.completedAt` | `string<date-time> \| null` | Yes | — | — |

```json
{
  "ok": true,
  "operation": {
    "id": "operation_example",
    "operation": "createThread",
    "reconciliation": {
      "kind": "thread",
      "id": "thread_example",
      "threadId": "thread_example",
      "status": "running"
    },
    "execution": null,
    "state": "unknown",
    "statusCode": null,
    "result": null,
    "createdAt": "2026-09-22T09:55:00.000Z",
    "completedAt": null
  }
}
```

## Response headers

| Header | Type | Statuses | Description |

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

| `RateLimit` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Current ingress policy, remaining requests, and seconds until reset, for example `"ingress";r=599;t=60`. |

| `RateLimit-Policy` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Ingress quota and window, for example `"ingress";q=600;qu="requests";w=60`. |

| `X-RateLimit-Limit` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Maximum requests allowed in the current rolling window. |

| `X-RateLimit-Remaining` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Requests remaining in the current rolling window. |

| `X-RateLimit-Reset` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Unix timestamp when the current rolling window resets. |

| `x-request-id` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Request correlation ID. |

| `Retry-After` | `integer` | `429`, `503` | Seconds until another request should be attempted. |

| `X-Retry-After` | `integer` | `429`, `503` | Legacy retry delay in seconds. |

## Status codes

- `200` — Successful response

- `400` — Invalid request. Validation responses include field paths.

- `401` — The API key is missing, invalid, or lacks the operation's permission.

- `402` — The organization does not have access to the requested product capability.

- `403` — The key's current user no longer has the required organization membership or role.

- `404` — The resource is not available in the authenticated scope.

- `409` — The request conflicts with a retry receipt or current resource state.

- `410` — The event cursor has expired; capture a fresh head and resource snapshot.

- `429` — The API-key rate limit has been exceeded.

- `500` — The API encountered an unexpected failure.

- `501` — The deployment has not configured the requested capability.

- `503` — A required API dependency, including the rate limiter, is unavailable.