dbx/docs/content/docs/web-api.mdx

350 lines
8.6 KiB
Plaintext

---
title: Web API Reference
description: Internal HTTP APIs used by the DBX Web and Docker UI, including authentication, queries, background jobs, uploads, and downloads.
---
<Callout type="warn">This API powers the DBX Web UI and internal tooling such as the MCP Web backend. It is not a separate public integration contract. Endpoints and payloads may change between releases. For scripting and agent workflows, prefer [@dbx-app/cli](/en/docs/cli) or [@dbx-app/mcp-server](/en/docs/mcp) when possible.</Callout>
## Base URL
By default, DBX Web listens on port `4224`:
```text
http://localhost:4224
```
When deployed behind a reverse-proxy subpath, set `DBX_PUBLIC_BASE_PATH` and prefix every route. For example, with `/dbx`:
```text
https://example.com/dbx/api/auth/check
```
All API routes are under `/api`.
## Authentication
Protected routes require a session cookie named `dbx_session`.
### Check Auth State
```http
GET /api/auth/check
```
Example response:
```json
{
"authenticated": false,
"required": true,
"setup_required": false
}
```
| Field | Meaning |
| --- | --- |
| `required` | Password protection is enabled |
| `setup_required` | First-run password setup is still needed |
| `authenticated` | Current request already has a valid session |
### First-Run Setup
```http
POST /api/auth/setup
Content-Type: application/json
{
"password": "your-password"
}
```
### Login
```http
POST /api/auth/login
Content-Type: application/json
{
"password": "your-password"
}
```
On success, the response sets `Set-Cookie: dbx_session=...`. Reuse that cookie on later requests.
Five consecutive login failures trigger an approximately 60-second lockout. Sessions live in the current Web process and require login again after restart. The cookie is `HttpOnly`, uses `SameSite=Lax`, and follows `DBX_PUBLIC_BASE_PATH` for its path.
### Logout
```http
POST /api/auth/logout
Cookie: dbx_session=...
```
### Environment Variables
| Variable | Purpose |
| --- | --- |
| `DBX_PASSWORD` | Set an initial password at container startup |
| `DBX_DISABLE_PASSWORD=1` | Disable password protection entirely |
| `DBX_PORT` | Change the listen port (default `4224`) |
| `DBX_DATA_DIR` | Data directory containing `dbx.db` |
| `DBX_PUBLIC_BASE_PATH` | Serve DBX under a subpath such as `/dbx` |
| `DBX_MAX_UPLOAD_MB` | Override the general request/upload limit; default 1024 MB |
| `DBX_AGENT_DIR` | Override the Web Agent/driver directory; defaults to `agents` under the data directory |
| `DBX_STATIC_DIR` | Override the Web static asset directory |
## Request Format
- Field naming follows each Rust request type. Some bodies use `camelCase`, while connection configuration still contains `snake_case`; do not apply one naming convention to the whole API.
- `GET` query parameters commonly use `snake_case`, such as `connection_id`, but the current route implementation remains authoritative.
- Errors usually return JSON with an `error` field and an HTTP status code.
- Long-running export, import, transfer, SQL-file, and AI operations commonly use a start request plus SSE progress and cancel/download routes rather than one synchronous response.
Only the data-grid extractor currently exposes a tested, scoped OpenAPI document at `/api/query/data-grid-extractor-openapi.json`. It does not cover the complete DBX Web API or version the other routes.
## Connection APIs
### List Connections
```http
GET /api/connection/list
Cookie: dbx_session=...
```
Returns saved connection profiles. Secrets such as passwords are stored separately from the returned JSON.
### Save Connections
```http
POST /api/connection/save
Content-Type: application/json
Cookie: dbx_session=...
{
"configs": [
{
"name": "local-mysql",
"db_type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "root",
"database": "app"
}
]
}
```
### Test Connection
```http
POST /api/connection/test
Content-Type: application/json
{
"config": {
"name": "temp",
"db_type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "root",
"database": "app"
}
}
```
### Connect
Most data APIs expect the target connection to be active first.
```http
POST /api/connection/connect
Content-Type: application/json
{
"config": {
"id": "connection-id",
"name": "local-mysql",
"db_type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "root",
"database": "app"
}
}
```
### Check Health
```http
POST /api/connection/check-health
Content-Type: application/json
{
"connectionId": "connection-id"
}
```
## Schema APIs
### List Tables
```http
GET /api/schema/tables?connection_id=CONNECTION_ID&database=app&schema=
Cookie: dbx_session=...
```
### List Columns
```http
GET /api/schema/columns?connection_id=CONNECTION_ID&database=app&schema=&table=users
Cookie: dbx_session=...
```
Other schema routes include:
- `/api/schema/databases`
- `/api/schema/schemas`
- `/api/schema/indexes`
- `/api/schema/foreign-keys`
- `/api/schema/ddl`
## SQL Query APIs
### Execute One Statement
```http
POST /api/query/execute
Content-Type: application/json
{
"connectionId": "connection-id",
"database": "app",
"sql": "select id, name from users limit 10"
}
```
Example response shape:
```json
{
"columns": ["id", "name"],
"rows": [[1, "Ada"], [2, "Lin"]]
}
```
Related routes:
| Route | Purpose |
| --- | --- |
| `/api/query/execute-multi` | Execute multiple result sets in one request |
| `/api/query/execute-batch` | Execute a list of statements |
| `/api/query/cancel` | Cancel a running query |
| `/api/query/build-table-select-sql` | Build a table browse query |
## Redis APIs
Redis browser and command execution use dedicated routes.
```http
POST /api/redis/execute-command
Content-Type: application/json
{
"connectionId": "redis-id",
"db": 0,
"command": "GET mykey"
}
```
Other common Redis routes:
- `/api/redis/scan-keys`
- `/api/redis/get-value`
- `/api/redis/set-string`
- `/api/redis/delete-key`
## MongoDB APIs
MongoDB routes are `POST` endpoints with JSON bodies.
### List Collections
```http
POST /api/mongo/list-collections
Content-Type: application/json
{
"connectionId": "mongo-id",
"database": "app"
}
```
### Find Documents
```http
POST /api/mongo/find-documents
Content-Type: application/json
{
"connectionId": "mongo-id",
"database": "app",
"collection": "users",
"skip": 0,
"limit": 20,
"filter": "{}"
}
```
Other MongoDB routes include `aggregate-documents`, `insert-documents`, `update-documents`, and `delete-documents`.
## MCP and CLI Integration
For automation, these packages are usually easier to maintain than calling the Web API directly:
- MCP: [@dbx-app/mcp-server](/en/docs/mcp)
- CLI: [@dbx-app/cli](/en/docs/cli)
When MCP runs against a deployed Web instance, set:
```json
{
"env": {
"DBX_WEB_URL": "http://localhost:4224",
"DBX_WEB_PASSWORD": "your-password"
}
}
```
The MCP server handles login and session cookies for you.
CLI supports the same `DBX_WEB_URL` and `DBX_WEB_PASSWORD` variables. Both integrations reuse server-side connections, drivers, read-only protection, production protection, and database privileges, making them easier to maintain across DBX upgrades than copied internal route payloads.
## Writes, Safety, and File Boundaries
- API authentication proves only that the request belongs to a logged-in session; it does not replace database privileges
- Query, import, and transfer paths continue to enforce connection read-only protection, while production and SQL-risk policy apply in their corresponding core paths
- Browser-selected table-import and SQL files are uploaded into server temporary storage, not read from arbitrary client paths
- Web exports create a temporary server file, return it through a download route, and then clean it up
- Reverse proxies should preserve cookies and SSE streaming, allow appropriate long-running timeouts, and limit public exposure
## Example Scripts
See the repository examples:
- [examples/web-api/automation.sh](https://github.com/t8y2/dbx/tree/main/examples/web-api/automation.sh)
- [examples/docker/docker-compose.yml](https://github.com/t8y2/dbx/tree/main/examples/docker/docker-compose.yml)
- [examples/cli/basic-workflow.sh](https://github.com/t8y2/dbx/tree/main/examples/cli/basic-workflow.sh)
## Route Groups
The Web backend exposes many more routes for the UI, including:
- `/api/export/*` for exports and downloads
- `/api/import/*` for table imports
- `/api/transfer/*` for data transfer jobs
- `/api/ai/*` for the built-in AI assistant
- `/api/agents/*` and `/api/jdbc/*` for driver management
- `/api/history/*` and `/api/saved-sql/*` for editor state
Browse `crates/dbx-web/src/main.rs` in the repository for the full route list.