SeleID

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/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"
    }
  ]
}
StatusMeaning
200Databases.
401Missing, 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"
}
StatusMeaning
201Created.
400Invalid request.
401Missing, invalid or revoked API key.
403Key lacks the required scope, or the account is suspended.
409already_exists.
502provisioning_failed; nothing was kept. Retry.

DELETE /v1/databases/{name}

Delete a database. Role: admin.

Authentication: API key, scope or role admin.

ParameterInRequiredDescription
namepathyesDatabase 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)
StatusMeaning
200Deleted.
401Missing, invalid or revoked API key.
403Key lacks the required scope, or the account is suspended.
404Not found.
502deprovisioning_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.

ParameterInRequiredDescription
namepathyesDatabase 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"
    ]
  ]
}
StatusMeaning
200Result.
400Invalid request.
401Missing, invalid or revoked API key.
403Key lacks the required scope, or the account is suspended.
404Not found.
413Payload too large.
429Plan quota or rate limit reached. Hard stop, never an overage charge.

GET /v1/databases/{name}/schema

Read the schema

Authentication: required.

ParameterInRequiredDescription
namepathyesDatabase 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)
StatusMeaning
200Schema.
401Missing, invalid or revoked API key.
404Not found.

GET /v1/databases/{name}/export

Export as SQL

Authentication: required.

ParameterInRequiredDescription
namepathyesDatabase 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)
StatusMeaning
200SQL dump.
401Missing, invalid or revoked API key.
404Not found.

POST /v1/databases/{name}/import

Import a SQL dump. Max 1 MB and 5000 statements.

Authentication: required.

ParameterInRequiredDescription
namepathyesDatabase 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.sql

TypeScript

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)
StatusMeaning
200Imported.
400Invalid request.
401Missing, invalid or revoked API key.
404Not found.
413Payload 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.

ParameterInRequiredDescription
namepathyesDatabase 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)
StatusMeaning
200Audit.
401Missing, invalid or revoked API key.
403Key lacks the required scope, or the account is suspended.
404Not 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)
StatusMeaning
200Usage.
401Missing, invalid or revoked API key.

Errors

HTTPMeaning
400Invalid request.
401Missing, invalid or revoked API key.
403Key lacks the required scope, or the account is suspended.
404Not found.
413Payload too large.
429Plan 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/.

Last updated 2026-11-12Suggest an editReport a problem with this page