Skip to main content
Approvals are governance records that capture the decision chain required before a cap table action is finalized. Every approval moves through a defined lifecycle: it starts as a Draft, is submitted for review (Submitted), advances as each step is decided (Approved once all steps pass), and is finally locked (Locked) to make it immutable. An approval must be in the Locked state before it can gate token minting through the Securities table. You can attach multiple sequential steps to an approval — for example, a legal review step followed by a board vote step. Each step carries its own PENDINGAPPROVED / REJECTED status. The parent approval transitions to Approved only when every step resolves to APPROVED.

List approvals

Returns a cursor-paginated list of approval requests for your organization. Filter by status or entityType to narrow results. GET /api/v1/approvals
Response

Create an approval

Creates a new approval request in Draft state. You can optionally provide initial steps in the same request. POST /api/v1/approvals Requires role: EDITOR. Idempotent with an Idempotency-Key header.
string
required
Human-readable title for the approval (e.g. "Q1 option grants — engineering cohort"). Maximum 200 characters.
string
required
The type of equity event this approval covers. One of: Stock Issuance, Option Grant, RSU Grant, Warrant Issuance, Convertible Issuance, Stock Transfer, Exercise, Conversion, Cancellation, Repurchase, Valuation, Equity Plan, Stock Split, Other.
string
Deadline for completing this approval (YYYY-MM-DD).
string
Free-text context or instructions. Maximum 2000 characters.
array
Initial steps to create alongside the approval. Each element requires a name (string, max 100 chars). Steps can also be added later via POST /approvals/{id}/steps.
Response — 201 Created

Get an approval

Retrieves a single approval by ID. GET /api/v1/approvals/{id} Requires role: VIEWER.

Update an approval

Updates a Draft approval’s metadata. You cannot update an approval that has been submitted or locked. PATCH /api/v1/approvals/{id} Requires role: EDITOR. Returns 409 Conflict if the approval is not in Draft state.
string
Updated title. Maximum 200 characters.
string
Updated entity type.
string
Updated deadline (YYYY-MM-DD).
string
Updated notes. Maximum 2000 characters.

Delete an approval

Permanently deletes a Draft approval and all its steps. Returns 409 Conflict if the approval has been submitted. DELETE /api/v1/approvals/{id} Requires role: EDITOR.
Response — 204 No Content

Submit for review

Moves a Draft approval to Submitted, signalling that it is ready for step decisions. Returns 409 Conflict if the approval is already past Draft state. POST /api/v1/approvals/{id}/submit Requires role: EDITOR. No request body.
Response — 200 OK Returns the updated approval object with state: "Submitted".

Add a step

Appends a new approval step to an existing approval. Steps can only be added while the approval is in Draft or Submitted state. POST /api/v1/approvals/{id}/steps Requires role: EDITOR. Returns 409 Conflict if the approval is locked.
string
required
Display name for the step (e.g. "CFO sign-off"). Maximum 100 characters.
Response — 201 Created
string (uuid)
Unique step ID. Reference this as {stepId} when updating or deleting the step.
string
PENDING, APPROVED, or REJECTED.
integer
1-based position of this step in the approval sequence.

Lock an approval

Locks an Approved approval, making it immutable and eligible to gate token minting. Returns 409 Conflict if the approval is not in Approved state (i.e. all steps must be approved first). POST /api/v1/approvals/{id}/lock Requires role: EDITOR. No request body.
Response — 200 OK Returns the updated approval object with state: "Locked" and lockedAt set to the current timestamp.
Locking is irreversible. Once an approval is Locked, its state and steps cannot be modified. Create a new approval if you need to re-authorize the same action.

Approval lifecycle

The diagram below shows the valid state transitions:
An approval must reach Locked status before it can authorize token minting in the Securities table. Approvals in Draft, Submitted, or Approved state are not yet eligible.

Error codes