Enterprise Data Model

The Enterprise Data Model (EDM) is a graph-connected schema that spans your entire organization. It is defined in JSON Schema Draft 2020-12, maintained as the single source of truth, and used to generate typed SDKs for TypeScript, Python, Go, and .NET.


Six Domains

┌─────────────────────────────────────────────────────────────────┐
│                    Enterprise Data Model                        │
│                                                                 │
│  ┌──────────────┐  ┌──────────────────┐  ┌──────────────────┐  │
│  │    People    │  │   Technology     │  │    Licenses      │  │
│  │              │  │                  │  │                  │  │
│  │  Person      │  │  TechnologyAsset │  │  SoftwareLicense │  │
│  │  Group       │  │  AccessEntitle-  │  │  LicenseAssign-  │  │
│  │              │  │  ment            │  │  ment            │  │
│  └──────┬───────┘  └────────┬─────────┘  └────────┬─────────┘  │
│         │                   │                      │            │
│         │           ┌───────┴──────────────────────┘            │
│         │           │                                           │
│         └───────────┤      Relationship (graph edge)            │
│                     │      links any two entities               │
│         ┌───────────┤      across any domain                    │
│         │           └───────┬──────────────────────┐            │
│         │                   │                      │            │
│  ┌──────┴───────┐  ┌────────┴─────────┐  ┌────────┴─────────┐  │
│  │    Assets    │  │ Risk & Compliance │  │     Common       │  │
│  │              │  │                  │  │                  │  │
│  │  Physical-   │  │  Vulnerability   │  │  Relationship    │  │
│  │  Asset       │  │  Compliance-     │  │  DataSource      │  │
│  │  CloudRes-   │  │  Control         │  │  Tag             │  │
│  │  ource       │  │  RiskItem        │  │                  │  │
│  └──────────────┘  └──────────────────┘  └──────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
DomainSDK serviceEntities
Peoplesdk.peoplePerson, Group
Technologysdk.technologyTechnologyAsset, AccessEntitlement
Licensessdk.licensesSoftwareLicense, LicenseAssignment
Assetssdk.assetsPhysicalAsset, CloudResource
Risk & Compliancesdk.riskVulnerability, ComplianceControl, RiskItem
Commonsdk.relationships, sdk.dataSourcesRelationship, DataSource, Tag

Common Fields

Every EDM entity shares these fields regardless of domain:

FieldTypeDescription
idstringUnique identifier with type prefix (e.g. per-abc123)
tenantIdstringOwning tenant — set server-side from JWT, never client-supplied
createdAtISO 8601Creation timestamp (UTC)
updatedAtISO 8601Last update timestamp (UTC)
deletedAtISO 8601 or nullSoft-delete timestamp; null means the entity is active
tagsstring[]Arbitrary labels for filtering and organization

Deletion is always soft. Setting deletedAt hides the entity from default list queries but preserves it for audit and compliance purposes. Pass includeDeleted: true to list queries to see soft-deleted entities.


ID Prefixes

Every entity ID is prefixed to make its type immediately identifiable in logs, foreign keys, and API responses.

EntityPrefixExample
Personper-per-a1b2c3d4
Groupgrp-grp-e5f6g7h8
TechnologyAssettast-tast-i9j0k1l2
AccessEntitlementaent-aent-m3n4o5p6
SoftwareLicenselic-lic-q7r8s9t0
LicenseAssignmentlasg-lasg-u1v2w3x4
PhysicalAssetpast-past-y5z6a7b8
CloudResourcecres-cres-c9d0e1f2
Vulnerabilityvuln-vuln-g3h4i5j6
ComplianceControlctrl-ctrl-k7l8m9n0
RiskItemrisk-risk-o1p2q3r4
Relationshiprel-rel-s5t6u7v8
DataSourcedsrc-dsrc-w9x0y1z2
StorageRecordsrec-srec-a3b4c5d6
StorageObjectsobj-sobj-e7f8g9h0
Tenanttnt-tnt-i1j2k3l4
AuditEventaevt-aevt-m5n6o7p8

Graph Connectivity

Relationship entities are typed edges that link any two EDM entities across any domain. They enable graph-style queries without schema changes.

// Link a person to a cloud resource (access relationship)
const rel = await sdk.relationships.create({
  fromId: 'per-a1b2c3d4',    // Person
  toId:   'cres-c9d0e1f2',   // CloudResource
  type:   'has_access_to',
  metadata: { grantedAt: '2026-01-15T10:00:00Z', grantedBy: 'per-x9y8z7w6' }
})
 
// Query: which cloud resources does this person have access to?
const rels = await sdk.relationships.list({
  fromId: 'per-a1b2c3d4',
  type:   'has_access_to',
})

Common relationship types used across the EDM:

TypeTypical fromId entityTypical toId entity
member_ofPersonGroup
has_access_toPersonTechnologyAsset / CloudResource
assigned_toSoftwareLicensePerson
affectsVulnerabilityTechnologyAsset / CloudResource
mitigated_byRiskItemComplianceControl
owned_byPhysicalAsset / CloudResourcePerson / Group
sourced_fromAny entityDataSource

Schema Conventions

All EDM schemas follow JSON Schema Draft 2020-12 with these required fields:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id":     "https://schemas.cyberpod.app/edm/v1/person.json",
  "title":   "Person",
  "description": "A human individual in the organization.",
  "type": "object",
  "additionalProperties": false,
  "required": ["id", "tenantId", "createdAt", "updatedAt"],
  "properties": { ... }
}

Key conventions:

  • additionalProperties: false on every schema — unknown fields are rejected
  • All date-time fields use "format": "date-time" (ISO 8601 UTC)
  • Nullable fields use "type": ["string", "null"] (JSON Schema 2020-12 style)
  • ID fields reference common/id.json for the prefix pattern