# Read a proposal

GET /v1/proposals/{id}: Read a proposal

```http
GET /v1/proposals/{id}
```

|  |  |
|---|---|
| Operation id | `getProposal` |
| Key scope | `read`: every key |
| Section | [Proposals](https://docs.kaab.ist/reference/api#proposals) |

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | string | yes | pattern `^prp_[0-9a-hjkmnp-tv-z]{26}$` |

## Example request

```bash
curl -X GET "https://api.kaab.ist/v1/proposals/{id}" \
  -H "Authorization: Bearer $KAAB_API_KEY"
```

## Responses

### 200

Proposal

[Proposal](https://docs.kaab.ist/reference/api/schemas/proposal)

```json
{
  "id": "prp_01j9zqk3q7m4n5p6r7s8t9v0wx",
  "object": "proposal",
  "kind": "relocate",
  "status": "pending",
  "program": {
    "id": "prg_01j9zqk3q7m4n5p6r7s8t9v0wx",
    "name": "acme-report",
    "version": 3,
    "version_id": "pv_01j9zqk3q7m4n5p6r7s8t9v0wx"
  },
  "job_id": "job_01j9zqk3q7m4n5p6r7s8t9v0wx",
  "target": "extract.rows[].amount",
  "confidence": 0.91,
  "source": "heuristic",
  "payload": {
    "old": {
      "selector": "td:nth-child(3)"
    },
    "new": {
      "candidates": [
        {
          "css": "td[data-col=amount]"
        }
      ]
    },
    "samples": {
      "old": "1.250,00",
      "new": "1.250,00"
    }
  },
  "created_at": "2026-09-18T10:00:00Z",
  "expires_at": "2026-09-25T10:00:00Z",
  "decided_at": null,
  "decision": null
}
```

## Errors

Every error answers with the [error envelope](https://docs.kaab.ist/reference/api/schemas/error-response); its `code` is one of the [error codes](https://docs.kaab.ist/reference/codes#errors).

| Status | When |
|---|---|
| 400 | `request_invalid`: request validation failed |
| 401 | Missing or invalid API key |
| 403 | The key's scope does not cover this operation |
| 404 | Resource not found |
| 429 | Rate limited; see `Retry-After` |
| 500 | `internal`: unexpected server error |
