Skip to content

Install products

POST /api/v1/products/install: request fields and declared response contract.

POST/api/v1/products/install

Authorization
Permissionproducts.install
Workspace scoperequired
Scope targetworkspace

Request body

Request body fields
FieldTypeRequiredNullableDefault
productKeystringrequirednon-null—
productVersionstringrequirednon-null—
namespacestringoptionalnon-null—
idempotencyKeystringrequirednon-null—
expectedPlanobjectrequirednon-null—
expectedPlan.planSchemaVersionnumberrequirednon-null—
expectedPlan.planHashstringrequirednon-null—
bindingsobjectoptionalnon-null—
productConfigobjectoptionalnon-null—
referenceInputsobjectoptionalnon-null—
profileobjectoptionalnon-null—
profile.profileKeystringrequirednon-null—
profile.profileVersionstringrequirednon-null—
bindingAnswersobjectoptionalnon-null—
roleSatisfactionsobjectoptionalnon-null—
acceptedRecommendationsobjectoptionalnon-null—

Response

201

Response fields
FieldTypeRequiredNullableDefault
dataobjectrequirednon-null—
data.attemptobjectrequirednon-null—
data.attempt.idstringrequirednon-null—
data.attempt.companyIdstringrequirednon-null—
data.attempt.workspaceIdstringrequirednon-null—
data.attempt.installationIdstringrequirednon-null—
data.attempt.planIdstringrequirednon-null—
data.attempt.attemptKeyintegerrequirednon-null—
data.attempt.invocationKeystringrequirednon-null—
data.attempt.operation"install" | "upgrade"requirednon-null"install"
data.attempt.state"running" | "succeeded" | "failed_retryable" | "failed_permanent" | "requires_resolution"requirednon-null—
data.attempt.executionFenceintegerrequirednon-null0
data.attempt.executionClaimIdunknownrequirednon-null—
data.attempt.executionClaimedAtunknownrequirednon-null—
data.attempt.executionClaimExpiresAtunknownrequirednon-null—
data.attempt.startedAtunknownrequirednon-null—
data.attempt.completedAtunknownrequirednon-null—
data.attemptState"running" | "succeeded" | "failed_retryable" | "failed_permanent" | "requires_resolution"requirednon-null—
data.installationState"installing" | "partial" | "installed" | "requires_resolution" | "failed" | "retired"requirednon-null—
data.completedUnitCountintegerrequirednon-null—
data.failedNodeKeystringoptionalnon-null—
data.failedUnitKind"identity" | "owned_content"optionalnon-null—
data.terminalReceiptobjectoptionalnon-null—

Declared failures

Declared failures
PRODUCT_OPERATION_FAILED500 — not retryable
PRODUCT_REQUIRES_RESOLUTION409 — not retryable
PRODUCT_STALE409 — 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/install HTTP/1.1
Authorization: Bearer <token>
x-merulan-workspace-id: <workspace-id>
Content-Type: application/json

{
  "productKey": "<productKey>",
  "productVersion": "<productVersion>",
  "idempotencyKey": "<idempotencyKey>",
  "expectedPlan": {}
}