Skip to main content

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.
The response carries the full storage linkage and a server-minted upload authority so a Clerk attachment can adopt this Files row instead of creating a second one for the same bytes. At the current web and backend source revisions, the web composer preserves the row id, bucket and object path but drops that authority before it builds the attachment metadata. Because the Clerk requires the authority to adopt the persisted row, the browser handoff is not end-to-end traceable at this boundary. See Upload to posted journal entry for the exact artifact chain and the direct-attachment fallback.

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.
This lane is a payment approval, not a payment. Approving here authorises the write-back; it does not move money on a rail, and it is not what posts the settlement entry. The entry a payment produces is on Payments, rails and treasury.
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.