ObjectStackObjectStack

Plugin Rest Api

Plugin Rest Api protocol schemas

REST API Plugin Protocol

Defines the schema for REST API plugins that register Discovery, Metadata, Data CRUD, Batch, and Permission routes with the HTTP Dispatcher.

This plugin type implements Phase 2 of the API Protocol implementation plan, providing standardized REST endpoints with:

  • Request validation middleware using Zod schemas
  • Response envelope wrapping with BaseResponseSchema
  • Error handling using ApiErrorSchema
  • OpenAPI documentation auto-generation

Features:

  • Route registration for core API endpoints
  • Automatic schema-based validation
  • Standardized request/response envelopes
  • OpenAPI/Swagger documentation generation

Architecture Alignment:

  • Salesforce: REST API with metadata and data CRUD
  • Microsoft Dynamics: Web API with entity operations
  • Strapi: Auto-generated REST endpoints from schemas

@example Plugin Manifest

{
  "name": "rest_api",
  "version": "1.0.0",
  "type": "server",
  "contributes": {
    "routes": [
      {
        "prefix": "/api/v1/discovery",
        "service": "metadata",
        "methods": ["getDiscovery"],
        "middleware": [
          { "name": "response_envelope", "type": "transformation", "enabled": true }
        ]
      },
      {
        "prefix": "/api/v1/meta",
        "service": "metadata",
        "methods": ["getMetaTypes", "getMetaItems", "getMetaItem", "saveMetaItem"],
        "middleware": [
          { "name": "auth", "type": "authentication", "enabled": true },
          { "name": "request_validation", "type": "validation", "enabled": true }
        ]
      },
      {
        "prefix": "/api/v1/data",
        "service": "data",
        "methods": ["findData", "getData", "createData", "updateData", "deleteData"]
      }
    ]
  }
}

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

TypeScript Usage

import { ErrorHandlingConfigSchema, HandlerStatusSchema, OpenApiGenerationConfigSchema, RequestValidationConfigSchema, ResponseEnvelopeConfigSchema, RestApiEndpointSchema, RestApiPluginConfigSchema, RestApiRouteCategory, RestApiRouteRegistrationSchema, RouteCoverageEntrySchema, RouteCoverageReportSchema, ValidationMode } from '@objectstack/spec/api';
import type { ErrorHandlingConfig, HandlerStatus, OpenApiGenerationConfig, RequestValidationConfig, ResponseEnvelopeConfig, RestApiEndpoint, RestApiPluginConfig, RestApiRouteCategory, RestApiRouteRegistration, RouteCoverageEntry, RouteCoverageReport, ValidationMode } from '@objectstack/spec/api';

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

ErrorHandlingConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable standardized error handling
includeStackTracebooleanoptional (default: false)Include stack traces in error responses
logErrorsbooleanoptional (default: true)Log errors to system logger
exposeInternalErrorsbooleanoptional (default: false)Expose internal error details in responses
includeRequestIdbooleanoptional (default: true)Include requestId in error responses
includeTimestampbooleanoptional (default: true)Include timestamp in error responses
includeDocumentationbooleanoptional (default: true)Include documentation URLs for errors
documentationBaseUrlstringoptionalBase URL for error documentation
customErrorMessagesRecord<string, string>optionalCustom error messages by error code
redactFieldsstring[]optionalField names to redact from error details

HandlerStatus

Allowed Values

  • implemented
  • stub
  • planned

OpenApiGenerationConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable automatic OpenAPI documentation generation
versionEnum<'3.0.0' | '3.0.1' | '3.0.2' | '3.0.3' | '3.1.0'>optional (default: "3.0.3")OpenAPI specification version
titlestringoptional (default: "ObjectStack API")API title
descriptionstringoptionalAPI description
apiVersionstringoptional (default: "1.0.0")API version
outputPathstringoptional (default: "/api/docs/openapi.json")URL path to serve OpenAPI JSON
uiPathstringoptional (default: "/api/docs")URL path to serve documentation UI
uiFrameworkEnum<'swagger-ui' | 'redoc' | 'rapidoc' | 'elements'>optional (default: "swagger-ui")Documentation UI framework
includeInternalbooleanoptional (default: false)Include internal endpoints in documentation
generateSchemasbooleanoptional (default: true)Auto-generate schemas from Zod definitions
includeExamplesbooleanoptional (default: true)Include request/response examples
servers{ url: string; description?: string }[]optionalServer URLs for API
contact{ name?: string; url?: string; email?: string }optionalAPI contact information
license{ name: string; url?: string }optionalAPI license information
securitySchemesRecord<string, { type: Enum<'apiKey' | 'http' | 'oauth2' | 'openIdConnect'>; scheme?: string; bearerFormat?: string }>optionalSecurity scheme definitions

RequestValidationConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable automatic request validation
modeEnum<'strict' | 'permissive' | 'strip'>optional (default: "strict")How to handle validation errors
validateBodybooleanoptional (default: true)Validate request body against schema
validateQuerybooleanoptional (default: true)Validate query string parameters
validateParamsbooleanoptional (default: true)Validate URL path parameters
validateHeadersbooleanoptional (default: false)Validate request headers
includeFieldErrorsbooleanoptional (default: true)Include field-level error details in response
errorPrefixstringoptionalCustom prefix for validation error messages
schemaRegistrystringoptionalSchema registry name to use for validation

ResponseEnvelopeConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable automatic response envelope wrapping
includeMetadatabooleanoptional (default: true)Include meta object in responses
includeTimestampbooleanoptional (default: true)Include timestamp in response metadata
includeRequestIdbooleanoptional (default: true)Include requestId in response metadata
includeDurationbooleanoptional (default: false)Include request duration in ms
includeTraceIdbooleanoptional (default: false)Include distributed traceId
customMetadataRecord<string, any>optionalAdditional metadata fields to include
skipIfWrappedbooleanoptional (default: true)Skip wrapping if response already has success field

RestApiEndpoint

Properties

PropertyTypeRequiredDescription
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method for this endpoint
pathstringURL path pattern (e.g., /api/v1/data/:object/:id)
handlerstringProtocol method name or handler identifier
categoryEnum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | 'automation' | 'ui' | 'realtime' | 'notification' | 'ai' | 'i18n'>Route category
publicbooleanoptional (default: false)Is publicly accessible without authentication
permissionsstring[]optionalRequired permissions (e.g., ["data.read", "object.account.read"])
summarystringoptionalShort description for OpenAPI
descriptionstringoptionalDetailed description for OpenAPI
tagsstring[]optionalOpenAPI tags for grouping
requestSchemastringoptionalRequest schema name (for validation)
responseSchemastringoptionalResponse schema name (for documentation)
timeoutintegeroptionalRequest timeout in milliseconds
rateLimitstringoptionalRate limit policy name
cacheablebooleanoptional (default: false)Whether response can be cached
cacheTtlintegeroptionalCache TTL in seconds
handlerStatusEnum<'implemented' | 'stub' | 'planned'>optionalHandler implementation status: implemented (default if omitted), stub, or planned

RestApiPluginConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable REST API plugin
basePathstringoptional (default: "/api")Base path for all API routes
versionstringoptional (default: "v1")API version identifier
routes{ prefix: string; service: string; category: Enum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | …>; methods?: string[]; … }[]Route registrations
validation{ enabled: boolean; mode: Enum<'strict' | 'permissive' | 'strip'>; validateBody: boolean; validateQuery: boolean; … }optionalRequest validation configuration
responseEnvelope{ enabled: boolean; includeMetadata: boolean; includeTimestamp: boolean; includeRequestId: boolean; … }optionalResponse envelope configuration
errorHandling{ enabled: boolean; includeStackTrace: boolean; logErrors: boolean; exposeInternalErrors: boolean; … }optionalError handling configuration
openApi{ enabled: boolean; version: Enum<'3.0.0' | '3.0.1' | '3.0.2' | '3.0.3' | '3.1.0'>; title: string; description?: string; … }optionalOpenAPI documentation configuration
globalMiddleware{ name: string; type: Enum<'authentication' | 'authorization' | 'logging' | 'validation' | 'transformation' | 'error' | 'custom'>; enabled: boolean; order: integer; … }[]optionalGlobal middleware stack
cors{ enabled: boolean; origins?: string[]; methods?: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>[]; credentials: boolean }optionalCORS configuration
performance{ enableCompression: boolean; enableETag: boolean; enableCaching: boolean; defaultCacheTtl: integer }optionalPerformance optimization settings

RestApiRouteCategory

Allowed Values

  • discovery
  • metadata
  • data
  • batch
  • permission
  • analytics
  • automation
  • ui
  • realtime
  • notification
  • ai
  • i18n

RestApiRouteRegistration

Properties

PropertyTypeRequiredDescription
prefixstringURL path prefix for this route group
servicestringCore service name (metadata, data, auth, etc.)
categoryEnum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | 'automation' | 'ui' | 'realtime' | 'notification' | 'ai' | 'i18n'>Primary category for this route group
methodsstring[]optionalProtocol method names implemented
endpoints{ method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; path: string; handler: string; category: Enum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | …>; … }[]optionalEndpoint definitions
middleware{ name: string; type: Enum<'authentication' | 'authorization' | 'logging' | 'validation' | 'transformation' | 'error' | 'custom'>; enabled: boolean; order: integer; … }[]optionalMiddleware stack for this route group
authRequiredbooleanoptional (default: true)Whether authentication is required by default
documentation{ title?: string; description?: string; tags?: string[] }optionalDocumentation metadata for this route group

RouteCoverageEntry

Properties

PropertyTypeRequiredDescription
pathstringFull URL path (e.g. /api/v1/analytics/query)
methodEnum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>HTTP method (GET, POST, etc.)
categoryEnum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | 'automation' | 'ui' | 'realtime' | 'notification' | 'ai' | 'i18n'>Route category
handlerStatusEnum<'implemented' | 'stub' | 'planned'>Handler status
servicestringTarget service name
healthCheckPassedbooleanoptionalWhether the health check probe succeeded

RouteCoverageReport

Properties

PropertyTypeRequiredDescription
timestampstringISO 8601 timestamp
adapterstringAdapter name (e.g. "hono", "express", "nextjs")
summary{ total: integer; implemented: integer; stub: integer; planned: integer }
entries{ path: string; method: Enum<'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'>; category: Enum<'discovery' | 'metadata' | 'data' | 'batch' | 'permission' | 'analytics' | …>; handlerStatus: Enum<'implemented' | 'stub' | 'planned'>; … }[]Per-endpoint coverage entries

ValidationMode

Allowed Values

  • strict
  • permissive
  • strip

On this page