Create a webhook subscription
const url = 'https://desk.example.com/api/v1/webhooks';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"Deploy bot","url":"https://hooks.example.com/the-desk","events":["message.created"],"channel_ids":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://desk.example.com/api/v1/webhooks \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "Deploy bot", "url": "https://hooks.example.com/the-desk", "events": [ "message.created" ], "channel_ids": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ] }'Required scope: webhooks:write
Registers an outgoing-webhook subscription in the workspace. The signing secret is returned in plaintext here exactly once and never again — store it now; it is what you verify delivery signatures with.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
A publicly reachable http:// or https:// endpoint.
Loopback, private, link-local, and cloud-metadata addresses
are rejected.
Restrict delivery to these channels, all of which must belong to the workspace. Omit to subscribe workspace-wide.
Responses
Section titled “Responses”The subscription was created, with its one-time signing secret.
object
An outgoing-webhook subscription. The signing secret is deliberately absent — it is returned only by the create operation.
object
Null when the subscription is workspace-wide.
A subscription is disabled automatically after repeated delivery failures.
The signing secret, shown only here.
Example
{ "data": { "events": [ "message.created" ], "status": "active" }}The token is missing, malformed, or revoked.
The shape every error response carries.
object
Examplegenerated
{ "message": "example"}The token lacks the scope this operation requires, or its subject may see the resource but not perform this action on it.
The shape every error response carries.
object
Examplegenerated
{ "message": "example"}The resource does not exist, is outside the token’s workspace, or the
integrations platform is disabled. A channel the subject cannot see is
reported here rather than as a 403, so the API never leaks its
existence.
The shape every error response carries.
object
Examplegenerated
{ "message": "example"}The request body failed validation.
object
The failing fields, each mapped to its messages.
object
Examplegenerated
{ "message": "example", "errors": { "additionalProperty": [ "example" ] }}The per-token rate limit (INTEGRATIONS_API_RATE_LIMIT requests per
minute) was exceeded. Retry after the Retry-After header.
The shape every error response carries.
object
Examplegenerated
{ "message": "example"}Headers
Section titled “Headers”Seconds to wait before retrying.