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
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
| Param | Notes |
|---|---|
ledger | Subledger name (e.g. expenses). |
rowId | Subledger row UUID. |
RejectResult:
Errors
| Status | When |
|---|---|
400 Bad Request | rowId not a UUID, or row’s current status doesn’t allow reject (response carries currentStatus). |
404 Not Found | Row not found in :ledger. |
Update one cell
expenses, see EditableExpenseField. Non-editable fields return 400 INVALID_FIELD.
Body — UpdateSubledgerCellDto:
| Field | Type | Required | Notes |
|---|---|---|---|
field | string | Yes | Column key. Per-ledger allow-list; coercion happens in the per-ledger adapter. |
value | unknown | Yes | New scalar / null. Intentionally permissive — per-ledger adapters validate / coerce. |
UpdateResult:
Errors
| Status | When |
|---|---|
400 Bad Request | rowId not a UUID; field not editable on this ledger; value coercion failed; row’s current status doesn’t allow edits (response carries currentStatus). |
404 Not Found | Row not found. |
When to use these vs /tasks/:id/row-action
| Use this endpoint | Use POST /tasks/:taskId/row-action |
|---|---|
| Ops tooling fixing a stuck row outside a workflow run | Tenant UI inline edit / reject during a HITL review step |
| Migration / backfill scripts | Anything that needs Temporal to be the system of record |
| One-off forensic correction | All standard runbook flows |
Cross-links
SDK Subledgers
Row base, SubledgerStatus lifecycle, mutation helpers.Tasks — row-action
The signal-based path used by the Tenant UI.