Architecture
The mental model you need before integrating: one public API host, how a request is authenticated and scoped, how the schema drives everything downstream, and how tenant isolation is enforced.
Overview
ℹ️ The design principle worth internalising
What You Talk To
| Host | What it is | You use it for |
|---|---|---|
| api.supero.dev | The public API | Everything programmatic: auth, CRUD, query, schemas, connectors, services, workflows. |
| app.supero.dev | The dashboard | Building, managing projects and tenants, issuing API keys, publishing. |
*.supero.live | Where published apps run | Your end users. Each published app gets its own subdomain. |
A Request End to End
# 1. Authenticate
curl -X POST https://api.supero.dev/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"domain": "acme", "email": "[email protected]", "password": "..."}'
# The access token is nested: response["auth"]["access_token"]
# 2. Call the CRUD API with that token
curl https://api.supero.dev/api/v1/crud/acme/product \
-H "Authorization: Bearer <access_token>"
# ...or with an API key instead of a JWT
curl https://api.supero.dev/api/v1/crud/acme/product \
-H "X-API-Key: ak_..."import supero
org = supero.login(domain_name='acme', email='[email protected]', password='...')
products = org.crud.list('product')
new_product = org.crud.create('product', name='Widget', price=9.99)💡 Two auth mechanisms, and they are not interchangeable
The Schema Engine
{
"name": "Product",
"schema_type": "object",
"schema_content": {
"name": "Product",
"namespace": "mystore",
"parent_type": "tenant",
"extends": "product:base_product",
"attributes": [
{ "name": "sku", "type": "string", "mandatory": true },
{ "name": "price", "type": "float", "mandatory": true },
{ "name": "status", "type": "string", "values": ["draft", "live"] }
],
"references": []
},
"version": "1.0.0"
}⚠️ extends must be inside schema_content
ℹ️ attributes is canonical; fields is accepted
Tenant Isolation
🚨 The one exception, and it matters
| Level | Represents | Typical roles |
|---|---|---|
| Domain | Your top-level account | domain_admin, domain_user |
| Project | An app or environment within a domain | project_admin, project_user, developer |
| Tenant | An isolated customer within a project | tenant_admin, tenant_user |
| Cross-cutting | Read-only at whichever level it is issued | viewer |
ℹ️ Namespace is not a tenancy level
Where Your Data Lives
| Arrangement | What it means | When to choose it |
|---|---|---|
| Managed storage | Supero stores your records. The default. | You are creating the data, and you want the platform to own durability and scaling. |
| Your own database, synced | A connector copies rows from a database you run, on a schedule. | Another system is the writer of record and some staleness is acceptable. |
| Your own database, live | Reads — and on supported sources, writes — go to your database on every request. | Another system is the writer of record and staleness is not acceptable. |
Deployment and Security
- •Transport: all external traffic to api.supero.dev and app.supero.dev is TLS-encrypted.
- •Sessions: short-lived JWT access tokens with a longer-lived refresh token. API keys are opaque secrets for integrations and are never interchangeable with a Bearer token.
- •Authorization: every request is evaluated against the caller’s role and scope, and every write additionally against the object access policy.
- •Tenant isolation: enforced through the fq_name hierarchy, not by a client-supplied filter that could be omitted or tampered with.
- •Input validation: writes are checked against the active schema — mandatory attributes must be present, and values are checked against declared types and enum values.
⚠️ Self-hosted deployments harden themselves
Next Steps
Platform Concepts
A closer look at domains, projects, tenants, schemas and roles. Read it
Authentication
The full login, refresh and API-key flow, with exact response shapes. Read it
Schema Reference
Attributes, references, enums, and extends. Read it
Deployment
Supero Cloud, your own AWS or GCP, and on-premise. Read it
On this page