Discovery schemas of the ObjectStack API Protocol: ApiRoutes, AuthFamilies and 10 more — each property with its type, default and a TypeScript example.
Whether the better-auth admin family ({routes.auth}/admin/*: list-users, set-role, update-user, ban-user, …) is mounted. Same value as features.admin on GET {routes.auth}/config, read from the same source; false means those routes answer a plain 404 on this deployment.
Deployment posture a discovery response advertises. Deliberately three coarse buckets — a client reads this to answer "am I talking to production?", not to identify a specific environment (that is sys_environment / EnvironmentTypeSchema, a richer 7-member taxonomy).
Environment-scoping posture, added by the REST discovery endpoint
authFamilies
{ admin: boolean }
optional
Which optional better-auth route families are mounted under routes.auth — the same source as GET {routes.auth}/config features; absent when no auth service answers
Whether the slot is filled by something this host delivers. NOT "a channel exists": subscribing requires handlerReady:true AND a connectable route (isSubscribableChannel).
available = fully operational, registered = route declared but handler unverified, unavailable = not installed, degraded = partial, stub = placeholder that returns 501
handlerReady
boolean
optional
Whether the HTTP handler is confirmed to be mounted. Omitted = readiness unknown/unverified; true = handler mounted; false = handler missing or stub (likely 501).
route
string
optional
e.g. /api/v1/analytics
provider
string
optional
e.g. "objectql", "plugin-redis", "driver-memory"
version
string
optional
Semantic version of the service implementation (e.g. "3.0.6")
Whether the backend exposes the atomic cross-object batch endpoint (POST {basePath}/batch, /ADR-0034): all ops commit or roll back together in one transaction. Lets clients skip non-atomic client-side simulation instead of runtime-probing 404/405/501. True ⟺ the /batch route is mounted AND the runtime can honour a transaction.
Whether the backend mounts a realtime push surface (WebSocket/SSE) clients can subscribe to. Derived from isSubscribableChannel(services.realtime): handlerReady true AND a connectable route.
Whether the better-auth admin family ({routes.auth}/admin/*: list-users, set-role, update-user, ban-user, …) is mounted. Same value as features.admin on GET {routes.auth}/config, read from the same source; false means those routes answer a plain 404 on this deployment.
Deployment posture a discovery response advertises. Deliberately three coarse buckets — a client reads this to answer "am I talking to production?", not to identify a specific environment (that is sys_environment / EnvironmentTypeSchema, a richer 7-member taxonomy).
Whether the slot is filled by something this host delivers. NOT "a channel exists": subscribing requires handlerReady:true AND a connectable route (isSubscribableChannel).
available = fully operational, registered = route declared but handler unverified, unavailable = not installed, degraded = partial, stub = placeholder that returns 501
handlerReady
boolean
optional
Whether the HTTP handler is confirmed to be mounted. Omitted = readiness unknown/unverified; true = handler mounted; false = handler missing or stub (likely 501).
route
string
optional
e.g. /api/v1/analytics
provider
string
optional
e.g. "objectql", "plugin-redis", "driver-memory"
version
string
optional
Semantic version of the service implementation (e.g. "3.0.6")
Whether the backend supports record comments / chatter (the sys_comment object served via the data API)
automation
boolean
✅
Whether the backend supports Automation CRUD (flows, triggers)
cron
boolean
✅
Whether the backend supports cron scheduling
search
boolean
✅
Whether the backend supports full-text search
export
boolean
✅
Whether the backend supports async export
chunkedUpload
boolean
✅
Whether the backend supports chunked (multipart) uploads
transactionalBatch
boolean
✅
Whether the backend exposes the atomic cross-object batch endpoint (POST {basePath}/batch, /ADR-0034): all ops commit or roll back together in one transaction. Lets clients skip non-atomic client-side simulation instead of runtime-probing 404/405/501. True ⟺ the /batch route is mounted AND the runtime can honour a transaction.
websockets
boolean
✅
Whether the backend mounts a realtime push surface (WebSocket/SSE) clients can subscribe to. Derived from isSubscribableChannel(services.realtime): handlerReady true AND a connectable route.
files
boolean
✅
Whether a file-storage surface (upload/download/attachments) is served
analytics
boolean
✅
Whether the backend serves the analytics / BI query surface
ai
boolean
✅
Whether the backend serves the AI surface (NLQ, chat, agents, suggest)
notifications
boolean
✅
Whether the backend serves the notification surface (inbox, delivery)
i18n
boolean
✅
Whether the backend serves the i18n surface (translations, locale negotiation)