Licensing & Contracts

Contracts bind an organization (or user) to products, clusters, and usage quotas; licenses are issued per contract-cluster. This group covers three related concerns:

  • License registration — the always-available endpoints that member clusters (via license-proxyserver) use to validate a license and obtain a fresh one.
  • Contracts (admin) — the AppsCode-hosted, site-admin console for managing every contract across accounts.
  • Contracts (user) — the AppsCode-hosted, token-scoped API an organization uses to manage its own contracts, bind clusters, and issue offline licenses.

All routes are served under the /api/v1 prefix.

Deployment note. The /contracts/* and /user/contracts/* families — plus POST /user/license-proxy — are AppsCode-hosted-only. On a self-hosted platform these routes are not registered and return 404 Not Found. They are documented here for completeness; the verification notes below record the observed behavior on the self-hosted test platform.

Contracts bind an organization to products, clusters, and quotas; licenses are issued per contract-cluster. The license flow is what member clusters (via license-proxyserver) use.

License registration (always available)

MethodPathAuthDescription
POST/api/v1/registerLicense validationRegister / validate a licensed cluster
POST/api/v1/license/issueToken + license issuance checksIssue a license

Contracts — admin (/api/v1/contracts, AppsCode-hosted, site-admin authz)

MethodPathDescription
GET/POST/List / create contracts
GET/PUT/DELETE/:id/Get / update / delete a contract
POST/:id/extend, /:id/revokeExtend / revoke a contract
GET/:id/documentDownload the contract document
GET/:id/auditContract audit history
GET/:id/clusters/imported/non-associatedImportable clusters not yet bound
GET/POST/:id/clusters/List / bind clusters to the contract
DELETE/:id/clusters/:ccID/Remove a cluster from the contract
POST/:id/clusters/:ccID/issue-licenseIssue a full license for a contract cluster
PATCH/:id/clusters/:ccID/{name,tags}Rename / retag a contract cluster
GET/active/associated-clusters/:clusterID/status, POST /active/associated-clusters/batch-statusContract status per cluster (single / batch)
GET/available_productsProducts available for new contracts

Contracts — user (/api/v1/user/contracts, AppsCode-hosted, Token)

MethodPathDescription
GET/List my contracts
GET/active-offline-contractsList active offline contracts
POST/assign-clusterAssign a cluster to multiple contracts
GET/active/associated-with/clusters/:clusterID, /active/not-associated-with/clusters/:clusterIDContracts (not) associated with a cluster
GET/active/associated-clusters/ (+/:clusterID/status, POST /batch-status)Cluster association status
GET/:id/ (+/document, /audit)Contract details, document, audit
PUT/:id/preferencesUpdate contract preferences
GET/POST/:id/clusters/ (+imported/non-associated)List / bind clusters
DELETE/:id/clusters/:ccID/, PATCH /:ccID/{name,tags}Manage contract clusters
POST/:id/clusters/:ccID/issue-licenseIssue a license for my contract cluster

Related: POST /api/v1/user/license-proxy — generate the license-proxyserver installer for a cluster.

Pages

Common concepts

  • Owner scope. Contract endpoints accept an owner (organization) context via the optional ?org=<slug> query parameter. When omitted, the caller’s own account is used.
  • Contract IDs (id) are numeric (int64). A contract-cluster ID (ccID) is the numeric ID of a cluster’s binding within a specific contract — distinct from the cluster UUID.
  • Cluster UUID (clusterID / cluster) is the cluster’s UUID string.
  • Timestamps on the Contract object (start, end) are Unix seconds.