Update cluster connection API Reference
const url = 'https://api.kupe.cloud/api/v1/tenants/acme/registries/registry/bindings/prod';const options = { method: 'PATCH', headers: { 'If-Match': '582020', Authorization: '<Authorization>', 'Content-Type': 'application/json' }, body: '{"pushNamespaces":["ci","release"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://api.kupe.cloud/api/v1/tenants/acme/registries/registry/bindings/prod \ --header 'Authorization: <Authorization>' \ --header 'Content-Type: application/json' \ --header 'If-Match: 582020' \ --data '{ "pushNamespaces": [ "ci", "release" ] }'Replace a cluster connection’s push namespaces (JSON merge-patch semantics: the list sent is the new
list; [] removes every push credential). A namespace added gets the push Secret; a namespace left
out loses its Secret, and the push credential is replaced, so build jobs in the push namespaces that
remain must restart to read the new Secret (while the platform has the registry switched off or the
tenant is suspended, the replacement waits until the registry is on and the tenant active again).
pushNamespaces is the only field that can change: sending secretName or any other field is a 400.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Tenant name
Registry name: always registry
Cluster connection name: the cluster’s name
Header Parameters
Section titled “ Header Parameters ”ETag for optimistic locking
Request Body
Section titled “ Request Body ”The new push namespace list
object
The new list of push namespaces (replaces the old one; [] removes every push credential). Same rules as on create. A namespace added gets the push Secret; one left out loses it.
Example
[ "ci", "release"]Responses
Section titled “ Responses ”Updated cluster connection
object
Name is the cluster’s name.
PushNamespaces are the namespaces that hold a push credential (empty: pull only).
SecretName is the push credential Secret’s name in each push namespace.
object
object
Message gives detail; once Ready it says that pods running before the connection need a restart to pull.
Namespaces reports what was delivered into each push namespace. A namespace removed from pushNamespaces stays here until its Secret is withdrawn and the push credential is replaced; while the platform has the registry switched off or the tenant is suspended, the replacement, and with it the entry’s removal, waits until the registry is on and the tenant active again.
object
Message gives detail while the namespace is not Ready.
Phase is Ready only when pull works and every push namespace is Ready.
PullUsername is the registry username of the cluster’s pull credential.
PushUsername is the registry username of the push credential; empty without push namespaces.
object
Pending is true while RequestedAt differs from AppliedAt.
RequestedAt is the token of the last rotation requested; empty if none ever was.
Example
{ "cluster": "prod", "createdAt": "2026-10-21T10:05:00Z", "name": "prod", "pushNamespaces": [ "ci" ], "registry": "registry", "resourceVersion": "582020", "secretName": "kupe-registry-push", "status": { "message": "", "namespaces": [ { "message": "", "name": "ci", "phase": "Pending" } ], "phase": "Pending", "pullUsername": "kupe+acme+pull-prod", "pushUsername": "kupe+acme+push-prod", "rotation": { "appliedAt": "2026-10-21T12:00:00.123456789Z", "pending": false, "requestedAt": "2026-10-21T12:00:00.123456789Z" } }}Headers
Section titled “ Headers ”New resource version
Validation error, or too many push namespaces (codes REGISTRY_PUSH_NAMESPACES_LIMIT, REGISTRY_PUSH_NAMESPACES_SERVICE_LIMIT, field spec.pushNamespaces)
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}Missing or invalid authentication
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}Admin access required
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}Cluster connection not found for this registry, or the registry is switched off and the change adds a namespace (code registries_unavailable)
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}The connection or the registry is being deleted (code terminating), or the connection kept changing while it was being updated
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}ETag mismatch
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}Rate limit exceeded
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}