# Schemas — Stardraw Cloud Admin API

156 schemas referenced by the operations. Index: https://stardraw.cloud/developer/api/admin/index.md

Base URL: `https://stardraw.cloud/api/v1/admin/`  
Authentication: `Authorization: Bearer <token>` on every request — see https://stardraw.cloud/developer/authentication  
Conventions (soft deletes, `version` on every PATCH, grid queries): https://stardraw.cloud/developer/conventions

---

## AdminFile

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | no |  |
| `name` | string | no |  |

## Anchor

0 = start, 1 = middle, 2 = end

## Application

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `customerId` | integer (int32) | no |  |
| `name` | string | yes |  |
| `description` | string | yes |  |
| `logo` | string | no |  |
| `icon` | string | no |  |
| `screenshots` | string[] | no |  |
| `helpUrl` | string | no |  |
| `unit` | string | yes |  |
| `precision` | integer (int32) | yes |  |
| `type` | `ApplicationType` | no |  |
| `expiry` | string (date-time) | no |  |
| `expired` | boolean | no |  |
| `assistantEnabled` | boolean | no |  |
| `assistantVoiceEnabled` | boolean | no |  |
| `projectSettings` | map of string → object | yes |  |
| `userSettings` | map of string → `Setting` | yes |  |
| `productCategories` | map of string → map of string → `ProductSetting` | yes |  |
| `cableCategories` | map of string → map of string → `ProductSetting` | no |  |
| `cableCategoryOrder` | string[] | no |  |
| `productCategoryOrder` | string[] | no |  |
| `productBrowserNodes` | string[] | yes |  |
| `productBrowserColumns` | string[] | no |  |
| `defaultProductSettings` | map of string → `ProductSetting` | yes |  |
| `settings` | map of string → `Setting` | yes |  |
| `viewSettings` | map of string → `Setting` | yes |  |
| `settingsVersion` | integer (int32) | no |  |
| `baseUrl` | string | no |  |
| `loginProviders` | `LoginProvider`[] | no |  |
| `uniqueNumber` | integer (int64) | no |  |
| `domains` | string[] | yes |  |
| `originalId` | string | no |  |
| `subscription` | `Subscription` | no |  |
| `theme` | `ApplicationTheme` | no |  |
| `shortcuts` | map of string → string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationCable

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `categories` | map of string → map of string → `ProductSetting` | no |  |
| `startConnector` | `ConnectorSnapshot` | no |  |
| `endConnector` | `ConnectorSnapshot` | no |  |
| `length` | number | no |  |
| `signalId` | string | no | A 24-hex ObjectId |
| `category` | string | no |  |
| `stroke` | `Stroke` | no |  |
| `diameter` | number | no |  |
| `cores` | `CableCore`[] | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationCableCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `categories` | map of string → map of string → `ProductSetting` | no |  |
| `startConnector` | `ConnectorSnapshot` | no |  |
| `endConnector` | `ConnectorSnapshot` | no |  |
| `length` | number | no |  |
| `signalId` | string | no |  |
| `category` | string | no |  |
| `stroke` | `Stroke` | no |  |
| `diameter` | number | no |  |
| `cores` | `CableCore`[] | no |  |

## ApplicationCableGridResponse

One window of ApplicationCable rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationCable`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationCable documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationCableSettings

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `labeling` | `CableLabeling` | no |  |
| `blockIncompatible` | boolean | no |  |
| `defaultConduitMaxFillPercent` | integer (int32) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationConnector

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `gender` | boolean | no | true = female, false = male |
| `glyph` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationConnectorCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `gender` | boolean | yes | true = female, false = male |
| `glyph` | string | no |  |

## ApplicationConnectorGridResponse

One window of ApplicationConnector rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationConnector`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationConnector documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationConnectorPairing

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `fromConnectorId` | string | no | A 24-hex ObjectId |
| `toConnectorId` | string | no | A 24-hex ObjectId |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationConnectorPairingCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `fromConnectorId` | string | yes | A 24-hex ObjectId |
| `toConnectorId` | string | yes | A 24-hex ObjectId |

## ApplicationConnectorPairingGridResponse

One window of ApplicationConnectorPairing rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationConnectorPairing`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationConnectorPairing documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationDomain

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `domain` | string | yes |  |

## ApplicationEmail

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes |  |
| `description` | string | yes |  |
| `from` | string | yes |  |
| `to` | string | yes |  |
| `subject` | string | yes |  |
| `body` | string | yes |  |
| `cc` | string | no |  |
| `bcc` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationEmailCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes |  |
| `description` | string | yes |  |
| `from` | string | yes |  |
| `to` | string | yes |  |
| `subject` | string | yes |  |
| `body` | string | yes |  |
| `cc` | string | no |  |
| `bcc` | string | no |  |

## ApplicationFile

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `url` | string | no |  |
| `type` | string | no |  |
| `size` | integer (int64) | no |  |
| `lastModified` | string (date-time) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationFileGridResponse

One window of ApplicationFile rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationFile`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationFile documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationList

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationListCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |

## ApplicationListItem

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `applicationListId` | string | no | A 24-hex ObjectId |
| `name` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationListItemCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |

## ApplicationProduct

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `description` | string | yes |  |
| `symbols` | map of string → `ViewSymbol` | yes |  |
| `categories` | map of string → map of string → `ProductSetting` | yes |  |
| `ports` | map of string → `Port` | yes |  |
| `accessoryOnly` | boolean | no |  |
| `accessories` | `ProductAccessory`[] | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationProductChanges

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `source` | `ApplicationProduct` | yes |  |
| `target` | `ApplicationProduct` | yes |  |

## ApplicationProductGridResponse

One window of ApplicationProduct rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationProduct`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationProduct documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationReport

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `type` | string | yes |  |
| `published` | boolean | yes |  |
| `prefix` | string | yes |  |
| `order` | integer (int32) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationReportCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `type` | string | yes |  |
| `published` | boolean | yes |  |
| `prefix` | string | yes |  |
| `definition` | object | yes |  |
| `order` | integer (int32) | no |  |

## ApplicationReportGridResponse

One window of ApplicationReport rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationReport`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationReport documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationReportWithDefinition

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `definition` | object | yes |  |
| `name` | string | yes |  |
| `type` | string | yes |  |
| `published` | boolean | yes |  |
| `prefix` | string | yes |  |
| `order` | integer (int32) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationRole

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `role` | integer (int64) | yes |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationRoleCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `role` | integer (int64) | yes |  |

## ApplicationRoleGridResponse

One window of ApplicationRole rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationRole`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationRole documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationSignal

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `prefix` | string | no |  |
| `stroke` | `Stroke` | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationSignalCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `prefix` | string | no |  |
| `stroke` | `Stroke` | no |  |

## ApplicationSignalGridResponse

One window of ApplicationSignal rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationSignal`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationSignal documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationTheme

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `fontFamily` | string | no |  |
| `headingFontFamily` | string | no |  |
| `light` | `ThemeColors` | no |  |
| `dark` | `ThemeColors` | no |  |

## ApplicationType

0 = privateType, 1 = publicType, 2 = sampleType

## ApplicationUser

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `pending` | boolean | no |  |
| `isActive` | boolean | no |  |
| `roles` | map of string → `ApplicationUserRole` | yes |  |
| `emailAddress` | string | yes |  |
| `name` | string | yes |  |
| `settings` | map of string → `Setting` | yes |  |
| `provider` | string | no |  |
| `providerName` | string | no |  |
| `externalId` | string | no |  |
| `linkedSsoProviders` | `SsoLink`[] | no |  |
| `lastLoginAt` | string (date-time) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationUserGridResponse

One window of ApplicationUser rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationUser`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationUser documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationUserRole

## ApplicationView

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `viewKey` | string | yes |  |
| `name` | string | yes |  |
| `description` | string | yes |  |
| `boundingRectangle` | `Rect` | yes |  |
| `logo` | string | yes |  |
| `grid` | `Point` | yes |  |
| `gridSnaps` | `Point` | yes |  |
| `settings` | map of string → `Setting` | yes |  |
| `unit` | string | yes |  |
| `precision` | integer (int32) | yes |  |
| `one` | number | yes |  |
| `defaults` | map of string → object | yes |  |
| `layers` | `Layer`[] | yes |  |
| `currentLayer` | string | yes |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationViewFile

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `applicationViewId` | string | no | A 24-hex ObjectId |
| `name` | string | no |  |
| `url` | string | no |  |
| `type` | string | no |  |
| `size` | integer (int64) | no |  |
| `lastModified` | string (date-time) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ApplicationViewFileGridResponse

One window of ApplicationViewFile rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `ApplicationViewFile`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not ApplicationViewFile documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ApplicationViewFromTemplate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `viewKey` | string | no |  |
| `name` | string | no |  |
| `description` | string | no |  |

## BlockIcon

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | yes |  |
| `boundingRectangle` | `Rect` | yes |  |

## BlockPortOption

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `portId` | string | yes |  |
| `side` | string | no |  |
| `group` | string | no |  |
| `hidden` | boolean | no |  |

## BlockSymbolOptions

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `ports` | `BlockPortOption`[] | no |  |
| `icon` | `BlockIcon` | no |  |
| `minWidth` | number | no |  |

## BugDiagnostics

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `errorMessage` | string | no |  |
| `errorName` | string | no |  |
| `stack` | string | no |  |
| `viewport` | string | no |  |
| `screen` | string | no |  |
| `devicePixelRatio` | string | no |  |
| `locale` | string | no |  |
| `timezone` | string | no |  |
| `platform` | string | no |  |
| `language` | string | no |  |
| `connection` | string | no |  |
| `memory` | string | no |  |
| `referrer` | string | no |  |
| `clientIp` | string | no |  |
| `appVersion` | string | no |  |

## CableCore

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes |  |
| `name` | string | yes |  |
| `color` | string | no |  |
| `signalId` | string | no | A 24-hex ObjectId |
| `startConnector` | `ConnectorSnapshot` | no |  |
| `endConnector` | `ConnectorSnapshot` | no |  |

## CableLabeling

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `idFormat` | string | no |  |
| `sequenceScope` | string | no |  |
| `padding` | integer (int32) | no |  |
| `sequenceStart` | integer (int64) | no |  |
| `fromLabel` | string | no |  |
| `middleLabel` | string | no |  |
| `toLabel` | string | no |  |
| `coreLabel` | string | no |  |
| `referenceSetting` | string | no |  |

## CatalogProductUsage

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `applicationProductId` | string | yes |  |
| `totalCount` | integer (int32) | yes |  |
| `projects` | `CatalogProductUsageProject`[] | yes |  |

## CatalogProductUsageProject

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | yes |  |
| `name` | string | yes |  |
| `locked` | boolean | yes |  |
| `count` | integer (int32) | yes |  |

## CatalogProductUsageRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `applicationProductIds` | string[] | no |  |

## ChangedProjectProducts

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `ProjectId` | string | no |  |
| `ProjectProductIds` | string[] | no |  |

## ClassicLayer

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | yes |  |
| `boundingRectangle` | `Rect` | yes |  |

## Clearance

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `top` | number | yes |  |
| `left` | number | yes |  |
| `bottom` | number | yes |  |
| `right` | number | yes |  |

## ColumnVO

A grouping or aggregation column (ag-Grid ColumnVO).

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | no | Column id (mirrors `field` for grouping columns). |
| `displayName` | string | no | For a valueCols entry, the key the aggregate is returned under in each group row. |
| `field` | string | no | The MongoDB field path the column reads. |
| `aggFunc` | string (sum \| min \| max \| avg \| first \| last \| count \| push \| addToSet) | no | Aggregation applied per group (valueCols only); any other value is ignored. |

## ConnectorSnapshot

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | no | A 24-hex ObjectId |
| `name` | string | no |  |
| `gender` | boolean | no | true = female, false = male |

## DomainStatus

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `domain` | string | yes |  |
| `validationState` | string | yes |  |
| `validationToken` | string | no |  |
| `tokenExpiry` | string | no |  |
| `cnameTarget` | string | yes |  |

## EmailChangePolicy

0 = RequireConfirmation, 1 = SilentUpdate, 2 = NeverUpdate

## EmailPreview

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `from` | string | yes |  |
| `to` | string | yes |  |
| `subject` | string | yes |  |
| `body` | string | yes |  |
| `cc` | string | no |  |
| `bcc` | string | no |  |

## Gender

0 = male, 1 = female, 2 = bi

## GenerateAppleClientSecretResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `clientSecret` | string | no |  |

## GenerateClientSecretRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `privateKeyPem` | string | no |  |
| `keyId` | string | no |  |
| `teamId` | string | no |  |
| `clientId` | string | no |  |

## GridRequest

A server-side grid query: one window of rows, filtered, sorted and optionally grouped in the database. The minimal request is `{ "startRow": 0, "endRow": 100 }`; add filterModel/sortModel to narrow and order, and rowGroupCols/groupKeys/valueCols for grouped results.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `startRow` | integer (int32) | yes | First row of the requested window (0-based, inclusive). |
| `endRow` | integer (int32) | yes | End of the requested window (exclusive) — at most endRow − startRow rows are returned. |
| `filterModel` | map of string → `IItem` | no | Column filters, keyed by the MongoDB field path into the row document (`name`, `categories.Product.Manufacturer.value`, `startConnector.name`; a path with a `*` segment such as `ports.*.connectorId` matches against every value of that map field). Each endpoint's description lists its useful paths. All entries must match (AND) unless filterModelOr is true. |
| `filterModelOr` | boolean | no | true = a row matches when ANY filterModel entry matches (OR — e.g. one search text applied across several fields); false/omitted = every entry must match (AND). |
| `sortModel` | `ISortModel`[] | no | Sort order, outermost first; omit for the natural (insertion) order. |
| `rowGroupCols` | `ColumnVO`[] | no | Row grouping, outermost level first. With more rowGroupCols than groupKeys the response holds one GROUP row per distinct value of the next level — `{ "0": <value>, "childCount": <rows in the group>, …valueCols aggregates }` — instead of plain rows; expand a group by repeating the request with its value appended to groupKeys. |
| `groupKeys` | string[] | no | The values of the already-expanded group levels, in rowGroupCols order. When every level is expanded the response returns the matching leaf rows. |
| `valueCols` | `ColumnVO`[] | no | Aggregations computed per group row (each entry's aggFunc over its field, returned under its displayName). |
| `pivotCols` | `ColumnVO`[] | no | Accepted for ag-Grid compatibility; pivoting is not implemented — ignored. |
| `pivotMode` | boolean | no | Accepted for ag-Grid compatibility; pivoting is not implemented — ignored. |

## GridResponse

One window of grid rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | map of string → object[] | yes | The requested window of rows: the stored documents as JSON (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted) — or group rows when grouping (see GridRequest.rowGroupCols). |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## IItem

One column filter. `filterType` picks the family, `type` the operation within it; a filter the server cannot apply (unknown operation, unparsable comparand) is silently DROPPED — the query runs without it, it never errors. - `text`: operations equals, notEqual, contains, notContains, startsWith, endsWith, blank, notBlank; the comparand in `filter`. contains/notContains/startsWith/endsWith match case-insensitively; equals/notEqual are exact. blank matches a null-or-missing field, notBlank the opposite. - `number`: operations equals, notEqual, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, inRange (bounds in `filter` and `filterTo`, both inclusive), blank, notBlank. The comparand is a number, `"true"`/`"false"` for a stored-boolean field, or `ObjectId("<24-hex id>")` — the way to filter a reference field that stores a MongoDB ObjectId. On a path ending `.value` (an admin-defined setting) the stored text is coerced to a number before comparing. - `date`: the same operations as number, with the comparands in `dateFrom`/`dateTo` (ISO 8601). Only for real date fields (`createdAt`, `updatedAt`); a date-typed SETTING stores its value as text — filter it as text. - `set`: matches rows whose field equals ANY entry of `values` (`type` is ignored). Values are matched as strings, except `ObjectId("<24-hex id>")` literals for reference fields, the string `null` for "field not set", and `true`/`false` for stored-boolean fields. A key with a `*` segment (`ports.*.connectorId`) applies the filter to EVERY value of that map-of-objects field and matches when any value passes (for notEqual/notContains: when none does). Supported for text, number and set filters.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `filterType` | string (text \| number \| date \| set) | yes | The filter family — see the schema description for each family's operations and comparands. |
| `type` | string (equals \| notEqual \| contains \| notContains \| startsWith \| endsWith \| greaterThan \| greaterThanOrEqual \| lessThan \| lessThanOrEqual \| inRange \| blank \| notBlank) | no | The operation. Which are valid depends on filterType; a set filter ignores it. |
| `filter` | object | no | The comparand for text and number filters (for a number inRange, the lower bound). String or number. |
| `filterTo` | string | no | Upper bound of a number inRange. |
| `values` | string[] | no | Set filter values — the row matches when its field equals any of them. |
| `dateFrom` | string | no | Date comparand (ISO 8601); for inRange, the lower bound. |
| `dateTo` | string | no | Upper bound of a date inRange (ISO 8601). |

## ISortModel

One sort level. Multiple entries sort by the first, then the second within equal values, and so on.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `colId` | string | no | The MongoDB field path to sort by — the same paths filterModel is keyed by (e.g. `name`, `categories.Product.Manufacturer.value`). |
| `sort` | string (asc \| desc) | no | Sort direction; omitted means `asc`. |

## Layer

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `visible` | boolean | yes |  |
| `locked` | boolean | yes |  |

## LoginAsRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `emailAddress` | string | no |  |

## LoginProvider

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `url` | string | yes |  |

## McpSettings

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `enabled` | boolean | no |  |
| `assistantProvider` | string | no |  |
| `assistantUrl` | string | no |  |
| `assistantModel` | string | no |  |
| `assistantApiKey` | string | no |  |
| `assistantApiKeyHint` | string | no |  |
| `voiceEnabled` | boolean | no |  |
| `voiceApiKey` | string | no |  |
| `voiceId` | string | no |  |
| `voiceName` | string | no |  |
| `voiceApiKeyHint` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## McpToolLog

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `toolName` | string | no |  |
| `userId` | string | no |  |
| `userName` | string | no |  |
| `userEmail` | string | no |  |
| `parameters` | string | no |  |
| `response` | string | no |  |
| `success` | boolean | no |  |
| `error` | string | no |  |
| `durationMs` | number | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## McpToolLogGridResponse

One window of McpToolLog rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `McpToolLog`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not McpToolLog documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## Module

0 = None, 1 = Projects, 2 = Layout, 4 = Dwg

## OAuth2ProvidersCreateRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `issuer` | string | no |  |
| `clientId` | string | no |  |
| `responseType` | string | no |  |
| `scope` | string | no |  |
| `secret` | string | no |  |
| `discoveryDoc` | `OidcDiscoveryDoc` | no |  |
| `keys` | map of string → string[] | no |  |
| `emailChangePolicy` | `EmailChangePolicy` | no |  |
| `claimMappings` | map of string → object | no |  |
| `providerOptions` | map of string → object | no |  |
| `isEnabled` | boolean | no |  |
| `type` | string | no |  |

## OAuthClient

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `clientId` | string | no |  |
| `redirectUris` | string[] | no |  |
| `clientName` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## OAuthClientCreateRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `clientName` | string | no |  |
| `redirectUris` | string[] | no |  |

## OAuthTokenResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `access_token` | string | no |  |
| `token_type` | string | no |  |
| `expires_in` | integer (int64) | no |  |
| `refresh_token` | string | no |  |
| `id_token` | string | no |  |

## OidcDiscoveryDoc

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `issuer` | string | no |  |
| `authorization_endpoint` | string | no |  |
| `token_endpoint` | string | no |  |
| `token_endpoint_auth_methods_supported` | string[] | no |  |
| `token_endpoint_auth_signing_alg_values_supported` | string[] | no |  |
| `userinfo_endpoint` | string | no |  |
| `check_session_iframe` | string | no |  |
| `end_session_endpoint` | string | no |  |
| `jwks_uri` | string | no |  |
| `registration_endpoint` | string | no |  |
| `scopes_supported` | string[] | no |  |
| `response_types_supported` | string[] | no |  |
| `acr_values_supported` | string[] | no |  |
| `response_modes_supported` | string[] | no |  |
| `grant_types_supported` | string[] | no |  |
| `subject_types_supported` | string[] | no |  |
| `userinfo_signing_alg_values_supported` | string[] | no |  |
| `userinfo_encryption_alg_values_supported` | string[] | no |  |
| `userinfo_encryption_enc_values_supported` | string[] | no |  |
| `id_token_signing_alg_values_supported` | string[] | no |  |
| `id_token_encryption_alg_values_supported` | string[] | no |  |
| `id_token_encryption_enc_values_supported` | string[] | no |  |
| `request_object_signing_alg_values_supported` | string[] | no |  |
| `display_values_supported` | string[] | no |  |
| `claim_types_supported` | string[] | no |  |
| `claims_supported` | string[] | no |  |
| `claims_parameter_supported` | boolean | no |  |
| `service_documentation` | string | no |  |
| `ui_locales_supported` | string[] | no |  |
| `revocation_endpoint` | string | no |  |

## PartialApplication

Partial Application — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `projectSettings.<key>` replaces one entry, `projectSettings.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `customerId` | integer (int32) | no |  |
| `name` | string | no |  |
| `description` | string | no |  |
| `logo` | string | no |  |
| `icon` | string | no |  |
| `screenshots` | string[] | no |  |
| `helpUrl` | string | no |  |
| `unit` | string | no |  |
| `precision` | integer (int32) | no |  |
| `type` | `ApplicationType` | no |  |
| `expiry` | string (date-time) | no |  |
| `expired` | boolean | no |  |
| `assistantEnabled` | boolean | no |  |
| `assistantVoiceEnabled` | boolean | no |  |
| `projectSettings` | map of string → object | no |  |
| `userSettings` | map of string → `Setting` | no |  |
| `productCategories` | map of string → map of string → `ProductSetting` | no |  |
| `cableCategories` | map of string → map of string → `ProductSetting` | no |  |
| `cableCategoryOrder` | string[] | no |  |
| `productCategoryOrder` | string[] | no |  |
| `productBrowserNodes` | string[] | no |  |
| `productBrowserColumns` | string[] | no |  |
| `defaultProductSettings` | map of string → `ProductSetting` | no |  |
| `settings` | map of string → `Setting` | no |  |
| `viewSettings` | map of string → `Setting` | no |  |
| `settingsVersion` | integer (int32) | no |  |
| `baseUrl` | string | no |  |
| `loginProviders` | `LoginProvider`[] | no |  |
| `uniqueNumber` | integer (int64) | no |  |
| `domains` | string[] | no |  |
| `originalId` | string | no |  |
| `subscription` | `Subscription` | no |  |
| `theme` | `ApplicationTheme` | no |  |
| `shortcuts` | map of string → string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationCable

Partial ApplicationCable — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `categories.<key>` replaces one entry, `categories.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `categories` | map of string → map of string → `ProductSetting` | no |  |
| `startConnector` | `ConnectorSnapshot` | no |  |
| `endConnector` | `ConnectorSnapshot` | no |  |
| `length` | number | no |  |
| `signalId` | string | no | A 24-hex ObjectId |
| `category` | string | no |  |
| `stroke` | `Stroke` | no |  |
| `diameter` | number | no |  |
| `cores` | `CableCore`[] | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationCableSettings

Partial ApplicationCableSettings — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `labeling` | `CableLabeling` | no |  |
| `blockIncompatible` | boolean | no |  |
| `defaultConduitMaxFillPercent` | integer (int32) | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationConnector

Partial ApplicationConnector — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `gender` | boolean | no | true = female, false = male |
| `glyph` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationConnectorPairing

Partial ApplicationConnectorPairing — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `fromConnectorId` | string | no | A 24-hex ObjectId |
| `toConnectorId` | string | no | A 24-hex ObjectId |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationEmail

Partial ApplicationEmail — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | no |  |
| `description` | string | no |  |
| `from` | string | no |  |
| `to` | string | no |  |
| `subject` | string | no |  |
| `body` | string | no |  |
| `cc` | string | no |  |
| `bcc` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationList

Partial ApplicationList — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationListItem

Partial ApplicationListItem — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `applicationListId` | string | no | A 24-hex ObjectId |
| `name` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationProduct

Partial ApplicationProduct — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `symbols.<key>` replaces one entry, `symbols.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `description` | string | no |  |
| `symbols` | map of string → `ViewSymbol` | no |  |
| `categories` | map of string → map of string → `ProductSetting` | no |  |
| `ports` | map of string → `Port` | no |  |
| `accessoryOnly` | boolean | no |  |
| `accessories` | `ProductAccessory`[] | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationReportWithDefinition

Partial ApplicationReportWithDefinition — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `definition` | object | no |  |
| `name` | string | no |  |
| `type` | string | no |  |
| `published` | boolean | no |  |
| `prefix` | string | no |  |
| `order` | integer (int32) | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationRole

Partial ApplicationRole — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `role` | integer (int64) | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationSignal

Partial ApplicationSignal — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `prefix` | string | no |  |
| `stroke` | `Stroke` | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialApplicationView

Partial ApplicationView — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `settings.<key>` replaces one entry, `settings.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `viewKey` | string | no |  |
| `name` | string | no |  |
| `description` | string | no |  |
| `boundingRectangle` | `Rect` | no |  |
| `logo` | string | no |  |
| `grid` | `Point` | no |  |
| `gridSnaps` | `Point` | no |  |
| `settings` | map of string → `Setting` | no |  |
| `unit` | string | no |  |
| `precision` | integer (int32) | no |  |
| `one` | number | no |  |
| `defaults` | map of string → object | no |  |
| `layers` | `Layer`[] | no |  |
| `currentLayer` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialMcpSettings

Partial McpSettings — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `enabled` | boolean | no |  |
| `assistantProvider` | string | no |  |
| `assistantUrl` | string | no |  |
| `assistantModel` | string | no |  |
| `assistantApiKey` | string | no |  |
| `assistantApiKeyHint` | string | no |  |
| `voiceEnabled` | boolean | no |  |
| `voiceApiKey` | string | no |  |
| `voiceId` | string | no |  |
| `voiceName` | string | no |  |
| `voiceApiKeyHint` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialOAuthClient

Partial OAuthClient — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `clientId` | string | no |  |
| `redirectUris` | string[] | no |  |
| `clientName` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialProject

Partial Project — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `settings.<key>` replaces one entry, `settings.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `cableLabeling` | `CableLabeling` | no |  |
| `name` | string | no |  |
| `description` | string | no |  |
| `settings` | map of string → object | no |  |
| `users` | map of string → `ProjectUser` | no |  |
| `uniqueNumber` | integer (int64) | no |  |
| `locked` | boolean | no |  |
| `pendingOwnershipTransfer` | `PendingOwnershipTransfer` | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialTranslation

Partial Translation — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | no |  |
| `value` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialWebhookEndpoint

Partial WebhookEndpoint — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `headers.<key>` replaces one entry, `headers.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | no |  |
| `description` | string | no |  |
| `eventTypes` | string[] | no |  |
| `headers` | map of string → string | no |  |
| `enabled` | boolean | no |  |
| `disabledReason` | string | no |  |
| `disabledAt` | string (date-time) | no |  |
| `previousSecretExpiresAt` | string (date-time) | no |  |
| `secretHint` | string | no |  |
| `notificationEmail` | string | no |  |
| `createdByUserId` | string | no | A 24-hex ObjectId |
| `lastDeliveryAt` | string (date-time) | no |  |
| `lastSuccessAt` | string (date-time) | no |  |
| `lastFailureAt` | string (date-time) | no |  |
| `failingSince` | string (date-time) | no |  |
| `failureStreak` | integer (int32) | no |  |
| `lastFailureNotifiedAt` | string (date-time) | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PartialoAuth2Provider

Partial oAuth2Provider — all fields optional except version (required for optimistic concurrency); unknown fields are rejected with 400, and an id field (the string properties with a 24-hex pattern) must be a valid 24-hex ObjectId or null — anything else is a 400 naming the path. A key may also be a DOTTED PATH into one of this object's MAP fields, which changes just that entry and leaves its siblings alone — `claimMappings.<key>` replaces one entry, `claimMappings.<key>.<field of the entry>` sets one leaf of it. Those key shapes are listed in `patternProperties` (so `additionalProperties: false` still rejects everything else), and each segment is validated the same way — a typo anywhere in the path is a 400. Use it wherever you would otherwise have to read a whole map and send it back to change one entry. Only a MISSING parent is created for you: a parent stored as null is an error, which is why a nullable object is not offered here.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `issuer` | string | no |  |
| `clientId` | string | no |  |
| `responseType` | string | no |  |
| `scope` | string | no |  |
| `secret` | string | no |  |
| `discoveryDoc` | `OidcDiscoveryDoc` | no |  |
| `keys` | map of string → string[] | no |  |
| `emailChangePolicy` | `EmailChangePolicy` | no |  |
| `claimMappings` | map of string → object | no |  |
| `providerOptions` | map of string → object | no |  |
| `isEnabled` | boolean | no |  |
| `type` | string | no |  |
| `applicationId` | string | no | A 24-hex ObjectId |
| `id` | string | no | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | no |  |
| `version` | integer (int64) | yes |  |

## PendingOwnershipTransfer

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `toUserId` | string | yes | A 24-hex ObjectId |
| `expiresAt` | string (date-time) | yes |  |
| `createdAt` | string (date-time) | yes |  |

## Point

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `x` | number | yes |  |
| `y` | number | yes |  |

## Port

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes |  |
| `gender` | `Gender` | yes |  |
| `direction` | `PortDirection` | yes |  |
| `signalId` | string | no | A 24-hex ObjectId |
| `connectorId` | string | no | A 24-hex ObjectId |

## PortDirection

0 = input, 1 = output, 2 = up, 3 = down, 4 = bidirectional

## ProductAccessory

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `productId` | string | no | A 24-hex ObjectId |
| `lineItem` | boolean | no |  |
| `quantity` | integer (int32) | no |  |
| `optional` | boolean | no |  |

## ProductAuditFinding

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `productId` | string | yes |  |
| `description` | string | yes |  |
| `check` | string | yes |  |
| `detail` | string | yes |  |

## ProductAuditRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `duplicateKeySettings` | string[] | no |  |

## ProductAuditResult

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `productsAudited` | integer (int32) | yes |  |
| `findings` | `ProductAuditFinding`[] | yes |  |
| `truncated` | boolean | yes |  |

## ProductChange

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `at` | string (date-time) | yes |  |
| `method` | string | yes |  |
| `userId` | string | yes |  |
| `userName` | string | yes |  |
| `productId` | string | yes |  |
| `description` | string | no |  |
| `version` | integer (int64) | no |  |
| `deleted` | boolean | no |  |

## ProductChangesRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `sinceDays` | integer (int32) | no |  |
| `productId` | string | no |  |
| `limit` | integer (int32) | no |  |

## ProductChangesResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `changes` | `ProductChange`[] | yes |  |
| `note` | string | yes |  |

## ProductSetting

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `index` | integer (int32) | yes |  |
| `type` | string | yes |  |
| `access` | integer (int32) | yes |  |
| `value` | string | no |  |

## ProductSettingRef

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `category` | string | no |  |
| `name` | string | no |  |

## Project

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `cableLabeling` | `CableLabeling` | no |  |
| `name` | string | yes |  |
| `description` | string | yes |  |
| `settings` | map of string → object | yes |  |
| `users` | map of string → `ProjectUser` | yes |  |
| `uniqueNumber` | integer (int64) | no |  |
| `locked` | boolean | yes |  |
| `pendingOwnershipTransfer` | `PendingOwnershipTransfer` | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## ProjectGridResponse

One window of Project rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `Project`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not Project documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## ProjectUser

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `emailAddress` | string | yes |  |
| `pending` | boolean | yes |  |
| `role` | string | yes |  |
| `lastInviteSentAt` | string (date-time) | no |  |

## Rect

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `top` | number | yes |  |
| `left` | number | yes |  |
| `right` | number | yes |  |
| `bottom` | number | yes |  |

## RegisterOAuth2ClientRequest

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `issuer` | string | no |  |
| `redirectUri` | string | no |  |

## RegisterOAuth2ClientResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `clientId` | string | no |  |

## ReindexProductsSummary

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `productsTotal` | integer (int32) | no |  |
| `productsProcessed` | integer (int32) | no |  |
| `productsSkipped` | integer (int32) | no |  |
| `chunksWritten` | integer (int32) | no |  |
| `pdfsLoaded` | integer (int32) | no |  |
| `errors` | integer (int32) | no |  |

## ReindexStartResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `instanceId` | string | no |  |

## ReindexStatus

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `instanceId` | string | no |  |
| `runtimeStatus` | string | no |  |
| `summary` | `ReindexProductsSummary` | no |  |

## SessionRecording

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `userId` | string | no | A 24-hex ObjectId |
| `userName` | string | no |  |
| `userEmailAddress` | string | no |  |
| `blobPath` | string | no |  |
| `trigger` | string | no |  |
| `startedAt` | string (date-time) | no |  |
| `durationMs` | integer (int64) | no |  |
| `sizeBytes` | integer (int64) | no |  |
| `url` | string | no |  |
| `userAgent` | string | no |  |
| `note` | string | no |  |
| `diagnostics` | `BugDiagnostics` | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## SessionRecordingGridResponse

One window of SessionRecording rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `SessionRecording`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not SessionRecording documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## SessionRecordingReadSasResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `readUrl` | string | yes |  |

## Setting

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string | yes |  |
| `access` | integer (int32) | yes |  |
| `value` | string | no |  |

## SsoLink

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `providerId` | string | no | A 24-hex ObjectId |
| `providerUserId` | string | no |  |
| `providerEmail` | string | no |  |
| `linkedAt` | string (date-time) | no |  |
| `lastAuthenticated` | string (date-time) | no |  |

## Stroke

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `color` | string | yes |  |
| `width` | number | yes |  |
| `scallop` | number | no |  |
| `style` | string | no |  |
| `opacity` | number | no |  |

## Subscription

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `modules` | `Module` | no |  |
| `paidThrough` | string (date-time) | no |  |
| `rateLimit` | integer (int32) | no |  |

## SymbolAnchor

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes |  |
| `point` | `Point` | yes |  |
| `kind` | `SymbolAnchorKind` | yes |  |
| `portId` | string | no |  |
| `d` | string | no |  |

## SymbolAnchorKind

0 = port, 1 = free, 2 = mount

## SymbolLabel

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes |  |
| `setting` | string | yes |  |
| `offset` | `Point` | yes |  |
| `fontName` | string | yes |  |
| `size` | number | yes |  |
| `color` | string | yes |  |
| `rotation` | number | no |  |
| `anchor` | `Anchor` | no |  |
| `layer` | string | no |  |

## ThemeColors

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `primary` | string | no |  |
| `accent` | string | no |  |
| `background` | string | no |  |
| `surface` | string | no |  |
| `text` | string | no |  |

## TranslateSentences

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `From` | string | yes |  |
| `To` | string | yes |  |
| `Strings` | string[] | yes |  |

## Translation

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes |  |
| `value` | string | yes |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## TranslationBatchItem

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | no |  |
| `key` | string | yes |  |
| `value` | string | no |  |
| `deleted` | boolean | no |  |

## TranslationCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes |  |
| `value` | string | yes |  |

## TranslationsTranslateResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `TranslatedStrings` | string[] | yes |  |

## UpdateProductSetting

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `settings` | `ProductSettingRef`[] | no |  |
| `applicationViewIds` | string[] | no |  |

## UpdateProductSettingResult

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `ProjectsModified` | integer (int64) | no |  |
| `ProductsModified` | integer (int64) | no |  |
| `Changed` | `ChangedProjectProducts`[] | no |  |

## UploadFile

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | yes |  |

## UploadProductError

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `Row` | integer (int32) | no |  |
| `Value` | string | no |  |
| `Message` | string | no |  |

## UploadProductsResponse

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `Errors` | `UploadProductError`[] | yes |  |
| `Added` | `ApplicationProduct`[] | yes |  |
| `Deleted` | `ApplicationProduct`[] | yes |  |
| `Changed` | `ApplicationProductChanges`[] | yes |  |

## ViewSymbol

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `used` | boolean | yes |  |
| `anchors` | `SymbolAnchor`[] | no |  |
| `labels` | `SymbolLabel`[] | no |  |
| `origin` | `Point` | no |  |
| `layers` | map of string → `ClassicLayer` | no |  |
| `clearance` | `Clearance` | no |  |
| `url` | string | no |  |
| `block` | `BlockSymbolOptions` | no |  |

## VoiceOption

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `voiceId` | string | yes |  |
| `name` | string | yes |  |
| `category` | string | no |  |

## WebhookAttempt

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `at` | string (date-time) | no |  |
| `durationMs` | integer (int32) | no |  |
| `httpStatus` | integer (int32) | no |  |
| `error` | string | no |  |
| `responseExcerpt` | string | no |  |

## WebhookDelivery

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `endpointId` | string | yes | A 24-hex ObjectId |
| `eventId` | string | yes | A 24-hex ObjectId |
| `eventType` | string | yes |  |
| `endpointUrl` | string | no |  |
| `status` | string | yes |  |
| `attemptCount` | integer (int32) | no |  |
| `nextAttemptAt` | string (date-time) | no |  |
| `claimedAt` | string (date-time) | no |  |
| `completedAt` | string (date-time) | no |  |
| `lastHttpStatus` | integer (int32) | no |  |
| `lastError` | string | no |  |
| `manual` | boolean | no |  |
| `test` | boolean | no |  |
| `requeues` | integer (int32) | no |  |
| `attempts` | `WebhookAttempt`[] | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## WebhookDeliveryDetail

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `delivery` | `WebhookDelivery` | yes |  |
| `event` | `WebhookEvent` | no |  |

## WebhookDeliveryGridResponse

One window of WebhookDelivery rows plus the total match count.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `rows` | `WebhookDelivery`[] | yes | The requested window of rows (`_id` is returned as `id`, ObjectIds as their 24-hex strings, server-only fields omitted). When grouping (more rowGroupCols than groupKeys) rows are group summaries — `{ "0": <group value>, "childCount": <n>, …aggregates }` — not WebhookDelivery documents. |
| `lastRow` | integer (int32) | yes | Total number of rows matching the filter — not just this window. |

## WebhookEndpoint

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | yes |  |
| `description` | string | no |  |
| `eventTypes` | string[] | yes |  |
| `headers` | map of string → string | no |  |
| `enabled` | boolean | no |  |
| `disabledReason` | string | no |  |
| `disabledAt` | string (date-time) | no |  |
| `previousSecretExpiresAt` | string (date-time) | no |  |
| `secretHint` | string | no |  |
| `notificationEmail` | string | no |  |
| `createdByUserId` | string | no | A 24-hex ObjectId |
| `lastDeliveryAt` | string (date-time) | no |  |
| `lastSuccessAt` | string (date-time) | no |  |
| `lastFailureAt` | string (date-time) | no |  |
| `failingSince` | string (date-time) | no |  |
| `failureStreak` | integer (int32) | no |  |
| `lastFailureNotifiedAt` | string (date-time) | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## WebhookEndpointCreate

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | yes |  |
| `description` | string | no |  |
| `eventTypes` | string[] | yes |  |
| `headers` | map of string → string | no |  |
| `enabled` | boolean | no |  |
| `notificationEmail` | string | no |  |

## WebhookEndpointCreated

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `endpoint` | `WebhookEndpoint` | yes |  |
| `secret` | string | yes |  |

## WebhookEvent

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string | yes |  |
| `occurredAt` | string (date-time) | no |  |
| `actorUserId` | string | no | A 24-hex ObjectId |
| `actorEmail` | string | no |  |
| `projectId` | string | no | A 24-hex ObjectId |
| `objectId` | string | no |  |
| `payload` | string | yes |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |

## WebhookEventTypeInfo

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string | yes |  |
| `group` | string | yes |  |
| `description` | string | yes |  |

## WebhookSecret

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `secret` | string | yes |  |

## WebhookSecretRoll

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `gracePeriodHours` | integer (int32) | no |  |

## oAuth2Provider

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no |  |
| `issuer` | string | no |  |
| `clientId` | string | no |  |
| `responseType` | string | no |  |
| `scope` | string | no |  |
| `secret` | string | no |  |
| `discoveryDoc` | `OidcDiscoveryDoc` | no |  |
| `keys` | map of string → string[] | no |  |
| `emailChangePolicy` | `EmailChangePolicy` | no |  |
| `claimMappings` | map of string → object | no |  |
| `providerOptions` | map of string → object | no |  |
| `isEnabled` | boolean | no |  |
| `type` | string | no |  |
| `applicationId` | string | yes | A 24-hex ObjectId |
| `id` | string | yes | A 24-hex ObjectId |
| `createdAt` | string (date-time) | no |  |
| `updatedAt` | string (date-time) | no |  |
| `deleted` | boolean | yes |  |
| `version` | integer (int64) | yes |  |
