Skip to content

Install an extension on a cluster

POST
/clusters/{cluster_id}/extensions
curl --request POST \
  --url http://localhost:8000/clusters/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/extensions \
  --header 'API-Key: <API-Key>' \
  --header 'API-Version: 2026-06-01.beta' \
  --header 'Content-Type: application/json' \
  --data '{ "extension_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "parameters": { "THEME_COLOR": "#3b82f6" } }'

Installs an extension on the cluster. The installation is processed asynchronously; poll GET /clusters/{cluster_id}/extensions/{extension_id} until status reaches active or failed.

The extension’s scan_status must be ready before installation.

Required scope: clusters:extensions:write

cluster_id
required
string format: uuid
API-Version
required
string
Allowed values: 2026-06-01.beta
Media typeapplication/json
object
extension_id
required
string format: uuid
parameters

Parameter values keyed by the parameter key. Required parameters must be provided.

object
key
additional properties
string

Example

{
  "extension_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "parameters": {
    "THEME_COLOR": "#3b82f6"
  }
}

Returned for async operations. Poll the Location URL to track completion.

Media typeapplication/json
object
extension_id
required
string format: uuid
extension_name
required
string
extension_source
required
string
Allowed values: platform custom
status
required
string
Allowed values: installing active failed removing
installed_version
required

Version currently running on the cluster. For platform extensions this is the upstream release string of the installed build (not necessarily semver, for example 1.4.1-SNAPSHOT), or unknown when it cannot be determined. For custom extensions it is the uploader-supplied version.

string
available_version
required

Version the cluster would get by upgrading now. For platform extensions it is the build published for the cluster’s Keycloak version (unknown when that build states no version), and null when no build supports the cluster’s Keycloak version. For custom extensions it is the latest uploaded version.

string
nullable
upgrade_available
required

Whether upgrading would install a different build. For platform extensions it compares the installed build with the one published for the cluster’s Keycloak version, so republishing an unchanged catalog never sets it. For custom extensions it is set when a version was published after the install. Always false when the install is not active or is pinned by Skycloak support.

boolean
parameters
required

Current parameter values. Values for sensitive parameters are omitted (null).

object
key
additional properties
string
nullable
installed_at
required
string format: date-time
last_status_change_at
required

When the installation status last changed.

string format: date-time
nullable

Example

{
  "extension_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "extension_name": "Social Login Bundle",
  "extension_source": "platform",
  "status": "active",
  "installed_version": "3.0.0",
  "available_version": "3.1.0",
  "upgrade_available": true,
  "parameters": {},
  "installed_at": "2025-02-01T09:00:00Z",
  "last_status_change_at": "2025-02-01T09:05:00Z"
}
Location
required
string format: uri

URL of the resource being created or modified. Poll this endpoint to track completion.

Retry-After
integer

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"
}

The request conflicts with the current state of the server.

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"
}