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
Response — service-level
RejectResult:
Errors
Update one cell
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.
Cross-links
SDK Subledgers
Row base, SubledgerStatus lifecycle, mutation helpers.Tasks — row-action
The signal-based path used by the Tenant UI.