> For a complete page index of the Captain API documentation, fetch https://docs.captain.dev/llms.txt?excludeSpec=true

# List Endpoints

GET https://api.captain.dev/v2/webhooks/endpoints

List the organization's webhook endpoints, with their filters, whether each is disabled and why, and the most recent delivery. Secrets are never included.

Reference: https://docs.captain.dev/reference/webhooks/endpoints/list

## Response

### 200

Successful Response

- `endpoints` (list of WebhookEndpoint, required)
- `limit` (integer, required) — The most endpoints the organization may have (20).

## Errors

### 401 Unauthorized Error

Missing or invalid API key.

- `error` (string, required) — Error kind. `HTTP_ERROR` for errors raised by the route.
- `message` (string, required) — What went wrong.
- `path` (string, required) — The request path.
- `status_code` (integer, optional) — The HTTP status code.

### 429 Too Many Requests Error

`Too many webhook management requests. Try again shortly.` Retry after the `Retry-After` header.

- `error` (string, required) — Error kind. `HTTP_ERROR` for errors raised by the route.
- `message` (string, required) — What went wrong.
- `path` (string, required) — The request path.
- `status_code` (integer, optional) — The HTTP status code.

## Types

### WebhookEndpoint

A webhook endpoint. Never includes the signing secret.

- `endpoint_id` (string, required) — The endpoint's id (`whe_...`).
- `url` (string, required) — HTTPS URL that receives events.
- `description` (string, required) — Free-text label. Empty string when not set.
- `event_types` (list of string, required) — Events this endpoint receives. Empty means all five.
- `collection_ids` (list of string, required) — Collection filter. Empty means every collection.
- `sync_ids` (list of string, required) — Sync filter. Empty means no sync filter.
- `sources` (list of string, required) — Source filter (`api`, `sync`). Empty means both.
- `channels` (list of string, required) — Filters set in Captain Studio's Webhooks page that cannot be expressed as `collection_ids`, `sync_ids` and `sources`. Empty for endpoints whose filters were set through the API. Setting `collection_ids`, `sync_ids` or `sources` with `PATCH` replaces them.
- `include_collection_name` (boolean, required) — Whether payloads sent to this endpoint may carry `collection_name`.
- `disabled` (boolean, required) — `true` when no events are being sent to this endpoint.
- `disabled_reason` (string, required, nullable) — `delivery_failures` when Captain disabled the endpoint after sustained failed deliveries. `null` when it is enabled or was paused through the API.
- `last_delivery` (WebhookLastDelivery, required, nullable) — The most recent delivery, or `null` before the first one.
- `created_at` (string, required)
- `updated_at` (string, required)

### WebhookLastDelivery

- `at` (string, required) — When the most recent delivery attempt finished.
- `status` (enum, required) — Outcome of that delivery.
  - Allowed values: `succeeded`, `failed`

## Examples

**Response**

```json
{
  "endpoints": [
    {
      "endpoint_id": "whe_3f9a1c7e5b2d4a6c8e0f1a2b",
      "url": "https://example.com/webhooks/captain",
      "description": "Indexing notifications",
      "event_types": [
        "job.completed",
        "job.completed_with_errors",
        "job.failed"
      ],
      "collection_ids": [],
      "sync_ids": [],
      "sources": [],
      "channels": [],
      "include_collection_name": true,
      "disabled": false,
      "disabled_reason": null,
      "last_delivery": {
        "at": "2026-09-23T10:05:13Z",
        "status": "succeeded"
      },
      "created_at": "2026-09-20T16:42:08Z",
      "updated_at": "2026-09-20T16:42:08Z"
    }
  ],
  "limit": 20
}
```

**SDK Code**

```python Python
import requests

BASE_URL = "https://api.captain.dev"
API_KEY = "your_api_key"

response = requests.get(
    f"{BASE_URL}/v2/webhooks/endpoints",
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=30.0,
)
response.raise_for_status()
data = response.json()
for endpoint in data["endpoints"]:
    state = "disabled" if endpoint["disabled"] else "enabled"
    last = endpoint["last_delivery"]
    last_text = f"{last['status']} at {last['at']}" if last else "no deliveries yet"
    print(f"{endpoint['endpoint_id']} {endpoint['url']} ({state}, {last_text})")

```

```typescript TypeScript
const BASE_URL = "https://api.captain.dev";
const API_KEY = "your_api_key";

const response = await fetch(`${BASE_URL}/v2/webhooks/endpoints`, {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${API_KEY}`,
  },
});
if (!response.ok) throw new Error(`Request failed: ${response.status} ${await response.text()}`);
const data = await response.json();
interface Endpoint {
  endpoint_id: string;
  url: string;
  disabled: boolean;
  last_delivery: { at: string; status: string } | null;
}

for (const endpoint of data.endpoints as Endpoint[]) {
  const state = endpoint.disabled ? "disabled" : "enabled";
  const last = endpoint.last_delivery
    ? `${endpoint.last_delivery.status} at ${endpoint.last_delivery.at}`
    : "no deliveries yet";
  console.log(`${endpoint.endpoint_id} ${endpoint.url} (${state}, ${last})`);
}

```