---
title: "Create a webhook (e.g. 'https://myapp.com/hook'). URL must be HTTPS. Returns signing secret (save it). Fails if URL not"
method: POST
path: "/api/v1/webhooks"
tags: ["webhooks"]
---

# Create a webhook (e.g. 'https://myapp.com/hook'). URL must be HTTPS. Returns signing secret (save it). Fails if URL not

`POST /api/v1/webhooks`

## Request

- Base URL: `https://crispy.sh`
- URL: `https://crispy.sh/api/v1/webhooks`
- Auth: HTTP bearer

## Request body

- object
  - `url` string, required: HTTPS URL to receive webhook POST requests
  - `events` string[], required: Event types to subscribe to. Use list_webhooks to see valid events.
  - `description` string: Optional description for this webhook
  - `signing_format` 'v1' | 'legacy': Signature format. Default 'v1' (signed Webhook-Signature envelope). 'legacy' kept for older integrations.

## Response `200`

Success

## Other responses

- `401`: Missing or expired API key
- `403`: Insufficient key scope or permission denied
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/crispy/apis/crispy-rest-api.md) · [All operations](https://skmtc.dev/crispy/apis/crispy-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crispy/apis/crispy-rest-api/revisions/6bed0974d9ce?raw)
