Skip to content

Create a webhook subscription

POST
/webhooks
curl --request POST \
  --url http://localhost:8000/webhooks \
  --header 'API-Key: <API-Key>' \
  --header 'Content-Type: application/json' \
  --data '{ "name": "example", "url": "https://example.com", "source": "keycloak", "event_types": [ "example" ], "signing_secret": "example", "enabled": true, "cluster_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "realm_id": "123e4567-e89b-12d3-a456-426614174000", "authorization_header": "example" }'

Creates a webhook subscription. Secrets are write-only and are never returned.

url must include an endpoint path (https://api.example.com/webhooks/events); a bare origin is rejected with 422 because no route on your server would receive the delivery.

cluster_id must name a cluster in your workspace, and realm_id a realm on that cluster; either one unknown returns 404. A realm_id sent without a cluster_id must be a realm on one of your workspace’s clusters. Omit both to subscribe to every cluster in the workspace.

Required scope: webhooks:write

Media typeapplication/json
object
name
required
string
>= 1 characters <= 255 characters
url
required

Delivery endpoint. Must be an http or https URL that includes an endpoint path, for example https://api.example.com/webhooks/events. A bare origin with no path (or a path of just /) is rejected.

string format: uri
<= 1000 characters
source
required
string
Allowed values: keycloak platform
event_types
required
Array<string>
>= 1 items
signing_secret
required
string format: password
>= 32 characters <= 512 characters
enabled
boolean
default: true
cluster_id
string format: uuid
realm_id

Keycloak realm ID. This is a UUID generated by Keycloak.

string format: uuid

Example

123e4567-e89b-12d3-a456-426614174000
authorization_header
string format: password
<= 2048 characters

The request has succeeded and a new resource has been created as a result.

Media typeapplication/json

Saved webhook subscription for the authenticated workspace.

object
id
required
string format: uuid
name
required
string
>= 1 characters <= 255 characters
url
required
string
enabled
required
boolean
source
required
string
Allowed values: keycloak platform
event_types
required
Array<string>
cluster_id
string format: uuid
realm_id
string
has_authorization_header
required
boolean
has_signing_secret
required
boolean
created_at
required
string format: date-time
updated_at
required
string format: date-time

Example

{
  "source": "keycloak"
}

The server could not understand the request due to invalid syntax.

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}

Access is unauthorized.

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}

Client error

Media typeapplication/problem+json

Returned when a workspace plan quota would be exceeded. required_plan indicates the minimum plan needed to complete the request.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri
current_plan
required
string
required_plan
required
string
code

Machine-readable identifier of the quota that was hit, so a client can tell quotas apart without parsing detail. Known values include cluster_limit (the workspace’s total cluster allowance), cluster_size_quota (the allowance for the requested cluster size) and cluster_size (the requested size is not offered on the plan at all). New values may be added.

string
current_usage

How many of the resource the workspace currently has.

integer
current_limit

Maximum allowed by the current plan. 0 means the plan does not include the resource at all.

integer

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com",
  "current_plan": "example",
  "required_plan": "example",
  "code": "example",
  "current_usage": 1,
  "current_limit": 1
}

Access is forbidden.

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}

The server cannot find the requested resource.

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}

Client error

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri
errors
required
Array<object>
>= 1 items
object
field
required
string
detail
required
string
code
string
value

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com",
  "errors": [
    {
      "field": "example",
      "detail": "example",
      "code": "example",
      "value": "example"
    }
  ]
}

Client error

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}
Retry-After
integer
RateLimit-Limit
integer
RateLimit-Remaining
integer
RateLimit-Reset
integer
X-RateLimit-Limit-Second
integer
X-RateLimit-Remaining-Second
integer
X-RateLimit-Limit-Minute
integer
X-RateLimit-Remaining-Minute
integer
X-RateLimit-Limit-Hour
integer
X-RateLimit-Remaining-Hour
integer
X-RateLimit-Limit-Day
integer
X-RateLimit-Remaining-Day
integer

Server error

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}

Server error

Media typeapplication/problem+json

RFC 9457 Problem Details object.

object
type
required
string format: uri
title
required
string
status
required
integer
detail
required
string
instance
string format: uri

Example generated

{
  "type": "https://example.com",
  "title": "example",
  "status": 1,
  "detail": "example",
  "instance": "https://example.com"
}