Files, actions and payments
Three small lanes that sit either side of the money path: getting a file into the system, seeing what needs doing, and approving a payment.Uploads - /uploads
POST /uploads
multipart/form-data.
The bytes go to the private storage bucket under
raw-intake/sha256/<prefix>/<digest>, with the service-role key kept server-side, and a row is recorded so the file appears on the Files screen and is available to the classify flow.
GET /uploads/list, GET /uploads/timeline
Every recorded upload, newest first.
GET /uploads/folders
Returns child folders, the placements beneath the selected parent, pagination for each collection, and a separate read-only Drive reconciliation summary.
At the root, truly unfiled uploads remain in placements; a missing mirror reports not_scanned and never enables browser writes.
The status and classification columns on an upload are owned by the Actions flow, not by this route.
An upload is a file that exists; what was decided about it is a separate fact with a separate writer.
Human-action worklist - /actions
Two sources, deliberately kept apart, because they answer different questions.
GET /actions/tasks
Newest first, org-scoped.
This is the API behind Audit → Actions, not the top-level Actions run inbox.
Agent-run inbox - /agent-runs
GET /agent-runs and GET /agent-runs/{run_ref} retain every user/session-scoped agent run, including a failure created before any workspace exists.
The workspace subroutes expose the linked review state, selection, validation, confirmation, commit and receipts only when the run, workspace, organization, user and server-bound session agree.
A terminal error remains an error; only a legitimate completed run with no proposed change is a no-change outcome.
See Actions agent-run inbox for the presentation contract.
GET /actions/types, GET /actions/pipeline, POST /actions/run
The per-file pipeline over uploads and their recorded actions.
It stays a secondary view rather than the tab’s spine, because it describes files rather than work.
Payments - /payments
The human-in-the-loop gate on bills that have come due.
Both decisions take the derived actor, and every change is recorded in the task event trail.
task_id is an integer here, not a uuid.
The Payments screen does not print a figure today: its payload genuinely carries both a converted and a native amount, and choosing which to show - and in which currency - is a data decision rather than a formatting one.
It is left blank rather than labelled wrongly.
That is the same rule as the
base_currency requirement on the ledger routes: money is labelled with the currency it is actually in, or not printed.Connectors and service routes
These routes describe code boundaries only. Connector credentials and trust are not activated, no working external connector is claimed, and the QuickBooks redirect pair cannot create a connection in the current migration.
No secrets are stored by this service.
Credentials are read from the environment; an unconfigured connector reports
not_configured and appears on the ask-list with the exact variable names it is missing, per field.
Where it is enforced
The test that would fail if it broke
langgraph_chat/devcenter/tests/test_actions_tasks_api.py for the task list’s status filtering, and test_chat_upload_to_files_tab.py for the one-upload-one-row linkage.
Related
- Upload a document - the same flow in the UI
- Upload to posted journal entry - storage, extraction, mapping, both human gates and the ledger write
- The review inbox - where an uploaded document goes next
- Intake and the posting gate - the gates that follow
- Settlement, rails and the AP/AR spine - what a payment actually records