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

# List webhooks

> GET /v1/webhooks — list the webhook endpoints registered for the current project. Signing secrets are redacted.

Return the webhook endpoints registered for the current project. Signing secrets are never echoed here — they appear only on create.

**`GET /v1/webhooks`**

## Query parameters

<ParamField query="cursor" type="string">
  Opaque pagination cursor from a previous response's `nextCursor`.
</ParamField>

<ParamField query="limit" type="integer">
  Page size, `1`–`100` (default `25`).
</ParamField>

<Note>
  **Project scope.** With an account-wide key, set `X-Drin-Product` to name the project whose endpoints you want. Project-scoped keys may omit it.
</Note>

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.drin.run/v1/webhooks \
    -H "Authorization: Bearer $DRIN_API_KEY"
  ```

  ```typescript Node.js theme={null}
  import { DrinClient } from "@drin00/sdk";

  const drin = new DrinClient({ apiKey: process.env.DRIN_API_KEY });

  const page = await drin.webhooks.list();
  for (const hook of page.data) {
    console.log(hook.id, hook.url, hook.enabled);
  }
  ```
</CodeGroup>

## Response

Returns `200 OK` with a page of endpoints under `data`. `signingSecret` is an empty string on every endpoint — it is only ever returned on [create](/api-reference/webhooks/create).

```json 200 OK theme={null}
{
  "data": [
    {
      "id": "wh_3kQ9p2",
      "url": "https://example.com/hooks/drin",
      "enabled": true,
      "eventTypes": ["delivery", "bounce", "complaint"],
      "signingSecret": ""
    }
  ],
  "nextCursor": null
}
```
