FHIR
FHIR endpoints for patient search, clinical timelines, resource CRUD, and bundle import.
The Platform API provides FHIR endpoints for patient search, clinical timelines, read-optimized views, resource CRUD, and bulk import over a workspace's clinical world-model data.
Status
Get event and entity counts for the workspace's clinical data.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Missing or invalid API key.
Workspace not found.
GET /v1/{workspace_id}/fhir/status HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"configured": true,
"connector_type": "text",
"event_count": 1,
"entity_count": 1,
"entity_type_counts": {
"ANY_ADDITIONAL_PROPERTY": 1
},
"resource_type_counts": {
"ANY_ADDITIONAL_PROPERTY": 1
}
}Patient Access
Search Patients
Search patient entities by name, MRN, or phone.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search by name, MRN, phone, or entity ID
Search by MRN
Search by phone
Sort field with +/- prefix (e.g. -last_event_at)
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/patients HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"patients": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"birth_date": "text",
"gender": "text",
"phone": "text",
"email": "text",
"mrn": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Get a Patient Timeline
Get the full event timeline for a patient entity.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
500Successful Response
Validation Error
GET /v1/{workspace_id}/fhir/patients/{patient_id}/timeline HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"events": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"total": 1
}Get a Patient Summary
Get the agent-maintained world model state for a patient.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Patient name
Primary phone number (E.164)
Primary email address
Date of birth (YYYY-MM-DD)
Gender
Medical record number
Validation Error
GET /v1/{workspace_id}/fhir/patients/{patient_id}/summary HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_type": "text",
"display_name": "text",
"event_count": 1,
"last_event_at": "2026-01-01T00:00:00.000Z",
"name": "text",
"phone": "text",
"email": "text",
"birth_date": "text",
"gender": "text",
"mrn": "text"
}Read-Optimized Views
The flattened views can be scoped to one data source.
Patients
Frontend-ready patient list with flattened demographics, conditions, medications, allergies, and insurance. Optionally scoped to a specific data source via data_source_id.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search by name
Scope to data source
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/patients HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"patients": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"first_name": "text",
"last_name": "text",
"birth_date": "text",
"gender": "text",
"phone": "text",
"email": "text",
"mrn": "text",
"address": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"address_state": "text",
"address_postal_code": "text",
"address_city": "text",
"active_conditions": [
"text"
],
"active_medications": [
"text"
],
"allergies": [
"text"
],
"insurance": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"primary_payer_name": "text",
"practice_payer_id": "text",
"member_id": "text",
"policyholder_name": "text",
"policyholder_relationship": "text",
"policyholder_dob": "text",
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"confidence": 1,
"last_event_at": "text",
"created_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Practitioners
Frontend-ready practitioner list with name, NPI, specialty, phone. Optionally scoped to a data source.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search by name
Scope to data source
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/practitioners HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"practitioners": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"npi": "text",
"specialty": "text",
"phone": "text",
"email": "text",
"member_id": "text",
"scheduling_eligible": true,
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Organizations
Frontend-ready organization list with name, phone, domain, industry, address. Optionally scoped to a data source.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search by name
Scope to data source
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/organizations HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"organizations": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"phone": "text",
"domain": "text",
"industry": "text",
"address": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Appointments
Frontend-ready appointment list with date, status, patient, practitioner, location, reason. Optionally scoped to a data source.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search
Scope to data source
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/appointments HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"appointments": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "text",
"start": "text",
"end": "text",
"patient_name": "text",
"practitioner_name": "text",
"location_name": "text",
"reason": "text",
"cancel_reason": "text",
"appointment_type": "text",
"duration_minutes": 1,
"modality": "text",
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Locations
Frontend-ready location list with name, address, phone, hours. Optionally scoped to a data source.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search by name
Scope to data source
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/locations HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"locations": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"address": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"address_line": "text",
"city": "text",
"state": "text",
"postal_code": "text",
"country": "text",
"latitude": 1,
"longitude": 1,
"timezone": "text",
"facility_id": "text",
"phone": "text",
"hours": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Slots
The slot view resolves a provider display name from the slot's schedule reference so scheduling surfaces do not need to join the raw Schedule resource.
Frontend-ready provider availability slot list with start, end, status, schedule reference, and provider display name. Optionally scoped to a data source.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Search
Scope to data source
Slot status (e.g. 'free', 'busy')
Start date YYYY-MM-DD (filters slots on or after this date)
Number of days forward from date (default 7)
7Provider name (partial match, e.g. 'Woloski')
Specialty (partial match, e.g. 'Psychiatry')
Visit/service type name (partial match, e.g. 'Follow-up')
Facility ID
200Successful Response
falseValidation Error
GET /v1/{workspace_id}/fhir/views/slots HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"slots": [
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "text",
"start": "text",
"end": "text",
"schedule_ref": "text",
"provider_name": "text",
"provider_id": "text",
"facility_id": "text",
"specialty": "text",
"visit_type_ids": "text",
"visit_type_names": "text",
"source_system": "text",
"canonical_id": "text",
"event_count": 0,
"last_event_at": "text"
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Resource CRUD
FHIR resource responses include the linked world-model entity_id when entity resolution has established one. The value can be null while a new resource is awaiting resolution.
Search Resources
Search FHIR resources by type with standard search parameters.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
200General search text
Successful Response
Invalid resource type.
Validation Error
GET /v1/{workspace_id}/fhir/resources/{resource_type} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"resource_type": "text",
"total": 1,
"entries": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"next_url": "text"
}Create a Resource
Create a new FHIR resource. Automatically creates patient entities.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Invalid resource type or payload.
Validation Error
POST /v1/{workspace_id}/fhir/resources/{resource_type} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 103
{
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"data_source_id": "123e4567-e89b-12d3-a456-426614174000"
}{
"resource_type": "text",
"resource_id": "text",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}Read a Resource
Fetch a single FHIR resource by type and ID.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Invalid resource type.
Resource not found.
Validation Error
GET /v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"resource_type": "text",
"resource_id": "text",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}Update a Resource
Update a FHIR resource. Creates a new event that supersedes the old one.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Invalid resource type or payload.
Resource not found.
Validation Error
PUT /v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 103
{
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"data_source_id": "123e4567-e89b-12d3-a456-426614174000"
}{
"resource_type": "text",
"resource_id": "text",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}Get Resource History
History is ordered newest first and returns 404 when the resource has no events.
Fetch the version history and changed-field provenance for a FHIR resource.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
100Successful Response
falseInvalid resource type.
Resource not found.
Validation Error
GET /v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}/history HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"resource_type": "text",
"resource_id": "text",
"entries": [
{
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"event_type": "text",
"source": "text",
"source_system": "text",
"data_source_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"confidence": 1,
"is_current": true,
"effective_at": "text",
"created_at": "text",
"fields_affected": [
"text"
],
"data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
],
"total": 1,
"has_more": false,
"next_offset": 1
}Import
Import a Bundle
Import a FHIR Bundle. Decomposes supported resources into upserted world events and creates patient entities. Unsupported resource types are skipped and reported; omitted resources are not deleted.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
fhir_importWhen true, identical re-uploads of the same FHIR resource are skipped via content-hash dedup. Set to false to force emission regardless of content changes.
trueControls resources whose resourceType is missing or not projected by platform FHIR APIs. 'error' skips the resource and adds a per-resource error; 'skip' skips it without adding an error. Unsupported resources are never emitted as silent raw world events.
errorPossible values: Successful Response
000false0falseFHIR import uses workspace + resourceType + id as the natural key. Identical re-uploads can be deduped; changed resources supersede prior current events.
same_resource_id_upsertResources omitted from a later bundle are not deleted or archived by import.
absent_resources_persistInvalid bundle format.
Validation Error
POST /v1/{workspace_id}/fhir/import HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 202
{
"bundle": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"source": "fhir_import",
"source_system": "text",
"data_source_id": "123e4567-e89b-12d3-a456-426614174000",
"dedup": true,
"unsupported_resource_policy": "error"
}{
"events_created": 1,
"events_skipped": 0,
"events_updated": 0,
"entities_created": 1,
"entities_updated": 1,
"error_count": 0,
"errors": [
"text"
],
"errors_truncated": false,
"unsupported_resource_count": 0,
"unsupported_resources": [
{
"resource_type": "text",
"resource_id": "text",
"location": "text",
"reason": "text"
}
],
"unsupported_resources_truncated": false,
"upsert_semantics": "same_resource_id_upsert",
"absence_semantics": "absent_resources_persist"
}Stream NDJSON Resources
The separate streaming import operation has been retired. Use the bundle import operation above within its documented request limits; do not send NDJSON to that JSON bundle endpoint.
Last updated
Was this helpful?

