---
title: "API Map"
section: "Developer Platform"
canonical_url: "https://support.buildwithhq.com/api/api-map.html"
reviewed_at: "2026-09-14"
authority: Official
---

# API Map

Route inventory for native modules, Developer API operations and Build This recipes.

## In brief

- **First-class:** 25 capabilities
- **Build This:** 18 products
- **Surfaces:** Tenant runtime + Developer API

Status: generated for Developer Kit **1.20.70** from current repository contracts. Public OpenAPI SHA-256: `5f9bf4cee2ede9c6715ab4ec81822690e1c0cfd954571abb48f62d624e9527f2`; platform OpenAPI SHA-256: `67769f799e55d571518adfe4f63c60cc8a1bb9853e1c4f1256304469787eefab`.

Shipped operations catalog (`catalog/operations.json`) SHA-256: `b2c80609e287117773d179b7ed3c7412ce9a1fad46f162ef2c935b50369f6b93`.

This is a source-generated inventory. Its fingerprints describe these inputs; immutable package publication and deployment are recorded separately.

This document inventories the two application-facing HTTP surfaces without treating client-supplied identity as authorization:

- **Tenant runtime** routes begin with `/api/` and are used by rendered, authenticated SaaS pages.
- **Developer API** routes begin with `/v1/apps/{saasAppId}/` and are used by live-app or delegated-user integrations according to each OpenAPI operation's scopes.

The first section includes every route under the exact API base paths of all 25 documented first-class capabilities. The Build This section includes every route in the canonical generated recipe and every additional OpenAPI operation explicitly named by the runnable solution manifest. When a Build This product composes a first-class capability, the complete capability route set remains in section 1 and is linked from the product entry instead of being copied repeatedly.

Excluded from section 1 are control-plane, authentication, health, payment-support, and product-specific renderer routes that are not one of the 25 documented first-class capabilities. The portable runtime renderer routes are documented explicitly below; other excluded routes appear in section 2 only when a canonical Build This recipe or solution manifest references them.

## What you need beyond this inventory

The first-class and Build This tables answer the native product-surface question. A complete headless SaaS also needs the supporting platform contracts below.

**App design: pages, validation, history and publishing**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/design/authorization` | `developerAppDesignAuthorizationGet` |
| `GET` | `/v1/apps/{saasAppId}/design/pages` | `developerAppDesignPagesList` |
| `POST` | `/v1/apps/{saasAppId}/design/pages` | `developerAppDesignPagesCreate` |
| `GET` | `/v1/apps/{saasAppId}/design/pages/{pageKey}` | `developerAppDesignPagesGet` |
| `PUT` | `/v1/apps/{saasAppId}/design/pages/{pageKey}/draft` | `developerAppDesignPagesSaveDraft` |
| `POST` | `/v1/apps/{saasAppId}/design/pages/{pageKey}/validate` | `developerAppDesignPagesValidate` |
| `GET` | `/v1/apps/{saasAppId}/design/pages/{pageKey}/history` | `developerAppDesignPagesHistory` |
| `POST` | `/v1/apps/{saasAppId}/design/pages/{pageKey}/publish` | `developerAppDesignPagesPublish` |

**App design: authoring and app-wide custom fields**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/design/authoring` | `developerAppDesignAuthoringGet` |
| `PUT` | `/v1/apps/{saasAppId}/design/authoring/user-types/{userTypeKey}` | `developerAppDesignAuthoringUpsertUserType` |
| `PUT` | `/v1/apps/{saasAppId}/design/authoring/user-types/{userTypeKey}/menu` | `developerAppDesignAuthoringSaveMenu` |
| `PUT` | `/v1/apps/{saasAppId}/design/authoring/user-types/{userTypeKey}/tenant-policy` | `developerAppDesignAuthoringSaveTenantPresentationPolicy` |
| `GET` | `/v1/apps/{saasAppId}/design/authoring/tenant-policies` | `developerAppDesignAuthoringGetTenantPresentationPolicies` |
| `GET` | `/v1/apps/{saasAppId}/design/fields/{moduleKey}` | `developerAppDesignFieldsList` |
| `POST` | `/v1/apps/{saasAppId}/design/fields/{moduleKey}` | `developerAppDesignFieldsCreate` |
| `PUT` | `/v1/apps/{saasAppId}/design/fields/{moduleKey}/{fieldDefinitionId}` | `developerAppDesignFieldsUpdate` |
| `GET` | `/v1/apps/{saasAppId}/design/fields/{moduleKey}/policy` | `developerAppDesignFieldsGetPolicy` |
| `PUT` | `/v1/apps/{saasAppId}/design/fields/{moduleKey}/policy` | `developerAppDesignFieldsSetPolicy` |

**App design: debug sessions (shared with the in-app debug drawer)**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/design/debug/sessions` | `developerAppDesignDebugStart` |
| `POST` | `/v1/apps/{saasAppId}/design/debug/sessions/{debugSessionId}/events` | `developerAppDesignDebugAppend` |
| `GET` | `/v1/apps/{saasAppId}/design/debug/sessions/{debugSessionId}` | `developerAppDesignDebugQuery` |
| `GET` | `/v1/apps/{saasAppId}/design/debug/sessions/history` | `developerAppDesignDebugHistory` |
| `GET` | `/v1/apps/{saasAppId}/design/debug/sessions/history/{debugSessionId}` | `developerAppDesignDebugHistoryTimeline` |
| `DELETE` | `/v1/apps/{saasAppId}/design/debug/sessions/{debugSessionId}` | `developerAppDesignDebugClose` |

**Payments and payment connectors**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/payment-connectors` | `developerPaymentConnectorsList` |
| `POST` | `/v1/apps/{saasAppId}/payment-connectors` | `developerPaymentConnectorsCreate` |
| `PUT` | `/v1/apps/{saasAppId}/payment-connectors/{connectorId}` | `developerPaymentConnectorsUpdate` |
| `DELETE` | `/v1/apps/{saasAppId}/payment-connectors/{connectorId}` | `developerPaymentConnectorsDeactivate` |
| `GET` | `/v1/apps/{saasAppId}/modules/payments/settings` | `developerGetV1AppsModulesPaymentsSettings` |
| `PUT` | `/v1/apps/{saasAppId}/modules/payments/settings/{moduleKey}` | `developerPutV1AppsModulesPaymentsSettingsModuleKey` |
| `GET` | `/v1/apps/{saasAppId}/modules/payments/methods` | `developerGetV1AppsModulesPaymentsMethods` |
| `POST` | `/v1/apps/{saasAppId}/modules/payments/records/{recordId}/charges` | `developerPostV1AppsModulesPaymentsRecordsRecordIdGuidCharges` |

**Webhooks, deliveries and event types**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/webhooks` | `developerWebhookSubscriptionsList` |
| `POST` | `/v1/apps/{saasAppId}/webhooks` | `developerWebhookSubscriptionsCreate` |
| `PUT` | `/v1/apps/{saasAppId}/webhooks/{subscriptionId}` | `developerWebhookSubscriptionsUpdate` |
| `POST` | `/v1/apps/{saasAppId}/webhooks/{subscriptionId}/rotate-secret` | `developerWebhookSubscriptionsRotate` |
| `GET` | `/v1/apps/{saasAppId}/webhook-deliveries` | `developerWebhookDeliveriesList` |
| `POST` | `/v1/apps/{saasAppId}/webhook-deliveries/{deliveryId}/retry` | `developerWebhookDeliveriesRetry` |
| `GET` | `/v1/apps/{saasAppId}/webhook-event-types` | `developerWebhookSubscriptionsListEventTypes` |

**Objects API**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/objects` | `developerRecordsListObjects` |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/schema` | `developerRecordsGetSchema` |
| `POST` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/search` | `developerRecordsSearch` |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | `developerRecordsGet` |
| `PATCH` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | `developerRecordsUpdate` |
| `DELETE` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | `developerRecordsDelete` |
| `POST` | `/v1/apps/{saasAppId}/objects/{objectKey}/records` | `developerRecordsCreate` |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}/relationships` | `developerRecordsRelationships` |

**Custom-field definitions**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/fields` | `developerCustomFieldsList` |
| `POST` | `/v1/apps/{saasAppId}/objects/{objectKey}/fields` | `developerCustomFieldsCreate` |
| `PUT` | `/v1/apps/{saasAppId}/objects/{objectKey}/fields/{fieldDefinitionId}` | `developerCustomFieldsUpdate` |

**Signup, tenant accounts, users and token exchange**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/accounts` | `developerHeadlessIdentityCreateAccount` |
| `GET` | `/v1/apps/{saasAppId}/accounts` | `developerOrganizationLifecycleList` |
| `GET` | `/v1/apps/{saasAppId}/accounts/by-external-id` | `developerHeadlessIdentityGetAccount` |
| `GET` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users` | `developerHeadlessIdentityListUsers` |
| `POST` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users` | `developerHeadlessIdentityCreateUser` |
| `PATCH` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users/{userId}` | `developerHeadlessIdentityUpdateUser` |
| `POST` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users/{userId}/deactivate` | `developerHeadlessIdentityDeactivateUser` |
| `POST` | `/v1/apps/{saasAppId}/user-token-exchanges` | `developerHeadlessIdentityExchangeUserToken` |

**Governed Skills and GoClaw assignment**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/skills` | `developerSkillsList` |
| `GET` | `/v1/apps/{saasAppId}/skills/{skillVersionId}` | `developerSkillsGet` |
| `PUT` | `/v1/apps/{saasAppId}/goclaw-agents/{goClawAgentId}/skills/{skillKey}` | `developerSkillsAssign` |

**Tenant-owner outside forms**

| Method | Route | OpenAPI operationId |
| --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/outsideformsubmissions/endpoints` | `developerOutsideFormsList` |
| `POST` | `/v1/apps/{saasAppId}/outsideformsubmissions/endpoints` | `developerOutsideFormsCreate` |
| `PUT` | `/v1/apps/{saasAppId}/outsideformsubmissions/endpoints/{endpointId}` | `developerOutsideFormsUpdate` |
| `GET` | `/v1/apps/{saasAppId}/outsideformsubmissions/browser-challenge` | `developerOutsideFormsBrowserChallenge` |
| `GET` | `/v1/apps/{saasAppId}/outsideformsubmissions/{submissionId}` | `developerOutsideFormsGetSubmission` |

## Embed a page body or the whole published page

An external frontend can render either the portable page body inside its own navigation and theme or the complete BuildWithHQ page shell. Both choices use the published page definition and the same server-side entitlement fallback as the hosted tenant runtime; a page response grants no additional data authority.

| Method | Route | Result / purpose | Required credential | Required scope | OpenAPI operationId |
| --- | --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/runtime/bindings` | Resolve 1..24 unique page binding keys with current-user record security | `DelegatedUserCredential` | `runtime.bindings.read` | `developerRuntimePagesResolveBindings` |
| `GET` | `/v1/apps/{saasAppId}/runtime/pages/{pageKey}` | Page body only (`components + page`); host supplies its own shell and navigation | `DelegatedUserCredential` | `runtime.pages.read` | `developerRuntimePagesGetBody` |
| `GET` | `/v1/apps/{saasAppId}/runtime/pages/{pageKey}/bootstrap` | Whole published page bootstrap (`shell + components + page`) | `DelegatedUserCredential` | `runtime.pages.read` | `developerRuntimePagesGetBootstrap` |

Use the body route for `components + page`. Its `includeDesignTokens` query parameter defaults to `false`, so the host's CSS wins; set it to `true` when page-level design tokens should travel with the body. Use the bootstrap route for `shell + components + page`, including BuildWithHQ menus, top bar, entitled-page navigation, and tenant presentation.

After loading either representation, send the page's unique binding keys to the batch binding route. Each item returns its own safe `ok`, `notFound`, `forbidden`, or `invalid` status. Resolution runs through the registered runtime binding contract and current secured stored procedures, so tenant, user, DataRole, location, and record visibility still come from the delegated identity rather than request data.

These routes accept only a delegated user token (`bwu_live_`); a live-app credential (`bwk_live_`) is rejected even if it names the scope. The Developer Kit SDK exposes the flow through `BuildWithHQRuntimeClient.getPageBody`, `getPageBootstrap`, and `resolveBindings`.

Installed marketplace services have a separate app-specific discovery and contract-projection surface. See [`MARKETPLACE-SERVICE-APIS.md`](../MARKETPLACE-SERVICE-APIS.md) for endpoint schemas, per-app OpenAPI, contract fingerprints, MCP discovery, and the shipped database-policy evidence.

## Manage SaaS CSS and design assets

A trusted backend can manage the theme and shared design library for its credential-bound SaaS application. These routes require a server-held live app credential (`bwk_live_`); draft and delegated-user credentials cannot use them.

| Method | Route | Purpose | Scope | OpenAPI operationId |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/assets` | List shared app-level assets | `assets.read` | `developerAssetsList` |
| `POST` | `/v1/apps/{saasAppId}/assets` | Multipart upload; 25 MiB maximum | `assets.write` | `developerAssetsUpload` |
| `DELETE` | `/v1/apps/{saasAppId}/assets/{assetId}` | Retire an asset and its stored bytes | `assets.write` | `developerAssetsDelete` |
| `GET` | `/v1/apps/{saasAppId}/assets/{assetId}/content` | Authenticated attachment download | `assets.read` | `developerAssetsContent` |
| `GET` | `/v1/apps/{saasAppId}/theme` | Read app theme, CSS variables, and design tokens | `themes.read` | `developerThemesGet` |
| `PUT` | `/v1/apps/{saasAppId}/theme` | Version-fenced app theme update | `themes.write` | `developerThemesPut` |

Theme updates use optimistic versioning and validated `--runtime-*` CSS variables plus bounded base design tokens. Asset upload is `multipart/form-data` with required binary `file` plus optional metadata. Uploads default to private; `isPublic=true` is required to receive an immutable `https://assets.buildwithhq.com/{saasAppId}/{assetId}` URL. Asset types are the fixed `document`, `font`, `image`, `stylesheet`, and `video` set. Compile Tailwind in the developer's own build pipeline and upload the resulting CSS; these routes never execute npm, plugins, arbitrary JavaScript, or build scripts. CSS is validated before publication; `.dll`, `.com`, and `.exe` are rejected. Page-specific structure and tokens remain on the draft/validate/publish routes. No route accepts a physical storage root, storage key, server, database, account, or connection string. See [`SAAS-DESIGN-ASSETS.md`](../SAAS-DESIGN-ASSETS.md) for the complete React, Tailwind, asset, and page-publishing workflow.

## Associate eligible records into a recursive graph

Every first-class or Build This entity backed by a canonical, authorized `Records.RecordId` can participate in the shared Record Graph. Derived projections that do not own a Record must link back to their native owner instead.

1. Open the seed record graph. The response returns the currently visible nodes and edges plus the registered `relationTypes` that may be selected; do not invent a relation key.

2. Add an edge from the seed to another authorized record using that target's `recordId` and one returned `relationKey`.

3. Repeat the same operation from any related record to build a multi-level graph. Traversal follows both incoming and outgoing edges, deduplicates previously visited nodes, and safely supports cyclic graphs.

4. Read the recursive result with `maxDepth` from 1 through 5 and `maxNodes` from 2 through 200. Smaller bounds are recommended for ordinary screens; the response reports `depthReached`, `nodeCount`, and `truncated`.

5. Remove an edge by its returned `recordRelationId`; removing a relationship does not delete either record.

| Surface | Purpose | Method and route | Body / bounds |
| --- | --- | --- | --- |
| Tenant runtime | Read recursive graph | `GET /api/modules/record-graph/{recordId}?maxDepth=2&maxNodes=100` | `maxDepth=1..5`; `maxNodes=2..200` |
| Tenant runtime | Add association | `PUT /api/modules/record-graph/{fromRecordId}/relations` | `{"toRecordId":"<target-guid>","relationKey":"<registered-key>"}` |
| Tenant runtime | Remove association | `DELETE /api/modules/record-graph/relations/{recordRelationId}` | No body |
| Developer API | Read recursive graph | `GET /v1/apps/{saasAppId}/modules/record-graph/{recordId}?maxDepth=2&maxNodes=100` | Same bounds |
| Developer API | Add association | `PUT /v1/apps/{saasAppId}/modules/record-graph/{fromRecordId}/relations` | `{"toRecordId":"<target-guid>","relationKey":"<registered-key>"}` |
| Developer API | Remove association | `DELETE /v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | No body |

Association security is symmetric: both endpoint records must be active, belong to the same routed tenant/SaaS, and be readable and editable inside the current user's DataRole, location, and direct-conversation participation envelope. Self-links, empty or unregistered relation keys, foreign/concealed records, and unauthorized edge removal are rejected safely. Repeating the same directed edge and relation type returns the existing relationship instead of creating a duplicate.

Record Graph is intentionally REST/SDK-only in this release. The curated 43-tool MCP surface does not expose these nine operations; an MCP client must call them through an approved REST/SDK integration rather than assuming a graph tool exists.

## Vendor generation provenance

The following are vendor-repository inputs, not regeneration instructions for a Developer Kit recipient. The ZIP intentionally omits internal catalogs, solution manifests, and the generator. Recipients can independently verify the two shipped contract inputs against their hashes below.

- Vendor `catalog-generator/catalog.json` — schema 2; internal source snapshot entries: tenant modules=304, additional server surfaces=115, unresolved module gaps=0. These are vendor input counts, not published API totals. SHA-256 `e92ab82896ae8d16d138487a66c8584234a459aeaa9babc7652ab36cb02ba6ad`.
- Shipped `openapi/buildwithhq-generated.json` — 422 published operations, SHA-256 `5f9bf4cee2ede9c6715ab4ec81822690e1c0cfd954571abb48f62d624e9527f2`.
- Shipped `products/build-this-api-recipes.json` — 18 recipes and 73 referenced recipe operations, SHA-256 `93a48843a6bb577a2a300739428b35a88c74df8566b923439a4a9eb998f38bcb`.
- Vendor `solutions/build-this/*/solution.json` — explicit production-solution operation and composition contracts.
- Vendor regeneration command: `python tools/generate_api_route_inventory.py`; vendor verification command: `python tools/generate_api_route_inventory.py --check`.

## 1. First-class modules

[]()

**Connected work (`connected-work`)**

API bases: `/api/modules/record-graph`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `5`; Developer `5` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `3`; Developer `3` |
| Delete / remove / deactivate | Tenant `2`; Developer `2` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | Tenant `10`; Developer `10` |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (10):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `DELETE` | `/api/modules/record-graph/knowledge-relations/{recordRelationId:guid}` | Relationship graph | `UnlinkKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/records` | Relationship graph | `SearchAsync` |
| `DELETE` | `/api/modules/record-graph/relations/{recordRelationId:guid}` | Associate / remove relationship | `RemoveRelationAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}` | Relationship graph | `GetAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/knowledge` | Relationship graph | `RelatedKnowledgeAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/knowledge` | Associate / add | `LinkKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/knowledge/candidates` | Relationship graph | `ContextualKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/relations` | List / view | `ListRelatedAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/relations` | Associate / add | `AddRelationAsync` |

Developer API routes (10):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/knowledge-relations/{recordRelationId}` | Relationship graph | `developerDeleteV1AppsModulesRecordGraphKnowledgeRelationsRecordRelationIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/records` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecords` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesRecordGraphRecordIdGuidFavorite` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuidKnowledge` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidKnowledge` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge/candidates` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuidKnowledgeCandidates` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | List / view | `developerGetV1AppsModulesRecordGraphRecordIdGuidRelations` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` |

[]()

**Knowledge finder (`knowledge-finder`)**

API bases: `/api/modules/knowledge-core`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `14`; Developer `14` |
| Add / create / execute | Tenant `17`; Developer `17` |
| Edit / update / modify | Tenant `3`; Developer `3` |
| Delete / remove / deactivate | Tenant `2`; Developer `2` |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (36):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/knowledge-core` | List | `ListAsync` |
| `POST` | `/api/modules/knowledge-core` | Create | `CreateAsync` |
| `GET` | `/api/modules/knowledge-core/assignment-lookup` | List / view | `AssignmentLookupAsync` |
| `GET` | `/api/modules/knowledge-core/collections` | Collections | `CollectionsAsync` |
| `POST` | `/api/modules/knowledge-core/collections` | Create Collection | `CreateCollectionAsync` |
| `PUT` | `/api/modules/knowledge-core/collections/{collectionId:guid}` | Update Collection | `UpdateCollectionAsync` |
| `DELETE` | `/api/modules/knowledge-core/collections/{collectionId:guid}/items/{recordId:guid}` | Remove Collection Item | `RemoveCollectionItemAsync` |
| `POST` | `/api/modules/knowledge-core/collections/{collectionId:guid}/items/{recordId:guid}` | Add Collection Item | `AddCollectionItemAsync` |
| `GET` | `/api/modules/knowledge-core/gaps` | Gaps | `GapsAsync` |
| `GET` | `/api/modules/knowledge-core/health` | Health | `HealthAsync` |
| `DELETE` | `/api/modules/knowledge-core/owners/{knowledgeOwnerId:guid}` | Remove Owner | `RemoveOwnerAsync` |
| `GET` | `/api/modules/knowledge-core/questions` | Questions | `QuestionsAsync` |
| `POST` | `/api/modules/knowledge-core/questions` | Create Question | `CreateQuestionAsync` |
| `PUT` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}` | Edit Question | `EditQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/answer` | Answer Question | `AnswerQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/assign` | Assign Question | `AssignQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/close` | Close Question | `CloseQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/convert` | Convert Question | `ConvertQuestionAsync` |
| `GET` | `/api/modules/knowledge-core/reviews` | Reviews | `ReviewsAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/begin` | Begin Review | `BeginReviewAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/complete` | Complete Review | `CompleteReviewAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/reassign` | Reassign Review | `ReassignReviewAsync` |
| `GET` | `/api/modules/knowledge-core/support-learning/candidates` | Support Learning Candidates | `SupportLearningCandidatesAsync` |
| `POST` | `/api/modules/knowledge-core/support-learning/candidates` | Create Support Learning Candidate | `CreateSupportLearningCandidateAsync` |
| `GET` | `/api/modules/knowledge-core/unowned` | Unowned | `UnownedAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/knowledge-core/{recordId:guid}` | Update | `UpdateAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/archive` | Archive | `ArchiveAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/feedback` | Feedback Summary | `FeedbackSummaryAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/feedback` | Record Feedback | `RecordFeedbackAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/feedback/comments` | Feedback Comments | `FeedbackCommentsAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/owners` | Owners | `OwnersAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/owners` | Set Owner | `SetOwnerAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/publish` | Publish | `PublishAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/restore` | Restore | `RestoreAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/revisions` | Revisions | `RevisionsAsync` |

Developer API routes (36):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core` | List / view | `developerGetV1AppsModulesKnowledgeCore` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCore` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/assignment-lookup` | List / view | `developerGetV1AppsModulesKnowledgeCoreAssignmentLookup` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections` | List / view | `developerGetV1AppsModulesKnowledgeCoreCollections` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreCollections` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuid` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}/items/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuidItemsRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}/items/{recordId}` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuidItemsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/gaps` | List / view | `developerGetV1AppsModulesKnowledgeCoreGaps` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/health` | List / view | `developerGetV1AppsModulesKnowledgeCoreHealth` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/knowledge-core/owners/{knowledgeOwnerId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesKnowledgeCoreOwnersKnowledgeOwnerIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions` | List / view | `developerGetV1AppsModulesKnowledgeCoreQuestions` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestions` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/answer` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidAnswer` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/assign` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidAssign` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/close` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidClose` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/convert` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidConvert` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews` | List / view | `developerGetV1AppsModulesKnowledgeCoreReviews` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/begin` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidBegin` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/complete` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidComplete` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/reassign` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidReassign` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/support-learning/candidates` | List / view | `developerGetV1AppsModulesKnowledgeCoreSupportLearningCandidates` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/support-learning/candidates` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreSupportLearningCandidates` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/unowned` | List / view | `developerGetV1AppsModulesKnowledgeCoreUnowned` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/archive` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidArchive` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidFeedback` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidFeedback` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback/comments` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidFeedbackComments` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/owners` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidOwners` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/owners` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidOwners` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/publish` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidPublish` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/restore` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidRestore` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/revisions` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidRevisions` |

[]()

**Universal Inbox (`universal-inbox`)**

API bases: `/api/inbox`, `/api/inbox/items`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `13`; Developer `13` |
| Add / create / execute | Tenant `5`; Developer `4` |
| Edit / update / modify | Tenant `4`; Developer `4` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (22):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/inbox/badge` | Get Badge | `GetBadgeAsync` |
| `GET` | `/api/inbox/badge/indicator` | Get Badge Indicator | `GetBadgeIndicatorAsync` |
| `GET` | `/api/inbox/channels/ticketing` | Mailbox ticketing configuration | `GetChannelTicketingAsync` |
| `PUT` | `/api/inbox/channels/{channelConnectionId:guid}/ticketing` | Mailbox ticketing configuration | `SetChannelTicketingAsync` |
| `GET` | `/api/inbox/delivery/debug` | Get Delivery Debug | `GetDeliveryDebugAsync` |
| `POST` | `/api/inbox/delivery/{outboundMessageId:guid}/retry` | Retry operation | `RetryDeliveryAsync` |
| `GET` | `/api/inbox/email-channels/ticketing` | Mailbox ticketing configuration | `GetEmailTicketingAsync` |
| `PUT` | `/api/inbox/email-channels/{channelConnectionId:guid}/ticketing` | Mailbox ticketing configuration | `SetEmailTicketingAsync` |
| `GET` | `/api/inbox/items` | Get Items | `GetItemsAsync` |
| `GET` | `/api/inbox/items/{inboxItemId:guid}` | Get Item | `GetItemAsync` |
| `PUT` | `/api/inbox/items/{inboxItemId:guid}/human-state` | Human state / resolution | `UpdateHumanStateAsync` |
| `POST` | `/api/inbox/items/{inboxItemId:guid}/reply` | Message / reply | `ReplyAsync` |
| `POST` | `/api/inbox/items/{inboxItemId:guid}/workflow-approval` | Workflow approval | `DecideAsync` |
| `GET` | `/api/inbox/lego-catalog` | Lego Catalog | `LegoCatalogAsync` |
| `GET` | `/api/inbox/lego-presentation` | Lego Presentation | `LegoPresentationAsync` |
| `GET` | `/api/inbox/notifications` | Get Notifications | `GetNotificationsAsync` |
| `GET` | `/api/inbox/support-lanes` | List | `ListAsync` |
| `POST` | `/api/inbox/support-lanes` | Create | `CreateAsync` |
| `GET` | `/api/inbox/support-lanes/options` | Options | `OptionsAsync` |
| `GET` | `/api/inbox/support-lanes/{laneId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/inbox/support-lanes/{laneId:guid}` | Update | `UpdateAsync` |
| `POST` | `/api/inbox/support-lanes/{laneId:guid}/retire` | Retire | `RetireAsync` |

Developer API routes (21):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/inbox/badge` | List / view | `developerGetV1AppsInboxBadge` |
| `GET` | `/v1/apps/{saasAppId}/inbox/badge/indicator` | List / view | `developerGetV1AppsInboxBadgeIndicator` |
| `GET` | `/v1/apps/{saasAppId}/inbox/channels/ticketing` | Mailbox ticketing configuration | `developerGetV1AppsInboxChannelsTicketing` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/channels/{channelConnectionId}/ticketing` | Mailbox ticketing configuration | `developerPutV1AppsInboxChannelsChannelConnectionIdGuidTicketing` |
| `GET` | `/v1/apps/{saasAppId}/inbox/delivery/debug` | List / view | `developerGetV1AppsInboxDeliveryDebug` |
| `POST` | `/v1/apps/{saasAppId}/inbox/delivery/{outboundMessageId}/retry` | Retry operation | `developerPostV1AppsInboxDeliveryOutboundMessageIdGuidRetry` |
| `GET` | `/v1/apps/{saasAppId}/inbox/email-channels/ticketing` | Mailbox ticketing configuration | `developerGetV1AppsInboxEmailChannelsTicketing` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/email-channels/{channelConnectionId}/ticketing` | Mailbox ticketing configuration | `developerPutV1AppsInboxEmailChannelsChannelConnectionIdGuidTicketing` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}` | List / view | `developerGetV1AppsInboxItemsInboxItemIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}/human-state` | Human state / resolution | `developerPutV1AppsInboxItemsInboxItemIdGuidHumanState` |
| `POST` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}/reply` | Message / reply | `developerPostV1AppsInboxItemsInboxItemIdGuidReply` |
| `GET` | `/v1/apps/{saasAppId}/inbox/lego-catalog` | List / view | `developerGetV1AppsInboxLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/inbox/lego-presentation` | List / view | `developerGetV1AppsInboxLegoPresentation` |
| `GET` | `/v1/apps/{saasAppId}/inbox/notifications` | List / view | `developerGetV1AppsInboxNotifications` |
| `GET` | `/v1/apps/{saasAppId}/inbox/support-lanes` | List / view | `developerGetV1AppsInboxSupportLanes` |
| `POST` | `/v1/apps/{saasAppId}/inbox/support-lanes` | Add / create / execute | `developerPostV1AppsInboxSupportLanes` |
| `GET` | `/v1/apps/{saasAppId}/inbox/support-lanes/options` | List / view | `developerGetV1AppsInboxSupportLanesOptions` |
| `GET` | `/v1/apps/{saasAppId}/inbox/support-lanes/{laneId}` | List / view | `developerGetV1AppsInboxSupportLanesLaneIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/support-lanes/{laneId}` | Edit / update / modify | `developerPutV1AppsInboxSupportLanesLaneIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/inbox/support-lanes/{laneId}/retire` | Add / create / execute | `developerPostV1AppsInboxSupportLanesLaneIdGuidRetire` |

[]()

**Checklists & Signoffs (`checklists-signoffs`)**

API bases: `/api/modules/checklists-signoffs`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `8`; Developer `8` |
| Add / create / execute | Tenant `5`; Developer `5` |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Tenant `2`; Developer `2` |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | Tenant `2`; Developer `2` |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (17):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/checklists-signoffs/export` | Export | `ExportAsync` |
| `GET` | `/api/modules/checklists-signoffs/export/capability` | Get Export Capability | `GetExportCapabilityAsync` |
| `PUT` | `/api/modules/checklists-signoffs/items/{checklistRunItemId:guid}` | Update Item | `UpdateItemAsync` |
| `POST` | `/api/modules/checklists-signoffs/items/{checklistRunItemId:guid}/proof` | File proof / evidence | `AttachProofAsync` |
| `GET` | `/api/modules/checklists-signoffs/lego/catalog` | Get Lego Catalog | `GetLegoCatalog` |
| `GET` | `/api/modules/checklists-signoffs/lookups/{lookupId:guid}` | Get Lego Lookup | `GetLegoLookupAsync` |
| `DELETE` | `/api/modules/checklists-signoffs/proof/{checklistItemEvidenceId:guid}` | File proof / evidence | `RemoveProofAsync` |
| `GET` | `/api/modules/checklists-signoffs/runs` | List Runs | `ListRunsAsync` |
| `POST` | `/api/modules/checklists-signoffs/runs` | Start Run | `StartRunAsync` |
| `GET` | `/api/modules/checklists-signoffs/runs/{checklistRunId:guid}` | Get Run | `GetRunAsync` |
| `POST` | `/api/modules/checklists-signoffs/runs/{checklistRunId:guid}/cancel` | Cancel Run | `CancelRunAsync` |
| `POST` | `/api/modules/checklists-signoffs/runs/{checklistRunId:guid}/submit` | Submit workflow | `SubmitAsync` |
| `GET` | `/api/modules/checklists-signoffs/templates` | List Templates | `ListTemplatesAsync` |
| `POST` | `/api/modules/checklists-signoffs/templates` | Create Template | `CreateTemplateAsync` |
| `DELETE` | `/api/modules/checklists-signoffs/templates/{checklistTemplateId:guid}` | Remove Template | `RemoveTemplateAsync` |
| `GET` | `/api/modules/checklists-signoffs/templates/{checklistTemplateId:guid}` | Get Template | `GetTemplateAsync` |
| `PUT` | `/api/modules/checklists-signoffs/templates/{checklistTemplateId:guid}` | Update Template | `UpdateTemplateAsync` |

Developer API routes (17):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/export` | List / view | `developerGetV1AppsModulesChecklistsSignoffsExport` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/export/capability` | List / view | `developerGetV1AppsModulesChecklistsSignoffsExportCapability` |
| `PUT` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/items/{checklistRunItemId}` | Edit / update / modify | `developerPutV1AppsModulesChecklistsSignoffsItemsChecklistRunItemIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/items/{checklistRunItemId}/proof` | File proof / evidence | `developerPostV1AppsModulesChecklistsSignoffsItemsChecklistRunItemIdGuidProof` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/lego/catalog` | List / view | `developerGetV1AppsModulesChecklistsSignoffsLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesChecklistsSignoffsLookupsLookupIdGuid` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/proof/{checklistItemEvidenceId}` | File proof / evidence | `developerDeleteV1AppsModulesChecklistsSignoffsProofChecklistItemEvidenceIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | List / view | `developerGetV1AppsModulesChecklistsSignoffsRuns` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRuns` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}` | List / view | `developerGetV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}/cancel` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuidCancel` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}/submit` | Submit workflow | `developerPostV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuidSubmit` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates` | List / view | `developerGetV1AppsModulesChecklistsSignoffsTemplates` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsTemplates` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | List / view | `developerGetV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | Edit / update / modify | `developerPutV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` |

[]()

**GoClaw (`goclaw`)**

API bases: `/api/goclaw/agents`, `/api/goclaw/approvals`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `3`; Developer `3` |
| Add / create / execute | Tenant `4`; Developer `4` |
| Edit / update / modify | Tenant `1`; Developer `0` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (8):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `PUT` | `/api/goclaw/agents/{goClawAgentId:guid}/authority` | Configure | `ConfigureAsync` |
| `GET` | `/api/goclaw/approvals` | Get | `GetAsync` |
| `GET` | `/api/goclaw/approvals/lego/catalog` | Lego Catalog | `LegoCatalog` |
| `GET` | `/api/goclaw/approvals/lego/presentation` | Presentation metadata | `LegoPresentationAsync` |
| `POST` | `/api/goclaw/approvals/{suggestionBatchId:guid}/approve` | Approve | `ApproveAsync` |
| `POST` | `/api/goclaw/approvals/{suggestionBatchId:guid}/reject` | Reject | `RejectAsync` |
| `POST` | `/api/goclaw/approvals/{suggestionBatchId:guid}/retry` | Retry operation | `RetryAsync` |
| `POST` | `/api/goclaw/approvals/{suggestionBatchId:guid}/take-over` | Take Over | `TakeOverAsync` |

Developer API routes (7):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/goclaw/approvals` | List / view | `developerGetV1AppsGoclawApprovals` |
| `GET` | `/v1/apps/{saasAppId}/goclaw/approvals/lego/catalog` | List / view | `developerGetV1AppsGoclawApprovalsLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/goclaw/approvals/lego/presentation` | Presentation metadata | `developerGetV1AppsGoclawApprovalsLegoPresentation` |
| `POST` | `/v1/apps/{saasAppId}/goclaw/approvals/{suggestionBatchId}/approve` | Approve | `developerPostV1AppsGoclawApprovalsSuggestionBatchIdGuidApprove` |
| `POST` | `/v1/apps/{saasAppId}/goclaw/approvals/{suggestionBatchId}/reject` | Reject | `developerPostV1AppsGoclawApprovalsSuggestionBatchIdGuidReject` |
| `POST` | `/v1/apps/{saasAppId}/goclaw/approvals/{suggestionBatchId}/retry` | Retry operation | `developerPostV1AppsGoclawApprovalsSuggestionBatchIdGuidRetry` |
| `POST` | `/v1/apps/{saasAppId}/goclaw/approvals/{suggestionBatchId}/take-over` | Add / create / execute | `developerPostV1AppsGoclawApprovalsSuggestionBatchIdGuidTakeOver` |

[]()

**AI Insights (`ai-insights`)**

API bases: `/api/modules/ai-insights`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `3`; Developer `2` |
| Add / create / execute | Tenant `1`; Developer `0` |
| Edit / update / modify | Tenant `4`; Developer `1` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (8):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/ai-insights` | List | `ListAsync` |
| `GET` | `/api/modules/ai-insights/settings` | Get Settings | `GetSettingsAsync` |
| `PUT` | `/api/modules/ai-insights/settings` | Save Settings | `SaveSettingsAsync` |
| `POST` | `/api/modules/ai-insights/settings/directives` | Add Directive | `AddDirectiveAsync` |
| `PUT` | `/api/modules/ai-insights/settings/directives/{directiveId:guid}` | Save Directive | `SaveDirectiveAsync` |
| `PUT` | `/api/modules/ai-insights/settings/starters/{directiveId:guid}` | Set Starter Directive | `SetStarterDirectiveAsync` |
| `GET` | `/api/modules/ai-insights/{insightId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/ai-insights/{insightId:guid}/state` | State transition | `SetStateAsync` |

Developer API routes (3):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/ai-insights` | List / view | `developerGetV1AppsModulesAiInsights` |
| `GET` | `/v1/apps/{saasAppId}/modules/ai-insights/{insightId}` | List / view | `developerGetV1AppsModulesAiInsightsInsightIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/ai-insights/{insightId}/state` | State transition | `developerPutV1AppsModulesAiInsightsInsightIdGuidState` |

[]()

**Contacts (`contacts`)**

API bases: `/api/modules/contacts`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `9`; Developer `8` |
| Add / create / execute | Tenant `2`; Developer `1` |
| Edit / update / modify | Tenant `4`; Developer `2` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (16):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/contacts` | List | `ListAsync` |
| `POST` | `/api/modules/contacts` | Create | `CreateAsync` |
| `GET` | `/api/modules/contacts/count` | Count | `CountAsync` |
| `GET` | `/api/modules/contacts/create-visibility-options` | List / view | `GetCreateVisibilityOptionsAsync` |
| `GET` | `/api/modules/contacts/export` | Export | `ExportAsync` |
| `GET` | `/api/modules/contacts/export/capability` | Get Export Capability | `GetExportCapabilityAsync` |
| `GET` | `/api/modules/contacts/list-preferences` | Get List Preferences | `GetListPreferencesAsync` |
| `PUT` | `/api/modules/contacts/list-preferences/{scope}` | Save List Preferences | `SaveListPreferencesAsync` |
| `GET` | `/api/modules/contacts/lookups/{lookupId:guid}` | Get Lookup | `GetLookupAsync` |
| `GET` | `/api/modules/contacts/schema` | Schema / field metadata | `GetSchemaAsync` |
| `DELETE` | `/api/modules/contacts/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/contacts/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/contacts/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/contacts/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `PUT` | `/api/modules/contacts/{recordId:guid}/secure-fields/{fieldDefinitionId:guid}` | Set Secure Field | `SetSecureFieldAsync` |
| `POST` | `/api/modules/contacts/{recordId:guid}/secure-fields/{fieldDefinitionId:guid}/reveal` | Reveal Secure Field | `RevealSecureFieldAsync` |

Developer API routes (12):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts` | List / view | `developerGetV1AppsModulesContacts` |
| `POST` | `/v1/apps/{saasAppId}/modules/contacts` | Add / create / execute | `developerPostV1AppsModulesContacts` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/count` | List / view | `developerGetV1AppsModulesContactsCount` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/create-visibility-options` | List / view | `developerGetV1AppsModulesContactsCreateVisibilityOptions` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/export` | List / view | `developerGetV1AppsModulesContactsExport` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/export/capability` | List / view | `developerGetV1AppsModulesContactsExportCapability` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesContactsLookupsLookupIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/schema` | Schema / field metadata | `developerGetV1AppsModulesContactsSchema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/contacts/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesContactsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts/{recordId}` | List / view | `developerGetV1AppsModulesContactsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/contacts/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesContactsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/contacts/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesContactsRecordIdGuidFavorite` |

[]()

**Work Orders (`work-orders`)**

API bases: `/api/modules/work-orders`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `7`; Developer `8` |
| Add / create / execute | Tenant `1`; Developer `1` |
| Edit / update / modify | Tenant `3`; Developer `3` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (12):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/work-orders` | List | `ListAsync` |
| `POST` | `/api/modules/work-orders` | Create | `CreateAsync` |
| `GET` | `/api/modules/work-orders/export` | Export | `ExportAsync` |
| `GET` | `/api/modules/work-orders/export/capability` | Get Export Capability | `GetExportCapabilityAsync` |
| `GET` | `/api/modules/work-orders/lookups/{lookupId:guid}` | Get Lookup | `GetLookupAsync` |
| `GET` | `/api/modules/work-orders/schema` | Schema / field metadata | `GetSchemaAsync` |
| `DELETE` | `/api/modules/work-orders/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/work-orders/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/work-orders/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/work-orders/{recordId:guid}/assignment` | Assignment update | `AssignAsync` |
| `PUT` | `/api/modules/work-orders/{recordId:guid}/status` | Status transition | `StatusAsync` |
| `GET` | `/api/modules/work-orders/{recordId:guid}/status-transitions` | List / view | `GetStatusTransitionsAsync` |

Developer API routes (13):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders` | List / view | `developerGetV1AppsModulesWorkOrders` |
| `POST` | `/v1/apps/{saasAppId}/modules/work-orders` | Add / create / execute | `developerPostV1AppsModulesWorkOrders` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/export` | List / view | `developerGetV1AppsModulesWorkOrdersExport` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/export/capability` | List / view | `developerGetV1AppsModulesWorkOrdersExportCapability` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesWorkOrdersLookupsLookupIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/presentation` | Presentation metadata | `developerPresentationsGet` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/schema` | Schema / field metadata | `developerGetV1AppsModulesWorkOrdersSchema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesWorkOrdersRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}` | List / view | `developerGetV1AppsModulesWorkOrdersRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesWorkOrdersRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}/assignment` | Assignment update | `developerPutV1AppsModulesWorkOrdersRecordIdGuidAssignment` |
| `PUT` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}/status` | Status transition | `developerPutV1AppsModulesWorkOrdersRecordIdGuidStatus` |
| `GET` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}/status-transitions` | List / view | `developerGetV1AppsModulesWorkOrdersRecordIdGuidStatusTransitions` |

[]()

**Reservations (`reservations`)**

API bases: `/api/modules/reservations`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `8`; Developer `8` |
| Add / create / execute | Tenant `2`; Developer `2` |
| Edit / update / modify | Tenant `4`; Developer `4` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (14):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/reservations` | List | `ListAsync` |
| `GET` | `/api/modules/reservations/assignees` | List / view | `GetAssigneesAsync` |
| `GET` | `/api/modules/reservations/capabilities` | Capabilities | `CapabilitiesAsync` |
| `GET` | `/api/modules/reservations/export` | Export | `ExportAsync` |
| `GET` | `/api/modules/reservations/export/capability` | Get Export Capability | `GetExportCapabilityAsync` |
| `GET` | `/api/modules/reservations/lego/catalog` | Lego Catalog | `LegoCatalog` |
| `GET` | `/api/modules/reservations/products` | List Products | `ListProductsAsync` |
| `POST` | `/api/modules/reservations/products` | Upsert Product | `UpsertProductAsync` |
| `POST` | `/api/modules/reservations/purchase` | Purchase | `PurchaseAsync` |
| `GET` | `/api/modules/reservations/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/reservations/{recordId:guid}/custom-fields` | Update Custom Fields | `UpdateCustomFieldsAsync` |
| `PUT` | `/api/modules/reservations/{recordId:guid}/followups` | Update Followup | `UpdateFollowupAsync` |
| `PUT` | `/api/modules/reservations/{recordId:guid}/schedule` | Reschedule | `RescheduleAsync` |
| `PUT` | `/api/modules/reservations/{recordId:guid}/status` | Status transition | `SetStatusAsync` |

Developer API routes (14):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations` | List / view | `developerGetV1AppsModulesReservations` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/assignees` | List / view | `developerGetV1AppsModulesReservationsAssignees` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/capabilities` | List / view | `developerGetV1AppsModulesReservationsCapabilities` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/export` | List / view | `developerGetV1AppsModulesReservationsExport` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/export/capability` | List / view | `developerGetV1AppsModulesReservationsExportCapability` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/lego/catalog` | List / view | `developerGetV1AppsModulesReservationsLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/products` | List / view | `developerGetV1AppsModulesReservationsProducts` |
| `POST` | `/v1/apps/{saasAppId}/modules/reservations/products` | Add / create / execute | `developerPostV1AppsModulesReservationsProducts` |
| `POST` | `/v1/apps/{saasAppId}/modules/reservations/purchase` | Add / create / execute | `developerPostV1AppsModulesReservationsPurchase` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}` | List / view | `developerGetV1AppsModulesReservationsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/custom-fields` | Edit / update / modify | `developerPutV1AppsModulesReservationsRecordIdGuidCustomFields` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/followups` | Edit / update / modify | `developerPutV1AppsModulesReservationsRecordIdGuidFollowups` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/schedule` | Edit / update / modify | `developerPutV1AppsModulesReservationsRecordIdGuidSchedule` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/status` | Status transition | `developerPutV1AppsModulesReservationsRecordIdGuidStatus` |

[]()

**Calendar (`calendar`)**

API bases: `/api/modules/calendar`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Tenant `1`; Developer `1` |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (8):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/calendar` | List | `ListAsync` |
| `POST` | `/api/modules/calendar` | Create | `CreateAsync` |
| `GET` | `/api/modules/calendar/capabilities` | Capabilities | `CapabilitiesAsync` |
| `GET` | `/api/modules/calendar/lego/catalog` | Lego Catalog | `LegoCatalog` |
| `DELETE` | `/api/modules/calendar/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/calendar/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/calendar/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/calendar/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |

Developer API routes (8):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/calendar` | List / view | `developerGetV1AppsModulesCalendar` |
| `POST` | `/v1/apps/{saasAppId}/modules/calendar` | Add / create / execute | `developerPostV1AppsModulesCalendar` |
| `GET` | `/v1/apps/{saasAppId}/modules/calendar/capabilities` | List / view | `developerGetV1AppsModulesCalendarCapabilities` |
| `GET` | `/v1/apps/{saasAppId}/modules/calendar/lego/catalog` | List / view | `developerGetV1AppsModulesCalendarLegoCatalog` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/calendar/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesCalendarRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/calendar/{recordId}` | List / view | `developerGetV1AppsModulesCalendarRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/calendar/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesCalendarRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/calendar/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesCalendarRecordIdGuidFavorite` |

[]()

**Files (`files`)**

API bases: `/api/modules/files`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `9`; Developer `8` |
| Add / create / execute | Tenant `4`; Developer `4` |
| Edit / update / modify | Tenant `3`; Developer `2` |
| Delete / remove / deactivate | Tenant `3`; Developer `3` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | Tenant `19`; Developer `17` |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (19):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/files` | File / attachment | `ListAsync` |
| `GET` | `/api/modules/files/capabilities` | File / attachment | `CapabilitiesAsync` |
| `GET` | `/api/modules/files/lego/catalog` | File / attachment | `LegoCatalog` |
| `GET` | `/api/modules/files/personal-limit` | File / attachment | `GetPersonalLimitAsync` |
| `PUT` | `/api/modules/files/personal-limit` | File / attachment | `SavePersonalLimitAsync` |
| `POST` | `/api/modules/files/upload` | File / attachment | `UploadAsync` |
| `DELETE` | `/api/modules/files/{recordId:guid}` | File / attachment | `RemoveAsync` |
| `GET` | `/api/modules/files/{recordId:guid}` | File / attachment | `GetAsync` |
| `PUT` | `/api/modules/files/{recordId:guid}` | File / attachment | `UpdateAsync` |
| `POST` | `/api/modules/files/{recordId:guid}/attachments` | File / attachment | `AttachAsync` |
| `DELETE` | `/api/modules/files/{recordId:guid}/attachments/{attachmentId:guid}` | File / attachment | `DetachAsync` |
| `GET` | `/api/modules/files/{recordId:guid}/comments` | File / attachment | `ListCommentsAsync` |
| `POST` | `/api/modules/files/{recordId:guid}/comments` | File / attachment | `AddCommentAsync` |
| `DELETE` | `/api/modules/files/{recordId:guid}/comments/{commentId:guid}` | File / attachment | `RemoveCommentAsync` |
| `GET` | `/api/modules/files/{recordId:guid}/content` | File / attachment | `DownloadAsync` |
| `PUT` | `/api/modules/files/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `GET` | `/api/modules/files/{recordId:guid}/versions` | File / attachment | `ListVersionsAsync` |
| `POST` | `/api/modules/files/{recordId:guid}/versions` | File / attachment | `UploadVersionAsync` |
| `GET` | `/api/modules/files/{recordId:guid}/versions/{version:int}/content` | File / attachment | `DownloadVersionAsync` |

Developer API routes (17):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/files` | File / attachment | `developerGetV1AppsModulesFiles` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/capabilities` | File / attachment | `developerGetV1AppsModulesFilesCapabilities` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/lego/catalog` | File / attachment | `developerGetV1AppsModulesFilesLegoCatalog` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/upload` | File / attachment | `developerPostV1AppsModulesFilesUpload` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/files/{recordId}` | File / attachment | `developerDeleteV1AppsModulesFilesRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/{recordId}` | File / attachment | `developerGetV1AppsModulesFilesRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/files/{recordId}` | File / attachment | `developerPutV1AppsModulesFilesRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/{recordId}/attachments` | File / attachment | `developerPostV1AppsModulesFilesRecordIdGuidAttachments` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/files/{recordId}/attachments/{attachmentId}` | File / attachment | `developerDeleteV1AppsModulesFilesRecordIdGuidAttachmentsAttachmentIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/{recordId}/comments` | File / attachment | `developerGetV1AppsModulesFilesRecordIdGuidComments` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/{recordId}/comments` | File / attachment | `developerPostV1AppsModulesFilesRecordIdGuidComments` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/files/{recordId}/comments/{commentId}` | File / attachment | `developerDeleteV1AppsModulesFilesRecordIdGuidCommentsCommentIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/{recordId}/content` | File / attachment | `developerGetV1AppsModulesFilesRecordIdGuidContent` |
| `PUT` | `/v1/apps/{saasAppId}/modules/files/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesFilesRecordIdGuidFavorite` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/{recordId}/versions` | File / attachment | `developerGetV1AppsModulesFilesRecordIdGuidVersions` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/{recordId}/versions` | File / attachment | `developerPostV1AppsModulesFilesRecordIdGuidVersions` |
| `GET` | `/v1/apps/{saasAppId}/modules/files/{recordId}/versions/{version}/content` | File / attachment | `developerGetV1AppsModulesFilesRecordIdGuidVersionsVersionIntContent` |

[]()

**Conversations (`conversations`)**

API bases: `/api/modules/conversations`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `7`; Developer `7` |
| Add / create / execute | Tenant `3`; Developer `3` |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | Tenant `1`; Developer `1` |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (13):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/conversations` | List | `ListAsync` |
| `POST` | `/api/modules/conversations` | Create | `CreateAsync` |
| `GET` | `/api/modules/conversations/capabilities` | Capabilities | `CapabilitiesAsync` |
| `POST` | `/api/modules/conversations/direct` | Send Direct | `SendDirectAsync` |
| `GET` | `/api/modules/conversations/direct/scope` | Direct Scope | `DirectScopeAsync` |
| `GET` | `/api/modules/conversations/lego-catalog` | Lego Catalog | `LegoCatalogAsync` |
| `GET` | `/api/modules/conversations/lego-presentation` | Lego Presentation | `LegoPresentationAsync` |
| `DELETE` | `/api/modules/conversations/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/conversations/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/conversations/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/conversations/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `POST` | `/api/modules/conversations/{recordId:guid}/messages` | Message / reply | `ReplyAsync` |
| `GET` | `/api/modules/conversations/{recordId:guid}/messages/{messageId:guid}/attachments/{fileId:guid}/content` | Message / reply | `DownloadAttachmentAsync` |

Developer API routes (13):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations` | List / view | `developerGetV1AppsModulesConversations` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations` | Add / create / execute | `developerPostV1AppsModulesConversations` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/capabilities` | List / view | `developerGetV1AppsModulesConversationsCapabilities` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations/direct` | Add / create / execute | `developerPostV1AppsModulesConversationsDirect` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/direct/scope` | List / view | `developerGetV1AppsModulesConversationsDirectScope` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/lego-catalog` | List / view | `developerGetV1AppsModulesConversationsLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/lego-presentation` | List / view | `developerGetV1AppsModulesConversationsLegoPresentation` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesConversationsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}` | List / view | `developerGetV1AppsModulesConversationsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesConversationsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesConversationsRecordIdGuidFavorite` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/messages` | Message / reply | `developerPostV1AppsModulesConversationsRecordIdGuidMessages` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/messages/{messageId}/attachments/{fileId}/content` | Message / reply | `developerGetV1AppsModulesConversationsRecordIdGuidMessagesMessageIdGuidAttachmentsFileIdGuidContent` |

[]()

**Company news (`company-news`)**

API bases: `/api/modules/company-news`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Tenant `1`; Developer `1` |
| Edit / update / modify | Tenant `3`; Developer `3` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (9):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/company-news` | List | `ListAsync` |
| `POST` | `/api/modules/company-news` | Create | `CreateAsync` |
| `GET` | `/api/modules/company-news/lookups/{lookupId:guid}` | Lookup | `LookupAsync` |
| `GET` | `/api/modules/company-news/schema` | Schema / field metadata | `SchemaAsync` |
| `DELETE` | `/api/modules/company-news/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/company-news/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/company-news/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/company-news/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `PUT` | `/api/modules/company-news/{recordId:guid}/published` | Published | `PublishedAsync` |

Developer API routes (9):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/company-news` | List / view | `developerGetV1AppsModulesCompanyNews` |
| `POST` | `/v1/apps/{saasAppId}/modules/company-news` | Add / create / execute | `developerPostV1AppsModulesCompanyNews` |
| `GET` | `/v1/apps/{saasAppId}/modules/company-news/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesCompanyNewsLookupsLookupIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/company-news/schema` | Schema / field metadata | `developerGetV1AppsModulesCompanyNewsSchema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/company-news/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesCompanyNewsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/company-news/{recordId}` | List / view | `developerGetV1AppsModulesCompanyNewsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/company-news/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesCompanyNewsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/company-news/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesCompanyNewsRecordIdGuidFavorite` |
| `PUT` | `/v1/apps/{saasAppId}/modules/company-news/{recordId}/published` | Edit / update / modify | `developerPutV1AppsModulesCompanyNewsRecordIdGuidPublished` |

[]()

**Knowledge Core (`knowledge-core`)**

API bases: `/api/modules/knowledge-articles`, `/api/modules/knowledge-core`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `17`; Developer `17` |
| Add / create / execute | Tenant `18`; Developer `18` |
| Edit / update / modify | Tenant `5`; Developer `5` |
| Delete / remove / deactivate | Tenant `3`; Developer `3` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (43):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/knowledge-articles` | List | `ListAsync` |
| `POST` | `/api/modules/knowledge-articles` | Create | `CreateAsync` |
| `GET` | `/api/modules/knowledge-articles/lego/catalog` | Lego Catalog | `LegoCatalog` |
| `DELETE` | `/api/modules/knowledge-articles/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/knowledge-articles/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/knowledge-articles/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/knowledge-articles/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `GET` | `/api/modules/knowledge-core` | List | `ListAsync` |
| `POST` | `/api/modules/knowledge-core` | Create | `CreateAsync` |
| `GET` | `/api/modules/knowledge-core/assignment-lookup` | List / view | `AssignmentLookupAsync` |
| `GET` | `/api/modules/knowledge-core/collections` | Collections | `CollectionsAsync` |
| `POST` | `/api/modules/knowledge-core/collections` | Create Collection | `CreateCollectionAsync` |
| `PUT` | `/api/modules/knowledge-core/collections/{collectionId:guid}` | Update Collection | `UpdateCollectionAsync` |
| `DELETE` | `/api/modules/knowledge-core/collections/{collectionId:guid}/items/{recordId:guid}` | Remove Collection Item | `RemoveCollectionItemAsync` |
| `POST` | `/api/modules/knowledge-core/collections/{collectionId:guid}/items/{recordId:guid}` | Add Collection Item | `AddCollectionItemAsync` |
| `GET` | `/api/modules/knowledge-core/gaps` | Gaps | `GapsAsync` |
| `GET` | `/api/modules/knowledge-core/health` | Health | `HealthAsync` |
| `DELETE` | `/api/modules/knowledge-core/owners/{knowledgeOwnerId:guid}` | Remove Owner | `RemoveOwnerAsync` |
| `GET` | `/api/modules/knowledge-core/questions` | Questions | `QuestionsAsync` |
| `POST` | `/api/modules/knowledge-core/questions` | Create Question | `CreateQuestionAsync` |
| `PUT` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}` | Edit Question | `EditQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/answer` | Answer Question | `AnswerQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/assign` | Assign Question | `AssignQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/close` | Close Question | `CloseQuestionAsync` |
| `POST` | `/api/modules/knowledge-core/questions/{knowledgeQuestionId:guid}/convert` | Convert Question | `ConvertQuestionAsync` |
| `GET` | `/api/modules/knowledge-core/reviews` | Reviews | `ReviewsAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/begin` | Begin Review | `BeginReviewAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/complete` | Complete Review | `CompleteReviewAsync` |
| `POST` | `/api/modules/knowledge-core/reviews/{reviewCycleId:guid}/reassign` | Reassign Review | `ReassignReviewAsync` |
| `GET` | `/api/modules/knowledge-core/support-learning/candidates` | Support Learning Candidates | `SupportLearningCandidatesAsync` |
| `POST` | `/api/modules/knowledge-core/support-learning/candidates` | Create Support Learning Candidate | `CreateSupportLearningCandidateAsync` |
| `GET` | `/api/modules/knowledge-core/unowned` | Unowned | `UnownedAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/knowledge-core/{recordId:guid}` | Update | `UpdateAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/archive` | Archive | `ArchiveAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/feedback` | Feedback Summary | `FeedbackSummaryAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/feedback` | Record Feedback | `RecordFeedbackAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/feedback/comments` | Feedback Comments | `FeedbackCommentsAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/owners` | Owners | `OwnersAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/owners` | Set Owner | `SetOwnerAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/publish` | Publish | `PublishAsync` |
| `POST` | `/api/modules/knowledge-core/{recordId:guid}/restore` | Restore | `RestoreAsync` |
| `GET` | `/api/modules/knowledge-core/{recordId:guid}/revisions` | Revisions | `RevisionsAsync` |

Developer API routes (43):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-articles` | List / view | `developerGetV1AppsModulesKnowledgeArticles` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-articles` | Add / create / execute | `developerPostV1AppsModulesKnowledgeArticles` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-articles/lego/catalog` | List / view | `developerGetV1AppsModulesKnowledgeArticlesLegoCatalog` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/knowledge-articles/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesKnowledgeArticlesRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-articles/{recordId}` | List / view | `developerGetV1AppsModulesKnowledgeArticlesRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-articles/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeArticlesRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-articles/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesKnowledgeArticlesRecordIdGuidFavorite` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core` | List / view | `developerGetV1AppsModulesKnowledgeCore` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCore` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/assignment-lookup` | List / view | `developerGetV1AppsModulesKnowledgeCoreAssignmentLookup` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections` | List / view | `developerGetV1AppsModulesKnowledgeCoreCollections` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreCollections` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuid` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}/items/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuidItemsRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/collections/{collectionId}/items/{recordId}` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreCollectionsCollectionIdGuidItemsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/gaps` | List / view | `developerGetV1AppsModulesKnowledgeCoreGaps` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/health` | List / view | `developerGetV1AppsModulesKnowledgeCoreHealth` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/knowledge-core/owners/{knowledgeOwnerId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesKnowledgeCoreOwnersKnowledgeOwnerIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions` | List / view | `developerGetV1AppsModulesKnowledgeCoreQuestions` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestions` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/answer` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidAnswer` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/assign` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidAssign` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/close` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidClose` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/questions/{knowledgeQuestionId}/convert` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreQuestionsKnowledgeQuestionIdGuidConvert` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews` | List / view | `developerGetV1AppsModulesKnowledgeCoreReviews` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/begin` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidBegin` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/complete` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidComplete` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/reviews/{reviewCycleId}/reassign` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreReviewsReviewCycleIdGuidReassign` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/support-learning/candidates` | List / view | `developerGetV1AppsModulesKnowledgeCoreSupportLearningCandidates` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/support-learning/candidates` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreSupportLearningCandidates` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/unowned` | List / view | `developerGetV1AppsModulesKnowledgeCoreUnowned` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesKnowledgeCoreRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/archive` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidArchive` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidFeedback` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidFeedback` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/feedback/comments` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidFeedbackComments` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/owners` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidOwners` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/owners` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidOwners` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/publish` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidPublish` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/restore` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidRestore` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/revisions` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidRevisions` |

[]()

**Web links (`web-links`)**

API bases: `/api/modules/web-links`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Tenant `1`; Developer `1` |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (8):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/web-links` | List | `ListAsync` |
| `POST` | `/api/modules/web-links` | Create | `CreateAsync` |
| `GET` | `/api/modules/web-links/lego/catalog` | Get Lego Catalog | `GetLegoCatalog` |
| `GET` | `/api/modules/web-links/lookups/{lookupId:guid}` | Get Lego Lookup | `GetLegoLookupAsync` |
| `DELETE` | `/api/modules/web-links/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/web-links/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/web-links/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/web-links/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |

Developer API routes (8):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/web-links` | List / view | `developerGetV1AppsModulesWebLinks` |
| `POST` | `/v1/apps/{saasAppId}/modules/web-links` | Add / create / execute | `developerPostV1AppsModulesWebLinks` |
| `GET` | `/v1/apps/{saasAppId}/modules/web-links/lego/catalog` | List / view | `developerGetV1AppsModulesWebLinksLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/web-links/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesWebLinksLookupsLookupIdGuid` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/web-links/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesWebLinksRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/web-links/{recordId}` | List / view | `developerGetV1AppsModulesWebLinksRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/web-links/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesWebLinksRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/web-links/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesWebLinksRecordIdGuidFavorite` |

[]()

**Chat rooms (`chat-rooms`)**

API bases: `/api/modules/chat-rooms`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Tenant `2`; Developer `2` |
| Edit / update / modify | Tenant `6`; Developer `6` |
| Delete / remove / deactivate | Tenant `2`; Developer `2` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (14):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/chat-rooms` | List | `ListAsync` |
| `POST` | `/api/modules/chat-rooms` | Create | `CreateAsync` |
| `GET` | `/api/modules/chat-rooms/lego/catalog` | Lego Catalog | `LegoCatalogAsync` |
| `DELETE` | `/api/modules/chat-rooms/{recordId:guid}` | Remove | `RemoveAsync` |
| `GET` | `/api/modules/chat-rooms/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |
| `GET` | `/api/modules/chat-rooms/{recordId:guid}/members/lookup` | List / view | `MemberLookupAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}/members/{memberUserId:guid}` | Member management | `MemberAsync` |
| `POST` | `/api/modules/chat-rooms/{recordId:guid}/messages` | Message / reply | `PostMessageAsync` |
| `DELETE` | `/api/modules/chat-rooms/{recordId:guid}/messages/{chatMessageId:guid}` | Message / reply | `RemoveMessageAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}/messages/{chatMessageId:guid}` | Message / reply | `UpdateMessageAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}/messages/{chatMessageId:guid}/reaction` | Message / reply | `ReactionAsync` |
| `PUT` | `/api/modules/chat-rooms/{recordId:guid}/read` | Mark Read | `MarkReadAsync` |

Developer API routes (14):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/chat-rooms` | List / view | `developerGetV1AppsModulesChatRooms` |
| `POST` | `/v1/apps/{saasAppId}/modules/chat-rooms` | Add / create / execute | `developerPostV1AppsModulesChatRooms` |
| `GET` | `/v1/apps/{saasAppId}/modules/chat-rooms/lego/catalog` | List / view | `developerGetV1AppsModulesChatRoomsLegoCatalog` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesChatRoomsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}` | List / view | `developerGetV1AppsModulesChatRoomsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesChatRoomsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesChatRoomsRecordIdGuidFavorite` |
| `GET` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/members/lookup` | List / view | `developerGetV1AppsModulesChatRoomsRecordIdGuidMembersLookup` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/members/{memberUserId}` | Member management | `developerPutV1AppsModulesChatRoomsRecordIdGuidMembersMemberUserIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/messages` | Message / reply | `developerPostV1AppsModulesChatRoomsRecordIdGuidMessages` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/messages/{chatMessageId}` | Message / reply | `developerDeleteV1AppsModulesChatRoomsRecordIdGuidMessagesChatMessageIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/messages/{chatMessageId}` | Message / reply | `developerPutV1AppsModulesChatRoomsRecordIdGuidMessagesChatMessageIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/messages/{chatMessageId}/reaction` | Message / reply | `developerPutV1AppsModulesChatRoomsRecordIdGuidMessagesChatMessageIdGuidReaction` |
| `PUT` | `/v1/apps/{saasAppId}/modules/chat-rooms/{recordId}/read` | Edit / update / modify | `developerPutV1AppsModulesChatRoomsRecordIdGuidRead` |

[]()

**Discussion Boards (`discussion-boards`)**

API bases: `/api/modules/discussion-boards`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Tenant `3`; Developer `3` |
| Edit / update / modify | Tenant `4`; Developer `4` |
| Delete / remove / deactivate | Tenant `3`; Developer `3` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (14):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/discussion-boards` | List | `ListAsync` |
| `POST` | `/api/modules/discussion-boards` | Create Board | `CreateBoardAsync` |
| `GET` | `/api/modules/discussion-boards/lego/catalog` | Lego Catalog | `LegoCatalogAsync` |
| `DELETE` | `/api/modules/discussion-boards/posts/{recordId:guid}` | Remove Post | `RemovePostAsync` |
| `PUT` | `/api/modules/discussion-boards/posts/{recordId:guid}` | Update Post | `UpdatePostAsync` |
| `PUT` | `/api/modules/discussion-boards/records/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `DELETE` | `/api/modules/discussion-boards/topics/{recordId:guid}` | Remove Topic | `RemoveTopicAsync` |
| `GET` | `/api/modules/discussion-boards/topics/{recordId:guid}` | Get Topic | `GetTopicAsync` |
| `PUT` | `/api/modules/discussion-boards/topics/{recordId:guid}` | Update Topic | `UpdateTopicAsync` |
| `POST` | `/api/modules/discussion-boards/topics/{topicRecordId:guid}/posts` | Post Reply | `PostReplyAsync` |
| `POST` | `/api/modules/discussion-boards/{boardRecordId:guid}/topics` | Create Topic | `CreateTopicAsync` |
| `DELETE` | `/api/modules/discussion-boards/{recordId:guid}` | Remove Board | `RemoveBoardAsync` |
| `GET` | `/api/modules/discussion-boards/{recordId:guid}` | Get Board | `GetBoardAsync` |
| `PUT` | `/api/modules/discussion-boards/{recordId:guid}` | Update Board | `UpdateBoardAsync` |

Developer API routes (14):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/discussion-boards` | List / view | `developerGetV1AppsModulesDiscussionBoards` |
| `POST` | `/v1/apps/{saasAppId}/modules/discussion-boards` | Add / create / execute | `developerPostV1AppsModulesDiscussionBoards` |
| `GET` | `/v1/apps/{saasAppId}/modules/discussion-boards/lego/catalog` | List / view | `developerGetV1AppsModulesDiscussionBoardsLegoCatalog` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/discussion-boards/posts/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDiscussionBoardsPostsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/discussion-boards/posts/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDiscussionBoardsPostsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/discussion-boards/records/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDiscussionBoardsRecordsRecordIdGuidFavorite` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/discussion-boards/topics/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDiscussionBoardsTopicsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/discussion-boards/topics/{recordId}` | List / view | `developerGetV1AppsModulesDiscussionBoardsTopicsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/discussion-boards/topics/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDiscussionBoardsTopicsRecordIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/discussion-boards/topics/{topicRecordId}/posts` | Add / create / execute | `developerPostV1AppsModulesDiscussionBoardsTopicsTopicRecordIdGuidPosts` |
| `POST` | `/v1/apps/{saasAppId}/modules/discussion-boards/{boardRecordId}/topics` | Add / create / execute | `developerPostV1AppsModulesDiscussionBoardsBoardRecordIdGuidTopics` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/discussion-boards/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDiscussionBoardsRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/discussion-boards/{recordId}` | List / view | `developerGetV1AppsModulesDiscussionBoardsRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/discussion-boards/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDiscussionBoardsRecordIdGuid` |

[]()

**Mail reader (`mail-reader`)**

API bases: `/api/modules/mail-reader`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `3`; Developer `2` |
| Add / create / execute | Tenant `3`; Developer `0` |
| Edit / update / modify | Tenant `4`; Developer `2` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (10):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/mail-reader` | List | `ListAsync` |
| `GET` | `/api/modules/mail-reader/mailboxes` | List Mailboxes | `ListMailboxesAsync` |
| `POST` | `/api/modules/mail-reader/mailboxes` | Create Mailbox | `CreateMailboxAsync` |
| `PUT` | `/api/modules/mail-reader/mailboxes/{mailboxId:guid}` | Update Mailbox | `UpdateMailboxAsync` |
| `POST` | `/api/modules/mail-reader/mailboxes/{mailboxRecordId:guid}/compose` | Compose | `ComposeAsync` |
| `PUT` | `/api/modules/mail-reader/mailboxes/{mailboxRecordId:guid}/credentials/{purpose}` | Set Mailbox Credential | `SetMailboxCredentialAsync` |
| `GET` | `/api/modules/mail-reader/{recordId:guid}` | Get | `GetAsync` |
| `POST` | `/api/modules/mail-reader/{recordId:guid}/archive` | Archive | `ArchiveAsync` |
| `PUT` | `/api/modules/mail-reader/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `PUT` | `/api/modules/mail-reader/{recordId:guid}/read` | Set Read | `SetReadAsync` |

Developer API routes (4):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/mail-reader` | List / view | `developerGetV1AppsModulesMailReader` |
| `GET` | `/v1/apps/{saasAppId}/modules/mail-reader/{recordId}` | List / view | `developerGetV1AppsModulesMailReaderRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/mail-reader/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesMailReaderRecordIdGuidFavorite` |
| `PUT` | `/v1/apps/{saasAppId}/modules/mail-reader/{recordId}/read` | Edit / update / modify | `developerPutV1AppsModulesMailReaderRecordIdGuidRead` |

[]()

**Favorites (`favorites`)**

API bases: `/api/modules/favorites`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `5`; Developer `5` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | Tenant `7`; Developer `7` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (7):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/favorites` | Favorite / unfavorite | `ListAsync` |
| `GET` | `/api/modules/favorites/presentation` | Favorite / unfavorite | `PresentationAsync` |
| `GET` | `/api/modules/favorites/schema` | Favorite / unfavorite | `SchemaAsync` |
| `GET` | `/api/modules/favorites/{recordId:guid}` | Favorite / unfavorite | `GetAsync` |
| `PUT` | `/api/modules/favorites/{recordId:guid}/favorite` | Favorite / unfavorite | `SetAsync` |
| `PUT` | `/api/modules/favorites/{recordId:guid}/preferences` | Favorite / unfavorite | `UpdateAsync` |
| `GET` | `/api/modules/favorites/{recordId:guid}/state` | Favorite / unfavorite | `GetStateAsync` |

Developer API routes (7):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/favorites` | Favorite / unfavorite | `developerGetV1AppsModulesFavorites` |
| `GET` | `/v1/apps/{saasAppId}/modules/favorites/presentation` | Favorite / unfavorite | `developerGetV1AppsModulesFavoritesPresentation` |
| `GET` | `/v1/apps/{saasAppId}/modules/favorites/schema` | Favorite / unfavorite | `developerGetV1AppsModulesFavoritesSchema` |
| `GET` | `/v1/apps/{saasAppId}/modules/favorites/{recordId}` | Favorite / unfavorite | `developerGetV1AppsModulesFavoritesRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/favorites/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesFavoritesRecordIdGuidFavorite` |
| `PUT` | `/v1/apps/{saasAppId}/modules/favorites/{recordId}/preferences` | Favorite / unfavorite | `developerPutV1AppsModulesFavoritesRecordIdGuidPreferences` |
| `GET` | `/v1/apps/{saasAppId}/modules/favorites/{recordId}/state` | Favorite / unfavorite | `developerGetV1AppsModulesFavoritesRecordIdGuidState` |

[]()

**Notifications (`notifications`)**

API bases: `/api/modules/notifications`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `4`; Developer `4` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (6):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/notifications` | List | `ListAsync` |
| `GET` | `/api/modules/notifications/lego-catalog` | Lego Catalog | `LegoCatalogAsync` |
| `GET` | `/api/modules/notifications/lego-presentation` | Lego Presentation | `LegoPresentationAsync` |
| `GET` | `/api/modules/notifications/{notificationId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/notifications/{notificationId:guid}/source-favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `PUT` | `/api/modules/notifications/{notificationId:guid}/state` | State transition | `SetStateAsync` |

Developer API routes (6):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/notifications` | List / view | `developerGetV1AppsModulesNotifications` |
| `GET` | `/v1/apps/{saasAppId}/modules/notifications/lego-catalog` | List / view | `developerGetV1AppsModulesNotificationsLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/notifications/lego-presentation` | List / view | `developerGetV1AppsModulesNotificationsLegoPresentation` |
| `GET` | `/v1/apps/{saasAppId}/modules/notifications/{notificationId}` | List / view | `developerGetV1AppsModulesNotificationsNotificationIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/notifications/{notificationId}/source-favorite` | Favorite / unfavorite | `developerPutV1AppsModulesNotificationsNotificationIdGuidSourceFavorite` |
| `PUT` | `/v1/apps/{saasAppId}/modules/notifications/{notificationId}/state` | State transition | `developerPutV1AppsModulesNotificationsNotificationIdGuidState` |

[]()

**Dynamic Records (`dynamic-records`)**

API bases: `/api/modules/dynamic`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `8`; Developer `8` |
| Add / create / execute | Tenant `2`; Developer `2` |
| Edit / update / modify | Tenant `2`; Developer `2` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (13):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/dynamic` | Catalog | `CatalogAsync` |
| `POST` | `/api/modules/dynamic/caseflow-cases/{recordId:guid}/transition` | Transition Case Flow | `TransitionCaseFlowAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}` | List | `ListAsync` |
| `POST` | `/api/modules/dynamic/{moduleKey}` | Create | `CreateAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/export` | Export | `ExportAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/export/capability` | Get Export Capability | `GetExportCapabilityAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/lego/catalog` | Lego Catalog | `LegoCatalogAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/lookups/{lookupId:guid}` | Lego Lookup | `LegoLookupAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/schema` | Schema / field metadata | `SchemaAsync` |
| `DELETE` | `/api/modules/dynamic/{moduleKey}/{recordId:guid}` | Delete | `DeleteAsync` |
| `GET` | `/api/modules/dynamic/{moduleKey}/{recordId:guid}` | Get | `GetAsync` |
| `PUT` | `/api/modules/dynamic/{moduleKey}/{recordId:guid}` | Update | `UpdateAsync` |
| `PUT` | `/api/modules/dynamic/{moduleKey}/{recordId:guid}/favorite` | Favorite / unfavorite | `FavoriteAsync` |

Developer API routes (13):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic` | List / view | `developerGetV1AppsModulesDynamic` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/caseflow-cases/{recordId}/transition` | Add / create / execute | `developerPostV1AppsModulesDynamicCaseflowCasesRecordIdGuidTransition` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/export` | List / view | `developerGetV1AppsModulesDynamicModuleKeyExport` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/export/capability` | List / view | `developerGetV1AppsModulesDynamicModuleKeyExportCapability` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/lego/catalog` | List / view | `developerGetV1AppsModulesDynamicModuleKeyLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyLookupsLookupIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/schema` | Schema / field metadata | `developerGetV1AppsModulesDynamicModuleKeySchema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` |

[]()

**ActiveWorkplace (`active-workplace`)**

API bases: `/api/modules/active-workplace`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `7`; Developer `7` |
| Add / create / execute | Tenant `5`; Developer `5` |
| Edit / update / modify | Tenant `1`; Developer `1` |
| Delete / remove / deactivate | Tenant `1`; Developer `1` |
| Favorite / unfavorite | No direct route; use [Favorites](#first-class-favorites)  only for supported authorized Records |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | Tenant `1`; Developer `1` |

Tenant runtime routes (14):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/active-workplace` | List | `ListAsync` |
| `POST` | `/api/modules/active-workplace` | Create | `CreateAsync` |
| `GET` | `/api/modules/active-workplace/lego/catalog` | Lego Catalog | `LegoCatalog` |
| `GET` | `/api/modules/active-workplace/lego/lookups/{lookupId:guid}` | Lego Lookup | `LegoLookupAsync` |
| `GET` | `/api/modules/active-workplace/lego/presentation` | Presentation metadata | `LegoPresentationAsync` |
| `GET` | `/api/modules/active-workplace/{activeWorkplaceId:guid}` | Get | `GetAsync` |
| `PATCH` | `/api/modules/active-workplace/{activeWorkplaceId:guid}` | Update | `UpdateAsync` |
| `POST` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/activity` | Add / view activity | `RecordActivityAsync` |
| `POST` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/graph/refresh` | Refresh Graph | `RefreshGraphAsync` |
| `POST` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/participants` | Participant management | `AddParticipantAsync` |
| `GET` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/participants/catalog` | List / view | `ParticipantCatalogAsync` |
| `DELETE` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/participants/{activeWorkplaceParticipantId:guid}` | Participant management | `RemoveParticipantAsync` |
| `GET` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/playback` | Playback / history | `PlaybackAsync` |
| `POST` | `/api/modules/active-workplace/{activeWorkplaceId:guid}/status` | Status transition | `SetStatusAsync` |

Developer API routes (14):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace` | List / view | `developerGetV1AppsModulesActiveWorkplace` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace` | Add / create / execute | `developerPostV1AppsModulesActiveWorkplace` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/lego/catalog` | List / view | `developerGetV1AppsModulesActiveWorkplaceLegoCatalog` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/lego/lookups/{lookupId}` | List / view | `developerGetV1AppsModulesActiveWorkplaceLegoLookupsLookupIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/lego/presentation` | Presentation metadata | `developerGetV1AppsModulesActiveWorkplaceLegoPresentation` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}` | List / view | `developerGetV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuid` |
| `PATCH` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}` | Edit / update / modify | `developerPatchV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuid` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/activity` | Add / view activity | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidActivity` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/graph/refresh` | Add / create / execute | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidGraphRefresh` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/participants` | Participant management | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidParticipants` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/participants/catalog` | List / view | `developerGetV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidParticipantsCatalog` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/participants/{activeWorkplaceParticipantId}` | Participant management | `developerDeleteV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidParticipantsActiveWorkplaceParticipantIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/playback` | Playback / history | `developerGetV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidPlayback` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/status` | Status transition | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidStatus` |

[]()

**Record relations (`record-relations`)**

API bases: `/api/modules/record-graph`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `5`; Developer `5` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `3`; Developer `3` |
| Delete / remove / deactivate | Tenant `2`; Developer `2` |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | Tenant `10`; Developer `10` |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (10):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `DELETE` | `/api/modules/record-graph/knowledge-relations/{recordRelationId:guid}` | Relationship graph | `UnlinkKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/records` | Relationship graph | `SearchAsync` |
| `DELETE` | `/api/modules/record-graph/relations/{recordRelationId:guid}` | Associate / remove relationship | `RemoveRelationAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}` | Relationship graph | `GetAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/knowledge` | Relationship graph | `RelatedKnowledgeAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/knowledge` | Associate / add | `LinkKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/knowledge/candidates` | Relationship graph | `ContextualKnowledgeAsync` |
| `GET` | `/api/modules/record-graph/{recordId:guid}/relations` | List / view | `ListRelatedAsync` |
| `PUT` | `/api/modules/record-graph/{recordId:guid}/relations` | Associate / add | `AddRelationAsync` |

Developer API routes (10):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/knowledge-relations/{recordRelationId}` | Relationship graph | `developerDeleteV1AppsModulesRecordGraphKnowledgeRelationsRecordRelationIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/records` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecords` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesRecordGraphRecordIdGuidFavorite` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuidKnowledge` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidKnowledge` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge/candidates` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuidKnowledgeCandidates` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | List / view | `developerGetV1AppsModulesRecordGraphRecordIdGuidRelations` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` |

[]()

**Record activity (`record-activity`)**

API bases: `/api/modules/record-activity`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `3`; Developer `2` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `1`; Developer `1` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | Tenant `4`; Developer `3` |

Tenant runtime routes (4):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/record-activity/records` | Activity / audit history | `SearchAsync` |
| `GET` | `/api/modules/record-activity/{recordId:guid}` | Activity / audit history | `GetAsync` |
| `PUT` | `/api/modules/record-activity/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |
| `GET` | `/api/modules/record-activity/{recordId:guid}/history` | Activity / audit history | `ReadAsync` |

Developer API routes (3):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/records` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecords` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesRecordActivityRecordIdGuidFavorite` |

[]()

**Global secured search (`global-search`)**

API bases: `/api/modules/global-search`.

Day-to-day action coverage:

| Usability action | Direct route coverage |
| --- | --- |
| List / search / view | Tenant `2`; Developer `2` |
| Add / create / execute | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Edit / update / modify | Tenant `1`; Developer `1` |
| Delete / remove / deactivate | Not published as a direct action; this capability may be derived/read-only or action-specific |
| Favorite / unfavorite | Tenant `1`; Developer `1` |
| Associate / relationships | No direct route; use [Record relations](#first-class-record-relations)  only for supported authorized Records |
| Files / attachments / evidence | No direct route; use [Files](#first-class-files)  only for supported authorized Records |
| Activity / audit | No direct route; use [Record activity](#first-class-record-activity)  only for supported authorized Records |

Tenant runtime routes (3):

| Method | Route | Action | Controller action |
| --- | --- | --- | --- |
| `GET` | `/api/modules/global-search` | Search | `SearchAsync` |
| `GET` | `/api/modules/global-search/count` | Count | `CountAsync` |
| `PUT` | `/api/modules/global-search/records/{recordId:guid}/favorite` | Favorite / unfavorite | `SetFavoriteAsync` |

Developer API routes (3):

| Method | Route | Action | OpenAPI operationId |
| --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/global-search` | List / view | `developerGetV1AppsModulesGlobalSearch` |
| `GET` | `/v1/apps/{saasAppId}/modules/global-search/count` | List / view | `developerGetV1AppsModulesGlobalSearchCount` |
| `PUT` | `/v1/apps/{saasAppId}/modules/global-search/records/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesGlobalSearchRecordsRecordIdGuidFavorite` |

First-class totals: **292 tenant-runtime routes** and **273 Developer API routes** across 25 capabilities. These are unique route totals; discovery pages reuse the owning capabilities' routes, so per-capability counts must not be added together.

## Console-only capabilities

These tenant-runtime routes are intentionally absent from the promoted Developer API surface and are governed by the reviewed allow-list `tools/api-route-inventory-console-only-allowlist.json`. Here, console-only means tenant-runtime-only, not Builder Console; workflow approval is made by a signed-in user in Universal Inbox:

| Method | Tenant-runtime route | Why no Developer API equivalent is published |
| --- | --- | --- |
| `PUT` | `/api/goclaw/agents/{goClawAgentId:guid}/authority` | GoClaw agent authority is managed by signed-in tenant users in the tenant app; no delegated Developer API equivalent is published. |
| `POST` | `/api/inbox/items/{inboxItemId:guid}/workflow-approval` | Approval is made by a signed-in user in Universal Inbox; no Developer API equivalent is published, and the ActivityVersion fence remains in force. |
| `GET` | `/api/modules/record-activity/{recordId:guid}/history` | Secured record change history is available to signed-in tenant users through the native record envelope. The reviewed history release deliberately excludes this route from the Developer API; broader audit producer coverage remains separate. |

## Native-only operations

These routes retain their signed-in tenant boundary. Their presence does not grant Developer credentials access.

| Method | Native route | Boundary |
| --- | --- | --- |
| `GET` | `/api/modules/ai-insights/settings` | Organization-owner AI Insights producer settings; no delegated Developer API authority contract is reviewed. |
| `PUT` | `/api/modules/ai-insights/settings` | Organization-owner AI Insights producer settings; no delegated Developer API authority contract is reviewed. |
| `POST` | `/api/modules/ai-insights/settings/directives` | Organization-owner AI Insights producer settings; no delegated Developer API authority contract is reviewed. |
| `PUT` | `/api/modules/ai-insights/settings/directives/{directiveId:guid}` | Organization-owner AI Insights producer settings; no delegated Developer API authority contract is reviewed. |
| `PUT` | `/api/modules/ai-insights/settings/starters/{directiveId:guid}` | Organization-owner AI Insights producer settings; no delegated Developer API authority contract is reviewed. |
| `GET` | `/api/modules/contacts/list-preferences` | Signed-in tenant presentation preferences and audited secure-field operations; no delegated Developer API authority contract is published. |
| `PUT` | `/api/modules/contacts/list-preferences/{scope}` | Signed-in tenant presentation preferences and audited secure-field operations; no delegated Developer API authority contract is published. |
| `PUT` | `/api/modules/contacts/{recordId:guid}/secure-fields/{fieldDefinitionId:guid}` | Signed-in tenant presentation preferences and audited secure-field operations; no delegated Developer API authority contract is published. |
| `POST` | `/api/modules/contacts/{recordId:guid}/secure-fields/{fieldDefinitionId:guid}/reveal` | Signed-in tenant presentation preferences and audited secure-field operations; no delegated Developer API authority contract is published. |
| `GET` | `/api/modules/files/personal-limit` | Signed-in person's personal file limit and its organization-owner setting; no delegated Developer API authority contract is reviewed. |
| `PUT` | `/api/modules/files/personal-limit` | Signed-in person's personal file limit and its organization-owner setting; no delegated Developer API authority contract is reviewed. |
| `GET` | `/api/tenant/native-message-attachments/{recordId:guid}/content` | Native message attachment transport is not a promoted module action. |

## Deferred Developer API routes

These native routes remain explicitly deferred under the existing owner policy. Their presence in the native catalog does not publish them or create credential scopes.

| Method | Native route | Reviewed deferral |
| --- | --- | --- |
| `GET` | `/api/modules/mail-reader/mailboxes` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |
| `POST` | `/api/modules/mail-reader/mailboxes` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |
| `PUT` | `/api/modules/mail-reader/mailboxes/{mailboxId:guid}` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |
| `POST` | `/api/modules/mail-reader/mailboxes/{mailboxRecordId:guid}/compose` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |
| `PUT` | `/api/modules/mail-reader/mailboxes/{mailboxRecordId:guid}/credentials/{purpose}` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |
| `POST` | `/api/modules/mail-reader/{recordId:guid}/archive` | Mailbox administration, credentials, compose/send and archive remain deferred pending their separate provider and lifecycle acceptance. The four restored message operations use verified installed secured SQL. |

## 2. Build This product routes

Origins are `recipe:<step-key>` for canonical Developer API recipe steps and `solution-manifest` for additional operation IDs explicitly present in the runnable production solution. An operation can have both origins.

**CrewOS (`crew-os`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.goclaw.read`, `modules.goclaw.write`, `modules.record-graph.read`, `modules.universal-inbox.read`.

Composed first-class capability route sets: [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [goclaw](#first-class-goclaw), [record-activity](#first-class-record-activity)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `crewos-agent-profiles` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `crewos-work-requests` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `crewos-ratings` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `crewos-approval-inbox` | `crewos-work-requests` | Planning is read-only; this surface applies only canonical approve, reject, retry, or take-over controls and never edits source records directly. |
| `crewos-execution-timeline` | `crewos-work-requests` | Execution evidence is an immutable derived trail; lifecycle changes occur on the source work request or governed approval. |

Direct recipe/solution operations (13):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/goclaw/approvals` | List / view | `developerGetV1AppsGoclawApprovals` | `recipe:list-approvals` |
| `POST` | `/v1/apps/{saasAppId}/goclaw/approvals/{suggestionBatchId}/approve` | Approve | `developerPostV1AppsGoclawApprovalsSuggestionBatchIdGuidApprove` | `recipe:approve-batch` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` | `recipe:verify-inbox` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:open-context, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**SignalIQ (`signal-iq`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.ai-insights.read`, `modules.ai-insights.write`, `modules.contacts.read`, `modules.record-graph.read`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [goclaw](#first-class-goclaw)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `signaliq-accounts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `signaliq-contacts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `signaliq-opportunities` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `signaliq-signals` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `signaliq-score-snapshots` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `signaliq-recommendations` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `signaliq-revenue-command-center` | `signaliq-accounts` | The command center ranks and explains permitted records; lifecycle changes occur on the native account, opportunity, signal, score, or recommendation record. |
| `signaliq-secured-insights` | `signaliq-recommendations` | AI Insights are secured findings with personal feed state, not authorization to mutate CRM records. |
| `signaliq-action-approvals` | `signaliq-recommendations` | Planning is read-only; material next-best actions use the canonical permission and ActivityVersion-fenced approval chain. |

Direct recipe/solution operations (14):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/ai-insights` | List / view | `developerGetV1AppsModulesAiInsights` | `recipe:list-insights` |
| `GET` | `/v1/apps/{saasAppId}/modules/ai-insights/{insightId}` | List / view | `developerGetV1AppsModulesAiInsightsInsightIdGuid` | `recipe:open-insight` |
| `PUT` | `/v1/apps/{saasAppId}/modules/ai-insights/{insightId}/state` | State transition | `developerPutV1AppsModulesAiInsightsInsightIdGuidState` | `recipe:set-state` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts` | List / view | `developerGetV1AppsModulesContacts` | `recipe:find-account` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:load-graph, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**Resolve (`resolve`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.conversations.write`, `modules.knowledge-articles.read`, `modules.universal-inbox.read`, `modules.universal-inbox.write`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [conversations](#first-class-conversations), [dynamic-records](#first-class-dynamic-records), [goclaw](#first-class-goclaw), [knowledge-core](#first-class-knowledge-core), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `resolve-customer-contexts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `resolve-issues` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `resolve-resolution-suggestions` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `resolve-escalations` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `resolve-universal-inbox` | `resolve-issues` | Universal Inbox is the attention layer; communication lifecycle remains on the native Conversation and issue lifecycle remains on Resolve Issues. |
| `resolve-policy-findings` | `resolve-resolution-suggestions` | Cited AI findings do not authorize customer-facing mutations; actions require policy or human approval. |
| `resolve-action-approvals` | `resolve-resolution-suggestions` | Planning is read-only and approval retains the current Inbox ActivityVersion fence. |

Direct recipe/solution operations (15):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` | `recipe:list-work` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}` | List / view | `developerGetV1AppsInboxItemsInboxItemIdGuid` | `recipe:open-ticket` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}/human-state` | Human state / resolution | `developerPutV1AppsInboxItemsInboxItemIdGuidHumanState` | `recipe:resolve` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/messages` | Message / reply | `developerPostV1AppsModulesConversationsRecordIdGuidMessages` | `recipe:reply` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core` | List / view | `developerGetV1AppsModulesKnowledgeCore` | `recipe:find-policy` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**LaunchPilot (`launch-pilot`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.dynamic-records.read`, `modules.dynamic-records.write`, `modules.files.write`, `modules.goclaw.read`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `launchpilot-campaigns` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `launchpilot-audiences` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `launchpilot-assets` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `launchpilot-channel-runs` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (cancel) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `launchpilot-experiments` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `launchpilot-performance-snapshots` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `launchpilot-campaign-readiness` | `launchpilot-campaigns` | Readiness and AI findings explain permitted campaign evidence but never authorize audience disclosure, claims, spend, or activation. |
| `launchpilot-approval-attention` | `launchpilot-channel-runs` | Universal Inbox points to approval work; the managed channel run retains launch state and frozen inputs. |
| `launchpilot-optimization-findings` | `launchpilot-performance-snapshots` | Performance findings may propose a bounded experiment or budget adjustment but cannot silently activate channels or move spend. |

Direct recipe/solution operations (13):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/goclaw/approvals` | List / view | `developerGetV1AppsGoclawApprovals` | `recipe:inspect-approvals` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `recipe:create-campaign, solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/schema` | Schema / field metadata | `developerGetV1AppsModulesDynamicModuleKeySchema` | `recipe:read-schema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `recipe:verify-campaign, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/upload` | File / attachment | `developerPostV1AppsModulesFilesUpload` | `recipe:upload-asset` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**Northstar (`northstar`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.ai-insights.read`, `modules.ai-insights.write`, `modules.global-search.read`, `modules.record-activity.read`, `modules.record-graph.read`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [goclaw](#first-class-goclaw)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `northstar-metric-definitions` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `northstar-metric-observations` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `northstar-forecasts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `northstar-signals` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `northstar-scenarios` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `northstar-briefings` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `northstar-executive-scorecard` | `northstar-metric-definitions` | The scorecard summarizes currently permitted managed metric and observation records and links back to their native lifecycle. |
| `northstar-synthesis` | `northstar-signals` | AI synthesis explains authorized evidence and uncertainty but cannot invent or overwrite metrics, forecasts, or decisions. |
| `northstar-decision-approvals` | `northstar-briefings` | Planning and approval attention do not mutate operating systems; approved follow-up uses the canonical governed action chain. |

Direct recipe/solution operations (13):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/ai-insights` | List / view | `developerGetV1AppsModulesAiInsights` | `recipe:list-insights` |
| `PUT` | `/v1/apps/{saasAppId}/modules/ai-insights/{insightId}/state` | State transition | `developerPutV1AppsModulesAiInsightsInsightIdGuidState` | `recipe:record-disposition` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/global-search` | List / view | `developerGetV1AppsModulesGlobalSearch` | `recipe:search` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `recipe:load-history, solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:load-evidence, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**TeamBox (`team-box`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.conversations.read`, `modules.conversations.write`, `modules.universal-inbox.read`, `modules.universal-inbox.write`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [conversations](#first-class-conversations), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [goclaw](#first-class-goclaw), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `teambox-channel-intake-policies` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `teambox-queues` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `teambox-routing-rules` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `teambox-classification-reviews` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `teambox-sla-policies` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `teambox-handoff-playbooks` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `teambox-attention-queue` | `teambox-queues` | Universal Inbox is the attention and ownership projection; native conversations and their source business records keep their lifecycle and history. |
| `teambox-triage-insights` | `teambox-classification-reviews` | AI classification and summaries expose permitted evidence and uncertainty; reviewers change managed disposition without overwriting the native conversation. |
| `teambox-action-approvals` | `teambox-handoff-playbooks` | Prepared customer replies and material operations stay fenced to the Inbox ActivityVersion and require configured policy or human approval. |

Direct recipe/solution operations (15):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` | `recipe:list-attention` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}` | List / view | `developerGetV1AppsInboxItemsInboxItemIdGuid` | `recipe:open-item` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}/human-state` | Human state / resolution | `developerPutV1AppsInboxItemsInboxItemIdGuidHumanState` | `recipe:claim-or-complete` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}` | List / view | `developerGetV1AppsModulesConversationsRecordIdGuid` | `recipe:open-conversation` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/messages` | Message / reply | `developerPostV1AppsModulesConversationsRecordIdGuidMessages` | `recipe:reply` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**RelateEverything (`relate-everything`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.contacts.write`, `modules.global-search.read`, `modules.record-graph.read`, `modules.record-graph.write`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [contacts](#first-class-contacts), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [global-search](#first-class-global-search), [record-relations](#first-class-record-relations)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `relateeverything-companies` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `relateeverything-workstreams` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `relateeverything-opportunities` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `relateeverything-relationship-contexts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `relateeverything-duplicate-reviews` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `relateeverything-connected-automations` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `relateeverything-connected-search` | `relateeverything-companies` | Search discovers only currently authorized canonical records and links to the owning module lifecycle. |
| `relateeverything-permissioned-graph` | `relateeverything-relationship-contexts` | Graph traversal omits inaccessible nodes and incident edges; relation creation and removal remain explicit secured operations. |
| `relateeverything-context-insights` | `relateeverything-duplicate-reviews` | AI summarizes currently authorized connected context and marks inferred links separately from confirmed facts. |

Direct recipe/solution operations (12):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/modules/contacts` | Add / create / execute | `developerPostV1AppsModulesContacts` | `recipe:create-contact` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/global-search` | List / view | `developerGetV1AppsModulesGlobalSearch` | `recipe:search` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:read-graph, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `recipe:relate-record, solution-manifest` |

**CustomerPortal (`customer-portal`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `app-credential-then-delegated-user`. Required recipe scopes: `modules.conversations.read`, `modules.files.read`, `tenant-accounts.write`, `tenant-users.read`, `tenant-users.tokens.issue`, `tenant-users.write`.

Composed first-class capability route sets: [dynamic-records](#first-class-dynamic-records), [files](#first-class-files)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `customerportal-requests` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `customerportal-milestones` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `customerportal-approvals` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (revoke) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `customerportal-shared-updates` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `customerportal-internal-operations` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `customerportal-visibility-reviews` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `customerportal-global-search` | `customerportal-requests` | Search is derived and opens the native secured record lifecycle. |
| `customerportal-relationship-graph` | `customerportal-requests` | Graph traversal returns only independently authorized nodes and edges. |
| `customerportal-internal-ai` | `customerportal-internal-operations` | AI Insights are internal read-only synthesis and never authorize customer-facing action. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/accounts` | Add / create / execute | `developerHeadlessIdentityCreateAccount` | `recipe:create-account` |
| `GET` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/security-catalog` | List / view | `developerHeadlessIdentityGetSecurityCatalog` | `recipe:read-security-catalog` |
| `POST` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users` | Add / create / execute | `developerHeadlessIdentityCreateUser` | `recipe:create-user` |
| `GET` | `/v1/apps/{saasAppId}/modules/conversations` | List / view | `developerGetV1AppsModulesConversations` | `recipe:list-shared-conversations` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/files` | File / attachment | `developerGetV1AppsModulesFiles` | `recipe:list-shared-files` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/user-token-exchanges` | Add / create / execute | `developerHeadlessIdentityExchangeUserToken` | `recipe:issue-user-token` |

**CompanyIQ (`company-iq`)**

Readiness: **withheld - not buildable in this kit** — its real Developer API operations and GPU/producer readiness lanes are not available in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `ai.read`, `ai.write`, `modules.knowledge-articles.write`, `modules.record-graph.write`.

Composed first-class capability route sets: [dynamic-records](#first-class-dynamic-records), [files](#first-class-files)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `companyiq-source-catalog` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `companyiq-business-context` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `companyiq-intelligence-runs` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (cancel) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `companyiq-opportunity-insights` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `companyiq-evidence-reviews` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `companyiq-semantic-search` | `companyiq-source-catalog` | Search returns only independently authorized source evidence and links back to the native owner. |
| `companyiq-native-ai-insights` | `companyiq-opportunity-insights` | The feed is a secured projection; lifecycle remains on the underlying insight and governed action records. |

Direct recipe/solution operations (15):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/ai/search` | Search | `developerAiSearch` | `recipe:search` |
| `POST` | `/v1/apps/{saasAppId}/ai/sources/records/{recordId}/ingest` | Add / create / execute | `developerAiIngest` | `recipe:ingest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCore` | `recipe:create-knowledge` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/publish` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidPublish` | `recipe:publish` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/knowledge` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidKnowledge` | `recipe:connect-record` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**OpsAtlas (`ops-atlas`)**

Readiness: **withheld - not buildable in this kit** — its real Developer API operations and GPU/producer readiness lanes are not available in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.knowledge-articles.read`, `modules.knowledge-articles.write`.

Composed first-class capability route sets: [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [knowledge-core](#first-class-knowledge-core)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `opsatlas-operating-domains` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `opsatlas-source-registers` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `opsatlas-review-programs` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `opsatlas-gap-triage` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `opsatlas-governed-actions` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (cancel) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `opsatlas-secured-answers` | `opsatlas-source-registers` | Answer synthesis is read-only and opens exact published source revisions; unsupported answers create questions instead of fabricating. |
| `opsatlas-knowledge-health` | `opsatlas-gap-triage` | Health is a secured projection; lifecycle remains on Knowledge items, questions, reviews, and triage records. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCore` | `recipe:create-article` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/gaps` | List / view | `developerGetV1AppsModulesKnowledgeCoreGaps` | `recipe:review-gaps` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/health` | List / view | `developerGetV1AppsModulesKnowledgeCoreHealth` | `recipe:review-health` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/owners` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidOwners` | `recipe:assign-owner` |
| `POST` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/publish` | Add / create / execute | `developerPostV1AppsModulesKnowledgeCoreRecordIdGuidPublish` | `recipe:publish` |
| `GET` | `/v1/apps/{saasAppId}/modules/knowledge-core/{recordId}/revisions` | List / view | `developerGetV1AppsModulesKnowledgeCoreRecordIdGuidRevisions` | `recipe:verify-revisions` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**Headless SaaS DB (`headless-saas-db`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `app-credential-then-delegated-user`. Required recipe scopes: `modules.dynamic-records.write`, `modules.record-graph.read`, `modules.record-graph.write`, `records.read`, `records.write`, `tenant-accounts.write`, `tenant-users.tokens.issue`, `tenant-users.write`, `webhooks.write`.

Composed first-class capability route sets: [dynamic-records](#first-class-dynamic-records), [files](#first-class-files)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `headless-domain-records` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `headless-api-client-profiles` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (revoke) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `headless-inbound-contracts` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `headless-webhook-policies` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `headless-operation-evidence` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `headless-native-api-clients` | `headless-api-client-profiles` | Profiles link to the native Developer Console credential lifecycle; one-time secrets are never copied into dynamic records or browser output. |
| `headless-delivery-diagnostics` | `headless-operation-evidence` | Diagnostics are bounded projections; retries and state changes remain on authorized native Developer API operations. |

Direct recipe/solution operations (20):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/accounts` | Add / create / execute | `developerHeadlessIdentityCreateAccount` | `recipe:create-account` |
| `POST` | `/v1/apps/{saasAppId}/accounts/{appAccountId}/users` | Add / create / execute | `developerHeadlessIdentityCreateUser` | `recipe:create-user` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `recipe:favorite-record, solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `recipe:remove-relation, solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:inspect-graph, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `recipe:add-relation, solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/objects/{objectKey}/records` | Add / create / execute | `developerRecordsCreate` | `recipe:create-record` |
| `DELETE` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | Delete / remove / deactivate | `developerRecordsDelete` | `recipe:remove-record` |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | List / view | `developerRecordsGet` | `recipe:read-record` |
| `PATCH` | `/v1/apps/{saasAppId}/objects/{objectKey}/records/{recordId}` | Edit / update / modify | `developerRecordsUpdate` | `recipe:update-record` |
| `GET` | `/v1/apps/{saasAppId}/objects/{objectKey}/schema` | Schema / field metadata | `developerRecordsGetSchema` | `recipe:read-object-schema` |
| `POST` | `/v1/apps/{saasAppId}/user-token-exchanges` | Add / create / execute | `developerHeadlessIdentityExchangeUserToken` | `recipe:issue-token` |
| `POST` | `/v1/apps/{saasAppId}/webhooks` | Add / create / execute | `developerWebhookSubscriptionsCreate` | `recipe:create-webhook` |
| `PUT` | `/v1/apps/{saasAppId}/webhooks/{subscriptionId}` | Edit / update / modify | `developerWebhookSubscriptionsUpdate` | `recipe:deactivate-webhook` |

**CaseFlow (`case-flow`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.checklists-signoffs.write`, `modules.dynamic-records.read`, `modules.dynamic-records.write`, `modules.files.write`, `modules.universal-inbox.read`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [checklists-signoffs](#first-class-checklists-signoffs), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [record-activity](#first-class-record-activity), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `caseflow-cases` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-parties` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-stage-transitions` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-tasks` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-evidence` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-decisions` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `caseflow-approvals` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `caseflow-inbox` | `caseflow-approvals` | Universal Inbox is the attention and approval surface; cases, decisions and signoff checklists retain native lifecycle ownership. |
| `caseflow-ai-review` | `caseflow-decisions` | AI may summarize permitted evidence and suggest next work but cannot decide or advance a case. |
| `caseflow-activity` | `caseflow-cases` | Activity is an audit projection with links back to the secured native case records. |

Direct recipe/solution operations (15):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` | `recipe:verify-attention` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRuns` | `recipe:start-checklist` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}/submit` | Submit workflow | `developerPostV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuidSubmit` | `recipe:submit-stage` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `recipe:create-case, solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/schema` | Schema / field metadata | `developerGetV1AppsModulesDynamicModuleKeySchema` | `recipe:read-case-schema` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/upload` | File / attachment | `developerPostV1AppsModulesFilesUpload` | `recipe:upload-proof` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**AssetOps (`asset-ops`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.checklists-signoffs.write`, `modules.dynamic-records.write`, `modules.files.write`, `modules.record-graph.read`, `modules.work-orders.write`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [checklists-signoffs](#first-class-checklists-signoffs), [contacts](#first-class-contacts), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [record-activity](#first-class-record-activity), [work-orders](#first-class-work-orders)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `assetops-sites` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (deactivate) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `assetops-assets` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `assetops-inspection-findings` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `assetops-part-usages` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `assetops-service-events` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (archive) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `assetops-condition-signals` | `assetops-assets` | AI condition summaries are suggestions over permitted history and cannot mutate asset or work state. |
| `assetops-activity` | `assetops-service-events` | Activity is an audit projection with links back to the secured native record. |

Direct recipe/solution operations (13):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRuns` | `recipe:start-inspection` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `recipe:create-asset, solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/upload` | File / attachment | `developerPostV1AppsModulesFilesUpload` | `recipe:upload-evidence` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `recipe:verify-graph, solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/work-orders` | Add / create / execute | `developerPostV1AppsModulesWorkOrders` | `recipe:create-work-order` |

**ActiveWorkplace (`active-workplace`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.active-workplace.read`, `modules.active-workplace.write`.

Composed first-class capability route sets: [active-workplace](#first-class-active-workplace), [dynamic-records](#first-class-dynamic-records), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `activeworkplace-work-items` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (close) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |
| `activeworkplace-playbooks` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `activeworkplace-playback` | `activeworkplace-work-items` | Graph Playback re-applies current authorization and exposes no mutation controls. |
| `activeworkplace-inbox` | `activeworkplace-work-items` | Universal Inbox is the shared attention layer; the root Record and workplace remain native owners. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace` | Add / create / execute | `developerPostV1AppsModulesActiveWorkplace` | `recipe:create-workplace` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/activity` | Add / view activity | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidActivity` | `recipe:append-activity` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/graph/refresh` | Add / create / execute | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidGraphRefresh` | `recipe:refresh-graph` |
| `POST` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/participants` | Participant management | `developerPostV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidParticipants` | `recipe:add-participant` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/participants/catalog` | List / view | `developerGetV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidParticipantsCatalog` | `recipe:list-participants` |
| `GET` | `/v1/apps/{saasAppId}/modules/active-workplace/{activeWorkplaceId}/playback` | Playback / history | `developerGetV1AppsModulesActiveWorkplaceActiveWorkplaceIdGuidPlayback` | `recipe:playback` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**FieldService (`field-service`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.calendar.write`, `modules.checklists-signoffs.write`, `modules.contacts.read`, `modules.work-orders.write`.

Composed first-class capability route sets: [ai-insights](#first-class-ai-insights), [calendar](#first-class-calendar), [contacts](#first-class-contacts), [conversations](#first-class-conversations), [dynamic-records](#first-class-dynamic-records), [universal-inbox](#first-class-universal-inbox), [work-orders](#first-class-work-orders)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `change-requests` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (cancel) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `fieldservice-ai-assistant` | `change-requests` | The assistant returns cited permitted evidence and cannot mutate jobs, approvals or customer messages. |
| `fieldservice-inbox` | `change-requests` | Universal Inbox projects attention while native Records remain source of truth. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `POST` | `/v1/apps/{saasAppId}/modules/calendar` | Add / create / execute | `developerPostV1AppsModulesCalendar` | `recipe:schedule` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRuns` | `recipe:start-proof-checklist` |
| `GET` | `/v1/apps/{saasAppId}/modules/contacts` | List / view | `developerGetV1AppsModulesContacts` | `recipe:find-customer` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/work-orders` | Add / create / execute | `developerPostV1AppsModulesWorkOrders` | `recipe:create-job` |
| `PUT` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}/assignment` | Assignment update | `developerPutV1AppsModulesWorkOrdersRecordIdGuidAssignment` | `recipe:assign-technician` |
| `PUT` | `/v1/apps/{saasAppId}/modules/work-orders/{recordId}/status` | Status transition | `developerPutV1AppsModulesWorkOrdersRecordIdGuidStatus` | `recipe:complete-job` |

**Reservations (`reservations`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.reservations.read`, `modules.reservations.write`.

Composed first-class capability route sets: [calendar](#first-class-calendar), [contacts](#first-class-contacts), [dynamic-records](#first-class-dynamic-records), [reservations](#first-class-reservations)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `reservation-policies` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `reservation-payment-state` | `reservation-policies` | Provider-synchronized payment state is displayed but never client-authored. |
| `reservation-capacity` | `reservation-policies` | Availability is derived from server-locked overlap checks, not editable counters. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/products` | List / view | `developerGetV1AppsModulesReservationsProducts` | `recipe:list-products` |
| `POST` | `/v1/apps/{saasAppId}/modules/reservations/products` | Add / create / execute | `developerPostV1AppsModulesReservationsProducts` | `recipe:publish-product` |
| `POST` | `/v1/apps/{saasAppId}/modules/reservations/purchase` | Add / create / execute | `developerPostV1AppsModulesReservationsPurchase` | `recipe:purchase` |
| `GET` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}` | List / view | `developerGetV1AppsModulesReservationsRecordIdGuid` | `recipe:open-reservation` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/followups` | Edit / update / modify | `developerPutV1AppsModulesReservationsRecordIdGuidFollowups` | `recipe:set-follow-up` |
| `PUT` | `/v1/apps/{saasAppId}/modules/reservations/{recordId}/status` | Status transition | `developerPutV1AppsModulesReservationsRecordIdGuidStatus` | `recipe:set-status` |

**Checkoff & Approval (`checkoff-approval`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.checklists-signoffs.read`, `modules.checklists-signoffs.write`, `modules.files.write`.

Composed first-class capability route sets: [checklists-signoffs](#first-class-checklists-signoffs), [dynamic-records](#first-class-dynamic-records), [files](#first-class-files), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `verification-programs` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `checklist-progress` | `verification-programs` | Progress is derived from versioned native run items and validated evidence. |
| `signoff-attention` | `verification-programs` | Universal Inbox projects the native Workflow approval and preserves its ActivityVersion fence. |

Direct recipe/solution operations (21):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `PUT` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/items/{checklistRunItemId}` | Edit / update / modify | `developerPutV1AppsModulesChecklistsSignoffsItemsChecklistRunItemIdGuid` | `recipe:complete-item` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/items/{checklistRunItemId}/proof` | File proof / evidence | `developerPostV1AppsModulesChecklistsSignoffsItemsChecklistRunItemIdGuidProof` | `recipe:attach-proof` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsRuns` | `recipe:start-run` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}` | List / view | `developerGetV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuid` | `recipe:verify` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/runs/{checklistRunId}/submit` | Submit workflow | `developerPostV1AppsModulesChecklistsSignoffsRunsChecklistRunIdGuidSubmit` | `recipe:submit` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates` | List / view | `developerGetV1AppsModulesChecklistsSignoffsTemplates` | `recipe:list-templates` |
| `POST` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates` | Add / create / execute | `developerPostV1AppsModulesChecklistsSignoffsTemplates` | `recipe:create-template` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` | `recipe:deactivate-template` |
| `GET` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | List / view | `developerGetV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` | `recipe:open-template` |
| `PUT` | `/v1/apps/{saasAppId}/modules/checklists-signoffs/templates/{checklistTemplateId}` | Edit / update / modify | `developerPutV1AppsModulesChecklistsSignoffsTemplatesChecklistTemplateIdGuid` | `recipe:update-template` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/files/upload` | File / attachment | `developerPostV1AppsModulesFilesUpload` | `recipe:upload-proof` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

**Support Tickets (`support-tickets`)**

Readiness: **available** — the product's published recipe and composed surfaces are shipped in this kit.

Identity mode: `delegated-user`. Required recipe scopes: `modules.conversations.write`, `modules.universal-inbox.read`, `modules.universal-inbox.write`.

Composed first-class capability route sets: [conversations](#first-class-conversations), [dynamic-records](#first-class-dynamic-records), [knowledge-core](#first-class-knowledge-core), [record-relations](#first-class-record-relations), [universal-inbox](#first-class-universal-inbox)

Managed record day-to-day lifecycle:

| Managed record type | List | View | Add | Edit / modify | Remove | Favorite | Associate | Files / evidence | Activity |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `support-playbooks` | Yes — `GET` | Yes — `GET` | Yes — `POST` | Yes — `PUT` | Yes — `DELETE` (retire) | Yes — `PUT` on/off | Yes — `GET/PUT/DELETE` | Shared Files by authorized `recordId` | Yes — `GET` |

Derived/read-only surfaces do not duplicate destructive lifecycle actions:

| Surface | Native owner / return path | Why it is read-only here |
| --- | --- | --- |
| `support-ticket-attention` | `support-playbooks` | Universal Inbox projects the Conversation into ticket identity, attention, assignment, SLA and audited resolution state; it does not replace the source thread. |
| `support-customer-context` | `support-playbooks` | Related customer and business records remain independently secured native records with paths to their owning modules. |

Direct recipe/solution operations (16):

| Method | Route | Action | OpenAPI operationId | Origin |
| --- | --- | --- | --- | --- |
| `GET` | `/v1/apps/{saasAppId}/inbox/email-channels/ticketing` | Mailbox ticketing configuration | `developerGetV1AppsInboxEmailChannelsTicketing` | `recipe:list-email-channels` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/email-channels/{channelConnectionId}/ticketing` | Mailbox ticketing configuration | `developerPutV1AppsInboxEmailChannelsChannelConnectionIdGuidTicketing` | `recipe:enable-ticketing` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items` | List / view | `developerGetV1AppsInboxItems` | `recipe:list-tickets` |
| `GET` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}` | List / view | `developerGetV1AppsInboxItemsInboxItemIdGuid` | `recipe:open-ticket, recipe:verify` |
| `PUT` | `/v1/apps/{saasAppId}/inbox/items/{inboxItemId}/human-state` | Human state / resolution | `developerPutV1AppsInboxItemsInboxItemIdGuidHumanState` | `recipe:resolve` |
| `POST` | `/v1/apps/{saasAppId}/modules/conversations/{recordId}/messages` | Message / reply | `developerPostV1AppsModulesConversationsRecordIdGuidMessages` | `recipe:reply` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | List / view | `developerGetV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `POST` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}` | Add / create / execute | `developerPostV1AppsModulesDynamicModuleKey` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Delete / remove / deactivate | `developerDeleteV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | List / view | `developerGetV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}` | Edit / update / modify | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/dynamic/{moduleKey}/{recordId}/favorite` | Favorite / unfavorite | `developerPutV1AppsModulesDynamicModuleKeyRecordIdGuidFavorite` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-activity/{recordId}` | Activity / audit history | `developerGetV1AppsModulesRecordActivityRecordIdGuid` | `solution-manifest` |
| `DELETE` | `/v1/apps/{saasAppId}/modules/record-graph/relations/{recordRelationId}` | Associate / remove relationship | `developerDeleteV1AppsModulesRecordGraphRelationsRecordRelationIdGuid` | `solution-manifest` |
| `GET` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}` | Relationship graph | `developerGetV1AppsModulesRecordGraphRecordIdGuid` | `solution-manifest` |
| `PUT` | `/v1/apps/{saasAppId}/modules/record-graph/{recordId}/relations` | Associate / add | `developerPutV1AppsModulesRecordGraphRecordIdGuidRelations` | `solution-manifest` |

Build This totals: **18 products**, **73 recipe step references**, and **76 unique direct recipe/solution routes** after adding manifest operations and removing duplicates.

## Interpretation constraints

- A route's presence is not permission. The server derives SaaS, tenant account, user, DataRole, location, and capabilities from verified identity.
- Route parameters such as `{saasAppId}`, `{recordId}`, or `{moduleKey}` are query targets, not authorization proof.
- Build This products are compositions. Their direct table is deliberately limited to routes explicitly named by generated recipes or solution manifests; their linked first-class modules provide the complete native route surface above.
- 'Every record' means every canonical record currently authorized for the caller. It never means tenant-wide disclosure, a relationship to a derived projection, or permission inherited through an edge.
- SQL procedures are not HTTP routes. Procedure joins remain in the machine-readable catalog and current database exports and are not duplicated here.
- This inventory is prospective technical documentation and does not reproduce private reasoning.

---

Capability review: 2026-09-14. [View the canonical guide](https://support.buildwithhq.com/api/api-map.html).
