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

# Webhook Events

> Available webhook events

# Webhook Events

Events are named with the format `RESOURCE_TYPE.EVENT`. The `RESOURCE_TYPE` corresponds to the shape of the payload.

For example, `FOLLOWED_OPP.MODIFIED` will have a payload that mimics the `/v3/opportunities/{{id}}` endpoint.

## Available Events

The following webhook events are available to subscribe to:

### Workspace Events

* `OPP_WORKSPACE.FOLLOWED` - Sent when a user follows a workspace
* `OPP_WORKSPACE.STATUS_CHANGED` - Sent when a workspace's status changes

#### `OPP_WORKSPACE.STATUS_CHANGED`

All organizations have default statuses (Qualifying, Intend to Bid, Quoted, Submitted, Awarded, Not Awarded, No Bid) and can define custom statuses. `STATUS_CHANGED` fires for all status transitions.

The payload includes the current and previous status, so consumers know exactly what changed. `displayStatus` is the status name (e.g., "Qualifying" or a custom name like "Proposal Drafting"). Each status belongs to a stable `statusCategory` (`triage`, `planned`, `in_progress`, `completed`, `canceled`).

**Example payload:**

```json theme={null}
{
  "event": "OPP_WORKSPACE.STATUS_CHANGED",
  "payload": {
    "id": "workspace-uuid",
    "createdAt": "2026-02-10T10:30:00Z",
    "updatedAt": "2026-02-18T14:22:00Z",
    "displayName": "Workspace Name",
    "archivedAt": null,
    "commentsCount": 3,
    "private": false,
    "createdByOrganization": "Acme Corp",
    "url": "https://app.govly.com/opportunities/{opp_id}/workspaces/{workspace_id}",
    "statusCategory": "in_progress",
    "displayStatus": "Proposal Drafting",
    "statusId": "status-uuid",
    "previousStatusCategory": "triage",
    "previousDisplayStatus": "Qualifying",
    "previousStatusId": "status-uuid",
    "comments": [],
    "follows": [],
    "opportunity": { "..." : "full opportunity object" },
    "activities": []
  }
}
```

**Status fields:**

| Field                    | Type           | Description                                                                                                    |
| ------------------------ | -------------- | -------------------------------------------------------------------------------------------------------------- |
| `statusCategory`         | string         | The stable category the status belongs to. One of: `triage`, `planned`, `in_progress`, `completed`, `canceled` |
| `displayStatus`          | string         | The status name (e.g., a default like "Qualifying" or a custom name like "Proposal Drafting")                  |
| `statusId`               | string or null | ID of the status                                                                                               |
| `previousStatusCategory` | string         | The status category before this change                                                                         |
| `previousDisplayStatus`  | string         | The display status before this change                                                                          |
| `previousStatusId`       | string or null | ID of the previous status                                                                                      |

### Opportunity Events

Events handled by Govly's opportunity processing pipeline in real time:

* `FOLLOWED_OPP.MODIFIED` - Sent when modifications hit Govly
* `FOLLOWED_OPP.ENRICHED` - Sent when Govly finishes LLM summarization
