---
title: "Deliver an event to a Webhook"
method: POST
path: "/api/v1/hooks/{webhookId}"
---

# Deliver an event to a Webhook

`POST /api/v1/hooks/{webhookId}`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/api/v1/hooks/{webhookId}`
- Auth: none required

The URL an external sender calls. Present the Webhook's secret as `Authorization: Bearer chrm_hook_…` or `?key=chrm_hook_…`. The body is the target op's input, validated against its declared input schema: a JSON object, or a `multipart/form-data` or `application/x-www-form-urlencoded` form whose text fields become the input, each converted to the type the schema declares. File parts are dropped and listed in the delivery record. The response is the op's own result envelope, validated against its output schema. Tagged `x-charming-trigger: webhook` for the handler.

## Request body

- WebhookDeliveryBody: The target op's input. Its shape is the op's declared input schema, returned as `target.input_schema` when the Webhook was created, so it cannot be closed here.

## Response `200`

The op's result envelope, `{ ok: true, value }`.

- WebhookDeliveryResponse: The op's own result envelope, validated against its declared output schema.
  - `ok` true, required
  - `value` unknown, required

## Other responses

- `400`: Body is not a JSON object, or fails the op's input schema.
- `401`: Missing or wrong secret.
- `403`: The owner disabled this Webhook.
- `404`: No Webhook with this id, or its op is no longer declared.
- `429`: Too many deliveries from this address or to this Webhook, or the app is at its run ceiling; retry after `Retry-After`.

---

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