> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oneshotagent.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get approval

> Read an approval and poll for its decision

## Authentication

`X-Agent-ID` plus a signed `x-agent-proof` with `scope: "read"`. See [proof authentication](/sdk/overview#read-authentication).

<RequestExample>
  ```bash cURL theme={null}
  curl "https://win.oneshotagent.com/v1/approvals/appr_01J..." \
    -H "X-Agent-ID: 0xYourWalletAddress" \
    -H "x-agent-proof: <base64 signed proof, scope=read>"
  ```
</RequestExample>

## Parameters

<ParamField path="id" type="string" required>Approval ID belonging to this agent.</ParamField>

## Response

`200` returns the approval. Poll until `status` leaves `pending`. `404 approval_not_found` means it does not exist or belongs to another agent.

<ResponseExample>
  ```json theme={null}
  {
    "success": true,
    "data": {
      "approval_id": "appr_01J...",
      "source": "api",
      "tool": null,
      "status": "pending",
      "action_summary": "Send the signed LOI to Acme",
      "preview": {
        "contact": "jane@acme.com"
      },
      "policy_rule": null,
      "approver": {
        "channel": "email",
        "address": "o***@acme.com"
      },
      "expires_at": "2026-10-19T13:00:00.000Z",
      "use_by": null,
      "decided_at": null,
      "decided_via": null,
      "decision_note": null,
      "decision_receipt_id": null,
      "consumed_at": null,
      "notified": true,
      "notify_error": null,
      "compute": null,
      "created_at": "2026-10-19T12:00:00.000Z"
    }
  }
  ```
</ResponseExample>

<ResponseField name="data.approval_id" type="string">Use this ID to poll or cancel.</ResponseField>
<ResponseField name="data.status" type="string">`pending`, `approved`, `denied`, `expired`, `cancelled` or `consumed`.</ResponseField>
<ResponseField name="data.source" type="string">`api`, `policy` or `compute`. `tool` and `policy_rule` are nullable; `action_summary` and nullable `preview` describe the action.</ResponseField>
<ResponseField name="data.approver" type="object">`channel` is `email` or `sms`; `address` is masked.</ResponseField>
<ResponseField name="data.expires_at" type="string">ISO deadline. `created_at` is the creation time; nullable `use_by`, `decided_at` and `consumed_at` record later stages.</ResponseField>
<ResponseField name="data.decision_note" type="string | null">Optional note. `decided_via` and `decision_receipt_id` are also nullable.</ResponseField>
<ResponseField name="data.notified" type="boolean">Whether the approver was notified. `notify_error` is `null` or `approver notification failed`.</ResponseField>
<ResponseField name="data.compute" type="object | null">`goal_id` and `task_id` for a compute approval.</ResponseField>

For a policy approval, retry the [held call](/api-reference/approvals/overview#when-a-call-is-held) with `X-Approval-Id` once approved.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.