---
id: "webhook-endpoint"
type: "kind"
category: "messaging"
url: "https://localhost:3000/catalogue/kinds/webhook-endpoint"
---

# Webhook endpoint

HTTP endpoint that receives callbacks from a third party.

| | |
|---|---|
| Category | Messaging |
| Properties | 4 |
| Components | 4 |
| Rules | 1 |

## Properties

| property | type | values | required | default |
|---|---|---|---|---|
| `idempotent` | boolean | — | no | false |
| `managed` | boolean | — | no | false |
| `retriedByCaller` | boolean | — | no | true |
| `signatureVerified` | boolean | — | no | false |

## Rules for this kind · 1

### Webhook without signature verification or idempotency `webhook-without-signature-or-idempotency` (error)

- Page: https://localhost:3000/catalogue/rules/webhook-without-signature-or-idempotency.md
- Why: A webhook is a public endpoint that its caller retries. Without signature verification anyone can post a fake event; without idempotency the provider's own retries apply the same event twice.
- Applies to: every node of kind webhook-endpoint
- Message: Webhook '{{node.id}}' does not verify signatures or is not idempotent. Verify the caller's signature and deduplicate by event id.

It fires when:

- any of these hold:
  - the node's `signatureVerified` is false
  - the node's `idempotent` is false

## Components · 4

### vendor-neutral

- [Generic webhook endpoint](https://localhost:3000/catalogue/components/webhook-endpoint.md) `webhook-endpoint` — the kind itself

### default

- [Hookdeck](https://localhost:3000/catalogue/components/hookdeck.md) `hookdeck` — 4 defaults
- [Svix](https://localhost:3000/catalogue/components/svix.md) `svix` — 4 defaults
- [Webhook receiver](https://localhost:3000/catalogue/components/webhook-receiver.md) `webhook-receiver` — 3 defaults

## Source (`kind` YAML, verbatim)

```yaml
# yaml-language-server: $schema=../schema/kind.schema.json
# Abstract kind: An HTTP endpoint you expose to receive callbacks from a third party (PSP, SaaS, provider).
schemaVersion: "1"
type: "kind"
id: "webhook-endpoint"
category: "messaging"
properties:
  signatureVerified:
    type: "boolean"
    default: false
  idempotent:
    type: "boolean"
    default: false
  retriedByCaller:
    type: "boolean"
    default: true
  managed:
    type: "boolean"
    default: false
```

Human page: https://localhost:3000/catalogue/kinds/webhook-endpoint
