ObjectStackObjectStack

Rest Server

Rest Server protocol schemas

REST API Server Protocol

Defines the REST API server configuration for automatically generating RESTful CRUD endpoints, metadata endpoints, and batch operations.

Features:

  • Automatic CRUD endpoint generation from Object definitions
  • Standard REST conventions (GET, POST, PUT, PATCH, DELETE)
  • Metadata API endpoints
  • Batch operation endpoints
  • OpenAPI/Swagger documentation generation

Architecture alignment:

  • Salesforce: REST API with Object CRUD
  • Microsoft Dynamics: Web API with entity operations
  • Strapi: Auto-generated REST endpoints

Source: packages/spec/src/api/rest-server.zod.ts

TypeScript Usage

import { BatchEndpointsConfigSchema, CrudEndpointPatternSchema, CrudEndpointsConfigSchema, CrudOperation, EndpointRegistrySchema, GeneratedEndpointSchema, MetadataEndpointsConfigSchema, RestApiConfigSchema, RestServerConfigSchema, RouteGenerationConfigSchema } from '@objectstack/spec/api';
import type { BatchEndpointsConfig, CrudEndpointPattern, CrudEndpointsConfig, CrudOperation, EndpointRegistry, GeneratedEndpoint, MetadataEndpointsConfig, RestApiConfig, RestServerConfig, RouteGenerationConfig } from '@objectstack/spec/api';

// Validate data
const result = BatchEndpointsConfigSchema.parse(data);

BatchEndpointsConfig

Properties

PropertyTypeRequiredDescription
maxBatchSizeintegeroptional (default: 200)Maximum records per batch operation
enableBatchEndpointbooleanoptional (default: true)Enable POST /data/:object/batch endpoint
operations{ createMany: boolean; updateMany: boolean; deleteMany: boolean; upsertMany: boolean }optionalEnable/disable specific batch operations
defaultAtomicbooleanoptional (default: true)Default atomic/transaction mode for batch operations

Nested Shape: BatchEndpointsConfig.operations

PropertyTypeRequiredDescription
createManybooleanoptional (default: true)Enable POST /data/:object/createMany
updateManybooleanoptional (default: true)Enable POST /data/:object/updateMany
deleteManybooleanoptional (default: true)Enable POST /data/:object/deleteMany
upsertManybooleanoptional (default: true)Enable POST /data/:object/upsertMany

CrudEndpointPattern

Properties

PropertyTypeRequiredDescription
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringURL path pattern
summarystringoptionalOperation summary
descriptionstringoptionalOperation description

CrudEndpointsConfig

Properties

PropertyTypeRequiredDescription
operations{ create: boolean; read: boolean; update: boolean; delete: boolean; … }optionalEnable/disable operations
patternsRecord<string, { method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; summary?: string; description?: string }>optionalCustom URL patterns for operations
dataPrefixstringoptional (default: "/data")URL prefix for data endpoints
objectParamStyleEnum<'path' | 'query'>optional (default: "path")How object name is passed (path param or query param)

Nested Shape: CrudEndpointsConfig.operations

PropertyTypeRequiredDescription
createbooleanoptional (default: true)Enable create operation
readbooleanoptional (default: true)Enable read operation
updatebooleanoptional (default: true)Enable update operation
deletebooleanoptional (default: true)Enable delete operation
listbooleanoptional (default: true)Enable list operation

Nested Shape: CrudEndpointsConfig.patterns[string]

PropertyTypeRequiredDescription
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringURL path pattern
summarystringoptionalOperation summary
descriptionstringoptionalOperation description

CrudOperation

Allowed Values

  • create
  • read
  • update
  • delete
  • list

EndpointRegistry

Properties

PropertyTypeRequiredDescription
endpoints{ id: string; method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; object: string; … }[]All generated endpoints
totalintegerTotal number of endpoints
byObjectRecord<string, { id: string; method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; object: string; … }[]>optionalEndpoints grouped by object
byOperationRecord<string, { id: string; method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; object: string; … }[]>optionalEndpoints grouped by operation

Nested Shape: EndpointRegistry.endpoints[number]

PropertyTypeRequiredDescription
idstringUnique endpoint identifier
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringFull URL path
objectstringObject name (snake_case)
operationEnum<'create' | 'read' | 'update' | 'delete' | 'list'> | stringOperation type
handlerstringHandler function identifier
metadata{ summary?: string; description?: string; tags?: string[]; deprecated?: boolean }optional

Nested Shape: EndpointRegistry.byObject[string][number]

PropertyTypeRequiredDescription
idstringUnique endpoint identifier
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringFull URL path
objectstringObject name (snake_case)
operationEnum<'create' | 'read' | 'update' | 'delete' | 'list'> | stringOperation type
handlerstringHandler function identifier
metadata{ summary?: string; description?: string; tags?: string[]; deprecated?: boolean }optional

Nested Shape: EndpointRegistry.byOperation[string][number]

PropertyTypeRequiredDescription
idstringUnique endpoint identifier
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringFull URL path
objectstringObject name (snake_case)
operationEnum<'create' | 'read' | 'update' | 'delete' | 'list'> | stringOperation type
handlerstringHandler function identifier
metadata{ summary?: string; description?: string; tags?: string[]; deprecated?: boolean }optional

GeneratedEndpoint

Properties

PropertyTypeRequiredDescription
idstringUnique endpoint identifier
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method
pathstringFull URL path
objectstringObject name (snake_case)
operationEnum<'create' | 'read' | 'update' | 'delete' | 'list'> | stringOperation type
handlerstringHandler function identifier
metadata{ summary?: string; description?: string; tags?: string[]; deprecated?: boolean }optional

MetadataEndpointsConfig

Properties

PropertyTypeRequiredDescription
prefixstringoptional (default: "/meta")URL prefix for metadata endpoints
enableCachebooleanoptional (default: true)Enable HTTP cache headers (ETag, Last-Modified)
cacheTtlintegeroptional (default: 3600)Cache TTL in seconds
maskObjectFieldsbooleanoptional (default: true)[ADR-0106 D8] Mask served object schemas to the caller's readable fields
endpoints{ types: boolean; items: boolean; item: boolean; schema: boolean }optionalEnable/disable specific endpoints

Nested Shape: MetadataEndpointsConfig.endpoints

PropertyTypeRequiredDescription
typesbooleanoptional (default: true)GET /meta - List all metadata types
itemsbooleanoptional (default: true)GET /meta/:type - List items of type
itembooleanoptional (default: true)GET /meta/:type/:name - Get specific item
schemabooleanoptional (default: true)GET /meta/:type/:name/schema - Get JSON schema

RestApiConfig

Properties

PropertyTypeRequiredDescription
versionstringoptional (default: "v1")API version (e.g., v1, v2, 2024-01)
basePathstringoptional (default: "/api")Base URL path for API
apiPathstringoptionalFull API path (defaults to {basePath}/{version})
enableCrudbooleanoptional (default: true)Enable automatic CRUD endpoint generation
enableMetadatabooleanoptional (default: true)Enable metadata API endpoints
enableUibooleanoptional (default: true)Enable UI API endpoints (Views, Menus, Layouts)
enableBatchbooleanoptional (default: true)Enable batch operation endpoints
enableDiscoverybooleanoptional (default: true)Enable API discovery endpoint
enableOpenApibooleanoptional (default: true)Enable OpenAPI 3.1 spec & docs viewer endpoints
enableSearchbooleanoptional (default: true)Enable structured search endpoints (deployment-wide search opt-out)
enableProjectScopingbooleanoptional (default: false)Enable project-scoped routing for data/meta/AI APIs
projectResolutionEnum<'required' | 'optional' | 'auto'>optional (default: "auto")Project ID resolution strategy
requireAuthneveroptional[REMOVED] api.requireAuth was removed in @objectstack/spec 17. Anonymous access to object data is now always denied — auth is a kernel concern, not a deployment posture. Delete the key. To publish something publicly, declare it: a public form view (sharing.allowAnonymous), a share link, or book.audience: 'public' — each derives its own narrow authorization instead of opening the whole data plane. Run os migrate meta --from 16 to list the mechanical edits for existing sources; apply them by hand.
documentation{ enabled: boolean; title: string; description?: string; version?: string; … }optionalOpenAPI/Swagger documentation config
responseFormat{ envelope: boolean; includeMetadata: boolean; includePagination: boolean }optionalResponse format options

Nested Shape: RestApiConfig.documentation

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable API documentation
titlestringoptional (default: "ObjectStack API")API documentation title
descriptionstringoptionalAPI description
versionstringoptionalDocumentation version
termsOfServicestringoptionalTerms of service URL
contact{ name?: string; url?: string; email?: string }optional
license{ name: string; url?: string }optional

Nested Shape: RestApiConfig.responseFormat

PropertyTypeRequiredDescription
envelopebooleanoptional (default: true)Wrap responses in standard envelope
includeMetadatabooleanoptional (default: true)Include response metadata (timestamp, requestId)
includePaginationbooleanoptional (default: true)Include pagination info in list responses

RestServerConfig

Properties

PropertyTypeRequiredDescription
api{ version: string; basePath: string; apiPath?: string; enableCrud: boolean; … }optionalREST API configuration
crud{ operations?: object; patterns?: Record<string, object>; dataPrefix: string; objectParamStyle: Enum<'path' | 'query'> }optionalCRUD endpoints configuration
metadata{ prefix: string; enableCache: boolean; cacheTtl: integer; maskObjectFields: boolean; … }optionalMetadata endpoints configuration
batch{ maxBatchSize: integer; enableBatchEndpoint: boolean; operations?: object; defaultAtomic: boolean }optionalBatch endpoints configuration
routes{ includeObjects?: string[]; excludeObjects?: string[]; nameTransform: Enum<'none' | 'plural' | 'kebab-case' | 'camelCase'>; overrides?: Record<string, object> }optionalRoute generation configuration
openApi31neveroptional[REMOVED] RestServerConfig.openApi31 was removed in @objectstack/spec 17 (ADR-0049) — no runtime ever read it: the REST server forwards only api/crud/metadata/batch/routes, and the served /openapi.json is the pre-generated contract enriched with the live server URL and the registered objects, so webhook/callback definitions declared here never appeared in it. Delete the key. Config-driven OpenAPI 3.1 webhooks/callbacks documentation is a new capability and must arrive via the enforce route of ADR-0049 (a new ADR), not by re-declaring the key; for a real outbound webhook use Webhook from @objectstack/spec/automation.

Nested Shape: RestServerConfig.api

PropertyTypeRequiredDescription
versionstringoptional (default: "v1")API version (e.g., v1, v2, 2024-01)
basePathstringoptional (default: "/api")Base URL path for API
apiPathstringoptionalFull API path (defaults to {basePath}/{version})
enableCrudbooleanoptional (default: true)Enable automatic CRUD endpoint generation
enableMetadatabooleanoptional (default: true)Enable metadata API endpoints
enableUibooleanoptional (default: true)Enable UI API endpoints (Views, Menus, Layouts)
enableBatchbooleanoptional (default: true)Enable batch operation endpoints
enableDiscoverybooleanoptional (default: true)Enable API discovery endpoint
enableOpenApibooleanoptional (default: true)Enable OpenAPI 3.1 spec & docs viewer endpoints
enableSearchbooleanoptional (default: true)Enable structured search endpoints (deployment-wide search opt-out)
enableProjectScopingbooleanoptional (default: false)Enable project-scoped routing for data/meta/AI APIs
projectResolutionEnum<'required' | 'optional' | 'auto'>optional (default: "auto")Project ID resolution strategy
requireAuthneveroptional[REMOVED] api.requireAuth was removed in @objectstack/spec 17. Anonymous access to object data is now always denied — auth is a kernel concern, not a deployment posture. Delete the key. To publish something publicly, declare it: a public form view (sharing.allowAnonymous), a share link, or book.audience: 'public' — each derives its own narrow authorization instead of opening the whole data plane. Run os migrate meta --from 16 to list the mechanical edits for existing sources; apply them by hand.
documentation{ enabled: boolean; title: string; description?: string; version?: string; … }optionalOpenAPI/Swagger documentation config
responseFormat{ envelope: boolean; includeMetadata: boolean; includePagination: boolean }optionalResponse format options

Nested Shape: RestServerConfig.crud

PropertyTypeRequiredDescription
operations{ create: boolean; read: boolean; update: boolean; delete: boolean; … }optionalEnable/disable operations
patternsRecord<string, { method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; summary?: string; description?: string }>optionalCustom URL patterns for operations
dataPrefixstringoptional (default: "/data")URL prefix for data endpoints
objectParamStyleEnum<'path' | 'query'>optional (default: "path")How object name is passed (path param or query param)

Nested Shape: RestServerConfig.metadata

PropertyTypeRequiredDescription
prefixstringoptional (default: "/meta")URL prefix for metadata endpoints
enableCachebooleanoptional (default: true)Enable HTTP cache headers (ETag, Last-Modified)
cacheTtlintegeroptional (default: 3600)Cache TTL in seconds
maskObjectFieldsbooleanoptional (default: true)[ADR-0106 D8] Mask served object schemas to the caller's readable fields
endpoints{ types: boolean; items: boolean; item: boolean; schema: boolean }optionalEnable/disable specific endpoints

Nested Shape: RestServerConfig.batch

PropertyTypeRequiredDescription
maxBatchSizeintegeroptional (default: 200)Maximum records per batch operation
enableBatchEndpointbooleanoptional (default: true)Enable POST /data/:object/batch endpoint
operations{ createMany: boolean; updateMany: boolean; deleteMany: boolean; upsertMany: boolean }optionalEnable/disable specific batch operations
defaultAtomicbooleanoptional (default: true)Default atomic/transaction mode for batch operations

Nested Shape: RestServerConfig.routes

PropertyTypeRequiredDescription
includeObjectsstring[]optionalSpecific objects to generate routes for (empty = all)
excludeObjectsstring[]optionalObjects to exclude from route generation
nameTransformEnum<'none' | 'plural' | 'kebab-case' | 'camelCase'>optional (default: "none")Transform object names in URLs
overridesRecord<string, { enabled?: boolean; basePath?: string; operations?: Record<string, boolean> }>optionalPer-object route customization

RouteGenerationConfig

Properties

PropertyTypeRequiredDescription
includeObjectsstring[]optionalSpecific objects to generate routes for (empty = all)
excludeObjectsstring[]optionalObjects to exclude from route generation
nameTransformEnum<'none' | 'plural' | 'kebab-case' | 'camelCase'>optional (default: "none")Transform object names in URLs
overridesRecord<string, { enabled?: boolean; basePath?: string; operations?: Record<string, boolean> }>optionalPer-object route customization

Nested Shape: RouteGenerationConfig.overrides[string]

PropertyTypeRequiredDescription
enabledbooleanoptionalEnable/disable routes for this object
basePathstringoptionalCustom base path
operationsRecord<string, boolean>optionalEnable/disable specific operations

On this page