Skip to content

Create registry API Reference

POST
/tenants/{tenant}/registries
curl --request POST \
--url https://api.kupe.cloud/api/v1/tenants/acme/registries \
--header 'Authorization: <Authorization>' \
--header 'Content-Type: application/json' \
--data '{ "deletionProtection": true, "name": "registry", "storageLimit": "10Gi" }'

Create the tenant’s container registry. A tenant has one, named registry: images live at registry.kupe.cloud/<tenant>/<repository>:<tag>. It is provisioned asynchronously; poll the GET endpoint until status.phase is “Running”. storageLimit caps what it stores below the plan’s cap (omit it to take the plan’s cap); deletionProtection defaults to true.

tenant
required
string

Tenant name

Registry configuration (every field optional)

Media type application/json
object
deletionProtection

Must be false before the registry can be deleted. Default true.

boolean
Example
true
name

Must be “registry” when set; it is also the default.

string
Example
registry
storageLimit

Storage cap below the plan’s, with a binary unit: Mi, Gi or Ti (“10Gi”). More than zero, at most 20 characters. Omit to take the plan’s cap.

string
Example
10Gi

Registry created

Media type application/json
object
createdAt
string
deletionProtection

DeletionProtection must be false before the registry can be deleted.

boolean
generation

Generation increments on every spec change; compare with status.observedGeneration.

integer
name
string
resourceVersion
string
status
object
artifactCount

ArtifactCount counts every stored item: each image, each platform image of a multi-platform image, and signatures.

integer
conditions

Conditions include Ready, Provisioned and StorageFull.

Array<object>
object
key
additional properties
endpoint

Endpoint is the image path prefix to push to and pull from.

string
phase
string
Allowed values: Pending Provisioning Running Degraded Terminating
repositoryCount

RepositoryCount is the number of repositories.

integer
storageLimitBytes

StorageLimitBytes is the storage cap in force, in bytes; -1 means unlimited. Absent until a cap has been applied.

integer
storageUsedBytes

StorageUsedBytes is what the registry stores, in bytes.

integer
usageObservedAt

UsageObservedAt is when the usage figures were last read.

string
storageLimit

StorageLimit is the tenant’s own cap below the plan’s; empty means the plan’s cap.

string
Example
{
"createdAt": "2026-10-21T10:00:00Z",
"deletionProtection": true,
"generation": 2,
"name": "registry",
"resourceVersion": "582019",
"status": {
"artifactCount": 12,
"endpoint": "registry.kupe.cloud/acme",
"phase": "Pending",
"repositoryCount": 3,
"storageLimitBytes": 10737418240,
"storageUsedBytes": 1073741824,
"usageObservedAt": "2026-10-21T10:05:00Z"
},
"storageLimit": "10Gi"
}
ETag
string

Resource version

Validation error, a storage limit above the plan’s (code REGISTRY_STORAGE_LIMIT_ABOVE_PLAN, field spec.storageLimit), registry creation is paused (code creation_paused), or the plan includes no registry (code plan_limit_reached)

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Missing or invalid authentication

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Admin access required

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

The registry is not enabled (code registries_unavailable)

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

The tenant already has a registry (code REGISTRY_ALREADY_EXISTS), or the tenant is being deleted (code tenant_terminating), suspended (code tenant_suspended) or awaiting a payment method (code payment_setup_required)

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Rate limit exceeded

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

The tenant’s limit is still being set up (a new tenant’s first seconds); retry in a few seconds

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}