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.
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.
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.
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.
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
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 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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Filter by entity type (repeatable)
Search by name, type, canonical ID, phone, or entity ID
200Sort order (PostgREST-style, e.g. last_event_at.desc, display_name.asc)
Filter by has_projection flag
Filter by event source (e.g. voice_agent, connector_runner)
Filter by source system name (e.g. charmhealth, gcp_fhir)
Filter by FHIR resource type (e.g. Patient, Practitioner)
Successful Response
Missing or invalid API key.
Validation Error
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
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
falseDisplay name (person, organization)
Primary phone number (E.164)
Primary email address
Date of birth (YYYY-MM-DD)
Gender
Medical record number
Appointment status (booked, confirmed, cancelled)
Appointment start time (UTC)
Appointment end time (UTC)
Appointment/visit type
Organization domain
Organization industry
Twilio call SID
Call direction (inbound, outbound)
Call duration in seconds
Entity status
Primary data source
01When the entity was created
When the entity was last updated
Invalid entity ID format.
Missing or invalid API key.
Entity not found.
Validation Error
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 ofstring,number,boolean,date,enum,json.allowed_values: required whenvalue_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
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
^[a-z0-9][a-z0-9_\-]*$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.
Scalar or JSON-compatible value to store.
Overrides the registry value_type when set. Rarely needed.
Write source — e.g. manual, forms, auto_enrich.
manualSubsystem / connector identifier.
Write confidence. Must be >= registry min_confidence for the key.
1When the value became true (UTC). Defaults to ingested_at.
Successful Response
^[a-z0-9][a-z0-9_\-]*$Registry validation failed.
Insufficient permissions.
Entity not found.
Validation Error
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
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Max enrichment rows
200Page offset
0Successful Response
Entity not found.
Validation Error
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
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
^[a-z0-9][a-z0-9_\-]*$50Successful Response
^[a-z0-9][a-z0-9_\-]*$0Entity not found.
Validation Error
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
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
^[a-z0-9][a-z0-9_\-]*$0falseRouting 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).
Successful Response
^[a-z0-9][a-z0-9_\-]*$[]Invalid request body.
Insufficient permissions.
Key already exists for (entity_type, key).
Validation Error
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
Optionally filter by entity_type.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Filter by entity type.
Max keys to return
200Page offset
0Successful Response
Validation Error
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 allowed_values, source_hint, description, min_confidence, is_pii, or tags. key and value_type are immutable.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Replaces the full tags list when set. Pass [] to remove all tags.
Successful Response
^[a-z0-9][a-z0-9_\-]*$[]Insufficient permissions.
Enrichment key not found.
Validation Error
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
Existing entity.enriched events are not deleted (append-only); only future writes against this key will be rejected.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
No content
Insufficient permissions.
Enrichment key not found.
Validation Error
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:
Reference parsing: automatically extracted during entity resolution (e.g., Appointment.participant -> Patient).
Explicit events:
relationship.establishedevents created by connectors or agents.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
supersedeslink. 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 a Self-Image brief for the target entity (patient, cohort, territory, emirate, or district).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Target entity UUID
Successful Response
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.
falseValidation Error
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.
Return the latest Self-Image brief for the target entity (null shape if none).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Target entity UUID
Successful Response
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.
falseValidation Error
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.
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).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Entity not found
Validation Error
Rate limit exceeded
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.
Data lineage for an entity — sources, confidence history, merge history (historical same_as edges from the pre-SDP resolver — new edges are not produced).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Entity not found
Validation Error
Rate limit exceeded
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).
Full data lineage — provenance + outbound sinks + review history.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Entity not found
Validation Error
Rate limit exceeded
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
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).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Filter by entity type
Max confidence threshold
1Max edges to return
100Page offset
0Successful Response
Validation Error
Rate limit exceeded
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.
Entity Search
Search currently uses case-insensitive display-name substring matching. It is not semantic or embedding search.
Enhanced entity search with type, source, and confidence filters.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search text (matched against display_name)
Filter by entity type
Filter by event source
Min confidence
200Successful Response
Validation Error
Rate limit exceeded
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 a table with PostgREST-style filtering, sorting, and pagination.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
200Successful Response
Validation Error
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.
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.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Naive/future timestamps, bad window, or non-person entity_id.
Insufficient permissions.
Validation Error
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?

