# Save a thread

> Save one thread, which keeps it under Saved, and kept, even once it is done.

<div class="g1t-endpoint"><span class="g1t-method" data-method="put">PUT</span><code>/notifications/threads/{id}/saved</code></div>

With `saved` false it is unsaved. Returns the thread.

- **Authentication:** Required. Send an [access token](/reference/api/#authentication) as `Authorization: Bearer`.
- **MCP tool:** [`notifications`](/reference/mcp/#notifications) with `action` `save`, and the same inputs
- **Scope:** An access token needs [`notifications:write`](/guides/authentication/#scopes).
- **Also at:** [`DELETE /notifications/threads/{id}/saved`](/reference/api/notifications/unsave-thread/)

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes | The thread's id, from [`list_notifications`](/reference/api/notifications/list-notifications/). |

## Body parameters

Send a JSON object. Names are `snake_case`, as in responses; the `camelCase` spelling is accepted too.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `saved` | boolean | No | False unsaves it. |

## Example request

```sh
curl -X PUT https://api.g1t.sh/notifications/threads/ntf_01kp7m2q3r4s5t6v7w8x9y0z1a/saved \
  -H "Authorization: Bearer $G1T_TOKEN"
```

## Example response

A successful request answers `200` with:

```json
{
  "id": "ntf_01kp7m2q3r4s5t6v7w8x9y0z1a",
  "reason": "review_requested",
  "severity": "warning",
  "title": "ada asked you to review flagon-io/hello#14",
  "body": "Add a greeting to the README",
  "event": "pull.review_requested",
  "repo": "flagon-io/hello",
  "workspace": "flagon-io",
  "subject": "pull",
  "number": 14,
  "url": "/flagon-io/hello/pull/14",
  "actor": "ada",
  "count": 3,
  "created_at": "2026-10-06T15:02:11.000Z",
  "updated_at": "2026-10-07T09:41:30.000Z",
  "read_at": null,
  "done_at": null,
  "saved": true,
  "snoozed_until": null,
  "activity": [
    {
      "reason": "review_requested",
      "severity": "warning",
      "title": "ada asked you to review flagon-io/hello#14",
      "body": "Add a greeting to the README",
      "event": "pull.review_requested",
      "actor": "ada",
      "created_at": "2026-10-07T09:41:30.000Z"
    },
    {
      "reason": "comment",
      "severity": "info",
      "title": "ada commented on flagon-io/hello#14",
      "body": "Pushed the fix for the heading.",
      "event": "comment.created",
      "actor": "ada",
      "created_at": "2026-10-06T18:20:02.000Z"
    },
    {
      "reason": "comment",
      "severity": "info",
      "title": "g1t commented on flagon-io/hello#14",
      "body": "The heading level is off by one.",
      "event": "comment.created",
      "actor": "g1t",
      "created_at": "2026-10-06T15:02:11.000Z"
    }
  ],
  "subscription": {
    "subscribed": true,
    "ignored": false,
    "reason": "review_requested",
    "repo": "flagon-io/hello",
    "number": 14,
    "updated_at": null
  }
}
```

## Errors

A failed request answers with one of these statuses and a body like `{"error": {"code": "not_found", "message": "Repository not found."}}`. See [errors](/reference/api/#errors).

| Status | Code | When |
| --- | --- | --- |
| 401 | `unauthenticated` | A token is required, or the one sent is not valid. |
| 403 | `forbidden` | The token is valid but not allowed to do this, such as a member-only change or an agent token outside its repository. |
| 404 | `not_found` | It does not exist, or you cannot see it. |
| 409 | `conflict` | The request conflicts with the current state. |
| 422 | `invalid` | The input is not valid. `message` says which field and why. |
