DOCUMENTATION

DATUM-GLB platform guide

A practical guide to getting started, integrating with the API and understanding what DATUM records. Read our AI inventory guide or explore the sample-data demo.

Introduction

DATUM-GLB is an AI governance console. Companies register assets and models, assign policies, run workflows, and review alerts, incidents and audit history from one place.

Getting value from DATUM

Start with one AI use case: list the system and its owner, record the models and vendors involved, decide who reviews changes, then use policies and workflows to keep those records current. Risk scores and readiness mappings support review; they are not legal advice or proof of compliance.

Developer quickstart

These examples call workflow routes, which require a company administrator or manager session. Sign in first and provide a short-lived access token. Other routes may accept company API keys with specific permissions; credentials are not interchangeable. The localhost URLs below are for local development only.

curl
curl -H "Authorization: Bearer $DATUM_ACCESS_TOKEN" http://localhost:8000/workflows/
TypeScript (sdk/typescript, Node 18+)
import { DatumClient } from "@datum-glb/sdk";

const accessToken = process.env.DATUM_ACCESS_TOKEN;
if (!accessToken) throw new Error("Set DATUM_ACCESS_TOKEN");
const client = new DatumClient({
  accessToken,
  baseUrl: process.env.DATUM_API_URL ?? "http://localhost:8000",
});

const workflows = await client.workflows.list();
const risk = await client.models.risk();
Python (sdk/python, pip install -e sdk/python)
import os
from datum_glb import DatumClient

client = DatumClient(
    base_url=os.environ.get("DATUM_API_URL", "http://localhost:8000"),
    access_token=os.environ["DATUM_ACCESS_TOKEN"],
)
workflows = client.workflows.list()
result = client.workflows.run(3, asset_id=1)
Command line
export DATUM_API_URL=http://localhost:8000
datum login --email you@company.com
datum asset list
datum model risk --json

Authentication

The browser dashboard stores company-user sessions in HTTP-only cookies and uses its same-origin API proxy. Direct API and SDK clients use short-lived bearer access tokens. Accounts with multi-factor authentication must verify a six-digit code before tokens are issued. Some endpoints accept scoped company API keys instead; check each route's requirements and permissions.

POST/auth/loginSign in, or receive an MFA challenge.
POST/auth/verify-mfaComplete an MFA challenge.
POST/auth/refreshRefresh the session.
POST/auth/logoutEnd the session.
GET/auth/meCurrent user and role.

Security and deployment

Quickstart URLs use plain HTTP on localhost for development. Use HTTPS for deployed services; set DATUM_API_URL for SDK/CLI clients and DATUM_API_BASE_URL for the Next.js server-side API proxy. Keep access tokens, API keys, database credentials and signing secrets in protected server-side environment settings or a secrets manager—never in browser code or source control. Configure a persistent production SECRET_KEY of at least 32 characters. Before enabling live payments, configure Stripe API and webhook secrets and disable mock payments. Authentication is route-specific: some routes are public, while others require a bearer session, a scoped API key or an administrator/manager role. Do not assume that every route accepts both credential types.

Assets and models

Assets are the AI systems you govern. Models are linked to assets and carry a risk level.

GET/assetsList assets.
POST/assetsCreate an asset.
GET/assets/{asset_id}/activityActivity for an asset.
PUT/assets/{asset_id}/workflowAssign a workflow to an asset.
GET/modelsList models.
POST/modelsRegister a model.

Workflows

Workflows are ordered stages with rules and actions that run when an asset moves between stages.

GET/workflows/List workflows.
POST/workflows/Create a workflow.
POST/workflows/{workflow_id}/runRun a workflow.
PATCH/workflows/{workflow_id}Update a workflow.
DELETE/workflows/{workflow_id}Delete a workflow.

Activity and risk

AI activity is recorded per company and scored by the risk engine. Signed governance receipts can verify DATUM's recorded risk and policy decisions without exposing prompts or outputs; they do not prove model correctness or completeness of unreported activity.

Independently verify an activity receipt (Python)
import hashlib, json
from cryptography.hazmat.primitives.serialization import load_pem_public_key

# receipt_response comes from GET /ai-activity/{activity_id}/receipt
# public_key_response comes from GET /verify/public-key
if not receipt_response["available"]:
    raise RuntimeError(receipt_response["reason"])
canonical = json.dumps(
    receipt_response["receipt"], sort_keys=True, separators=(",", ":"), ensure_ascii=True
).encode()
digest = hashlib.sha256(canonical).hexdigest()
assert digest == receipt_response["receipt_hash"]
key = load_pem_public_key(public_key_response["public_key_pem"].encode())
key.verify(
    bytes.fromhex(receipt_response["signature"]),
    receipt_response["signed_message"].encode(),
)
GET/ai-activity/company/{company_id}Activity for a company.
GET/ai-activity/company/{company_id}/summaryActivity summary.
GET/ai-activity/{activity_id}/receiptGet and verify a signed governance receipt. It contains governance metadata, not prompt or output text.

Incidents and alerts

Alerts are raised from activity and rules; incidents are the response workflow around them, with assignment, comments and explanations.

GET/ai-alerts/company/{company_id}Alerts for a company.
PATCH/ai-alerts/{alert_id}/statusChange an alert's status.
POST/ai-alerts/{alert_id}/assignAssign an alert to a user or external email.
GET/incidents/company/{company_id}Incidents for a company.
GET/incidents/{incident_id}/detailsExplanation and proposed solutions.
POST/incidents/{incident_id}/assignAssign an incident.
PATCH/incidents/{incident_id}/statusChange an incident's status.
POST/incidents/{incident_id}/commentsAdd a comment.

Policies

Create policies, assign them to assets and choose an enforcement mode; every evaluation is written to the audit trail.

GET/policies/company/{company_id}List a company's policies.
POST/policies/createCreate a policy.
POST/policies/updateUpdate a policy.
DELETE/policies/{policy_id}Delete a policy.
POST/policies/assignAssign a policy to assets.
POST/policies/removeRemove a policy assignment.

Shadow AI discovery

The agent matches a catalog of known AI tools on the computer itself and reports only the matches, never the full software list. Reports land in the review queue until someone approves, blocks or ignores them.

GET/discovery/catalogKnown AI tool catalog used by the agent.
POST/discovery/reportAgent reports matched tools from a computer.
GET/discovery/company/{company_id}Discovered tools by review status.
PATCH/discovery/company/{company_id}/{item_id}Approve, block, ignore, or assign an owner.

Sensitive data (DLP)

New AI prompts and answers are scanned automatically for the selected data types unless DLP is off. Activity responses and linked alerts/incidents include sensitive_data metadata; their dashboard markers link to the source activity. Findings include counts, types and source links, never matched values. Flag mode retains original activity text; Redact replaces detected matches before storage, including complete private-key blocks. Incomplete key blocks are removed through the next key or end of text. Settings do not rescan existing records, markers do not create additional incidents, and detection is not proof of an external leak or a guarantee that every sensitive value was found.

GET/dlp/company/{company_id}Findings summary, data kinds and settings.
PUT/dlp/company/{company_id}/settingsSet the mode (off, flag, redact) and which data kinds are scanned.
POST/dlp/company/{company_id}/tryDry-run the scanner on sample text.

Compliance readiness

Readiness estimates map records in DATUM to the EU AI Act, ISO/IEC 42001, NIST AI RMF, GDPR and SOC 2 criteria. They are indicative, depend on the information entered, and are not an audit, legal advice, proof of compliance or certification. This feature does not assess ISO 9001 or ISO/IEC 27001. ISO certification applies to an organization's defined management system and is issued by an independent certification body—not by this feature or to the software itself.

GET/compliance/company/{company_id}Readiness score per framework and control.
GET/compliance/company/{company_id}/evidence-pack.pdfDownload the PDF evidence pack.

EU AI Act risk classification

A short questionnaire per asset produces the EU AI Act risk tier, the obligations that follow, and a record you can keep.

GET/risk-wizard/questionsQuestionnaire definition.
GET/risk-wizard/company/{company_id}Classification overview for the company's assets.
PUT/risk-wizard/company/{company_id}/assets/{asset_id}Save an asset's classification.
GET/risk-wizard/company/{company_id}/assets/{asset_id}/record.pdfDownload the asset's PDF record.

AI vendor risk register

Track AI suppliers with data location, certifications, DPA status and training use; each vendor gets a risk score and review reminders.

GET/vendors/company/{company_id}List vendors with risk scores.
POST/vendors/company/{company_id}Add a vendor.
PUT/vendors/company/{company_id}/{vendor_id}Update a vendor.
DELETE/vendors/company/{company_id}/{vendor_id}Remove a vendor.

AI costs

Estimated monthly spend per model and asset from recorded activity, with a budget and alert threshold.

GET/costs/company/{company_id}Estimated spend this month, per model and per asset.
PUT/costs/company/{company_id}/budgetSet the monthly budget and alert percentage.

Public AI trust page

An opt-in public page. Anyone with its URL can view the company name, optional statement and contact, plus readiness scores and controls if those display options are enabled. It does not publish readiness gaps or the underlying evidence. Its disclosures are self-reported, not an independent audit or certification.

GET/trust/company/{company_id}Read trust page settings.
PUT/trust/company/{company_id}Configure and enable the page.
GET/trust/public/{slug}Published page content; no authentication required.

Integrations and signed webhooks

Signed outbound webhooks stream incidents, alerts, shadow AI, sensitive data and risk events to your own endpoints. Each delivery carries X-Datum-Event, X-Datum-Timestamp and X-Datum-Signature headers; verify the signature before trusting the payload.

Verify a webhook signature (Python)
import hashlib, hmac
from flask import request

# Keep the exact raw request body; do not parse and re-serialize the JSON.
raw_body = request.get_data(cache=True)
body_text = raw_body.decode("utf-8")
timestamp = request.headers["X-Datum-Timestamp"]
expected = "sha256=" + hmac.new(
    secret.encode(), f"{timestamp}.{body_text}".encode(), hashlib.sha256
).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-Datum-Signature"])
GET/integrations/company/{company_id}List webhook endpoints (secrets are never returned).
POST/integrations/company/{company_id}/webhooksCreate a webhook; the signing secret is returned once.
PATCH/integrations/company/{company_id}/webhooks/{endpoint_id}Update URL, events or enabled state.
DELETE/integrations/company/{company_id}/webhooks/{endpoint_id}Delete a webhook.
POST/integrations/company/{company_id}/webhooks/{endpoint_id}/testSend a test delivery.
POST/integrations/company/{company_id}/webhooks/{endpoint_id}/rotate-secretRotate the signing secret.

Playbooks and executive summary

Automation rules trigger in-app notices or emails from key events, optionally filtered by minimum severity. The weekly executive summary emails a digest built from live data.

GET/playbooks/company/{company_id}Rules, summary settings and trigger/action options.
POST/playbooks/company/{company_id}/rulesCreate a rule.
PUT/playbooks/company/{company_id}/rules/{rule_id}Update a rule.
DELETE/playbooks/company/{company_id}/rules/{rule_id}Delete a rule.
PUT/playbooks/company/{company_id}/summaryConfigure the weekly executive summary.
POST/playbooks/company/{company_id}/summary/send-nowSend the summary immediately.

Audit log

The audit log records selected governance changes and authenticated user activity. Coverage varies by route and does not mean every API-key request or system event is captured. Audit records are operational evidence, not proof that all activity was recorded or that an organization is compliant.

GET/audit/company/{company_id}Read the company's audit log (roles with audit-read permission).
GET/audit/company/{company_id}/exportExport the company's audit log.

Billing and subscription

Prepaid plans with invoices and add-ons. Upgrades are invoiced mid-term; after the applicable grace period, an unpaid subscription may become read-only until paid.

GET/billing/plansPlan catalog.
GET/billing/company/{company_id}/planCurrent plan and limits.
PUT/subscription/company/{company_id}Request or apply a plan change.
GET/billing/company/{company_id}/invoicesList invoices.
GET/payments/invoices/{invoice_id}/pdfDownload an invoice PDF.

Users and access

Administrators manage users, roles, multi-factor sign-in and asset permissions.

GET/auth/admin/usersList company users.
PATCH/auth/admin/users/{user_id}/roleChange a user's role.
POST/auth/admin/users/bulkBulk-import users.
DELETE/auth/admin/users/{user_id}Remove a user.
GET/notificationsNotifications for the signed-in user.
POST/notifications/{notification_id}/readMark a notification read.
DELETE/notificationsClear the signed-in user's notifications, preserving assignment notices that still need acknowledgement.

Tamper-evident audit chain

DATUM provides hash and Ed25519-signature verification for signed audit-chain records. Verification checks the records present; it does not prove that every event was captured, that source data is true, or that an organization is compliant. Keep audit records backed up independently and preserve the signing key across deployments. Treat any failed verification as requiring investigation.

Verify a chain head (Python)
from cryptography.hazmat.primitives.serialization import load_pem_public_key

# head from GET /verify/trust/{slug}/chain-head, pem from GET /verify/public-key
if not head:
    raise RuntimeError("No signed audit-chain head is available")
key = load_pem_public_key(pem.encode())
key.verify(bytes.fromhex(head["signature"]), f"{company_id}.{head['chain_hash']}".encode())
GET/verify/company/{company_id}/chainRecompute and check the whole chain (administrators and managers).
GET/verify/trust/{slug}/chain-headLatest signed chain head for a company, by trust slug; no content exposed.
GET/verify/public-keyPlatform audit-signing public key (PEM).
Authenticate each request using the method and permissions required by that route. Use HTTPS and server-side secret storage in production. Readiness reports and audit records do not constitute ISO certification or guarantee legal compliance.