Skip to main content
Two direct HTTP endpoints for subledger row mutations. They exist for ops tooling and legacy callers; interactive Tenant UI edits for HITL tables should go through workflow signals (POST /tasks/:taskId/row-action) so Temporal stays the source of truth — see UI and Temporal signals. :ledger is the registered subledger name (expenses, journal_proposals, runbook-owned types). :rowId is a UUID — the controller validates this with a regex check before dispatching.

Reject a row

Apply the per-ledger reject rule. For expenses, only rows in NEEDS_ATTENTION are rejectable via this endpoint (see expenses_mutations.can_reject). Other types may carry their own reject rules. Path params Response — service-level RejectResult:

Errors

Update one cell

Update one editable cell on a row. The set of editable fields is per-ledger — for expenses, see EditableExpenseField. Non-editable fields return 400 INVALID_FIELD. Body — UpdateSubledgerCellDto:
Response — service-level UpdateResult:

Errors

When to use these vs /tasks/:id/row-action

Direct mutations bypass the workflow — replay / idempotency / step lifecycle don’t see them. Prefer the row-action signal whenever a workflow is alive for the row.

SDK Subledgers

Row base, SubledgerStatus lifecycle, mutation helpers.

Tasks — row-action

The signal-based path used by the Tenant UI.