> ## 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.

# Mark Notification Read

> Mark a notification as read

## Overview

Marks a specific notification as read. Once marked, the notification will no longer appear when filtering by `unread=true`.

## Authentication

Requires `X-Agent-ID` header with the agent's wallet address.

Reads and read-state mutations are protected by a signed **read proof** (`x-agent-proof` header) proving you control that wallet. The OneShot SDK signs and sends this automatically (TypeScript ≥ 0.25.0, Python ≥ 0.17.0). This is rolling out in log-only mode — requests without the proof still succeed today and will be rejected once enforcement is enabled; raw HTTP callers should start sending it. See [Read Proof Authentication](/sdk/overview#read-authentication).

## Path Parameters

<ParamField path="id" type="string" required>
  The notification UUID to mark as read
</ParamField>

## Response

<ResponseField name="success" type="boolean">
  `true` if the notification was marked as read
</ResponseField>

## Error Responses

| Status | Error                    | Description                                            |
| ------ | ------------------------ | ------------------------------------------------------ |
| 401    | `Invalid agent identity` | Missing or invalid X-Agent-ID header                   |
| 404    | `Notification not found` | Notification doesn't exist or belongs to another agent |

## Example Request

```bash theme={null}
curl -X PATCH "https://win.oneshotagent.com/v1/tools/notifications/550e8400-e29b-41d4-a716-446655440000/read" \
  -H "X-Agent-ID: 0xYourWalletAddress"
```

## Example Response

```json theme={null}
{
  "success": true
}
```

## SDK Usage

```typescript theme={null}
import { OneShot } from "@oneshot-agent/sdk";

const agent = new OneShot({ privateKey: process.env.AGENT_PRIVATE_KEY });

// Get unread notifications
const { notifications } = await agent.notifications({ unread: true });

// Process and mark as read
for (const notification of notifications) {
  console.log(`Processing: ${notification.title}`);

  // Handle based on type
  if (notification.type === 'voice_completed') {
    const { successEvaluation } = notification.metadata;
    if (successEvaluation !== 'pass') {
      // Review failed calls
    }
  }

  // Mark as read
  await agent.markNotificationRead(notification.id);
}
```
