Create a webhook subscription
/portal/v1/accounts/{accountSlug}/applications/{appSlug}/environments/{envSlug}/webhooksCreates a webhook subscription for the active Application's current Environment from a url, an event_types array, and an optional description. Use ["*"] to subscribe to all events (current and future); the wildcard cannot be mixed with concrete types, and any unsupported event type returns 400. The response includes a freshly minted HMAC signing secret that is shown only once at creation — store it to verify delivery signatures. Requires the webhook.manage permission.
Authentication
AuthorizationJWT access token. Never send alongside X-API-Key: a request carrying both is refused.
env_webhooks.manageDeveloper ConsoleCreate, edit, rotate, and delete Environment webhook subscriptions. Granted through an administrator role in the Admin Workspace; a valid token without it is refused with 403.
Request body
application/json
urlstring Required event_typesstring[] Required descriptionstring Optional Responses
application/json
data *WebhookCreatedResponseDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Errors
When the request can't be completed, the response body includes a stable error code you can branch on.
account.capability_requiredForbiddenThe signed-in user's administrator roles do not grant the capability this endpoint requires.
Ask an account administrator to grant a role carrying the capability named in the Authentication section, then retry.
Returned object
curl -X POST "https://auth.canopy-io.com/portal/v1/accounts/{accountSlug}/applications/{appSlug}/environments/{envSlug}/webhooks" \ -H "Authorization: Bearer $CANOPY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "url": "string", "event_types": [ "string" ], "description": "string" }'
{ "data": { "id": "string", "scope": "environment", "url": "string", "event_types": [ "string" ], "description": "string", "is_active": false, "created_at": "2026-04-20T12:00:00.000Z", "secret": "string" } }
Tell us how we can improve this guide.