Retire products
POST /api/v1/products/retire: request fields and declared response contract.
POST/api/v1/products/retire
| Permission | products.install |
|---|---|
| Workspace scope | required |
| Scope target | workspace |
Request body
| Field | Type | Required | Nullable | Default |
|---|---|---|---|---|
| installationId | string | required | non-null | — |
| expectedInstallUpdatedAt | string | required | non-null | — |
Response
201
| Field | Type | Required | Nullable | Default |
|---|---|---|---|---|
| data | object | required | non-null | — |
| data.outcome | "retired" | "requires_resolution" | required | non-null | — |
| data.installation | object | required | non-null | — |
| data.installation.id | string | required | non-null | — |
| data.installation.companyId | string | required | non-null | — |
| data.installation.workspaceId | string | required | non-null | — |
| data.installation.productKey | string | required | non-null | — |
| data.installation.productVersion | string | required | non-null | — |
| data.installation.namespace | string | required | non-null | — |
| data.installation.manifestDigest | string | required | non-null | — |
| data.installation.normalizedInputs | object | required | non-null | — |
| data.installation.normalizedInputs.bindings | object | required | non-null | — |
| data.installation.normalizedInputs.roleSatisfactions | object | optional | non-null | — |
| data.installation.normalizedInputs.productConfig | object | optional | non-null | — |
| data.installation.normalizedInputs.configurationProjectionDigest | string | optional | non-null | — |
| data.installation.normalizedInputs.profile | object | optional | non-null | — |
| data.installation.normalizedInputs.configurationResolution | object | optional | non-null | — |
| data.installation.normalizedInputs.referenceInputs | object | optional | non-null | — |
| data.installation.lifecycleState | "installing" | "partial" | "installed" | "requires_resolution" | "failed" | "retired" | required | non-null | — |
| data.installation.installedByPrincipalId | unknown | required | non-null | — |
| data.installation.ownedPackageInstallationId | unknown | required | non-null | — |
| data.installation.installedAt | unknown | required | non-null | — |
| data.installation.updatedAt | unknown | required | non-null | — |
| data.references | array | required | non-null | — |
| data.ownedContentReceipt | object | optional | non-null | — |
| data.ownedContentReceipt.installationId | string | required | non-null | — |
| data.ownedContentReceipt.namespace | string | required | non-null | — |
| data.ownedContentReceipt.status | string | required | non-null | — |
| data.ownedContentReceipt.retiredResourceCount | integer | required | non-null | — |
| data.auditBindingRevocation | object | optional | non-null | — |
| data.auditBindingRevocation.revoked | boolean | required | non-null | — |
| data.auditBindingRevocation.bindingVersion | integer | optional | non-null | — |
| data.auditBindingRevocation.profileId | string | optional | non-null | — |
| data.auditBindingRevocation.profileVersion | string | optional | non-null | — |
| data.terminalReceipt | object | optional | non-null | — |
Declared failures
| PRODUCT_OPERATION_FAILED | 500 — not retryable |
|---|---|
| PRODUCT_REQUIRES_RESOLUTION | 409 — not retryable |
| PRODUCT_STALE | 409 — not retryable |
Readback
Read the result back with:
- products.inspectInstalled
Request example
Schematic only. Replace placeholders with real values and include all required nested fields.
POST /api/v1/products/retire HTTP/1.1
Authorization: Bearer <token>
x-merulan-workspace-id: <workspace-id>
Content-Type: application/json
{
"installationId": "<installationId>",
"expectedInstallUpdatedAt": "<expectedInstallUpdatedAt>"
}