Appendix B — Tenant config reference

A consolidated reference for the tenant config document (tenants/<name>.json or PUT /services/raw). Sections link to the full explanation.

Top-level keys

{
  "auth":   { … },         // optional — enables token verification + the auth service
  "cors":   { … },         // optional — browser clients
  "retry":  { … },         // optional — tenant-default retry policy
  "catalogues": [ … ],     // optional — external service/adapter catalogues
  "secrets": { … },        // optional — write-only secret values
  "operatorRoles": "A",    // optional — roles that confer operator status
  "mounts": [ … ]          // required
}
Key Required Notes
mounts yes Array of mount objects (below)
auth no Presence + jwtSecret turns on auth (5.1)
cors no trustedOrigins / allowedOrigins (5.5)
retry no Default policy; overridden per mount/call (7.7)
catalogues no Named external catalogue URLs; usable only when the operator allowlists their hosts (8.11, 10.7)
secrets no Write-only block (10.6)
operatorRoles no Space-separated roles that confer operator status — the only principals who may change authorization (mount/spec access, role assignment). Absent ⇒ no API operator (5.0)

auth

"auth": { "jwtSecret": "…", "sessionMinutes": 60, "maxAttempts": 5,
          "lockMinutes": 10, "userDataset": "users", "allowedLoginOrigins": [],
          "jwtUserProps": ["accountId"] }

See 5.1 (endpoints), 5.3 (sessions/lockout), 5.5 (allowedLoginOrigins). jwtSecret reads back as "<secret>" (10.6).

cors

"cors": { "trustedOrigins": ["https://app.acme.com", "*.acme.dev"],
          "allowedOrigins": ["https://reader.example"] }

Trusted = credentialed CORS + cookie lane; allowed = bearer-only. See 5.5.

A mount

{ "path": "/data", "service": "data",
  "config": { "access": { "read": "all", "write": "A" }, … } }
Field Notes
path URL prefix; longest-prefix routing on segment boundaries (3.2). Duplicates rejected
service file | data | pipeline | wrapper | query | template | auth | proxy | sms | services | log | code:<name>@<version>
config Service-specific + standard keys (below)

access is operationally essential: omitting it makes the mount unreachable (fail closed). Within an access object, omitted action keys follow the defaults in 5.4.

Standard config keys (any mount)

Key Purpose Section
access Role spec: read/write/delete/invoke (or "open"/"authenticated") 5.4
elevate (pipeline mounts) role an elevate step adds to the caller — operator-set, not an operator role 5.0, 7.3
retry Retry policy for calls this mount makes 7.7
caching mode/maxAgeSeconds/public/immutable 9.4
schedule Exactly one of {every: "60s"} or {cron: "0 9 * * *"} (UTC) 7.11
secrets Names from the top-level write-only secrets block this mount may use 7.11, 10.6
grants Capability grants: {prefix}, {type:"httpOut",hosts}, {type:"socket",hosts} — code mounts (8.5); httpOut also on pipeline/wrapper mounts for external call steps (7.3) 8.5
x-agent, x-policy, x-expose, x-render, x-context, description Agent-surface metadata 9.1

Per-service config highlights

Service Notable config
file defaultResource, spaFallback, listings, friendlyUrls, extensionPriority (static-site, 4.3); store: {adapter} for a loadable backend (8.9)
data enforceSchema (4.4); fieldLevelAuthz — per-field x-rs-read/x-rs-write schema rules (4.5); store: {adapter} for a loadable backend (8.9)
pipeline retry, store: {root}, or specStore: {adapter, root} for authoring storage (7.1, 10.7); grants (httpOut) for external calls (7.3)
wrapper Inline pipeline; declared pattern/facets; enforced inputSchema, advisory outputSchema; optional elevate (7.10)
query store: {adapter, root} selects execution backend/legacy spec root; specStore selects authoring storage (6.1, 8.9, 10.7)
template store: {root} or specStore for compiled template envelopes; requires JS (6.6)
auth usually just access; tenant-level auth holds the real settings (5.1)
proxy Fixed external target plus host-side credential inject (8.10)
sms Provider under store.adapter (code: or infra:); no built-in provider (8.10)
services access with write: "A"; config changes are operator-only (5.0, 10.4)
log access (10.3)
code:<name>@<version> grants, access, plus JS bodyPassthrough / requestStreaming / responseStreaming (8.2, 8.5)

Loadable adapter store block (file / data / query, 8.9)

"store": {
  "adapter": "code:my-redis@v1",                 // required: the adapter code ref
  "grants": { "db": { "type": "socket",
                      "hosts": ["redis.internal:6379"] } },
  "maxRuntimes": 4,                               // optional, default 4 (1–64)
  "idleMs": 60000,                                // optional, default 60000; 0 disables eviction
  "host": "redis.internal", "port": 6379         // any extra keys are passed to the bundle as ctx.config
}
Key Notes
adapter builtin:<name>, code:<name>@<version>, or infra:<name> (4.7, 8.9, 10.7)
grants The adapter's capabilities — typically just its socket grant
maxRuntimes Max warm runtimes per mount (resident pool); grows lazily under concurrency
idleMs / idleSeconds Idle-eviction window; 0 keeps runtimes resident indefinitely
(other keys) The whole block is handed to the bundle as ctx.config (connection params, secrets)

Appendix A — Glossary · Manual home · Next: Appendix C — Error code reference →