> The full uetr.ai documentation index is at https://uetr.ai/llms.txt, and every page under https://uetr.ai/docs/api is also Markdown at its address plus `.md`.

# List webhook endpoints

List the account's webhook endpoints with their status and events, oldest first. Addresses show only their host and a masked path, and signing secrets are never returned. Only the account owner's API keys and connected apps can read webhooks. Reading changes nothing.

`GET https://uetr.ai/api/v1/webhooks`

- MCP tool: `list_webhook_endpoints`
- Access: any key or connection
- Only the account owner's keys and connections

## Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `endpoints` | array of object | Yes |  |
| `endpoints[].id` | string (uuid) | Yes |  |
| `endpoints[].url` | string | Yes | The address's host and a masked path. The full address is never shown. |
| `endpoints[].destination` | `json`, `slack`, `teams` | Yes | json: signed JSON. slack and teams: a readable message for a Slack or Microsoft Teams incoming webhook. |
| `endpoints[].events` | array of `status_changed`, `final_state`, `checks_ended` | Yes |  |
| `endpoints[].status` | `pending`, `active`, `paused` | Yes | pending: waiting for the account owner to confirm it on the website; until then it receives test events only. active: receiving events. paused: deliveries stopped after sustained failures; a test event that succeeds resumes it. |
| `endpoints[].paused_at` | string or null | Yes |  |
| `endpoints[].created_at` | string | Yes |  |
| `endpoints[].created_by` | `website`, `api` | Yes | website: added on the website. api: added by an API key or a connected app. |
| `endpoints[].api_version` | string | Yes |  |

## Example

```sh
curl -X GET "https://uetr.ai/api/v1/webhooks" \
  -H "Authorization: Bearer $UETR_API_KEY"
```

The answer:

```json
{
  "endpoints": [
    {
      "id": "8e2c4a6b-0d3f-4e7a-9b1c-5f8d2a4c6e0b",
      "url": "hooks.example.com/••••",
      "destination": "json",
      "events": [
        "status_changed",
        "final_state",
        "checks_ended"
      ],
      "status": "active",
      "paused_at": null,
      "created_at": "2026-10-14T08:40:00.000Z",
      "created_by": "website",
      "api_version": "2026-10-14"
    },
    {
      "id": "3b1f8c2e-6a4d-4f5e-9c7b-2d8e1a0f4b6c",
      "url": "hooks.slack.com/services/••••",
      "destination": "slack",
      "events": [
        "status_changed"
      ],
      "status": "active",
      "paused_at": null,
      "created_at": "2026-10-14T09:35:00.000Z",
      "created_by": "api",
      "api_version": "2026-10-14"
    }
  ]
}
```

## Refusals

Besides the [access refusals](/docs/api/errors#access-refusals) every call can meet, this call can answer:

- [`not_permitted`](/docs/api/errors#not_permitted) (403): Not permitted.