Skip to main content

Apps Domain

The Apps domain provides endpoints for managing a client's applications. An app is a client-scoped record that links a client to a Catalog App and adds client-specific metadata such as favorite status and license tracking.

The underlying apps table is an overlay on the shared catalog_applications table. Catalog data (name, logo, vendor, categories) comes from the catalog; client-specific data (is_favorite, license_count) lives on the app record itself.

For embedding and endpoint design decisions, see the Design Guidelines.

Endpoints

EndpointMethodDescription
List AppsGETPaginated list of the client's apps
Get AppGETFetch a single app by ID
Update AppPATCHUpdate client-specific fields (favorite, approved, license count)
Add FavoritesPOSTBulk add apps to favorites
Remove FavoritesPOSTBulk remove apps from favorites
Approve AppsPOSTBulk approve apps
Remove App ApprovalsPOSTBulk remove app approvals
App HistoryGETTimeline of approval events and notes for a single app
Add App History NotePOSTAppend a note event to a single app timeline

Why catalog_app is embedded

The catalog app is the identity of an app -- you need its name, logo, vendor, and categories to display anything meaningful. It passes all three conditions of the embedding rule:

RelationshipBounded?Always needed?Static?Decision
App → CatalogAppYes (always 1)YesYesEmbed
CatalogApp → VendorYes (always 1)YesYesEmbed (inside catalog_app)
CatalogApp → CategoriesYes (1–5)YesYesEmbed (inside catalog_app)

The embedded catalog_app reuses the existing CatalogApp DTO. This avoids defining a near-identical Ref type and keeps the shape consistent across domains.

Data Transfer Objects (DTOs)

AppRef

Lightweight app reference for embedding inside analytics and cross-domain responses. Contains only the fields needed to identify and display an app in a table row or list item. Consumers call Get App for the full object.

The rule for what belongs in AppRef: ask "does every place this app appears as a non-primary resource need this field to render a meaningful row?" If yes, it belongs here. If only the app's own endpoints need it (e.g. vendor, categories, license count), it belongs in App only.

{
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"canonical_name": "Slack",
"logo": "https://cdn.example.com/logos/slack.png",
"type": "desktop",
"is_favorite": true,
"is_approved": true
}
FieldTypeNullableDescription
idstring (uuid)NoStable unique identifier for this client-app record
canonical_namestringNoDisplay name from the catalog
logostringYesLogo URL from the catalog. null if no logo is available.
typestringNoCatalog app type (e.g. desktop, browser)
is_favoritebooleanNoWhether this app is marked as a favorite for the client
is_approvedbooleanNoWhether this app is approved for use by the client

DB source:

DTO FieldDB Column
idapps.id
canonical_namecatalog_applications.canonical_name (via apps.catalog_application_id)
logocatalog_applications.logo
typecatalog_applications.type
is_favoriteapps.is_favorite
is_approvedapps.is_approved

Used in: App Utilization (analytics domain)


App

Full client-app object returned by list and detail endpoints. Wraps the CatalogApp DTO with client-specific fields.

{
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"catalog_app": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"canonical_name": "Slack",
"description": "A messaging and collaboration platform for teams",
"display_colour": "#4A154B",
"logo": "https://cdn.example.com/logos/slack.png",
"type": "desktop",
"vendor": {
"id": "f6a7b8c9-d0e1-2345-fabc-678901234567",
"name": "Salesforce, Inc.",
"url": "https://www.salesforce.com"
},
"categories": [
{ "id": "a7b8c9d0-e1f2-3456-abcd-789012345678", "name": "Communication" }
],
"created_at": "2025-06-15T10:00:00.000Z",
"updated_at": "2026-02-10T09:15:00.000Z"
},
"is_favorite": true,
"is_approved": true,
"license_count": 25,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-02-20T14:30:00.000Z"
}
FieldTypeNullableDescription
idstring (uuid)NoStable unique identifier for this client-app record
catalog_appCatalogAppNoThe catalog application this record is linked to, with vendor and categories embedded
is_favoritebooleanNoWhether this app is marked as a favorite for the client
is_approvedbooleanNoWhether this app is approved for use by the client
license_countintegerYesNumber of tracked licenses. null if not tracked.
created_atstring (ISO 8601)NoWhen this app record was first created
updated_atstring (ISO 8601)NoWhen this app record was last modified

DB source:

DTO FieldDB Column
idapps.id
catalog_appJoined via apps.catalog_application_id → full CatalogApp DTO
is_favoriteapps.is_favorite
is_approvedapps.is_approved
license_countapps.license_count
created_atapps.created_at
updated_atapps.updated_at

Omitted internal fields: client_id (in URL path), partner_id, created_by, updated_by, catalog_application_id (replaced by embedded catalog_app)

App.is_approved is the current approval state of the app. This is different from App History, where AppHistoryEvent.metadata.is_approved represents the approval state produced by a specific history event.

Used in: List Apps, Get App, Update App (response)


Embedded DTOs from other domains

The App DTO embeds the following DTOs defined elsewhere:

  • CatalogApp — Full catalog app with vendor and categories embedded
  • CatalogVendor — Vendor identity (inside catalog_app.vendor)
  • CatalogCategory — Category identity (inside catalog_app.categories)