Data model
Status: Source-derived from v2/web/src/api.ts types and v2/api/ SELECT/INSERT columns (2026-10-30). Times are Unix milliseconds. IDs are UUIDs unless noted.
Every record below is scoped by tenant_id + workspace_id (+ product where shown); those columns are server-bound and never accepted from a client (Concepts ).
Context
Returned by GET /api/v1/context. Note camelCase here versus snake_case elsewhere — a known contract inconsistency (Developer standards ).
Field Type Notes principalIdstring actor ID tenantId, workspaceIdstring scope; workspace mirrors tenant today tenantNamestring organization name rolestring membership role ([[AUTH allowedProductsstring[] enabled products capabilitiesstring[] capability strings featureRevisionstring entitlement revision ontologySchemaRevisionstring currently "1" hqlVersionnumber currently 1
Event
List/detail/update responses. product ∈ Newsk | Tower | Ops | Civic.
Field Type Notes idUUID productstring owning product titlestring searchable summarystring searchable statusstring new, reviewing, saved, closedassigned_tostring/null self-assignment only revisioninteger optimistic-concurrency counter first_seen_at, last_seen_atnumber ms timestamps latitude, longitudenumber/null source-provided only, finite and in range evidence_countinteger computed in list queries
Detail adds evidence[] (≤ 100) and activity[] (≤ 50):
Evidence field Type Notes id, source_idUUID / registered ID source_urlstring preserved provenance publisher, headline, excerptstring captured_atnumber artifact_idstring/null metadata, not a download URL
Activity field Type Notes revision, status, assigned_to— state at that revision changed_bystring actor ID changed_atnumber
Source and ProductEntitlement
Source field Type Notes idUUID approved, registered sources only product, publisher, labelstring enabledboolean paused/resumed via PATCH revisioninteger ≥ 1 created_atnumber
ProductEntitlement: product, enabled, revision (starts 0 before first grant row).
Story and Brief
Story field Type Notes id, event_idUUID event must be Newsk-scoped titlestring 1–240 chars notesstring ≤ 20,000 chars statusstring draft, ready, handed_off, archived (no edits after handed_off)revisioninteger created_at, updated_atnumber
Brief: id, story_id, title, body (extractive), citations[] (url, publisher, headline, captured_at), generated_by: "extractive", timestamps. GET returns citations_json string — parse it.
OpsAction
Field Type Notes idUUID source_story_idUUID/null event handoffs have none source_event_idUUID source_productstring product the action came from story_title, event_titlestring joined labels source_url, publisherstring/null latest evidence of the event statusstring open, in_progress, done, cancelled — transition table in [[API_ENDPOINTSrevisioninteger
Run
Field Type Notes idUUID source_idUUID registered source snapshot taken at dispatch idempotency_keystring/null visible only to runs.manage actors statusstring queued, running, succeeded, partial, failed, cancellederror_codestring/null e.g. dispatch_unconfirmed trace_idstring correlation for support created_at, updated_atnumber
Dashboard
Field Type Notes idUUID owner-only edit/delete productstring must be enabled titlestring 1–160 chars descriptionstring ≤ 1,000 chars config_jsonstring validated by shared schema, JSON ≤ 32,000 chars visibilitystring private | workspacecan_editboolean computed: caller is owner revisioninteger
Investigation, InvestigationItem, Entity, Relationship
Investigation Type Notes id, product— title, summarystring validated (invalid_investigation) statusstring active, archivedrevisioninteger created_by, created_at, updated_at— item_countinteger on list
Item Type Notes item_kindstring note, event, evidence, entity, relationshiptitlestring 1–240 chars notestring ≤ 5,000 chars target_event_id, target_evidence_id, target_entity_id, target_relationship_idUUID/null exactly one target for non-note kinds
Entity Type Notes entity_typestring person, organization, place, asset, public_body, otherdisplay_namestring 1–200 chars descriptionstring ≤ 2,000 chars revisioninteger
Relationship Type Notes from_entity_id, to_entity_idUUID two distinct in-scope entities relationship_typestring 1–80 chars interpretationstring observed, inferred, disputedevidence_idUUID required in-scope evidencenotesstring ≤ 2,000 chars
Graph: nodes[] (entity subset) + edges[] (relationships), capped: boolean — treat a capped graph as partial.
WorkspaceSearchResult
type (event, evidence, story, dashboard, action, investigation, entity), id, product, title, description, updated_at, optional event_id / source_product.
See also