---
title: "List webhooks for a board"
method: GET
path: "/projects/{id}/webhooks"
---

# List webhooks for a board

`GET /projects/{id}/webhooks`

## Request

- Base URL: `https://craaft.io/api/v1`
- URL: `https://craaft.io/api/v1/projects/{id}/webhooks`
- Auth: HTTP bearer

Board admins only. Returns the list of webhook subscriptions plus a
catalogue of available broadcast event names for the filter picker.
A Free board returns `403`; a Pro board with no webhooks returns
an empty list.

## Response `200`

OK

- object
  - `webhooks` WebhookSubscription[], required
    - `id` string, uuid, required: Subscription id (the handle for update/delete)
    - `endpointId` string, uuid, required: Endpoint id at the workspace level
    - `url` string, uri, required: The target URL for deliveries
    - `secret` string, required: HMAC signing secret for 'craaft' deliveries (X-Craaft-Signature). Returned on every read to board admins. Slack/Discord deliveries are unsigned and ignore it.
    - `description` string, required: Optional label
    - `format` 'craaft' | 'slack' | 'discord', required: Delivery format (craaft=signed JSON envelope; slack/discord=message POST)
    - `events` string[], required: Event filter (empty=all events; non-empty=only listed events)
    - `active` boolean, required
    - `createdAt` string, date-time, required
    - `recentDeliveries` WebhookDelivery[]: Last few delivery attempts (most recent first), capped at 10
      - `event` string, required: The broadcast event name (e.g. 'card.created')
      - `status` 'delivered' | 'failed', required: Delivery outcome
      - `statusCode` integer, required: HTTP status code from the webhook URL
      - `attempts` integer, required: Number of delivery attempts
      - `error` string, required: Error message when status is failed; empty string on success (never null)
      - `createdAt` string, date-time, required
  - `eventCatalogue` string[], required: Broadcast event names (card.created, card.updated, card.deleted, etc.)

## Other responses

- `401`: Missing or invalid token
- `402`: Board is on Free plan; webhooks are Pro-only
- `403`: Caller is a board member but not an admin
- `404`: Resource doesn't exist or caller isn't a member of its workspace

---

[API](https://skmtc.dev/craaft/apis/craaft-api.md) · [All operations](https://skmtc.dev/craaft/apis/craaft-api/llms.txt) · [OpenAPI document](https://skmtc.dev/craaft/apis/craaft-api/revisions/3a1e9d30d7dc?raw)
