For the complete documentation index, see llms.txt. This page is also available as Markdown.

Data & World Model

Query and manage workspace entities, enrichment, provenance, confidence-gated writes, migration metadata, data sources, and synchronization status.

The Platform API exposes workspace-scoped entity projections, event timelines, enrichment, data-source configuration, and synchronization status. Event-producing paths write source-attributed world events, and asynchronous data pipelines materialize the supported entity and timeline read models. Other platform resources, including service-owned configuration and lifecycle records, remain transactional and can emit world events separately.

Conceptual overview. For the design rationale behind the world model - why event sourcing, how source-ranked conflict resolution works, and how agents read and write during conversations - see the World Model conceptual documentation. This page covers the API surface.

Different from Classic API data access. The Classic API provides SQL access to organization-scoped relational tables. The Platform API exposes typed operational APIs and asynchronously maintained world-model read projections.

Storage and Projection Boundaries

The API surface combines several storage patterns. Keep these boundaries in mind:

  • Event-backed entity reads are projections. Supported world-event families are materialized asynchronously into entity and timeline read models, so a successful emit does not imply immediate read-after-write visibility.

  • The world-event ledger is append-oriented. A replacement can point to a prior record through supersedes; downstream projections derive the effective current record. This does not make every service-owned table append-only.

  • Projection behavior is type-specific. Supported entity/event families have explicit projection logic. Arbitrary labels are not guaranteed to produce a typed entity projection or relationship edge.

  • Confidence is policy input, not a universal decision rule. Specific projections, review flows, and connector sinks use confidence alongside source allowlists, sink support, and other policy checks.

  • Transactional resources have their own contracts. Surfaces, connector configuration, and similar resources commit through their service APIs and may emit lifecycle events asynchronously after the transaction.

Event Sourcing Model

World-event-producing paths emit append-oriented records with source and confidence metadata. Not every platform datum is a world event; service-owned resources expose their own CRUD and lifecycle contracts.

Field
Description

entity_type

Optional entity classification used by supported projections and queries

event_type

Event identifier defined by the producing service and downstream pipeline

data

Event payload (structured data, FHIR resources, agent observations, etc.)

confidence

Source-class score (0.0-1.0) available to projections and delivery policies that use it

source

Origin system (voice_agent, connector_runner, ehr_sync, transcript_extraction, etc.)

is_current

Current marker on read/projection records; append-ledger supersession is represented by supersedes

effective_at

Source-reported time when the observation applies

review_status

Review state (e.g. auto_approved, approved, rejected, flagged)

Confidence as Trust Architecture

World events carry a source-class confidence score, not a calibrated probability that an observation is true. The labels below are the common source classes; passing a confidence threshold alone never guarantees projection or outbound delivery.

Level
Confidence
Meaning
Source Examples

Authoritative

1.0

Authoritative source or manual correction

EHR API, manual entry, human correction

Human-approved

0.95

Named class retained in the confidence registry

Not assigned by current proposal review

High

0.9

Operator-verified or high-quality adapter data

Operator verification, trusted adapter

EHR-trusted

0.8

Trusted EHR clinical data

EHR clinical records

Verified

0.7

Verified or EHR-ingested data

Verification pass, EHR ingestion

Self-report

0.5

Patient-submitted or partially corroborated data

Patient-submitted form data

Agent-raw

0.3

Unverified agent inference

Raw voice-agent write

Rejected

0.0

Discarded or explicitly rejected

Invalid or rejected observation

Current external-write proposal review authorizes a specific outbound proposal; approval does not promote the source observation into the human-approved confidence class.

Some projections, including governed enrichment winners, group confidence values into precedence tiers and use recency as a tiebreaker. Other projections can apply different type-specific logic. Selecting a winning observation does not independently verify its correctness or freshness.

Clients can filter and report on confidence. Connector write-back, which applied a confidence gate before delivering events to external systems, was retired with the connector runner on October 10, 2026.

See Voice Agent, Confidence-Gated Writes for how voice agent writes progress through the confidence pipeline.

Supersedes Chain

Where a producer supplies or derives a supersession link, the new event references the prior event through supersedes. The append ledger does not mutate the prior record; downstream projections asynchronously derive which record is effectively current. Event families without a supersession key do not automatically gain this chain.

How Agents Read and Write

Agents interact with the world model through three channels:

  • Ambient (pushed): selected data, such as caller identity, patient state, related entities, or location context, is included when the service, session, and runtime configuration make it available. This is bounded context, not a guarantee that every current fact is loaded or refreshed; use queried tools for authoritative details outside that payload.

  • Queried (pulled): data whose search space is too large to push - slot search, patient lookup, entity search - is retrieved through tool calls that return human-readable results.

  • Extracted (captured): supported voice runtimes can attach structured observations from conversation at source-appropriate confidence. Explicit write tools remain the controlled path for high-stakes mutations.

The World Model conceptual documentation covers the design rationale for this split and how it evolves as models improve.

Entity Types

The entity APIs accept string type filters, but typed projections are implemented for a defined set of entity families. The current shared projection set is person, place, call, appointment, outbound_task, and organization. Other labels can appear in domain event timelines, but a new label does not automatically gain typed projection behavior.

Entity Type
What It Represents
Common Roles / Key State Fields

person

Any individual in the system

Patient (demographics, conditions, medications, insurance), practitioner (profile, NPI, specialty), operator (availability, performance). A single person entity can hold multiple roles; the projection detects roles from event data.

organization

A company or healthcare organization

Practice, payer, employer. Name, contacts, identifiers

place

A physical site

Clinic, hospital, office. Address, phone, hours, status

appointment

A scheduled visit

Status, participants, times, cancellation, confirmation

call

A voice conversation

Context, escalation history, safety state, human segments, audit

outbound_task

A scheduled outreach task

Lifecycle, retry state, scheduling, dispatch history

FHIR resource types on events (Patient, Practitioner, Location, etc.) stay unchanged. The ontological type applies at the entity level, while FHIR types describe the data format of individual events.

Entity Reads

Entity reads promote common attributes from projected state into typed top-level fields. Fields that do not apply to an entity type return null.

List Entities

List entities

get

List entities filtered by type with optional name search. Works for any entity type — patients, operators, calls, or any type created by T3 agents. Returns full projected state.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
entity_typestring[] · nullableOptional

Filter by entity type (repeatable)

qstring · nullableOptional

Search by name, type, canonical ID, phone, or entity ID

limitinteger · min: 1 · max: 100OptionalDefault: 20
offsetintegerOptionalDefault: 0
orderstring · max: 128 · nullableOptional

Sort order (PostgREST-style, e.g. last_event_at.desc, display_name.asc)

has_projectionboolean · nullableOptional

Filter by has_projection flag

sourcestring · nullableOptional

Filter by event source (e.g. voice_agent, connector_runner)

source_systemstring · nullableOptional

Filter by source system name (e.g. charmhealth, gcp_fhir)

fhir_resource_typestring · max: 64 · nullableOptional

Filter by FHIR resource type (e.g. Patient, Practitioner)

Responses
200

Successful Response

application/json
totalintegerRequired
has_morebooleanRequired
next_offsetinteger · nullableOptional
get/v1/{workspace_id}/world/entities
GET /v1/{workspace_id}/world/entities HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "entities": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
      "entity_type": "text",
      "display_name": "text",
      "canonical_id": "text",
      "external_ids": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "has_projection": false,
      "name": "text",
      "phone": "text",
      "email": "text",
      "birth_date": "text",
      "gender": "text",
      "mrn": "text",
      "appointment_status": "text",
      "appointment_start": "2026-01-01T00:00:00.000Z",
      "appointment_end": "2026-01-01T00:00:00.000Z",
      "appointment_type": "text",
      "domain": "text",
      "industry": "text",
      "call_sid": "text",
      "direction": "text",
      "duration_seconds": 1,
      "status": "text",
      "source": "text",
      "first_seen_at": "2026-01-01T00:00:00.000Z",
      "last_event_at": "2026-01-01T00:00:00.000Z",
      "event_count": 0,
      "confidence": 1,
      "tags": [
        "text"
      ],
      "created_at": "2026-01-01T00:00:00.000Z",
      "updated_at": "2026-01-01T00:00:00.000Z"
    }
  ],
  "total": 1,
  "has_more": true,
  "next_offset": 1
}

Without entity_type, the list covers every entity type. Workspace-level records that carry no entity ID are not entities and are excluded from both the list and its total.

Get an Entity

Get entity

get

Fetch a single entity with its full projected state. The state is a computed projection from all events — never mutated directly. Enhanced entity types (patient, operator, call) have richer projections.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
entity_typestringRequired
display_namestring · nullableOptional
canonical_idstring · nullableOptional
has_projectionbooleanOptionalDefault: false
namestring · nullableOptional

Display name (person, organization)

phonestring · nullableOptional

Primary phone number (E.164)

emailstring · nullableOptional

Primary email address

birth_datestring · nullableOptional

Date of birth (YYYY-MM-DD)

genderstring · nullableOptional

Gender

mrnstring · nullableOptional

Medical record number

appointment_statusstring · nullableOptional

Appointment status (booked, confirmed, cancelled)

appointment_startstring · date-time · nullableOptional

Appointment start time (UTC)

appointment_endstring · date-time · nullableOptional

Appointment end time (UTC)

appointment_typestring · nullableOptional

Appointment/visit type

domainstring · nullableOptional

Organization domain

industrystring · nullableOptional

Organization industry

call_sidstring · nullableOptional

Twilio call SID

directionstring · nullableOptional

Call direction (inbound, outbound)

duration_secondsnumber · nullableOptional

Call duration in seconds

statusstring · nullableOptional

Entity status

sourcestring · nullableOptional

Primary data source

first_seen_atstring · date-time · nullableOptional
last_event_atstring · date-time · nullableOptional
event_countintegerOptionalDefault: 0
confidencenumberOptionalDefault: 1
tagsstring[] · nullableOptional
created_atstring · date-time · nullableOptional

When the entity was created

updated_atstring · date-time · nullableOptional

When the entity was last updated

get/v1/{workspace_id}/world/entities/{entity_id}
GET /v1/{workspace_id}/world/entities/{entity_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "entity_type": "text",
  "display_name": "text",
  "canonical_id": "text",
  "external_ids": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "has_projection": false,
  "name": "text",
  "phone": "text",
  "email": "text",
  "birth_date": "text",
  "gender": "text",
  "mrn": "text",
  "appointment_status": "text",
  "appointment_start": "2026-01-01T00:00:00.000Z",
  "appointment_end": "2026-01-01T00:00:00.000Z",
  "appointment_type": "text",
  "domain": "text",
  "industry": "text",
  "call_sid": "text",
  "direction": "text",
  "duration_seconds": 1,
  "status": "text",
  "source": "text",
  "first_seen_at": "2026-01-01T00:00:00.000Z",
  "last_event_at": "2026-01-01T00:00:00.000Z",
  "event_count": 0,
  "confidence": 1,
  "tags": [
    "text"
  ],
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

Entity Enrichment

Entities can carry governed per-key attributes beyond the typed response fields. Enrichment writes produce source-attributed, confidence-scored entity.enriched events, and the enrichment projection selects the current winner for each registered key.

Registry-Governed Keys

Every workspace maintains a registry of enrichment keys. A key is scoped to a specific (entity_type, key) pair and declares:

  • value_type: one of string, number, boolean, date, enum, json.

  • allowed_values: required when value_type=enum.

  • min_confidence: floor on write confidence; writes below this are rejected.

  • is_pii: marks the attribute for downstream PII handling.

  • source_hint, description: free-form text for admins.

Writes against an unregistered key are rejected with 400. Agent-extracted values whose key is not registered are silently dropped, so they do not pollute the event stream or compete with governed values. This gives admins full control over which attributes are tracked without blocking agent-side capture.

key and value_type are immutable after registration; create a new key and migrate if those need to change. Deleting a registered key does not delete historical entity.enriched events (the audit trail is preserved); only future writes are rejected.

Winner Selection and Audit

Reads return the current winner per (entity, key), one row with full provenance (value, value type, confidence, source, source system, effective time, ingested time, event ID). The enrichment projection selects winners by its own confidence_class precedence tier, then effective time, ingestion time, and event ID. These tiers aggregate source-confidence values rather than matching every named source class one-to-one; this rule is specific to that projection contract.

The supersedes chain for any key is queryable for audit and temporal debugging. Each historical entry carries the full provenance plus supersedes (pointer to the event it replaced) and is_current (whether it is still the winner).

Governed Enrichment Write Path

Direct enrichment writes share the registry validation path and are differentiated by source and confidence. Validation errors (unknown key, wrong value type, enum miss, sub-floor confidence) return 400 with a specific message. Connectors, surfaces, and agent runtimes have separate service paths and can emit compatible world events asynchronously.

Direct enrichment writes and registry mutations require the admin role or above (Workspace:Update). See the Enrichment API Reference below for the full endpoint contract.

Enrichment API Reference

Write an enrichment value

Set an enrichment value on an entity

put

Writes a single per-key entity.enriched event for the given entity. Validates against the workspace's enrichment_keys registry — unknown key, wrong value type, enum violation, or confidence below the key's floor all return 400. SDP picks winners by confidence class.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
Header parameters
Idempotency-Keystring · uuid · nullableOptional

Stable UUID so a retry after an ambiguous failure re-emits the same logical event (deduped downstream) instead of a duplicate. Used only on the synchronous-overlay write path; auto-generated when omitted.

Body
valueanyRequired

Scalar or JSON-compatible value to store.

value_typestring · enum · nullableOptional

Overrides the registry value_type when set. Rarely needed.

Possible values:
sourcestring · min: 1 · max: 64Optional

Write source — e.g. manual, forms, auto_enrich.

Default: manual
source_systemstring · min: 1 · max: 128 · nullableOptional

Subsystem / connector identifier.

confidencenumber · max: 1Optional

Write confidence. Must be >= registry min_confidence for the key.

Default: 1
effective_atstring · date-time · nullableOptional

When the value became true (UTC). Defaults to ingested_at.

Responses
200

Successful Response

application/json
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
valueanyRequired
value_typestring · enumRequiredPossible values:
confidencenumberRequired
sourcestringRequired
source_systemstring · nullableOptional
effective_atstring · date-time · nullableOptional
ingested_atstring · date-time · nullableOptional
event_idstring · uuidRequired
overlay_statusstring · nullableOptional
put/v1/{workspace_id}/world/entities/{entity_id}/enrichment/{key}
PUT /v1/{workspace_id}/world/entities/{entity_id}/enrichment/{key} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 134

{
  "value": null,
  "value_type": "string",
  "source": "manual",
  "source_system": "text",
  "confidence": 1,
  "effective_at": "2026-01-01T00:00:00.000Z"
}
{
  "key": "text",
  "value": null,
  "value_type": "string",
  "confidence": 1,
  "source": "text",
  "source_system": "text",
  "effective_at": "2026-01-01T00:00:00.000Z",
  "ingested_at": "2026-01-01T00:00:00.000Z",
  "event_id": "123e4567-e89b-12d3-a456-426614174000",
  "overlay_status": "text"
}

Read current enrichment

List current enrichment values for an entity

get

Current winners per (entity, key) from world.enrichment_synced (Synced-Table-populated view of SDP's enrichment_current_v3). Each row carries value, value_type, confidence, source, effective_at.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
Query parameters
limitinteger · min: 1 · max: 500Optional

Max enrichment rows

Default: 200
offsetintegerOptional

Page offset

Default: 0
Responses
200

Successful Response

application/json
entity_idstring · uuidRequired
get/v1/{workspace_id}/world/entities/{entity_id}/enrichment
GET /v1/{workspace_id}/world/entities/{entity_id}/enrichment HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "entity_id": "123e4567-e89b-12d3-a456-426614174000",
  "values": [
    {
      "key": "text",
      "value": null,
      "value_type": "string",
      "confidence": 1,
      "source": "text",
      "source_system": "text",
      "effective_at": "2026-01-01T00:00:00.000Z",
      "ingested_at": "2026-01-01T00:00:00.000Z",
      "event_id": "123e4567-e89b-12d3-a456-426614174000",
      "overlay_status": "text"
    }
  ]
}

Read enrichment history

Enrichment supersedes chain for audit

get

Returns every entity.enriched event for (entity, key), newest first, including superseded entries. Each entry carries the full provenance: source, confidence, effective_at, supersedes pointer, is_current flag.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
Query parameters
limitinteger · min: 1 · max: 200OptionalDefault: 50
Responses
200

Successful Response

application/json
entity_idstring · uuidRequired
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
dropped_countintegerOptionalDefault: 0
get/v1/{workspace_id}/world/entities/{entity_id}/enrichment/{key}/history
GET /v1/{workspace_id}/world/entities/{entity_id}/enrichment/{key}/history HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "entity_id": "123e4567-e89b-12d3-a456-426614174000",
  "key": "text",
  "history": [
    {
      "event_id": "123e4567-e89b-12d3-a456-426614174000",
      "value": null,
      "value_type": "string",
      "confidence": 1,
      "source": "text",
      "source_system": "text",
      "effective_at": "2026-01-01T00:00:00.000Z",
      "ingested_at": "2026-01-01T00:00:00.000Z",
      "supersedes": "123e4567-e89b-12d3-a456-426614174000",
      "is_current": true
    }
  ],
  "dropped_count": 0
}

Register an enrichment key

Register an enrichment key

post

Registers a new (entity_type, key) in this workspace's enrichment key registry. Future writes against this key will pass validation. value_type governs what values are accepted; enum types require allowed_values. Tag a person key with 'memory_extract' (description required) to make it a workspace-custom memory dimension the conversation extractor infers from transcripts.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body
entity_typestring · min: 1 · max: 64Required
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
value_typestring · enumRequiredPossible values:
source_hintstring · max: 2000 · nullableOptional
descriptionstring · max: 2000 · nullableOptional
min_confidencenumber · max: 1OptionalDefault: 0
is_piibooleanOptionalDefault: false
tagsstring[]Optional

Routing tags. 'memory_extract' opts this key into memory extraction — the conversation extractor will infer it from transcripts as a workspace-custom memory dimension (person keys with a description only).

Responses
201

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
entity_typestring · min: 1 · max: 64Required
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
value_typestring · enumRequiredPossible values:
source_hintstring · nullableOptional
descriptionstring · nullableOptional
min_confidencenumberRequired
is_piibooleanRequired
tagsstring[]OptionalDefault: []
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
post/v1/{workspace_id}/world/enrichment-keys
POST /v1/{workspace_id}/world/enrichment-keys HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 169

{
  "entity_type": "text",
  "key": "text",
  "value_type": "string",
  "allowed_values": [],
  "source_hint": "text",
  "description": "text",
  "min_confidence": 0,
  "is_pii": false,
  "tags": [
    "text"
  ]
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "entity_type": "text",
  "key": "text",
  "value_type": "string",
  "allowed_values": [],
  "source_hint": "text",
  "description": "text",
  "min_confidence": 1,
  "is_pii": true,
  "tags": [
    "text"
  ],
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

List enrichment keys

List enrichment keys registered for this workspace

get

Optionally filter by entity_type.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
entity_typestring · nullableOptional

Filter by entity type.

limitinteger · min: 1 · max: 500Optional

Max keys to return

Default: 200
offsetintegerOptional

Page offset

Default: 0
Responses
200

Successful Response

application/json
get/v1/{workspace_id}/world/enrichment-keys
GET /v1/{workspace_id}/world/enrichment-keys HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "keys": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
      "entity_type": "text",
      "key": "text",
      "value_type": "string",
      "allowed_values": [],
      "source_hint": "text",
      "description": "text",
      "min_confidence": 1,
      "is_pii": true,
      "tags": [
        "text"
      ],
      "created_at": "2026-01-01T00:00:00.000Z",
      "updated_at": "2026-01-01T00:00:00.000Z"
    }
  ]
}

Update an enrichment key

Update a registered enrichment key

patch

Update allowed_values, source_hint, description, min_confidence, is_pii, or tags. key and value_type are immutable.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
key_idstring · uuidRequired
Body
source_hintstring · max: 2000 · nullableOptional
descriptionstring · max: 2000 · nullableOptional
min_confidencenumber · max: 1 · nullableOptional
is_piiboolean · nullableOptional
tagsstring[] · nullableOptional

Replaces the full tags list when set. Pass [] to remove all tags.

Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
entity_typestring · min: 1 · max: 64Required
keystring · min: 1 · max: 128RequiredPattern: ^[a-z0-9][a-z0-9_\-]*$
value_typestring · enumRequiredPossible values:
source_hintstring · nullableOptional
descriptionstring · nullableOptional
min_confidencenumberRequired
is_piibooleanRequired
tagsstring[]OptionalDefault: []
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
patch/v1/{workspace_id}/world/enrichment-keys/{key_id}
PATCH /v1/{workspace_id}/world/enrichment-keys/{key_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 112

{
  "allowed_values": [],
  "source_hint": "text",
  "description": "text",
  "min_confidence": 1,
  "is_pii": true,
  "tags": [
    "text"
  ]
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "entity_type": "text",
  "key": "text",
  "value_type": "string",
  "allowed_values": [],
  "source_hint": "text",
  "description": "text",
  "min_confidence": 1,
  "is_pii": true,
  "tags": [
    "text"
  ],
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

Delete an enrichment key

Delete a registered enrichment key

delete

Existing entity.enriched events are not deleted (append-only); only future writes against this key will be rejected.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
key_idstring · uuidRequired
Responses
204

Successful Response

No content

delete/v1/{workspace_id}/world/enrichment-keys/{key_id}
DELETE /v1/{workspace_id}/world/enrichment-keys/{key_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Entity Graph

Entities are connected by directed relationship edges, discovered automatically from data:

Projected relationships can come from supported inputs such as:

  1. Reference parsing: automatically extracted during entity resolution (e.g., Appointment.participant -> Patient).

  2. Explicit events: relationship.established events created by connectors or agents.

  3. Agent-produced events: configured agents can emit supported relationship observations.

Relationship endpoints read projected graph edges. Availability and versioning depend on the producer and projection for that relationship type.

Agent-Produced Knowledge

Configured agents can emit derived events such as insights or corrections with provenance fields. Whether those records become typed entity state, timeline entries, or downstream triggers depends on the event family and deployed projection.

Data Sources

Data-source records describe an external feed: its type, connection configuration, entity types, field mappings, and sync_strategy (continuous, scheduled, manual, or webhook).

Data-source status counts the events recorded for the source in the last 90 days, and sync history returns daily counts for up to 90 days (30 by default). Both report zero failures, because no sync runs.

The data sources list endpoint accepts repeatable source_type query parameters for filtering by multiple source types in a single request (e.g., ?source_type=ehr&source_type=fhir_store).

Self-Service Secret Provisioning

The generic smart_fhir source type is retired and cannot be created through the current API. Compatibility secret-handling code or a stored record does not establish a runnable connector. Use an active adapter's documented credential process and confirm provisioning with the implementation owner. Never include secrets in issue reports or example downloads.

Raw Records

Supported connectors can retain records they cannot map as source-attributed raw events (commonly with a .raw event type). Retention and replay behavior are connector-specific; the API does not guarantee that every rejected or unmapped source payload is stored.

Data Quality Pipeline

World events expose confidence metadata, and specific consumers apply it according to their own contracts:

  • Capture at source-appropriate confidence. Supported producers assign a confidence class according to the source and write path. Conversational extraction is not automatically authoritative.

  • Corrections are new observations. A supported producer can emit a new source-attributed event with its own assigned confidence and, where supported, a supersedes link. External-write proposal approval alone neither creates a correction nor promotes confidence.

  • No connector write-back. Connector delivery to external systems and the external write proposal flow were retired with the connector runner. See Review Queue.

Entity Narrative Briefs

AI-generated narrative summaries of a patient entity's world model data. The platform reads the last 90 days of events, synthesizes them into a structured narrative, and persists the result as a world model event for fast retrieval.

Generate a Brief

Generate Brief

post

Generate a Self-Image brief for the target entity (patient, cohort, territory, emirate, or district).

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired

Target entity UUID

Responses
200

Successful Response

application/json

Wire shape for a Self-Image brief.

event_id is null when no brief has ever been generated for the entity. All other fields are nullable in that case so the UI can render a consistent empty state.

event_idstring · uuid · nullableRequired
target_entity_idstring · uuidRequired
target_entity_typestring · enumRequiredPossible values:
content_mdstring · max: 20000 · nullableOptional
versionstring · max: 64 · nullableOptional
evidence_event_idsstring · uuid[] · max: 500Optional
confidencenumber · max: 1Required
event_countintegerRequired
model_namestring · max: 128 · nullableOptional
truncatedbooleanOptionalDefault: false
generated_atstring · date-time · nullableRequired
post/v1/{workspace_id}/entities/{entity_id}/brief
POST /v1/{workspace_id}/entities/{entity_id}/brief HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "event_id": "123e4567-e89b-12d3-a456-426614174000",
  "target_entity_id": "123e4567-e89b-12d3-a456-426614174000",
  "target_entity_type": "patient",
  "content_md": "text",
  "content_json": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "version": "text",
  "evidence_event_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "confidence": 1,
  "event_count": 1,
  "model_name": "text",
  "truncated": false,
  "generated_at": "2026-01-01T00:00:00.000Z"
}

Get the Latest Brief

Cache misses fall through to the event store and repopulate the cache. When no brief has been generated, the operation returns a consistent empty shape rather than 404.

Get Latest Brief

get

Return the latest Self-Image brief for the target entity (null shape if none).

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired

Target entity UUID

Responses
200

Successful Response

application/json

Wire shape for a Self-Image brief.

event_id is null when no brief has ever been generated for the entity. All other fields are nullable in that case so the UI can render a consistent empty state.

event_idstring · uuid · nullableRequired
target_entity_idstring · uuidRequired
target_entity_typestring · enumRequiredPossible values:
content_mdstring · max: 20000 · nullableOptional
versionstring · max: 64 · nullableOptional
evidence_event_idsstring · uuid[] · max: 500Optional
confidencenumber · max: 1Required
event_countintegerRequired
model_namestring · max: 128 · nullableOptional
truncatedbooleanOptionalDefault: false
generated_atstring · date-time · nullableRequired
get/v1/{workspace_id}/entities/{entity_id}/brief
GET /v1/{workspace_id}/entities/{entity_id}/brief HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "event_id": "123e4567-e89b-12d3-a456-426614174000",
  "target_entity_id": "123e4567-e89b-12d3-a456-426614174000",
  "target_entity_type": "patient",
  "content_md": "text",
  "content_json": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "version": "text",
  "evidence_event_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "confidence": 1,
  "event_count": 1,
  "model_name": "text",
  "truncated": false,
  "generated_at": "2026-01-01T00:00:00.000Z"
}

Briefs are scoped to patient, cohort, territory, emirate, and district entities. Permissions: viewer+.

Entity Intelligence

Read endpoints for exploring individual entities: their relationship graph, data provenance, full lineage, suspected duplicates, and search.

Relationship Graph

Returns center (entity metadata), edges[] (edge type, confidence), and neighbors[] (entity metadata for connected nodes). Responds with 404 if the entity is not found.

Get Entity Graph

get

Entity relationship graph — one level of edges with neighbor metadata. same_as edges are historical merge edges (written by the pre-SDP resolver; merge detection now lives in the Databricks pipeline — new edges are not produced).

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
Responses
200

Successful Response

application/json
Other propertiesanyOptional
get/v1/{workspace_id}/world/entities/{entity_id}/graph
GET /v1/{workspace_id}/world/entities/{entity_id}/graph HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}

Provenance

Returns sources[] (contributing data sources), confidence_history[] (score over time), and merge_history[] (entity resolution events). Responds with 404 if the entity is not found.

Get Entity Provenance

get

Data lineage for an entity — sources, confidence history, merge history (historical same_as edges from the pre-SDP resolver — new edges are not produced).

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
Responses
200

Successful Response

application/json
Other propertiesanyOptional
get/v1/{workspace_id}/world/entities/{entity_id}/provenance
GET /v1/{workspace_id}/world/entities/{entity_id}/provenance HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}

Lineage

The response contains the same sources, confidence_history, and merge_history sections as the provenance endpoint, plus outbound_sinks and review_history keys that are currently always empty arrays (kept for wire stability).

Get Entity Lineage

get

Full data lineage — provenance + outbound sinks + review history.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
entity_idstring · uuidRequired
Responses
200

Successful Response

application/json
Other propertiesanyOptional
get/v1/{workspace_id}/world/entities/{entity_id}/lineage
GET /v1/{workspace_id}/world/entities/{entity_id}/lineage HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}

Suspected Duplicates

Get Entity Duplicates

get

Suspected duplicate entities — historical same_as merge edges sorted by confidence (written by the pre-SDP resolver; merge detection now lives in the Databricks pipeline — new edges are not produced).

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
entity_typestring · nullableOptional

Filter by entity type

confidence_maxnumber · max: 1Optional

Max confidence threshold

Default: 1
limitinteger · min: 1 · max: 500Optional

Max edges to return

Default: 100
offsetintegerOptional

Page offset

Default: 0
Responses
200

Successful Response

application/json
Other propertiesanyOptional
get/v1/{workspace_id}/world/entities/duplicates
GET /v1/{workspace_id}/world/entities/duplicates HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
  {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  }
]

Returns historical same_as merge edges sorted by ascending confidence (lowest means most uncertain). New same_as edges are no longer written; the results reflect previously recorded merges.

Search currently uses case-insensitive display-name substring matching. It is not semantic or embedding search.

get

Enhanced entity search with type, source, and confidence filters.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
qstringRequired

Search text (matched against display_name)

entity_typestring · nullableOptional

Filter by entity type

sourcestring · nullableOptional

Filter by event source

confidence_minnumber · max: 1 · nullableOptional

Min confidence

limitinteger · min: 1 · max: 100OptionalDefault: 20
offsetintegerOptionalDefault: 0
Responses
200

Successful Response

application/json
Other propertiesanyOptional
get/v1/{workspace_id}/world/search
GET /v1/{workspace_id}/world/search?q=text HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}

Permissions: viewer+.

World Sync Status

The former per-sink world sync status endpoint has been removed. Connector write-back, including delivery of approved external write proposals, stopped when the connector runner was retired on October 10, 2026. To change an external system during a conversation, use an integration and verify the result at the destination. A queryable entity is not proof that an external system holds the same record.

Generic Data Query

A structured query endpoint provides whitelisted table access with REST-style filtering.

Query Table

get

Query a table with PostgREST-style filtering, sorting, and pagination.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
schemastringRequired
tablestringRequired
Query parameters
selectstring · nullableOptional
orderstring · nullableOptional
limitinteger · min: 1 · max: 100OptionalDefault: 20
offsetintegerOptionalDefault: 0
Responses
200

Successful Response

application/json
countintegerRequired
has_morebooleanRequired
get/v1/{workspace_id}/query/{schema}/{table}
GET /v1/{workspace_id}/query/{schema}/{table} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "items": [
    {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    }
  ],
  "count": 1,
  "has_more": true
}

Security: column whitelist per table, hidden sensitive columns, workspace isolation enforced server-side, maximum 100 rows per request.

Import Classic Conversation Metadata

POST /v1/{workspace_id}/world/migration/conversations imports terminal Classic conversation envelopes for migrated person entities. The operation is admin-only and accepts 1-500 conversations per request.

The operation is idempotent and correctable for a given workspace and source conversation ID. It imports conversation metadata, not transcript turns. The response reports imported, created, and updated counts.

Bulk-import v1 conversation envelopes for migrated patients

post

Writes one terminal world.conversations row per v1 conversation (real dates, provider='v1-migration'), giving the returning-user greeting and the real conversation list. Admin-only, idempotent + correctable per (workspace, v1 conversation id), memory-safe (no world events emitted → the memory extractor never re-derives from these). Transcript content (turns) is a separate follow-up. Batch size <= 500.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body
Responses
200

Successful Response

application/json
importedintegerRequired
createdintegerRequired
updatedintegerRequired
post/v1/{workspace_id}/world/migration/conversations
POST /v1/{workspace_id}/world/migration/conversations HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 218

{
  "conversations": [
    {
      "entity_id": "123e4567-e89b-12d3-a456-426614174000",
      "source_conversation_id": "text",
      "started_at": "2026-01-01T00:00:00.000Z",
      "ended_at": "2026-01-01T00:00:00.000Z",
      "channel_kind": "web",
      "turn_count": 0
    }
  ]
}
{
  "imported": 1,
  "created": 1,
  "updated": 1
}

Last updated

Was this helpful?