Create cluster connection API Reference
const url = 'https://api.kupe.cloud/api/v1/tenants/acme/registries/registry/bindings';const options = { method: 'POST', headers: {Authorization: '<Authorization>', 'Content-Type': 'application/json'}, body: '{"cluster":"prod","name":"prod","pushNamespaces":["ci"],"secretName":"kupe-registry-push"}'};
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://api.kupe.cloud/api/v1/tenants/acme/registries/registry/bindings \ --header 'Authorization: <Authorization>' \ --header 'Content-Type: application/json' \ --data '{ "cluster": "prod", "name": "prod", "pushNamespaces": [ "ci" ], "secretName": "kupe-registry-push" }'Connect a cluster to the registry. Every pod of the cluster can then pull its images: the pull
credential stays on the platform and never enters the cluster. Pods that were running before the
connection get it when they restart. Each namespace in pushNamespaces (up to 10, none kube-* or
argocd) also gets a push credential Secret named secretName (default kupe-registry-push). A push
credential can pull from and push to every repository in your registry, including replacing
existing tags.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Tenant name
Registry name: always registry
Request Body
Section titled “ Request Body ”Cluster connection
object
Cluster to connect. A connection is named after its cluster.
Example
prodMust equal cluster when set; it is also the default.
Example
prodNamespaces inside the cluster that receive a push credential Secret: up to 10, each listed once, none kube-* or argocd. A push credential can pull from and push to every repository in your registry, including replacing existing tags. Pull needs none: every pod of the cluster can pull.
Example
[ "ci"]Name of the push credential Secret in each push namespace. Default “kupe-registry-push”; it cannot be “kupe-registry-pull” and cannot change later.
Example
kupe-registry-pushResponses
Section titled “ Responses ”Cluster connection created
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 ”Resource version
Validation error, or too many push namespaces in this connection (code REGISTRY_PUSH_NAMESPACES_LIMIT) or in the registry (code REGISTRY_PUSH_NAMESPACES_SERVICE_LIMIT), both with 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"}Registry or cluster not found, or the registry is not enabled (code registries_unavailable)
object
Example generated
{ "code": "example", "error": "example", "field": "example", "message": "example", "severity": "example"}The cluster is already connected (code REGISTRY_BINDING_EXISTS), or the registry or cluster is being deleted (code terminating)
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"}