# Proposal

The Proposal object of the Kaabist API.

| Field | Type | Required | Description |
|---|---|---|---|
| `id` | string | yes | pattern `^prp_[0-9a-hjkmnp-tv-z]{26}$` |
| `object` | `"proposal"` | yes |  |
| `kind` | `"relocate"`, `"dismiss"`, `"insert_steps"`, `"parser_config"`, `"api_discovery"` | yes |  |
| `status` | `"pending"`, `"approved"`, `"rejected"`, `"expired"` | yes |  |
| `program` | object | yes |  |
| `program.id` | string | yes | pattern `^prg_[0-9a-hjkmnp-tv-z]{26}$` |
| `program.name` | string | yes |  |
| `program.version` | integer | yes | ≥ 1 |
| `program.version_id` | string | yes | pattern `^pv_[0-9a-hjkmnp-tv-z]{26}$` |
| `job_id` | string or null | yes | pattern `^job_[0-9a-hjkmnp-tv-z]{26}$` |
| `target` | string | yes |  |
| `confidence` | number or null | yes | ≥ 0 · ≤ 1 |
| `source` | `"heuristic"`, `"llm"`, `"takeover"`, `"canary"` | yes |  |
| `payload` | object | yes |  |
| `payload.old` | map of any |  |  |
| `payload.new` | map of any |  |  |
| `payload.samples` | map of any |  |  |
| `payload.fingerprints` | map of any |  |  |
| `payload.bboxes` | map of any |  |  |
| `payload.evidence` | map of any[] |  |  |
| `payload.screenshots` | object |  |  |
| `payload.screenshots.old` | string or null |  |  |
| `payload.screenshots.new` | string or null |  |  |
| `payload.obstacle` | map of any |  |  |
| `payload.action` | map of any |  |  |
| `payload.hostname` | string |  |  |
| `payload.steps` | map of any[] |  |  |
| `payload.recording_key` | string |  |  |
| `payload.live_id` | string |  |  |
| `created_at` | string (date-time) | yes |  |
| `expires_at` | string (date-time) | yes |  |
| `decided_at` | string or null (date-time) | yes |  |
| `decision` | object or null | yes |  |
| `decision.promote` | boolean | yes |  |
| `decision.remember` | `"none"`, `"site"` | yes |  |
| `decision.by` | string | yes |  |
| `decision.notes` | string or null |  | max length 1000 |

## Example

```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
}
```
