Backend (console)
Backend projects, tables, columns, rows, keys and logs, as the console and personal tokens use them. 19 routes, from the API’s own OpenAPI document.
19 routes. Every path starts at https://cloud-api.qaldy.com. Sign-in, tokens, errors and limits are on the overview.
Routes#
Reference#
GET /v1/backend/projects/{projectId}#
One backend: tables, settings, counts and what you may change.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
readscope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | yes | at least 1 characters |
name | string | yes | at least 1 characters |
slug | string | yes | at least 1 characters |
description | string | yes | |
createdAt | string (date-time) | yes | |
url | string | yes | at least 1 characters |
tableCount | integer | yes | at least 0 |
keyCount | integer | yes | at least 0 |
rowCount | integer | yes | at least 0 |
requestsPerMin | number | yes | at least 0 |
workspaceId | string | yes | at least 1 characters |
createdBy | string | yes | at least 1 characters |
settings | object | yes | |
settings.rateLimitPerMin | integer | yes | 10 to 100000 |
settings.ipRatePerMin | integer | yes | 10 to 100000 |
settings.maxBodyKb | integer | yes | 1 to 1024 |
settings.allowedOrigins | string[] | yes | up to 20 items |
settings.identity | object or null | yes | |
tables | object[] | yes | |
tables[].name | string | yes | |
tables[].columns | object[] | yes | up to 66 items |
tables[].publicRead | boolean | yes | |
tables[].rules | object[] | yes | up to 16 items |
tables[].rowCount | integer or null | yes | at least 0 |
tables[].createdAt | string (date-time) | yes | |
canEdit | boolean | yes | |
canAdmin | boolean | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
GET /v1/backend/projects/{projectId}/keys#
Keys of a backend (prefixes only; owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | yes | at least 1 characters |
name | string | yes | 1 to 60 characters |
kind | "publishable" · "secret" | yes | |
prefix | string | yes | at least 1 characters |
last4 | string | yes | 4 to 4 characters |
scopes | "rows:read" · "rows:write" · "schema:write"[] | yes | up to 3 items |
tables | string[] or null | yes | up to 64 items |
createdAt | string (date-time) | yes | |
createdBy | string | yes | at least 1 characters |
lastUsedAt | string (date-time) or null | yes | |
revokedAt | string (date-time) or null | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/backend/projects/{projectId}/keys#
Create a key; its value is in this answer only (owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
kind | "publishable" · "secret" | yes | |
name | string | yes | 1 to 60 characters |
scopes | "rows:read" · "rows:write" · "schema:write"[] | up to 3 items | |
tables | string[] or null | up to 64 items |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
key | object | yes | |
key.id | string | yes | at least 1 characters |
key.name | string | yes | 1 to 60 characters |
key.kind | "publishable" · "secret" | yes | |
key.prefix | string | yes | at least 1 characters |
key.last4 | string | yes | 4 to 4 characters |
key.scopes | "rows:read" · "rows:write" · "schema:write"[] | yes | up to 3 items |
key.tables | string[] or null | yes | up to 64 items |
key.createdAt | string (date-time) | yes | |
key.createdBy | string | yes | at least 1 characters |
key.lastUsedAt | string (date-time) or null | yes | |
key.revokedAt | string (date-time) or null | yes | |
secret | string | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
DELETE /v1/backend/projects/{projectId}/keys/{keyId}#
Revoke a key at once (owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
keyId | path | string | yes | 1 to 64 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
ok | true | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
GET /v1/backend/projects/{projectId}/logs#
Recent data API requests and the last hour of load.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
readscope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
limit | query | integer | 1 to 200. default 50 |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
logs | object[] | yes | |
logs[].id | string | yes | at least 1 characters |
logs[].at | string (date-time) | yes | |
logs[].method | string | yes | 1 to 10 characters |
logs[].path | string | yes | up to 300 characters |
logs[].table | string or null | yes | |
logs[].status | integer | yes | 100 to 599 |
logs[].durationMs | integer | yes | at least 0 |
logs[].keyPrefix | string or null | yes | |
logs[].keyName | string or null | yes | up to 60 characters |
logs[].keyKind | "publishable" · "secret" · null or null | yes | |
logs[].rows | integer or null | yes | at least 0 |
logs[].errorCode | string or null | yes | |
metrics | object | yes | |
metrics.windowMinutes | integer | yes | at least 1 |
metrics.perMinute | integer[] | yes | up to 120 items |
metrics.requestsPerMin | number | yes | at least 0 |
metrics.total | integer | yes | at least 0 |
metrics.errors | integer | yes | at least 0 |
metrics.p50Ms | number or null | yes | at least 0 |
metrics.p95Ms | number or null | yes | at least 0 |
metrics.lastRequestAt | string (date-time) or null | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
PATCH /v1/backend/projects/{projectId}/settings#
Rate limit, allowed browser origins and public-read tables (owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
rateLimitPerMin | integer | 10 to 100000 | |
ipRatePerMin | integer | 10 to 100000 | |
maxBodyKb | integer | 1 to 1024 | |
allowedOrigins | string[] | up to 20 items | |
identity | object or null | ||
identity.issuer | string | yes | 1 to 200 characters |
identity.audience | string | yes | 1 to 200 characters |
identity.roleClaim | string | default "role" | |
identity.keys | object[] | yes | up to 8 items |
publicReadTables | string[] | up to 64 items | |
confirmPublicRead | string[] | up to 64 items |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | yes | at least 1 characters |
name | string | yes | at least 1 characters |
slug | string | yes | at least 1 characters |
description | string | yes | |
createdAt | string (date-time) | yes | |
url | string | yes | at least 1 characters |
tableCount | integer | yes | at least 0 |
keyCount | integer | yes | at least 0 |
rowCount | integer | yes | at least 0 |
requestsPerMin | number | yes | at least 0 |
workspaceId | string | yes | at least 1 characters |
createdBy | string | yes | at least 1 characters |
settings | object | yes | |
settings.rateLimitPerMin | integer | yes | 10 to 100000 |
settings.ipRatePerMin | integer | yes | 10 to 100000 |
settings.maxBodyKb | integer | yes | 1 to 1024 |
settings.allowedOrigins | string[] | yes | up to 20 items |
settings.identity | object or null | yes | |
tables | object[] | yes | |
tables[].name | string | yes | |
tables[].columns | object[] | yes | up to 66 items |
tables[].publicRead | boolean | yes | |
tables[].rules | object[] | yes | up to 16 items |
tables[].rowCount | integer or null | yes | at least 0 |
tables[].createdAt | string (date-time) | yes | |
canEdit | boolean | yes | |
canAdmin | boolean | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/backend/projects/{projectId}/tables#
Create a table with typed columns (id and created_at are added).
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | |
columns | object[] | up to 64 items. default | |
columns[].name | string | yes | |
columns[].type | "text" · "integer" · "real" · "boolean" · "timestamp" · "json" | yes | |
columns[].nullable | boolean | default true | |
publicRead | boolean | default false | |
confirmPublic | string |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | |
columns | object[] | yes | up to 66 items |
columns[].name | string | yes | |
columns[].type | "text" · "integer" · "real" · "boolean" · "timestamp" · "json" | yes | |
columns[].nullable | boolean | yes | |
columns[].system | boolean | yes | |
publicRead | boolean | yes | |
rules | object[] | yes | up to 16 items |
rules[].id | string | yes | |
rules[].audience | object | yes | |
rules[].actions | "read" · "insert" · "update" · "delete"[] | yes | up to 4 items |
rules[].where | object | yes | |
rules[].columns | string[] or null | yes | up to 66 items |
rules[].migrated | boolean | ||
rules[].sentence | string | yes | up to 400 characters |
rowCount | integer or null | yes | at least 0 |
createdAt | string (date-time) | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
DELETE /v1/backend/projects/{projectId}/tables/{table}#
Drop a table and its rows (the table's name typed back).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
confirm | string | yes |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
ok | true | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/backend/projects/{projectId}/tables/{table}/columns#
Add a column.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | |
type | "text" · "integer" · "real" · "boolean" · "timestamp" · "json" | yes | |
nullable | boolean | default true |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | |
columns | object[] | yes | up to 66 items |
columns[].name | string | yes | |
columns[].type | "text" · "integer" · "real" · "boolean" · "timestamp" · "json" | yes | |
columns[].nullable | boolean | yes | |
columns[].system | boolean | yes | |
publicRead | boolean | yes | |
rules | object[] | yes | up to 16 items |
rules[].id | string | yes | |
rules[].audience | object | yes | |
rules[].actions | "read" · "insert" · "update" · "delete"[] | yes | up to 4 items |
rules[].where | object | yes | |
rules[].columns | string[] or null | yes | up to 66 items |
rules[].migrated | boolean | ||
rules[].sentence | string | yes | up to 400 characters |
rowCount | integer or null | yes | at least 0 |
createdAt | string (date-time) | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
GET /v1/backend/projects/{projectId}/tables/{table}/export#
Every row as CSV or JSON (up to 5,000).
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
readscope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
format | query | "csv" · "json" | default "csv" |
Response 200: The file
A string.
POST /v1/backend/projects/{projectId}/tables/{table}/import#
Append rows from CSV (header row = column names; all or nothing per check).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
csv | string | yes | 1 to 1000000 characters |
importId | string |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
inserted | integer | yes | at least 0 |
errors | object[] | yes | up to 20 items |
errors[].line | integer | yes | at least 1 |
errors[].message | string | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
PUT /v1/backend/projects/{projectId}/tables/{table}/policy#
Set the rules of a table from their sentences (owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
sentences | string[] | yes | up to 16 items |
confirmPublic | string |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
table | object | yes | |
table.name | string | yes | |
table.columns | object[] | yes | up to 66 items |
table.publicRead | boolean | yes | |
table.rules | object[] | yes | up to 16 items |
table.rowCount | integer or null | yes | at least 0 |
table.createdAt | string (date-time) | yes | |
warnings | string[] | yes | up to 20 items |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/backend/projects/{projectId}/tables/{table}/policy/test#
Try the rules as a visitor, a signed-in person or a key; nothing is written (owner).
- Authentication: the console’s session cookie.
- Token: not available. This route is for a signed-in person in the console (
403 console_onlyfor a token).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
principal | object | yes | |
action | "read" · "insert" · "update" · "delete" | default "read" | |
query | string | up to 500 characters. default "" | |
row | map of any or null | ||
rowId | integer | at least 1 |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
who | string | yes | |
action | "read" · "insert" · "update" · "delete" | yes | |
allowed | boolean | yes | |
reason | string or null | yes | |
hint | string or null | yes | |
matched | object[] | yes | |
matched[].id | string | yes | |
matched[].sentence | string | yes | |
readableColumns | string[] | yes | |
hiddenColumns | string[] | yes | |
rows | map of any or null[] | yes | up to 20 items |
hiddenPerRow | string[][] | yes | up to 20 items |
totalRows | integer or null | yes | at least 0 |
visibleRows | integer or null | yes | at least 0 |
rowPasses | boolean or null | yes | |
stamps | map of string or number or boolean | yes | |
queryError | object or null | yes | |
queryError.code | string | yes | |
queryError.message | string | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
GET /v1/backend/projects/{projectId}/tables/{table}/rows#
A page of rows (same filters as the data API).
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
readscope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
rows | map of any or null[] | yes | |
total | integer | yes | |
limit | integer | yes | |
offset | integer | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/backend/projects/{projectId}/tables/{table}/rows#
Insert rows.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
Request body (application/json)
An empty object: {}.
Response 200
A map of any or null[].
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
PATCH /v1/backend/projects/{projectId}/tables/{table}/rows/{id}#
Change one row.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
id | path | string | yes | 1 to 20 characters |
Request body (application/json)
An empty object: {}.
Response 200
A map of any or null.
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
DELETE /v1/backend/projects/{projectId}/tables/{table}/rows/{id}#
Delete one row.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
projectId | path | string | yes | 1 to 128 characters |
table | path | string | yes | 1 to 48 characters |
id | path | string | yes | 1 to 20 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
ok | true | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
GET /v1/workspaces/{ws}/backend/projects#
Backend projects you can see.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
readscope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
ws | path | string | yes | 1 to 128 characters |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | yes | at least 1 characters |
name | string | yes | at least 1 characters |
slug | string | yes | at least 1 characters |
description | string | yes | |
createdAt | string (date-time) | yes | |
url | string | yes | at least 1 characters |
tableCount | integer | yes | at least 0 |
keyCount | integer | yes | at least 0 |
rowCount | integer | yes | at least 0 |
requestsPerMin | number | yes | at least 0 |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).
POST /v1/workspaces/{ws}/backend/projects#
New backend: a datacenter on the island, a sample table, no keys yet.
- Authentication: the console’s session cookie.
- Token: a personal access token or an MCP sign-in with the
writescope.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
ws | path | string | yes | 1 to 128 characters |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | 2 to 60 characters |
description | string | up to 280 characters. default "" | |
starter | "orders" · "waitlist" · "blank" | default "orders" |
Response 200
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | yes | at least 1 characters |
name | string | yes | at least 1 characters |
slug | string | yes | at least 1 characters |
description | string | yes | |
createdAt | string (date-time) | yes | |
url | string | yes | at least 1 characters |
tableCount | integer | yes | at least 0 |
keyCount | integer | yes | at least 0 |
rowCount | integer | yes | at least 0 |
requestsPerMin | number | yes | at least 0 |
workspaceId | string | yes | at least 1 characters |
createdBy | string | yes | at least 1 characters |
settings | object | yes | |
settings.rateLimitPerMin | integer | yes | 10 to 100000 |
settings.ipRatePerMin | integer | yes | 10 to 100000 |
settings.maxBodyKb | integer | yes | 1 to 1024 |
settings.allowedOrigins | string[] | yes | up to 20 items |
settings.identity | object or null | yes | |
tables | object[] | yes | |
tables[].name | string | yes | |
tables[].columns | object[] | yes | up to 66 items |
tables[].publicRead | boolean | yes | |
tables[].rules | object[] | yes | up to 16 items |
tables[].rowCount | integer or null | yes | at least 0 |
tables[].createdAt | string (date-time) | yes | |
canEdit | boolean | yes | |
canAdmin | boolean | yes |
Errors: 400, 401, 403, 404, 409, 429 (the error format is on the overview).