---
title: "Seer"
description: "Learn more about Sentry's integration platform Seer webhooks for Issue Fix analysis notifications."
url: https://docs.sentry.io/integrations/integration-platform/webhooks/seer/
---

# Seer

Sentry integrations that have subscribed to Seer webhooks can receive notifications about the Seer [Autofix](https://docs.sentry.io/product/ai-in-sentry/seer/autofix.md) process. These webhooks allow you to track the progress of root cause analysis, solution generation, and code fixes.

## [Sentry-Hook-Resource Header](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#sentry-hook-resource-header)

`'Sentry-Hook-Resource': 'seer'`

## [Webhook Types](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#webhook-types)

Seer webhooks support seven different event types that track the complete lifecycle of AI-powered issue resolution:

### [Root Cause Analysis](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#root-cause-analysis)

* `seer.root_cause_started` - Triggered when root cause analysis begins
* `seer.root_cause_completed` - Triggered when root cause analysis completes with results

### [Solution Generation](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#solution-generation)

* `seer.solution_started` - Triggered when solution generation begins
* `seer.solution_completed` - Triggered when a solution has been generated

### [Coding](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#coding)

* `seer.coding_started` - Triggered when the coding step (code fix generation) begins
* `seer.coding_completed` - Triggered when code changes are ready
* `seer.pr_created` - Triggered when pull request(s) are created

## [Common Attributes](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#common-attributes)

All Seer webhooks share these common attributes:

### [action](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#action)

* type: string
* description: The specific Seer event that occurred (e.g., `root_cause_started`, `solution_completed`)

### [data\['run\_id'\]](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#datarun_id)

* type: integer
* description: Unique identifier for this Seer analysis run

### [data\['group\_id'\]](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#datagroup_id)

* type: integer
* description: The Sentry issue ID being analyzed

## [Event-Specific Payloads](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#event-specific-payloads)

### [Root Cause Started](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#root-cause-started)

Minimal payload indicating analysis has begun:

```json
{
  "action": "root_cause_started",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [Root Cause Completed](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#root-cause-completed)

Includes the identified root cause. The `root_cause` object contains:

* `one_line_description` (string): A one-sentence summary of the root cause.
* `five_whys` (array of strings): A chain of reasoning explaining why the issue occurred.
* `reproduction_steps` (array of strings): Steps to reproduce the issue.
* `relevant_repo` (string): The repository most relevant to the root cause, in `owner/name` format.

```json
{
  "action": "root_cause_completed",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242,
    "root_cause": {
      "one_line_description": "A `TypeError` is thrown in `sendWelcomeEmail` because `getUser` can return `null`, but the result is used without a null check.",
      "five_whys": [
        "The error `TypeError: Cannot read properties of null (reading 'email')` is raised at runtime.",
        "The `user` object is `null` when `user.email` is accessed.",
        "`getUser(userId)` returns `null` when no matching user exists.",
        "`sendWelcomeEmail` assumes `getUser` always returns a user and omits a null check."
      ],
      "reproduction_steps": [
        "Call `sendWelcomeEmail` with a `userId` that does not exist.",
        "Observe the `TypeError` raised when `user.email` is accessed."
      ],
      "relevant_repo": "owner/repo"
    }
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [Solution Started](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#solution-started)

Minimal payload indicating solution generation has begun:

```json
{
  "action": "solution_started",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [Solution Completed](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#solution-completed)

Includes the generated solution details. The `solution` object contains:

* `one_line_summary` (string): A one-sentence summary of the proposed fix.
* `steps` (array): The ordered steps to implement the solution. Each step has a `title` and a `description`.

```json
{
  "action": "solution_completed",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242,
    "solution": {
      "one_line_summary": "Guard against a missing user in `sendWelcomeEmail` by returning early when `getUser` returns `null`.",
      "steps": [
        {
          "title": "Add a null check",
          "description": "In `notifications.js`, check whether `user` is defined after calling `getUser(userId)` and return early if it is not."
        },
        {
          "title": "Log the missing user",
          "description": "Emit a warning when no user is found so the missing record can be investigated."
        }
      ]
    }
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [Coding Started](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#coding-started)

Minimal payload indicating the coding step has begun:

```json
{
  "action": "coding_started",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [Coding Completed](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#coding-completed)

Includes the code changes made. `code_changes` is an object keyed by repository name (in `owner/name` format); each value is a list of file-level changes. Each change has:

* `diff` (string): The unified diff for the file.
* `path` (string): The path of the changed file.
* `type` (string): The kind of change — `M` (modified), `A` (added), or `D` (deleted).
* `added` (integer): The number of lines added.
* `removed` (integer): The number of lines removed.

```json
{
  "action": "coding_completed",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242,
    "code_changes": {
      "owner/repo": [
        {
          "diff": "--- notifications.js\n+++ notifications.js\n@@ -8,3 +8,7 @@\n   const user = getUser(userId);\n+  if (!user) {\n+    logger.warn(`No user found for id: ${userId}`);\n+    return;\n+  }\n   sendEmail(user.email, \"Welcome!\");\n }",
          "path": "notifications.js",
          "type": "M",
          "added": 4,
          "removed": 0
        }
      ]
    }
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

### [PR Created](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#pr-created)

Includes pull request details, there may be more than one pull request if there are multiple repos:

```json
{
  "action": "pr_created",
  "actor": {
    "id": "sentry",
    "name": "Sentry",
    "type": "application"
  },
  "data": {
    "run_id": 12345,
    "group_id": 1170820242,
    "pull_requests": [
      {
        "pull_request": {
          "pr_number": 123,
          "pr_url": "https://github.com/owner/repo/pull/123",
          "pr_id": 456789
        },
        "repo_name": "my-app",
        "provider": "github"
      }
    ]
  },
  "installation": {
    "uuid": "a8e5d37a-696c-4c54-adb5-b3f28d64c7de"
  }
}
```

## [Use Cases](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#use-cases)

Seer webhooks enable you to:

1. **Track Progress**: Monitor the status of Seer Issue Fix in real-time
2. **Build Notifications**: Send custom notifications when fixes are ready
3. **Audit Trail**: Maintain a log of all Seer fixes for your issues
4. **Custom Integrations**: Build custom tools that react to Seer's analysis results

## [Best Practices](https://docs.sentry.io/integrations/integration-platform/webhooks/seer.md#best-practices)

* Store the `run_id` to correlate related webhook events
* Use the `group_id` to link webhooks back to the original Sentry issue
