Docs

Docs

EDM Overview

The Enterprise Data Model (EDM) is the backbone of the cPod platform. It defines every entity your organization works with — people, assets, projects, risks, helpdesk tickets, financial records, and more — in a single, graph-connected schema that all four SDKs speak natively.

Think of it as the "type system for your enterprise." Instead of every application inventing its own User, Account, or Ticket shape, the EDM gives you one canonical definition that every SDK, emulator stub, and production backend agrees on.


Architecture#

code
  ┌─────────────────────────────────────────────────────────┐
  │                  data-model/schemas/                     │
  │          84 JSON Schema Draft 2020-12 files              │
  │       (single source of truth for all shapes)           │
  └───────────────────────┬─────────────────────────────────┘
                          │  generates / validates
          ┌───────────────┼───────────────────────┐
          ▼               ▼                       ▼
  ┌──────────────┐ ┌──────────────┐       ┌──────────────┐
  │ TypeScript   │ │   Python     │       │  Go / .NET   │
  │   @cpod/sdk  │ │  cpod-sdk    │       │  SDKs        │
  └──────┬───────┘ └──────┬───────┘       └──────┬───────┘
         │                │                      │
         └────────────────┼──────────────────────┘
                          │  REST + JSON
              ┌───────────┴────────────┐
              │                        │
              ▼                        ▼
  ┌─────────────────────┐   ┌──────────────────────────┐
  │  Local Emulator     │   │  cpod-backend (prod)      │
  │  :4000              │   │  cyberpod.app             │
  │  In-memory stubs    │   │  MongoDB · ClickHouse     │
  │  for all 88 entities│   │  FalkorDB · MinIO         │
  └─────────────────────┘   └──────────────────────────┘
              │                        │
              └───────────┬────────────┘
                          │
              ┌───────────▼────────────┐
              │   Your Applications    │
              │  (same SDK call either │
              │   way — just change    │
              │   the base URL)        │
              └────────────────────────┘

Domain Map#

The EDM is organized into 34 domains across 6 categories. Every domain maps directly to a set of JSON schemas and an SDK namespace.

People & HR#

DomainKey EntitiesSDK Namespace
PeoplePersonsdk.people
GroupsGroupsdk.groups
Employee ExperiencePersonSkill, CalendarEvent, LeaveRequest, MeetingNotesdk.employee
Performance & DevelopmentPerformanceReview, PersonGoal, LearningRecordsdk.performance
HR LifecycleJobPosting, Applicant, OnboardingTask, OffboardingTasksdk.hr
OrgLocation, Departmentsdk.org

Work & Projects#

DomainKey EntitiesSDK Namespace
ProjectsProject, Task, Sprint, Featuresdk.projects
Work & TimeTimeEntry, Comment, Capacitysdk.work
OKRObjective, KeyResultsdk.okr

Customer & Revenue#

DomainKey EntitiesSDK Namespace
CustomerAccount, Contact, Deal, Activitysdk.customer
RFPRfpRecord, RfpQuestion, RfpResponsesdk.rfp
FinanceInvoice, PurchaseOrder, Expense, Budget, BudgetLinesdk.finance

IT & Security#

DomainKey EntitiesSDK Namespace
TechnologyTechnologyAsset, AccessEntitlementsdk.technology
AssetsPhysicalAsset, CloudResourcesdk.assets
LicensesSoftwareLicense, LicenseAssignmentsdk.licenses
Technology InvestmentTechPortfolioItem, CostCentersdk.investments
GRCGrcFramework, GrcControl, GrcEvidence, GrcIncident, GrcRisksdk.grc
SOCSocAlert, SocInvestigation, SocPlaybooksdk.soc
Risk & ComplianceVulnerability, ComplianceControl, RiskItemsdk.risk

Operations#

DomainKey EntitiesSDK Namespace
HelpdeskTicket, SlaPolicysdk.helpdesk
ApprovalsApprovalRequest, ApprovalStepsdk.approvals
NotificationsNotification, Announcementsdk.notifications
CatalogProduct, ProductCategorysdk.catalog
ProcurementSuppliersdk.procurement

Platform#

DomainKey EntitiesSDK Namespace
KnowledgeDocument, Chunk, KnowledgeEntitysdk.knowledge
LearningCohort, Assessmentsdk.learning
IntegrationApplication, Connector, ApiKey, Webhooksdk.integration
StorageStorageObject, StorageRecordsdk.storage
TelemetryAuditEvent, AppEvent, Tracesdk.telemetry
ContractsVendor, Contract, ContractObligationsdk.contracts

How It All Connects#

The EDM is graph-connected — every entity carries typed foreign keys (UUIDs) that reference canonical owners. Some key traversal paths:

code
Person  ──► TimeEntry  ──► Project  ──► Customer (Account)
   │              │
   │              └──► Task (projects domain)
   │
   ├──► LeaveRequest         (employee domain)
   ├──► PerformanceReview    (performance domain)
   ├──► PersonSkill          (employee domain)
   └──► LearningRecord       (performance domain)

TechnologyAsset  ──► AccessEntitlement  ──► Person
SoftwareLicense  ──► LicenseAssignment  ──► Person

Ticket  ──► SlaPolicy
        ──► Person (assignee)
        ──► Account (customer)

ApprovalRequest  ──► ApprovalStep[]  ──► Person (approver)
                 ──► (any entity — polymorphic subject)

Deal  ──► RfpRecord  ──► RfpQuestion[]  ──► RfpResponse[]
     ──► Project (auto-created on close-won)

Budget  ──► BudgetLine[]  ──► CostCenter
Invoice ──► PurchaseOrder ──► Supplier

Cross-domain references are always by UUID — never by name match. The Relationship entity (common domain) provides a generic edge type for relationships not expressed by inline foreign keys.


Emulator vs. Production Backend#

ConcernLocal Emulator (:4000)cpod-backend (production)
PurposeFast local development, no credentials neededLive tenant data, full auth/authz
Data storeIn-memory (resets on restart)MongoDB, ClickHouse, FalkorDB, MinIO
AuthAccepts any Bearer tokenOIDC / SCIM via core-sdk
CoverageAll 88 entities stubbedFull implementation
SpeedInstant startupRequires full stack

Switch between them by changing a single environment variable — the SDK call is identical:

ts
// Emulator
const sdk = new CpodClient({ baseUrl: 'http://localhost:4000', token: 'dev' })
 
// Production
const sdk = new CpodClient({ baseUrl: 'https://api.cyberpod.app', token: process.env.CPOD_TOKEN })
python
# Emulator
sdk = CpodClient(base_url="http://localhost:4000", token="dev")
 
# Production
sdk = CpodClient(base_url="https://api.cyberpod.app", token=os.environ["CPOD_TOKEN"])
go
// Emulator
sdk := cpod.New(cpod.WithBaseURL("http://localhost:4000"), cpod.WithToken("dev"))
 
// Production
sdk := cpod.New(cpod.WithBaseURL("https://api.cyberpod.app"), cpod.WithToken(os.Getenv("CPOD_TOKEN")))
csharp
// Emulator
var sdk = new CpodClient(new CpodClientOptions { BaseUrl = "http://localhost:4000", Token = "dev" });
 
// Production
var sdk = new CpodClient(new CpodClientOptions { BaseUrl = "https://api.cyberpod.app", Token = Environment.GetEnvironmentVariable("CPOD_TOKEN") });

Getting Started#

Step 1 — Install the SDK

TypeScript

bash
npm install @cpod/sdk

Python

bash
pip install cpod-sdk

Go

bash
go get github.com/ZySec-AI/cpod-sdk/sdks/go

.NET

bash
dotnet add package Cpod.SDK

Step 2 — Start the local emulator

bash
cd emulator && npm start
# Emulator running at http://localhost:4000
# All 88 entities available with seeded mock data

Python/Go/.NET install via the commands above; the emulator is a portal toggle.

Step 3 — Make your first call

ts
import { CpodClient } from '@cpod/sdk'
 
const sdk = new CpodClient({ baseUrl: 'http://localhost:4000', token: 'dev' })
 
// List all people
const { data: people } = await sdk.people.persons.list()
console.log(people)
 
// Create a ticket
const ticket = await sdk.helpdesk.createTicket({
  title: 'Cannot access VPN',
  priority: 'high',
  requesterId: people[0].id,
})
python
from cpod import CpodClient
 
sdk = CpodClient(base_url="http://localhost:4000", token="dev")
 
# List all people
people = await sdk.people.list()
print(people.data)
 
# Create a ticket
ticket = await sdk.helpdesk.create_ticket(
    title="Cannot access VPN",
    priority="high",
    requester_id=people.data[0].id,
)
go
client := cpod.New(cpod.WithBaseURL("http://localhost:4000"), cpod.WithToken("dev"))
 
// List all people
people, _ := client.People.List(ctx, nil)
fmt.Println(people.Data)
 
// Create a ticket
ticket, _ := client.Helpdesk.CreateTicket(ctx, &cpod.CreateTicketInput{
    Title:       "Cannot access VPN",
    Priority:    "high",
    RequesterID: people.Data[0].ID,
})
csharp
var sdk = new CpodClient(new CpodClientOptions { BaseUrl = "http://localhost:4000", Token = "dev" });
 
// List all people
var people = await sdk.People.ListAsync();
Console.WriteLine(people.Data.Count);
 
// Create a ticket
var ticket = await sdk.Helpdesk.CreateTicketAsync(new CreateTicketInput
{
    Title = "Cannot access VPN",
    Priority = "high",
    RequesterId = people.Data[0].Id,
});

For full SDK reference see SDK Reference, and for authentication against the production backend see Authentication.