---
search:
  tags:
    - Operations
    - POST
seo:
  description: >-
    Session-gated; requires app:write. Declares one of the app’s ops as a…
    Reference for the POST /api/v1/apps/{appId}/webhooks endpoint in the
    Charming API.
sidebar:
  label: Declare a Webhook on an app
  badge: POST
title: Declare a Webhook on an app
type: openapi-operation
---
Session-gated; requires `app:write`. Declares one of the app’s ops as a Webhook target an external sender can invoke by POSTing to the returned `url` with the returned `secret` (shown once). Unlike a Routine, the op may declare required input: the sender supplies the body. Rejects a duplicate (app, op) pair and enforces a per-app and a per-owner cap from the app owner's plan, which for a team app is the team's plan rather than the caller's. `limits` on `GET /api/v1/webhooks` reports the caller's own plan, so it matches only their personal apps. The free defaults are 3 per app and 25 per owner.

`POST /api/v1/apps/{appId}/webhooks`

Found a bug or need a feature? [Tell us](/docs/capabilities/feedback) with `submit_feedback` or `POST /app/{id}/feedback`. Your feedback shapes what we build next.
