Skip to content

Decide approval workflow instances

POST /api/v1/workflows/instances/{instanceId}/blocks/{blockId}/decide: request fields and declared response contract.

POST/api/v1/workflows/instances/{instanceId}/blocks/{blockId}/decide

Authorization
Permissionworkflow.approve
Workspace scoperequired
Scope targetworkspace

Parameters

Path parameters
FieldTypeRequiredNullableDefault
instanceIdstringrequirednon-null—
blockIdstringrequirednon-null—

Query parameters: none.

Request body

Request body fields
FieldTypeRequiredNullableDefault
reviewRevisionstringoptionalnon-null—
decisionunknownrequirednon-null—
approvedOutputsobjectoptionalnon-null—
duplicateRecipientAction"exclude" | "proceed"optionalnon-null—
excludeMemberIdsarrayoptionalnon-null—
doubleContactAction"exclude" | "proceed"optionalnon-null—
excludeAccountIdsarrayoptionalnon-null—

Response

200

Response fields
FieldTypeRequiredNullableDefault
dataobjectrequirednon-null—
data.status"pending" | "dispatched" | "review_phase" | "waiting_approval" | "waiting_delay" | "waiting_effect" | "completed" | "failed" | "skipped" | "cancelled"requirednon-null—
data.attemptIdstringoptionalnon-null—
data.leaseOwnerstringoptionalnon-null—
data.leaseExpiresAtstringoptionalnon-null—
data.heartbeatAtstringoptionalnon-null—
data.cancelRequestedAtstringoptionalnon-null—
data.cancelReasonstringoptionalnon-null—
data.outputsobjectoptionalnon-null—
data.partialOutputsobjectoptionalnon-null—
data.outputsS3Keystringoptionalnon-null—
data.errorobjectoptionalnon-null—
data.error.messagestringrequirednon-null—
data.error.codestringrequirednon-null—
data.error.retryCountintegerrequirednon-null—
data.retryCountintegeroptionalnon-null—
data.iterationCountintegeroptionalnon-null—
data.lastIterationAtstringoptionalnon-null—
data.configOverrideobjectoptionalnon-null—
data.skipReasonstringoptionalnon-null—
data.approvalCommentstringoptionalnon-null—
data.approvalCompletedbooleanoptionalnon-null—
data.approvalDeadlinestringoptionalnon-null—
data.timeoutActionstringoptionalnon-null—
data.takenBranchstringoptionalnon-null—
data.reviewStateobjectoptionalnon-null—
data.reviewState.totalDraftsintegerrequirednon-null—
data.reviewState.flaggedCountintegerrequirednon-null—
data.reviewState.autoApprovedCountintegerrequirednon-null—
data.reviewState.reviewedCountintegerrequirednon-null—
data.reviewState.approvedCountintegerrequirednon-null—
data.reviewState.editedCountintegerrequirednon-null—
data.reviewState.skippedCountintegerrequirednon-null—
data.reviewState.batchApprovedbooleanoptionalnon-null—
data.reviewState.batchIdstringrequirednon-null—
data.reviewState.reviewStartedAtstringoptionalnon-null—
data.assigneeUserIdstringoptionalnon-null—
data.assigneeNamestringoptionalnon-null—
data.reviewerSnapshotobjectoptionalnon-null—
data.reviewerSnapshot.assigneeUserIdstringoptionalnon-null—
data.reviewerSnapshot.assigneeGroupIdstringoptionalnon-null—
data.reviewerSnapshot.assignmentSourcestringrequirednon-null—
data.reviewerSnapshot.unassignedbooleanoptionalnon-null—
data.reviewerSnapshot.evidenceobjectoptionalnon-null—
data.reviewerSnapshot.evidence.candidateCountintegeroptionalnon-null—
data.reviewerSnapshot.evidence.strategystringoptionalnon-null—
data.reviewerSnapshot.decisionModestringoptionalnon-null—
data.reviewerSnapshot.reviewRevisionstringrequirednon-null—
data.reviewerSnapshot.projectionNeededbooleanrequirednon-null—
data.reviewRequestobjectoptionalnon-null—
data.reviewRequest.approvalPromptstringoptionalnon-null—
data.reviewRequest.notifybooleanrequirednon-null—
data.reviewRequest.projectionNeededbooleanrequirednon-null—
data.partitionsobjectoptionalnon-null—
data.effectLinkobjectoptionalnon-null—
data.effectLink.companyIdstringrequirednon-null—
data.effectLink.workspaceIdstringrequirednon-null—
data.effectLink.capabilityIdstringrequirednon-null—
data.effectLink.operationIdstringrequirednon-null—
data.effectLink.attemptIdstringoptionalnon-null—
data.effectLink.blockAttemptIdstringrequirednon-null—
data.effectLink.appliedRevisionintegerrequirednon-null—
data.effectLink.operatorEvidenceRequiredbooleanoptionalnon-null—
data.suspendedUntilstringoptionalnon-null—
data.continuationTokenstringoptionalnon-null—
data.startedAtstringoptionalnon-null—
data.completedAtstringoptionalnon-null—

Declared failures

Declared failures
ACCESS_DENIED403 — not retryable
CORE_ERROR500 — not retryable
GOVERNANCE_DENIED403 — not retryable
VALIDATION_ERROR400 — not retryable

Readback

Read the result back with:

  • workflows.getBlockState

Request example

Schematic only. Replace placeholders with real values and include all required nested fields.

POST /api/v1/workflows/instances/{instanceId}/blocks/{blockId}/decide HTTP/1.1
Authorization: Bearer <token>
x-merulan-workspace-id: <workspace-id>
Content-Type: application/json

{
  "decision": "<decision>"
}