ObjectStackObjectStack

Protocol

Protocol protocol schemas

Source: packages/spec/src/api/protocol.zod.ts

TypeScript Usage

import { AiAgentCapabilitiesSchema, AiAgentChatRequestSchema, AiAgentSummarySchema, AiAgentsResponseSchema, AiChatRequestSchema, AiChatResponseSchema, AiCompleteRequestSchema, AiConversationSchema, AiMessageSchema, AiModelsResponseSchema, AiPendingActionSchema, AiPendingActionStatusSchema, AiStreamChunkSchema, ApproveAiPendingActionResponseSchema, AutomationActionsResponseSchema, AutomationTriggerRequestSchema, AutomationTriggerResponseSchema, BatchDataRequestSchema, BatchDataResponseSchema, CheckPermissionRequestSchema, CheckPermissionResponseSchema, CreateAiConversationRequestSchema, CreateDataRequestSchema, CreateDataResponseSchema, CreateManyDataRequestSchema, CreateManyDataResponseSchema, DeleteDataRequestSchema, DeleteDataResponseSchema, DeleteManyDataRequestSchema, DeleteManyDataResponseSchema, DeleteMetaItemRequestSchema, DeleteMetaItemResponseSchema, DisablePackageRequestSchema, DisablePackageResponseSchema, EnablePackageRequestSchema, EnablePackageResponseSchema, FindDataRequestSchema, FindDataResponseSchema, GetDataRequestSchema, GetDataResponseSchema, GetDiscoveryRequestSchema, GetDiscoveryResponseSchema, GetEffectivePermissionsRequestSchema, GetEffectivePermissionsResponseSchema, GetFieldLabelsRequestSchema, GetFieldLabelsResponseSchema, GetLocalesRequestSchema, GetLocalesResponseSchema, GetMetaItemCachedRequestSchema, GetMetaItemCachedResponseSchema, GetMetaItemLayeredResponseSchema, GetMetaItemRequestSchema, GetMetaItemResponseSchema, GetMetaItemsRequestSchema, GetMetaItemsResponseSchema, GetMetaTypesRequestSchema, GetMetaTypesResponseSchema, GetNotificationPreferencesRequestSchema, GetNotificationPreferencesResponseSchema, GetObjectPermissionsRequestSchema, GetObjectPermissionsResponseSchema, GetPackageRequestSchema, GetPackageResponseSchema, GetPresenceRequestSchema, GetPresenceResponseSchema, GetTranslationsRequestSchema, GetTranslationsResponseSchema, GetUiViewRequestSchema, GetUiViewResponseSchema, HttpFindQueryParamsSchema, InstallPackageRequestSchema, InstallPackageResponseSchema, ListAiConversationsRequestSchema, ListAiConversationsResponseSchema, ListAiPendingActionsRequestSchema, ListAiPendingActionsResponseSchema, ListNotificationsRequestSchema, ListNotificationsResponseSchema, ListPackagesRequestSchema, ListPackagesResponseSchema, MarkAllNotificationsReadRequestSchema, MarkAllNotificationsReadResponseSchema, MarkNotificationsReadRequestSchema, MarkNotificationsReadResponseSchema, NotificationSchema, NotificationPreferencesSchema, PublishMetaItemResponseSchema, RealtimeConnectRequestSchema, RealtimeConnectResponseSchema, RealtimeDisconnectRequestSchema, RealtimeDisconnectResponseSchema, RealtimeSubscribeRequestSchema, RealtimeSubscribeResponseSchema, RealtimeUnsubscribeRequestSchema, RealtimeUnsubscribeResponseSchema, RegisterDeviceRequestSchema, RegisterDeviceResponseSchema, RejectAiPendingActionResponseSchema, RuntimeAuthoringIssueSchema, SaveMetaItemRequestSchema, SaveMetaItemResponseSchema, SetPresenceRequestSchema, SetPresenceResponseSchema, UninstallPackageRequestSchema, UninstallPackageResponseSchema, UnregisterDeviceRequestSchema, UnregisterDeviceResponseSchema, UpdateAiConversationRequestSchema, UpdateDataRequestSchema, UpdateDataResponseSchema, UpdateManyDataRequestSchema, UpdateManyDataResponseSchema, UpdateNotificationPreferencesRequestSchema, UpdateNotificationPreferencesResponseSchema, ValidateDataIssueSchema, ValidateDataRequestSchema, ValidateDataResponseSchema } from '@objectstack/spec/api';
import type { AiAgentCapabilities, AiAgentChatRequest, AiAgentSummary, AiAgentsResponse, AiChatRequest, AiChatResponse, AiCompleteRequest, AiConversation, AiMessage, AiModelsResponse, AiPendingAction, AiPendingActionStatus, AiStreamChunk, ApproveAiPendingActionResponse, AutomationActionsResponse, AutomationTriggerRequest, AutomationTriggerResponse, BatchDataRequest, BatchDataResponse, CheckPermissionRequest, CheckPermissionResponse, CreateAiConversationRequest, CreateDataRequest, CreateDataResponse, CreateManyDataRequest, CreateManyDataResponse, DeleteDataRequest, DeleteDataResponse, DeleteManyDataRequest, DeleteManyDataResponse, DeleteMetaItemRequest, DeleteMetaItemResponse, DisablePackageRequest, DisablePackageResponse, EnablePackageRequest, EnablePackageResponse, FindDataRequest, FindDataResponse, GetDataRequest, GetDataResponse, GetDiscoveryRequest, GetDiscoveryResponse, GetEffectivePermissionsRequest, GetEffectivePermissionsResponse, GetFieldLabelsRequest, GetFieldLabelsResponse, GetLocalesRequest, GetLocalesResponse, GetMetaItemCachedRequest, GetMetaItemCachedResponse, GetMetaItemLayeredResponse, GetMetaItemRequest, GetMetaItemResponse, GetMetaItemsRequest, GetMetaItemsResponse, GetMetaTypesRequest, GetMetaTypesResponse, GetNotificationPreferencesRequest, GetNotificationPreferencesResponse, GetObjectPermissionsRequest, GetObjectPermissionsResponse, GetPackageRequest, GetPackageResponse, GetPresenceRequest, GetPresenceResponse, GetTranslationsRequest, GetTranslationsResponse, GetUiViewRequest, GetUiViewResponse, InstallPackageRequest, InstallPackageResponse, ListAiConversationsRequest, ListAiConversationsResponse, ListAiPendingActionsRequest, ListAiPendingActionsResponse, ListNotificationsRequest, ListNotificationsResponse, ListPackagesRequest, ListPackagesResponse, MarkAllNotificationsReadRequest, MarkAllNotificationsReadResponse, MarkNotificationsReadRequest, MarkNotificationsReadResponse, Notification, NotificationPreferences, PublishMetaItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeDisconnectRequest, RealtimeDisconnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RealtimeUnsubscribeRequest, RealtimeUnsubscribeResponse, RegisterDeviceRequest, RegisterDeviceResponse, RejectAiPendingActionResponse, RuntimeAuthoringIssue, SaveMetaItemRequest, SaveMetaItemResponse, SetPresenceRequest, SetPresenceResponse, UninstallPackageRequest, UninstallPackageResponse, UnregisterDeviceRequest, UnregisterDeviceResponse, UpdateAiConversationRequest, UpdateDataRequest, UpdateDataResponse, UpdateManyDataRequest, UpdateManyDataResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ValidateDataIssue, ValidateDataRequest, ValidateDataResponse } from '@objectstack/spec/api';

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

AiAgentCapabilities

Properties

PropertyTypeRequiredDescription
authoringbooleanAuthors app metadata (objects/views/flows)
canvasbooleanDrives the Live Canvas split view (ADR-0037)
debugbooleanExposes the build-doctor debug drawer
resumebooleanTurns resume durable multi-step runs (ADR-0013)

AiAgentChatRequest

Properties

PropertyTypeRequiredDescription
messages({ role: Enum<'system' | 'user' | 'assistant' | 'tool'>; content?: any; parts?: any[] } & Record<string, any>)[]Conversation messages (at least one)
contextRecord<string, any>optionalAgent context (app, object, record, …)
optionsRecord<string, any>optionalRequest options (model, temperature, …)

AiAgentSummary

Properties

PropertyTypeRequiredDescription
namestringAgent name — the :agentName path segment
labelstringDisplay label
rolestringAgent role
capabilities{ authoring: boolean; canvas: boolean; debug: boolean; resume: boolean }Capability set implied by the agent surface

AiAgentsResponse

Properties

PropertyTypeRequiredDescription
agents{ name: string; label: string; role: string; capabilities: object }[]Agents this caller may chat with

AiChatRequest

Properties

PropertyTypeRequiredDescription
messages({ role: Enum<'system' | 'user' | 'assistant' | 'tool'>; content?: any; parts?: any[] } & Record<string, any>)[]Conversation messages (at least one)
systemstringoptionalSystem prompt, prepended as a system message
modelstringoptionalModel id override
temperaturenumberoptionalSampling temperature
maxTokensintegeroptionalMaximum tokens to generate
streambooleanoptionalfalse → JSON response; otherwise the UI Message Stream Protocol
conversationIdstringoptionalConversation to persist this turn into (auto-created when omitted)
turnIdstringoptionalStable per-turn idempotency key (ADR-0013 D1)
optionsRecord<string, any>optionalLegacy nested request options

AiChatResponse

Properties

PropertyTypeRequiredDescription
contentstringGenerated text
modelstringoptionalModel that produced it
toolCallsany[]optionalTool calls the model requested (Vercel ToolCallPart)
usage{ promptTokens: number; completionTokens: number; totalTokens: number }optionalToken usage
conversationIdstringoptionalConversation the turn was persisted into

AiCompleteRequest

Properties

PropertyTypeRequiredDescription
promptstringPrompt text
optionsRecord<string, any>optionalRequest options (model, temperature, maxTokens, …)

AiConversation

Properties

PropertyTypeRequiredDescription
idstringConversation id
titlestringoptionalTitle / summary
agentIdstringoptionalAgent this conversation is bound to
userIdstringoptionalOwning user
messages({ role: Enum<'system' | 'user' | 'assistant' | 'tool'>; content?: any; parts?: any[] } & Record<string, any>)[]Message history
createdAtstringCreation timestamp (ISO 8601)
updatedAtstringLast update timestamp (ISO 8601)
metadataRecord<string, any>optionalConversation metadata

AiMessage

Properties

PropertyTypeRequiredDescription
roleEnum<'system' | 'user' | 'assistant' | 'tool'>Message role
contentanyoptionalMessage content: a string, or an array of content parts
partsany[]optionalVercel AI SDK v6 message parts (alternative to content)

AiModelsResponse

Properties

PropertyTypeRequiredDescription
models(string | { id: string; label: string; default: boolean })[]Models this environment offers
defaultModelstringoptionalDefault model id, when the service reports one

AiPendingAction

Properties

PropertyTypeRequiredDescription
idstringPending action id
object_namestringObject the action targets
action_namestringAction name
tool_namestringTool that would execute it
tool_inputstringSerialized tool input
statusEnum<'pending' | 'approved' | 'executed' | 'failed' | 'rejected'>Lifecycle status
resultstringoptionalSerialized result, once executed
errorstringoptionalFailure message, when status is failed
rejection_reasonstringoptionalReason given at rejection
conversation_idstringoptionalConversation that proposed it
message_idstringoptionalMessage that proposed it
proposed_bystringoptionalActor that proposed it
decided_bystringoptionalActor that approved or rejected it
proposed_atstringProposal timestamp (ISO 8601)
decided_atstringoptionalDecision timestamp (ISO 8601)

AiPendingActionStatus

Allowed Values

  • pending
  • approved
  • executed
  • failed
  • rejected

AiStreamChunk

Properties

PropertyTypeRequiredDescription
typestringFrame type (text-delta, tool-input-available, finish, error, …)

ApproveAiPendingActionResponse

Properties

PropertyTypeRequiredDescription
statusEnum<'executed' | 'failed'>Outcome of executing the approved action
resultanyoptionalTool result, when executed
errorstringoptionalFailure reason, when failed

AutomationActionsResponse

Properties

PropertyTypeRequiredDescription
actions{ type: string; version: string; name: string; description?: string; … }[]Registered action descriptors (built-in + plugin)
totalintegerNumber of descriptors returned (after any filters)

AutomationTriggerRequest

Properties

PropertyTypeRequiredDescription
triggerstring
payloadRecord<string, any>

AutomationTriggerResponse

Properties

PropertyTypeRequiredDescription
successboolean
jobIdstringoptional
resultanyoptional

BatchDataRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name
request{ operation: Enum<'create' | 'update' | 'upsert' | 'delete'>; records: object[]; options?: object }Batch operation request

BatchDataResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +264 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
operationEnum<'create' | 'update' | 'upsert' | 'delete'>optionalOperation type that was performed
totalnumberTotal number of records in the batch
succeedednumberNumber of records that succeeded
failednumberNumber of records that failed
results{ id?: string; success: boolean; errors?: object[]; data?: Record<string, any>; … }[]Detailed results for each record

CheckPermissionRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name to check permissions for
actionEnum<'create' | 'read' | 'edit' | 'delete' | 'transfer' | 'restore' | 'purge'>Action to check
recordIdstringoptionalSpecific record ID (for record-level checks)
fieldstringoptionalSpecific field name (for field-level checks)

CheckPermissionResponse

Properties

PropertyTypeRequiredDescription
allowedbooleanWhether the action is permitted
reasonstringoptionalReason if denied

CreateAiConversationRequest

Properties

PropertyTypeRequiredDescription
titlestringoptionalInitial title
agentIdstringoptionalAgent to bind the conversation to
metadataRecord<string, any>optionalConversation metadata

CreateDataRequest

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
dataRecord<string, any>The dictionary of field values to insert.

CreateDataResponse

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
idstringThe ID of the newly created record.
recordRecord<string, any>The created record, including server-generated fields (created_at, owner).
droppedFields{ object: string; fields: string[]; reason: Enum<'readonly' | 'readonly_when' | 'primary_key'> }[]optionalWrite-observability (#3407/#3431): caller-supplied fields that were LEGALLY stripped before the record was written — a non-system create cannot seed a static readonly column (#3043 ingress strip), so those keys are dropped and the field re-derives its default. Present ONLY when ≥1 field was dropped; the create still succeeded without them (status/success semantics unchanged). REST additionally surfaces this as the X-ObjectStack-Dropped-Fields response header. Optional — omit-when-empty keeps the shape backward-compatible for existing clients.

CreateManyDataRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name
recordsRecord<string, any>[]Array of records to create

CreateManyDataResponse

Properties

PropertyTypeRequiredDescription
objectstringObject name
recordsRecord<string, any>[]Created records
countnumberNumber of records created
droppedFields{ object: string; fields: string[]; reason: Enum<'readonly' | 'readonly_when' | 'primary_key'> }[]optionalWrite-observability (#3407/#3431/#3455): caller-supplied readonly fields the #3043 create-ingress strip removed before the rows were written. AGGREGATED across the batch (one event per object/reason with the union of dropped field names) rather than per-row, because the insert-time strip is static-readonly only — schema-uniform, so every row drops the same set. Present ONLY when ≥1 field was dropped; the creates still succeeded without them (count/success unchanged). Optional — omit-when-empty keeps the shape backward-compatible. (The per-row insertMany/batch paths carry per-row droppedFields on each result instead — see BatchOperationResultSchema.)

DeleteDataRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name
idstringRecord ID to delete
expectedVersionstringoptionalOptimistic concurrency token (typically the updated_at value the client read). When provided, the server compares it against the current record version and returns 409 CONCURRENT_UPDATE if they differ. Optional — omit to skip the check.

DeleteDataResponse

Properties

PropertyTypeRequiredDescription
objectstringObject name
idstringDeleted record ID
successbooleanWhether deletion succeeded

DeleteManyDataRequest

Properties

PropertyTypeRequiredDescription
idsstring[]Array of record IDs to delete (server caps the count — see batch.maxBatchSize)
options{ atomic: boolean; returnRecords: boolean; continueOnError: boolean }optionalDelete options
objectstringObject name

DeleteManyDataResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +264 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
operationEnum<'create' | 'update' | 'upsert' | 'delete'>optionalOperation type that was performed
totalnumberTotal number of records in the batch
succeedednumberNumber of records that succeeded
failednumberNumber of records that failed
results{ id?: string; success: boolean; errors?: object[]; data?: Record<string, any>; … }[]Detailed results for each record

DeleteMetaItemRequest

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
namestringItem name

DeleteMetaItemResponse

Properties

PropertyTypeRequiredDescription
successboolean
resetbooleanoptional
messagestringoptional

DisablePackageRequest

Disable package request

Properties

PropertyTypeRequiredDescription
idstringPackage ID to disable

DisablePackageResponse

Disable package response

Properties

PropertyTypeRequiredDescription
package{ manifest: object; status?: Enum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>; enabled?: boolean; installedAt?: string; … }Disabled package details
messagestringoptionalDisable status message

EnablePackageRequest

Enable package request

Properties

PropertyTypeRequiredDescription
idstringPackage ID to enable

EnablePackageResponse

Enable package response

Properties

PropertyTypeRequiredDescription
package{ manifest: object; status?: Enum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>; enabled?: boolean; installedAt?: string; … }Enabled package details
messagestringoptionalEnable status message

FindDataRequest

Properties

PropertyTypeRequiredDescription
objectstringThe unique machine name of the object to query (e.g. "account").
query{ object: string; fields?: string[]; where?: any; search?: string | object; … }optionalStructured query definition (filter, sort, select, pagination).

FindDataResponse

Properties

PropertyTypeRequiredDescription
objectstringThe object name for the returned records.
recordsRecord<string, any>[]The list of matching records.
totalnumberoptionalTotal number of records matching the filter (if requested).
nextCursorstringoptionalCursor for the next page of results (cursor-based pagination).
hasMorebooleanoptionalTrue if there are more records available (pagination).

GetDataRequest

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
idstringThe unique record identifier (primary key).
selectstring[]optionalFields to include in the response (allowlisted query param).
expandstring[]optionalLookup/master_detail field names to expand. The engine resolves these via batch $in queries, replacing foreign key IDs with full objects.

GetDataResponse

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
idstringThe record ID.
recordRecord<string, any>The complete record data.

GetDiscoveryRequest

Properties

PropertyTypeRequiredDescription

GetDiscoveryResponse

Properties

PropertyTypeRequiredDescription
namestringoptional
versionstring
environmentEnum<'production' | 'sandbox' | 'development'>optionalDeployment 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).
routes{ data: string; metadata: string; discovery?: string; ui?: string; … }optional
locale{ default: string; supported: string[]; timezone: string }optional
servicesRecord<string, { enabled: boolean; status: Enum<'available' | 'registered' | 'unavailable' | 'degraded' | 'stub'>; handlerReady?: boolean; route?: string; … }>optionalPer-service availability map keyed by CoreServiceName
capabilities{ comments: object; automation: object; cron: object; search: object; … }optionalHierarchical capability descriptors — the full WellKnownCapabilities vocabulary, every key present
schemaDiscovery{ openapi?: string; jsonSchema?: string }optionalSchema discovery endpoints for API toolchain integration
scoping{ enabled: boolean; resolution: Enum<'required' | 'optional' | 'auto'>; scoped: boolean; environmentId?: string }optionalEnvironment-scoping posture, added by the REST discovery endpoint
metadataRecord<string, any>optionalCustom metadata key-value pairs for extensibility
apiNamestringoptionalAPI name (deprecated — use name; removed in protocol 18)

GetEffectivePermissionsRequest

Properties

PropertyTypeRequiredDescription

GetEffectivePermissionsResponse

Properties

PropertyTypeRequiredDescription
objectsRecord<string, { allowCreate: boolean; allowRead: boolean; allowEdit: boolean; allowDelete: boolean; … }>Effective object permissions keyed by object name
systemPermissionsstring[]Effective system-level permissions

GetFieldLabelsRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name
localestringBCP-47 locale code

GetFieldLabelsResponse

Properties

PropertyTypeRequiredDescription
objectstringObject name
localestringLocale code
labelsRecord<string, { label: string; help?: string; options?: Record<string, string> }>Field labels keyed by field name

GetLocalesRequest

Properties

PropertyTypeRequiredDescription

GetLocalesResponse

Properties

PropertyTypeRequiredDescription
locales{ code: string; label: string; isDefault: boolean }[]Available locales

GetMetaItemCachedRequest

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
namestringItem name
cacheRequest{ ifNoneMatch?: string; ifModifiedSince?: string; cacheControl?: object }optionalCache validation parameters
localestringoptionalResolved response locale. Folded into the ETag so a language switch never returns a stale-locale 304 — metadata is translated after the cache validator check (issue #1319).

GetMetaItemCachedResponse

Properties

PropertyTypeRequiredDescription
dataanyoptionalMetadata payload (omitted for 304 Not Modified)
etag{ value: string; weak: boolean }optionalETag for this resource version
lastModifiedstringoptionalLast modification timestamp
cacheControl{ directives: Enum<'public' | 'private' | 'no-cache' | 'no-store' | 'must-revalidate' | 'max-age'>[]; maxAge?: number; staleWhileRevalidate?: number; staleIfError?: number }optionalCache control directives
notModifiedbooleanTrue if resource has not been modified (304 response)
versionstringoptionalMetadata version identifier

GetMetaItemLayeredResponse

Properties

PropertyTypeRequiredDescription
typestringMetadata type name (canonical singular)
namestringItem name
codeanyLAYER 1 — the packaged artifact baseline exactly as shipped, before any tenant customization. null when no artifact ships this item (it exists only as an overlay).
overlayanyLAYER 2 — the stored customization row ALONE, not merged with code. null when this tenant has not customized the item.
overlayScopeEnum<'org' | 'env'> | nullWhich scope the overlay row was read from — org for a tenant overlay, env for an environment-level one. null exactly when overlay is null.
effectiveanyLAYER 3 — the merged result, i.e. the value an ordinary GET /meta/:type/:name would return under item. null when the item resolves to nothing at all.
_diagnostics{ valid: boolean; errors?: object[]; warnings?: object[] }optionalLoad-time spec-validation verdict for effective, so the Studio edit page can raise invalid-metadata banners and inline field errors without a second round trip. ABSENT for metadata types that register no Zod schema (function / service / router) — absence means "no opinion", never "valid".
lockEnum<'none' | 'no-overlay' | 'no-delete' | 'full'>Resolved lock verdict (ADR-0010 §3.3), artifact winning over overlay. Always present on this path.
lockReasonstringoptionalHuman-readable explanation shown next to a refused write. Present only when the resolved item declares _lockReason.
lockSourceEnum<'artifact' | 'package' | 'env-forced'>optionalWhich layer asserted the lock. Present only when the resolved item declares _lockSource.
lockDocsUrlstringoptionalDocumentation link surfaced beside lockReason. Present only when the resolved item declares _lockDocsUrl.
provenanceEnum<'package' | 'org' | 'env-forced'>optionalWhere the item came from (package | org | env-forced). Present only when the resolved item declares _provenance.
packageIdstringoptionalOwning package machine id. Present only when the resolved item declares _packageId.
packageVersionstringoptionalOwning package version. Present only when the resolved item declares _packageVersion.
editablebooleanWhether an overlay write is permitted. Always present on this path.
deletablebooleanWhether deleting the overlay is permitted. Always present on this path.
resettablebooleanWhether the item can be reset to its packaged default. Always present on this path.

GetMetaItemRequest

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
namestringItem name (snake_case identifier)
packageIdstringoptionalOptional package ID to filter items by

GetMetaItemResponse

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
namestringItem name
itemanyMetadata item definition
lockEnum<'none' | 'no-overlay' | 'no-delete' | 'full'>optionalResolved lock verdict for this item (ADR-0010 §3.3). none means unlocked; no-overlay / no-delete / full refuse the corresponding write with 403 ITEM_LOCKED. Resolved from the document's _lock, with the packaged artifact winning over any org overlay.
lockReasonstringoptionalHuman-readable explanation shown next to a refused write. Present only when the resolved item declares _lockReason.
lockSourceEnum<'artifact' | 'package' | 'env-forced'>optionalWhich layer asserted the lock. Present only when the resolved item declares _lockSource.
lockDocsUrlstringoptionalDocumentation link surfaced beside lockReason. Present only when the resolved item declares _lockDocsUrl.
provenanceEnum<'package' | 'org' | 'env-forced'>optionalWhere the item came from (package | org | env-forced). Present only when the resolved item declares _provenance.
packageIdstringoptionalOwning package machine id. Present only when the resolved item declares _packageId.
packageVersionstringoptionalOwning package version. Present only when the resolved item declares _packageVersion.
editablebooleanoptionalWhether an overlay write is permitted — false iff lock is no-overlay or full. A derived verdict: do not recompute it from lock client-side.
deletablebooleanoptionalWhether deleting the overlay is permitted — false iff lock is no-delete or full.
resettablebooleanoptionalWhether the item can be reset to its packaged default — true iff it is artifact-backed, i.e. there is a baseline to reset TO.

GetMetaItemsRequest

Properties

PropertyTypeRequiredDescription
typestringMetadata type name (e.g., "object", "plugin")
packageIdstringoptionalOptional package ID to filter items by

GetMetaItemsResponse

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
itemsany[]Array of metadata items

GetMetaTypesRequest

Properties

PropertyTypeRequiredDescription

GetMetaTypesResponse

Properties

PropertyTypeRequiredDescription
typesstring[]Available metadata type names (e.g., "object", "plugin", "view")
entries{ type: string; label: string; description?: string; filePatterns: string[]; … }[]optionalEnriched per-type registry entries (Phase 3a)

GetNotificationPreferencesRequest

Properties

PropertyTypeRequiredDescription

GetNotificationPreferencesResponse

Properties

PropertyTypeRequiredDescription
preferences{ email: boolean; push: boolean; inApp: boolean; digest: Enum<'none' | 'daily' | 'weekly'>; … }Current notification preferences

GetObjectPermissionsRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name to get permissions for

GetObjectPermissionsResponse

Properties

PropertyTypeRequiredDescription
objectstringObject name
permissions{ allowCreate: boolean; allowRead: boolean; allowEdit: boolean; allowDelete: boolean; … }Object-level permissions
fieldPermissionsRecord<string, { readable: boolean; editable: boolean }>optionalField-level permissions keyed by field name

GetPackageRequest

Get package request

Properties

PropertyTypeRequiredDescription
idstringPackage identifier

GetPackageResponse

Get package response

Properties

PropertyTypeRequiredDescription
package{ manifest: object; status?: Enum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>; enabled?: boolean; installedAt?: string; … }Package details

GetPresenceRequest

Properties

PropertyTypeRequiredDescription
channelstringChannel to get presence for

GetPresenceResponse

Properties

PropertyTypeRequiredDescription
channelstringChannel name
members{ userId: string; status: Enum<'online' | 'away' | 'busy' | 'offline'>; lastSeen: string; metadata?: Record<string, any> }[]Active members and their presence state

GetTranslationsRequest

Properties

PropertyTypeRequiredDescription
localestringBCP-47 locale code

GetTranslationsResponse

Properties

PropertyTypeRequiredDescription
localestringLocale code
translations{ objects?: Record<string, object>; apps?: Record<string, object>; messages?: Record<string, string>; globalActions?: Record<string, object>; … }Translation data

GetUiViewRequest

Properties

PropertyTypeRequiredDescription
objectstringObject name (snake_case)
typeEnum<'list' | 'form'>View type

GetUiViewResponse

Properties

PropertyTypeRequiredDescription
namestringoptionalItem name — supplied by the metadata door; for an object-scoped container it is the object name.
labelstring | Record<string, string>optionalHuman-readable label shown in metadata lists.
objectstringoptionalObject this container binds to — how a stack-level views: [...] entry says which object its views belong to; read by getViewsByObject() / GET /meta/view?object=.
list{ name?: string; label?: string | Record<string, string>; type?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>; data?: object | … +3 more; … }optional
form{ type?: Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'>; layout?: Enum<'vertical' | 'horizontal' | 'inline' | 'grid'>; columns?: integer; title?: string; … }optional
listViewsRecord<string, { name?: string; label?: string | Record<string, string>; type?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>; data?: object | … +3 more; … }>optionalAdditional named list views (views mode — dropdown userFilters allowed, no tabs; ADR-0047)
formViewsRecord<string, { type?: Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'>; layout?: Enum<'vertical' | 'horizontal' | 'inline' | 'grid'>; columns?: integer; title?: string; … }>optionalAdditional named form views
protection{ lock: Enum<'none' | 'no-overlay' | 'no-delete' | 'full'>; reason: string; docsUrl?: string }optionalPackage author protection block — lock policy for this view.
_lockEnum<'none' | 'no-overlay' | 'no-delete' | 'full'>optionalItem-level lock — controls overlay & delete (ADR-0010).
_lockReasonstringoptionalHuman-readable reason shown when a write is refused by _lock.
_lockSourceEnum<'artifact' | 'package' | 'env-forced'>optionalLayer that set _lock (artifact | package | env-forced).
_provenanceEnum<'package' | 'org' | 'env-forced'>optionalOrigin of the item (package | org | env-forced).
_packageIdstringoptionalOwning package machine id.
_packageVersionstringoptionalOwning package version.
_lockDocsUrlstringoptionalOptional documentation link surfaced next to _lockReason.

HttpFindQueryParams

Properties

PropertyTypeRequiredDescription
filterstringoptionalJSON-encoded filter expression (canonical, singular).
filtersstringoptionalJSON-encoded filter expression (deprecated plural alias).
selectstringoptionalComma-separated list of fields to retrieve.
sortstringoptionalSort expression (e.g. "name asc,created_at desc" or "-created_at").
orderBystringoptionalAlias for sort (OData compatibility).
topnumberoptionalMax records to return (limit).
skipnumberoptionalRecords to skip (offset).
expandstringoptionalComma-separated list of lookup/master_detail field names to expand. Resolved to populate array and passed to the engine for batch $in expansion.
searchstringoptionalFull-text search query.
distinctneveroptional[REMOVED] query.distinct was removed in @objectstack/spec 17 (#4286, ADR-0049 / ADR-0078) — no driver ever rendered SELECT DISTINCT; the flag's only observable effect was MIS-WIRED: the REST list path treated a distinct query as not countable and silently degraded total/hasMore to a page-local estimate while still returning duplicate rows. Delete the key; QueryBuilder.distinct() was removed with it, and the count suppression is gone (total is truthful again). For unique values of one column use the SQL/memory drivers' distinct(object, field) door; for unique combinations, groupBy; for a deduplicated count, the count_distinct aggregation.
countbooleanoptionalInclude total count in response.

InstallPackageRequest

Install package request

Properties

PropertyTypeRequiredDescription
manifest{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }Package manifest to install
settingsRecord<string, any>optionalUser-provided settings at install time
enableOnInstallbooleanoptionalWhether to enable immediately after install
platformVersionstringoptionalCurrent platform version for compatibility verification

InstallPackageResponse

Install package response

Properties

PropertyTypeRequiredDescription
package{ manifest: object; status?: Enum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>; enabled?: boolean; installedAt?: string; … }Installed package details
messagestringoptionalInstallation status message
dependencyResolution{ dependencies: object[]; canProceed: boolean; requiredActions: object[]; installOrder: string[]; … }optionalDependency resolution result from install analysis

ListAiConversationsRequest

Properties

PropertyTypeRequiredDescription
agentIdstringoptionalFilter by agent
limitintegeroptionalMaximum conversations to return
cursorstringoptionalPagination cursor

ListAiConversationsResponse

Properties

PropertyTypeRequiredDescription
conversations{ id: string; title?: string; agentId?: string; userId?: string; … }[]Matching conversations

ListAiPendingActionsRequest

Properties

PropertyTypeRequiredDescription
statusEnum<'pending' | 'approved' | 'executed' | 'failed' | 'rejected'>optionalFilter by status
conversationIdstringoptionalFilter by proposing conversation
limitintegeroptionalMax rows (server default 100)

ListAiPendingActionsResponse

Properties

PropertyTypeRequiredDescription
items{ id: string; object_name: string; action_name: string; tool_name: string; … }[]Queued actions, newest first
totalnumberNumber of rows returned (not a total across pages)

ListNotificationsRequest

Properties

PropertyTypeRequiredDescription
readbooleanoptionalFilter by read status
typestringoptionalFilter by notification type
limitnumberoptionalMaximum number of notifications to return — the newest N. Omitted leaves the window to the server, which is not a fixed part of this contract: the platform inbox answers 50 and clamps any requested value into 1..200 rather than refusing it. This endpoint is not paginated — there is no continuation token, so a larger window is the only way to see more.
cursorneveroptional[REMOVED] cursor was removed from GET /api/v1/notifications in @objectstack/spec 17 (#6361, ADR-0049) — it was declared on the request AND the response and honoured on neither: the server reads only read/type/limit, and no emit site ever wrote the response key, so a caller paginating by it re-read the first window forever with no error and no 400. Delete the key; the cursor argument of client.notifications.list() was removed with it. This route is NOT paginated — it answers the newest limit notifications and stops, so ask for a bigger window (limit, clamped by the server into 1..200) instead of a next page. A first-class inbox cursor, if ever built, will be a response-minted opaque token, not this key.

ListNotificationsResponse

Properties

PropertyTypeRequiredDescription
notifications{ id: string; type: string; title: string; body: string; … }[]List of notifications — the newest window, not a page
unreadCountnumberTotal number of unread notifications
cursorneveroptional[REMOVED] cursor was removed from GET /api/v1/notifications in @objectstack/spec 17 (#6361, ADR-0049) — it was declared on the request AND the response and honoured on neither: the server reads only read/type/limit, and no emit site ever wrote the response key, so a caller paginating by it re-read the first window forever with no error and no 400. Delete the key; the cursor argument of client.notifications.list() was removed with it. This route is NOT paginated — it answers the newest limit notifications and stops, so ask for a bigger window (limit, clamped by the server into 1..200) instead of a next page. A first-class inbox cursor, if ever built, will be a response-minted opaque token, not this key.

ListPackagesRequest

List packages request

Properties

PropertyTypeRequiredDescription
statusEnum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>optionalFilter by package status
typeEnum<'plugin' | 'ui' | 'driver' | 'server' | 'app' | 'theme' | 'agent' | 'objectql' | 'module' | 'gateway' | 'adapter'>optionalFilter by package type
enabledbooleanoptionalFilter by enabled state

ListPackagesResponse

List packages response

Properties

PropertyTypeRequiredDescription
packages{ manifest: object; status?: Enum<'installed' | 'disabled' | 'installing' | 'upgrading' | 'uninstalling' | 'error'>; enabled?: boolean; installedAt?: string; … }[]List of installed packages
totalnumberTotal package count

MarkAllNotificationsReadRequest

Properties

PropertyTypeRequiredDescription

MarkAllNotificationsReadResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether the operation succeeded
readCountnumberNumber of notifications marked as read

MarkNotificationsReadRequest

Properties

PropertyTypeRequiredDescription
idsstring[]Notification IDs to mark as read

MarkNotificationsReadResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether the operation succeeded
readCountnumberNumber of notifications marked as read

Notification

Properties

PropertyTypeRequiredDescription
idstringNotification ID
typestringNotification type
titlestringNotification title
bodystringNotification body text
readbooleanWhether notification has been read
dataRecord<string, any>optionalAdditional notification data
actionUrlstringoptionalURL to navigate to when clicked
createdAtstringWhen notification was created

NotificationPreferences

Properties

PropertyTypeRequiredDescription
emailbooleanReceive email notifications
pushbooleanReceive push notifications
inAppbooleanReceive in-app notifications
digestEnum<'none' | 'daily' | 'weekly'>Email digest frequency
channelsRecord<string, { enabled: boolean; email?: boolean; push?: boolean }>optionalPer-channel notification preferences

PublishMetaItemResponse

Properties

PropertyTypeRequiredDescription
successbooleanAlways true on a 2xx — the draft was promoted. It does NOT cover the best-effort side effects below, each of which reports its own success.
versionstringContent hash of the just-promoted body, and the token the ADR-0008 optimistic-concurrency chain runs on: send it back as the If-Match request header on the next write to that item and a concurrent edit is reported as 409 metadata_conflict instead of silently overwritten. Opaque to callers — echo it verbatim, never parse it. Currently emitted as sha256:<64 hex chars>, but the format is not part of this contract.
seqintegerMonotonic sequence number of the op='publish' metadata event this promotion appended to the item history (sys_metadata_history.event_seq). Orders writes; unlike version it is not an OCC token.
seedApplied{ success: boolean; inserted: integer; updated: integer; error?: string; … }optionalOutcome of materializing a published seed body into data rows. Present ONLY when the published type is seed — publishing a seed is what makes its rows live, so the load rides along with the metadata promotion. Best-effort: a seed-load problem is surfaced here, never thrown, so a caller must check seedApplied.success instead of assuming the 200 covered the data. Absent on the batch path, which suppresses the per-item apply and loads every seed body in one later pass.
materializeApplied{ success: boolean; inserted: integer; updated: integer; error?: string }optionalOutcome of the ADR-0086 P2 publish-time materializer — the step that projects the published body into its data-plane row (e.g. permissionsys_permission_set, under the owning package). Present ONLY when a materializer is registered for this metadata type, which is why it is optional: its absence means "no materializer ran", never "it failed". Best-effort, same contract as seedApplied.
projectionApplied{ success: boolean; error?: string }optionalOutcome of the awaited ADR-0094 mutation projector — the post-persist step that materializes this metadata into its derived data-plane read model. The same receipt {@link SaveMetaItemResponseSchema} carries, because the projector runs on BOTH write doors: a direct active save and this draft→active promotion. Present ONLY when a projector is registered for this metadata type. Best-effort — a projector failure is reported here and logged, never thrown.
messagestringoptionalHuman-readable receipt, e.g. Published draft — type=view, name=cases [seq=3]. The producer sets it on every publish today; it stays optional to match the producer's own signature and its SaveMetaItemResponse twin, and because an absent human-readable string strips no data — the failure mode #5745 exists to prevent.

RealtimeConnectRequest

Properties

PropertyTypeRequiredDescription
transportEnum<'websocket' | 'sse' | 'polling'>optionalPreferred transport protocol
channelsstring[]optionalChannels to subscribe to on connect
tokenstringoptionalAuthentication token

RealtimeConnectResponse

Properties

PropertyTypeRequiredDescription
connectionIdstringUnique connection identifier
transportEnum<'websocket' | 'sse' | 'polling'>Negotiated transport protocol
urlstringoptionalWebSocket/SSE endpoint URL

RealtimeDisconnectRequest

Properties

PropertyTypeRequiredDescription
connectionIdstringoptionalConnection ID to disconnect

RealtimeDisconnectResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether disconnection succeeded

RealtimeSubscribeRequest

Properties

PropertyTypeRequiredDescription
channelstringChannel name to subscribe to
eventsstring[]optionalSpecific event types to listen for
filterRecord<string, any>optionalEvent filter criteria

RealtimeSubscribeResponse

Properties

PropertyTypeRequiredDescription
subscriptionIdstringUnique subscription identifier
channelstringSubscribed channel name

RealtimeUnsubscribeRequest

Properties

PropertyTypeRequiredDescription
subscriptionIdstringSubscription ID to cancel

RealtimeUnsubscribeResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether unsubscription succeeded

RegisterDeviceRequest

Properties

PropertyTypeRequiredDescription
tokenstringDevice push notification token
platformEnum<'ios' | 'android' | 'web'>Device platform
deviceIdstringoptionalUnique device identifier
namestringoptionalDevice friendly name

RegisterDeviceResponse

Properties

PropertyTypeRequiredDescription
deviceIdstringRegistered device ID
successbooleanWhether registration succeeded

RejectAiPendingActionResponse

Properties

PropertyTypeRequiredDescription
status'rejected'Always "rejected"
idstringThe rejected action id

RuntimeAuthoringIssue

Properties

PropertyTypeRequiredDescription
rulestringStable diagnostic rule id (flow-multi-write-unfiltered, approval-expression-invalid, …). Machine-readable and stable across releases — the key a renderer groups or suppresses by.
pathstringConfig path inside the SUBMITTED body (flows[0].nodes[1].config.multi), so an editor can jump to the offending key. May be empty when the finding is about the item as a whole.
wherestringHuman-readable location — flow "leave_approval" · node "approve". Prose for a person; use path for anything mechanical.
messagestringWhat is wrong, in the rule author's own words.
hintstringHow to fix it.
severityEnum<'error' | 'warning' | 'info'>How the gate treated this finding. error means the write was REFUSED (these appear on the 422, never on a 2xx); warning / info are advisory — the write succeeded and the finding is FYI.

SaveMetaItemRequest

Properties

PropertyTypeRequiredDescription
typestringMetadata type name
namestringItem name
itemanyMetadata item definition

SaveMetaItemResponse

Properties

PropertyTypeRequiredDescription
successboolean
versionstringContent hash of the just-committed body, and the token the ADR-0008 optimistic-concurrency chain runs on: send it back as the If-Match request header on the next write to that item and a concurrent edit is reported as 409 metadata_conflict instead of silently overwritten. Opaque to callers — echo it verbatim, never parse it. Currently emitted as sha256:<64 hex chars>, but the format is not part of this contract.
seqintegerMonotonic sequence number of the metadata event this write appended to the item history (sys_metadata_history.event_seq). Orders writes; unlike version it is not an OCC token.
stateEnum<'draft' | 'active'>Lifecycle the body was written into: "draft" when the request asked for draft mode (?mode=draft), otherwise "active" (published and live). A draft is staged only — it is not served to the runtime until published.
projectionApplied{ success: boolean; error?: string }optionalOutcome of the awaited ADR-0094 mutation projector — the post-persist step that materializes this metadata into its derived data-plane read model (e.g. permissionsys_permission_set). Present ONLY when a projector is registered for this metadata type, which is why it is optional: its absence means "no projector ran", never "the projection failed". Best-effort by design — a projector failure is reported here and logged, never thrown, so a caller that needs the read model to be live must check projectionApplied.success rather than rely on the 200.
advisories{ rule: string; path: string; where: string; message: string; … }[]optionalNon-gating findings from the #4463 runtime authoring gate — the same shared author-time rules os validate / os build / os lint run, applied to this body on its way to active. The write SUCCEEDED; these are what the gate has to say about it anyway (#4717, closing #4463 D3). Present ONLY when at least one advisory was raised — an empty array is never emitted, so a clean save's response bytes are unchanged and absence means "nothing to report", never "the gate did not run". Advisory by construction: every entry has severity warning or info, because an error finding refuses the write and arrives as the 422 invalid_metadata envelope instead of here. A caller that ignores this key behaves exactly as before. Runtime-only: the CLI surfaces the same findings on its own stdout, and a Studio / MCP / AI author has no CLI at all, which is the gap #4463 exists to close. NOTE the door asymmetry — POST /meta/:type/:name/publish does not carry this field yet (its declaration landed separately as #7294); the gate runs on both doors, only the save door reports.
messagestringoptional

SetPresenceRequest

Properties

PropertyTypeRequiredDescription
channelstringChannel to set presence in
state{ userId: string; status: Enum<'online' | 'away' | 'busy' | 'offline'>; lastSeen: string; metadata?: Record<string, any> }Presence state to set

SetPresenceResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether presence was set

UninstallPackageRequest

Uninstall package request

Properties

PropertyTypeRequiredDescription
idstringPackage ID to uninstall

UninstallPackageResponse

Uninstall package response

Properties

PropertyTypeRequiredDescription
idstringUninstalled package ID
successbooleanWhether uninstall succeeded
messagestringoptionalUninstall status message

UnregisterDeviceRequest

Properties

PropertyTypeRequiredDescription
deviceIdstringDevice ID to unregister

UnregisterDeviceResponse

Properties

PropertyTypeRequiredDescription
successbooleanWhether unregistration succeeded

UpdateAiConversationRequest

Properties

PropertyTypeRequiredDescription
titlestringoptionalNew title
metadataRecord<string, any>optionalNew metadata

UpdateDataRequest

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
idstringThe ID of the record to update.
dataRecord<string, any>The fields to update (partial update).
expectedVersionstringoptionalOptimistic concurrency token (typically the updated_at value the client read). When provided, the server compares it against the current record version and returns 409 CONCURRENT_UPDATE if they differ. Optional — omit to skip the check.

UpdateDataResponse

Properties

PropertyTypeRequiredDescription
objectstringObject name
idstringUpdated record ID
recordRecord<string, any>Updated record
droppedFields{ object: string; fields: string[]; reason: Enum<'readonly' | 'readonly_when' | 'primary_key'> }[]optionalWrite-observability (#3407/#3431): caller-supplied fields the engine LEGALLY stripped from the write before persisting — static readonly (#2948) or a TRUE readonlyWhen predicate (#3042). Present ONLY when ≥1 field was dropped; the update still succeeded without them (status/success semantics unchanged — stripping is legitimate, not an error). REST additionally surfaces this as the X-ObjectStack-Dropped-Fields response header. Optional — omit-when-empty keeps the shape backward-compatible for existing clients that only read record.

UpdateManyDataRequest

Properties

PropertyTypeRequiredDescription
records{ id: string; data: Record<string, any> }[]Array of records to update (server caps the count — see batch.maxBatchSize)
options{ atomic: boolean; returnRecords: boolean; continueOnError: boolean }optionalUpdate options
objectstringObject name

UpdateManyDataResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +264 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
operationEnum<'create' | 'update' | 'upsert' | 'delete'>optionalOperation type that was performed
totalnumberTotal number of records in the batch
succeedednumberNumber of records that succeeded
failednumberNumber of records that failed
results{ id?: string; success: boolean; errors?: object[]; data?: Record<string, any>; … }[]Detailed results for each record

UpdateNotificationPreferencesRequest

Properties

PropertyTypeRequiredDescription
preferences{ email?: boolean; push?: boolean; inApp?: boolean; digest?: Enum<'none' | 'daily' | 'weekly'>; … }Preferences to update

UpdateNotificationPreferencesResponse

Properties

PropertyTypeRequiredDescription
preferences{ email: boolean; push: boolean; inApp: boolean; digest: Enum<'none' | 'daily' | 'weekly'>; … }Updated notification preferences

ValidateDataIssue

Properties

PropertyTypeRequiredDescription
fieldstringThe field the finding is about (_record for an object-level rule).
codestringMachine-readable finding code, e.g. required, invalid_type, rule_violation.
messagestringHuman-readable message — a validation rule's author-written text where one exists.

ValidateDataRequest

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
dataRecord<string, any> | Record<string, any>[]A candidate record, or an array of them. Nothing is persisted.
modeEnum<'insert' | 'update'>optionalWhich write the verdict should predict. insert (default) walks every declared field, so a missing required field is a finding; update judges only the supplied keys, matching a PATCH.

ValidateDataResponse

Properties

PropertyTypeRequiredDescription
objectstringThe object name.
modeEnum<'insert' | 'update'>The write mode the verdict was reached for.
validbooleanTrue when EVERY row is valid — the whole-set answer.
results{ valid: boolean; errors: object[]; warnings: object[] }[]Per-row verdicts, in submission order.
posture{ valueShapeStrict: boolean; mediaValueShapeStrict: boolean }The ADR-0104 posture the verdict was reached under — reported because it is the difference between "this row is fine" and "this row is fine HERE". The same row can be an error on a self-certified deployment and an admitted warning on an un-migrated one, and a caller explaining a verdict needs to know which it got. An unconditionally-strict preview was considered and rejected (#4633 option B): it would fail rows on every un-migrated deployment that the write would have accepted.

On this page

TypeScript UsageAiAgentCapabilitiesPropertiesAiAgentChatRequestPropertiesAiAgentSummaryPropertiesAiAgentsResponsePropertiesAiChatRequestPropertiesAiChatResponsePropertiesAiCompleteRequestPropertiesAiConversationPropertiesAiMessagePropertiesAiModelsResponsePropertiesAiPendingActionPropertiesAiPendingActionStatusAllowed ValuesAiStreamChunkPropertiesApproveAiPendingActionResponsePropertiesAutomationActionsResponsePropertiesAutomationTriggerRequestPropertiesAutomationTriggerResponsePropertiesBatchDataRequestPropertiesBatchDataResponsePropertiesCheckPermissionRequestPropertiesCheckPermissionResponsePropertiesCreateAiConversationRequestPropertiesCreateDataRequestPropertiesCreateDataResponsePropertiesCreateManyDataRequestPropertiesCreateManyDataResponsePropertiesDeleteDataRequestPropertiesDeleteDataResponsePropertiesDeleteManyDataRequestPropertiesDeleteManyDataResponsePropertiesDeleteMetaItemRequestPropertiesDeleteMetaItemResponsePropertiesDisablePackageRequestPropertiesDisablePackageResponsePropertiesEnablePackageRequestPropertiesEnablePackageResponsePropertiesFindDataRequestPropertiesFindDataResponsePropertiesGetDataRequestPropertiesGetDataResponsePropertiesGetDiscoveryRequestPropertiesGetDiscoveryResponsePropertiesGetEffectivePermissionsRequestPropertiesGetEffectivePermissionsResponsePropertiesGetFieldLabelsRequestPropertiesGetFieldLabelsResponsePropertiesGetLocalesRequestPropertiesGetLocalesResponsePropertiesGetMetaItemCachedRequestPropertiesGetMetaItemCachedResponsePropertiesGetMetaItemLayeredResponsePropertiesGetMetaItemRequestPropertiesGetMetaItemResponsePropertiesGetMetaItemsRequestPropertiesGetMetaItemsResponsePropertiesGetMetaTypesRequestPropertiesGetMetaTypesResponsePropertiesGetNotificationPreferencesRequestPropertiesGetNotificationPreferencesResponsePropertiesGetObjectPermissionsRequestPropertiesGetObjectPermissionsResponsePropertiesGetPackageRequestPropertiesGetPackageResponsePropertiesGetPresenceRequestPropertiesGetPresenceResponsePropertiesGetTranslationsRequestPropertiesGetTranslationsResponsePropertiesGetUiViewRequestPropertiesGetUiViewResponsePropertiesHttpFindQueryParamsPropertiesInstallPackageRequestPropertiesInstallPackageResponsePropertiesListAiConversationsRequestPropertiesListAiConversationsResponsePropertiesListAiPendingActionsRequestPropertiesListAiPendingActionsResponsePropertiesListNotificationsRequestPropertiesListNotificationsResponsePropertiesListPackagesRequestPropertiesListPackagesResponsePropertiesMarkAllNotificationsReadRequestPropertiesMarkAllNotificationsReadResponsePropertiesMarkNotificationsReadRequestPropertiesMarkNotificationsReadResponsePropertiesNotificationPropertiesNotificationPreferencesPropertiesPublishMetaItemResponsePropertiesRealtimeConnectRequestPropertiesRealtimeConnectResponsePropertiesRealtimeDisconnectRequestPropertiesRealtimeDisconnectResponsePropertiesRealtimeSubscribeRequestPropertiesRealtimeSubscribeResponsePropertiesRealtimeUnsubscribeRequestPropertiesRealtimeUnsubscribeResponsePropertiesRegisterDeviceRequestPropertiesRegisterDeviceResponsePropertiesRejectAiPendingActionResponsePropertiesRuntimeAuthoringIssuePropertiesSaveMetaItemRequestPropertiesSaveMetaItemResponsePropertiesSetPresenceRequestPropertiesSetPresenceResponsePropertiesUninstallPackageRequestPropertiesUninstallPackageResponsePropertiesUnregisterDeviceRequestPropertiesUnregisterDeviceResponsePropertiesUpdateAiConversationRequestPropertiesUpdateDataRequestPropertiesUpdateDataResponsePropertiesUpdateManyDataRequestPropertiesUpdateManyDataResponsePropertiesUpdateNotificationPreferencesRequestPropertiesUpdateNotificationPreferencesResponsePropertiesValidateDataIssuePropertiesValidateDataRequestPropertiesValidateDataResponseProperties