Deploy your backend on Aethelos Base in six steps. Get an isolated PostgreSQL database, REST API, and typed SDK — no infrastructure headaches.
Each project gets its own isolated PostgreSQL database, provisioned instantly.
Go to dashboardGenerate a project-scoped API key from the project settings. This is how your app authenticates.
# Your API key looks like this: aeth_sk_9f8e7d6c5b4a3...
Use the REST API directly, or generate a typed client SDK for your project.
// ── Option A: REST API ──────────────────────────
const BASE = "http://localhost:3000/api/v1/db";
const KEY = "aeth_sk_9f8e7d6c5b4a3...";
// List all users
const res = await fetch(`${BASE}/users`, {
headers: { Authorization: `Bearer ${KEY}` }
});
const { data } = await res.json();
// Insert a new product
await fetch(`${BASE}/products`, {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Kente Cloth",
price: 250.00,
inventory_count: 45
})
});
// ── Option B: Auto-generated SDK ────────────────
// GET /api/v1/sdk?project_id=xxx&api_key=aeth_sk_...
// returns a ready-to-import JS client
import { createClient } from "./aethelos-client.js";
const db = createClient();
const users = await db.users.list();
const product = await db.products.get("p1");
const newRow = await db.orders.create({
user_id: "u1",
total_amount: 335.00,
status: "pending"
});Use the built-in query console to define your schema, or push DDL through the API.
-- Run this in the Query Console (Ctrl+K → "Query Console") CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT UNIQUE NOT NULL, full_name TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE products ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, price DECIMAL(10,2) NOT NULL, inventory_count INT DEFAULT 0, created_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES users(id), total_amount DECIMAL(10,2) NOT NULL, status TEXT DEFAULT 'pending', ordered_at TIMESTAMPTZ DEFAULT now() );
Your backend is live. Monitor telemetry, manage API keys, and scale.
# Test your live API with curl
curl -X GET http://localhost:3000/api/v1/db/users \
-H "Authorization: Bearer aeth_sk_9f8e7d6c5b4a3..."
# Response:
{
"data": [
{ "id": "u1", "email": "kwame@example.com", "full_name": "Kwame Asante" },
{ "id": "u2", "email": "ama@example.com", "full_name": "Ama Mensah" }
],
"count": 2
}All endpoints require Authorization: Bearer aeth_sk_...
/api/v1/db/:table/api/v1/db/:table/api/v1/db/:table/:id/api/v1/db/:table/:id/api/v1/db/:table/:id/api/v1/sdk?project_id=...&api_key=...const res = await fetch("/api/v1/db/users", {
headers: { Authorization: `Bearer ${KEY}` }
});
const { data } = await res.json();import requests
res = requests.get(
"http://localhost:3000/api/v1/db/users",
headers={"Authorization": f"Bearer {KEY}"}
)
data = res.json()["data"]curl http://localhost:3000/api/v1/db/users \ -H "Authorization: Bearer $KEY"
final res = await http.get(
Uri.parse("$BASE/api/v1/db/users"),
headers: {"Authorization": "Bearer $KEY"},
);
final data = jsonDecode(res.body);