Skip to content

Uninstall an extension from a cluster

DELETE
/clusters/{cluster_id}/extensions/{extension_id}
curl --request DELETE \
  --url http://localhost:8000/clusters/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/extensions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
  --header 'API-Key: <API-Key>' \
  --header 'API-Version: 2026-06-01.beta'

Uninstalls the extension from the cluster. The uninstall is processed asynchronously; poll GET /clusters/{cluster_id}/extensions/{extension_id} until status is removing, then until the endpoint returns 404.

Required scope: clusters:extensions:write

cluster_id
required
string format: uuid
extension_id
required
string format: uuid
API-Version
required
string
Allowed values: 2026-06-01.beta

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

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

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

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