Whatever the interface, there is an endpoint.
The dashboard is just one client. Queries, streaming results, transactions, connections, files, and jobs are all available over a documented REST API with API keys and consistent errors.
API surface
The problem
When a platform is UI-only, every integration becomes copy-paste, screenshots, and fragile workarounds.
The River approach
River is API-first: the same auth, permissions, and behaviour as the UI — plus an OpenAPI collection for code generation and agent workflows.
See it working
Inside HTTP API.
Endpoints
POST /v1/query
GET /v1/connections
POST /v1/query/stream
POST /v1/jobs/{id}/trigger
POST /v1/filestore/{bucket}/upload
…and every other capability in this workspace.
$ curl https://river.local/v1/query \
-H "Authorization: Bearer rqk_…" \
-d '{"sql": "SELECT count(*) FROM analytics_i8bq.appdb.users"}'{
"rows": [{ "count": 12840 }],
"strategy": "pushdown-single",
"elapsed_ms": 1.9
}What changes for your team
Less friction between the question and the answer.
Authenticate
Issue a revocable API key per service.
Call
Use the documented REST endpoints.
Stream
Consume large results as NDJSON, not timeouts.
Next capability