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

# Update Thread

> Update a thread's read status, starred status, or category.

## Path Parameters

<ParamField path="reply_id" type="string" required>
  The unique identifier of the reply thread.
</ParamField>

## Body Parameters

<ParamField body="isRead" type="boolean">
  Mark thread as read or unread.
</ParamField>

<ParamField body="isStarred" type="boolean">
  Star or unstar the thread.
</ParamField>

<ParamField body="category" type="string">
  Manually override the AI category. One of: `interested`, `not_interested`, `out_of_office`, `uncategorized`, `unknown`.
</ParamField>

## Response

Returns the updated thread object.

<RequestExample>
  ```bash cURL theme={null}
  curl -X PATCH "https://api.foxreach.io/api/v1/inbox/threads/rpl_abc123" \
    -H "X-API-Key: otr_your_key" \
    -H "Content-Type: application/json" \
    -d '{
      "isRead": true,
      "isStarred": true,
      "category": "interested"
    }'
  ```

  ```python Python SDK theme={null}
  from foxreach import FoxReach
  from foxreach.types import ThreadUpdate

  client = FoxReach(api_key="otr_your_key")
  thread = client.inbox.update(
      "rpl_abc123",
      ThreadUpdate(is_read=True, category="interested", is_starred=True)
  )
  ```

  ```typescript TypeScript SDK theme={null}
  import { FoxReach } from "foxreach";

  const client = new FoxReach({ apiKey: "otr_your_key" });
  const thread = await client.inbox.update("rpl_abc123", {
      isRead: true,
      category: "interested",
      isStarred: true
  });
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "data": {
      "id": "rpl_abc123",
      "fromEmail": "john@acme.com",
      "toEmail": "outreach@yourcompany.com",
      "subject": "Re: Quick question about your product",
      "bodyPreview": "Hi, thanks for reaching out! I'd love to learn more about...",
      "category": "interested",
      "isRead": true,
      "isStarred": true,
      "receivedAt": "2025-01-20T14:30:00",
      "leadId": "cld_xyz789",
      "campaignId": "cmp_def456"
    }
  }
  ```
</ResponseExample>

## Errors

| Status | Description            |
| ------ | ---------------------- |
| `404`  | Thread not found       |
| `422`  | Invalid category value |

## Rate Limit

* **100 requests per minute, per API key.** Fixed 60-second window.
* Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch seconds).
* A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
