API reference
SeleBase API
All APIs · SDKs · Continue with SeleID (OIDC) · SeleStorage · SeleBase · Webhooks, queue, SeleMail, routing and push · SeleAI · SeleDomains search
Coming soon Version 1.0.0. SQL databases over HTTP. One statement per request, parameterised, with per-plan row quotas as hard stops. Keys have a role (read, write or admin).
Base URL
https://api.seleid.dev Base URL.
Authentication and scopes
Bearer API key with a role: read, write or admin.
Rate limits and quotas
Monthly rows read and rows written by plan are hard stops (429 quota_rows_read_exceeded, quota_rows_written_exceeded). One statement per request, 5 second timeout.
Endpoints
GET /v1/databasesList databasesPOST /v1/databasesCreate a databaseDELETE /v1/databases/{name}Delete a databasePOST /v1/databases/{name}/queryRun one SQL statementGET /v1/databases/{name}/schemaRead the schemaGET /v1/databases/{name}/exportExport as SQLPOST /v1/databases/{name}/importImport a SQL dumpGET /v1/databases/{name}/auditRecent statement audit (hashes, not SQL)GET /v1/usageUsage and plan limits
GET /v1/databases
List databases
Authentication: required.
curl
curl -X GET "https://api.seleid.dev/v1/databases" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.get(
"https://api.seleid.dev/v1/databases",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
Example response
{
"databases": [
{
"name": "app",
"sizeBytes": 8192,
"createdAt": "2026-11-01T10:00:00.000Z"
}
]
}
| Status | Meaning |
|---|---|
200 | Databases. |
401 | Missing, invalid or revoked API key. |
POST /v1/databases
Create a database. Role: admin. Plan limits: Free 1, Starter 3, Pro 5 databases.
Authentication: API key, scope or role admin.
curl
curl -X POST "https://api.seleid.dev/v1/databases" \
-H "Authorization: Bearer $SELEBASE_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"app"}'TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "app"
}),
});
const data = await res.json();Python
import os, requests
res = requests.post(
"https://api.seleid.dev/v1/databases",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"},
json={
"name": "app",
}
)
print(res.status_code, res.text)
Example response
{
"name": "app",
"createdAt": "2026-11-12T10:00:00.000Z"
}
| Status | Meaning |
|---|---|
201 | Created. |
400 | Invalid request. |
401 | Missing, invalid or revoked API key. |
403 | Key lacks the required scope, or the account is suspended. |
409 | already_exists. |
502 | provisioning_failed; nothing was kept. Retry. |
DELETE /v1/databases/{name}
Delete a database. Role: admin.
Authentication: API key, scope or role admin.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X DELETE "https://api.seleid.dev/v1/databases/YOUR_NAME" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME', {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.delete(
"https://api.seleid.dev/v1/databases/YOUR_NAME",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | Deleted. |
401 | Missing, invalid or revoked API key. |
403 | Key lacks the required scope, or the account is suspended. |
404 | Not found. |
502 | deprovisioning_failed. Retry. |
POST /v1/databases/{name}/query
Run one SQL statement. Max 64 KB statement, 100 params, 5 s timeout, 1000 rows or 1 MB returned. ATTACH, PRAGMA, VACUUM and reserved names are blocked. Read-role keys may only read.
Authentication: required.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X POST "https://api.seleid.dev/v1/databases/YOUR_NAME/query" \
-H "Authorization: Bearer $SELEBASE_KEY" \
-H "Content-Type: application/json" \
-d '{"sql":"SELECT id, title FROM notes WHERE owner = ?","params":["u1"]}'TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME/query', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"sql": "SELECT id, title FROM notes WHERE owner = ?",
"params": [
"u1"
]
}),
});
const data = await res.json();Python
import os, requests
res = requests.post(
"https://api.seleid.dev/v1/databases/YOUR_NAME/query",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"},
json={
"sql": "SELECT id, title FROM notes WHERE owner = ?",
"params": [
"u1",
],
}
)
print(res.status_code, res.text)
Example response
{
"columns": [
"id",
"title"
],
"rows": [
[
1,
"Hello"
]
]
}
| Status | Meaning |
|---|---|
200 | Result. |
400 | Invalid request. |
401 | Missing, invalid or revoked API key. |
403 | Key lacks the required scope, or the account is suspended. |
404 | Not found. |
413 | Payload too large. |
429 | Plan quota or rate limit reached. Hard stop, never an overage charge. |
GET /v1/databases/{name}/schema
Read the schema
Authentication: required.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X GET "https://api.seleid.dev/v1/databases/YOUR_NAME/schema" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME/schema', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.get(
"https://api.seleid.dev/v1/databases/YOUR_NAME/schema",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | Schema. |
401 | Missing, invalid or revoked API key. |
404 | Not found. |
GET /v1/databases/{name}/export
Export as SQL
Authentication: required.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X GET "https://api.seleid.dev/v1/databases/YOUR_NAME/export" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME/export', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.get(
"https://api.seleid.dev/v1/databases/YOUR_NAME/export",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | SQL dump. |
401 | Missing, invalid or revoked API key. |
404 | Not found. |
POST /v1/databases/{name}/import
Import a SQL dump. Max 1 MB and 5000 statements.
Authentication: required.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X POST "https://api.seleid.dev/v1/databases/YOUR_NAME/import" \
-H "Authorization: Bearer $SELEBASE_KEY" \
-H "Content-Type: application/sql" \
--data-binary @dump.sqlTypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME/import', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
body: await readFile('./file'),
});
const data = await res.json();Python
import os, requests
res = requests.post(
"https://api.seleid.dev/v1/databases/YOUR_NAME/import",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"},
data=open("file", "rb")
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | Imported. |
400 | Invalid request. |
401 | Missing, invalid or revoked API key. |
404 | Not found. |
413 | Payload too large. |
GET /v1/databases/{name}/audit
Recent statement audit (hashes, not SQL). Role: admin. Last 100 entries.
Authentication: API key, scope or role admin.
| Parameter | In | Required | Description |
|---|---|---|---|
name | path | yes | Database name: 3 to 32 chars, a-z 0-9 _ -, starting with a letter. |
curl
curl -X GET "https://api.seleid.dev/v1/databases/YOUR_NAME/audit" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/databases/YOUR_NAME/audit', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.get(
"https://api.seleid.dev/v1/databases/YOUR_NAME/audit",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | Audit. |
401 | Missing, invalid or revoked API key. |
403 | Key lacks the required scope, or the account is suspended. |
404 | Not found. |
GET /v1/usage
Usage and plan limits
Authentication: required.
curl
curl -X GET "https://api.seleid.dev/v1/usage" \
-H "Authorization: Bearer $SELEBASE_KEY"TypeScript
const res = await fetch('https://api.seleid.dev/v1/usage', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.SELEBASE_KEY}` },
});
const data = await res.json();Python
import os, requests
res = requests.get(
"https://api.seleid.dev/v1/usage",
headers={"Authorization": f"Bearer {os.environ['SELEBASE_KEY']}"}
)
print(res.status_code, res.text)
| Status | Meaning |
|---|---|
200 | Usage. |
401 | Missing, invalid or revoked API key. |
Errors
| HTTP | Meaning |
|---|---|
400 | Invalid request. |
401 | Missing, invalid or revoked API key. |
403 | Key lacks the required scope, or the account is suspended. |
404 | Not found. |
413 | Payload too large. |
429 | Plan quota or rate limit reached. Hard stop, never an overage charge. |
The machine-readable OpenAPI 3.1 description for this API lives in the SeleID repository under docs/openapi/.