Workspaces
Manage workspaces: tenant isolation, voice settings, speech recognition, and test caller numbers.
Workspaces are the top-level organizational unit in the Platform API. Every resource (agents, services, skills, phone numbers, integrations) belongs to a workspace. Workspaces provide tenant isolation and environment separation.
Key Concepts
Workspace ID: UUID used in all Platform API request paths
Slug: URL-friendly name (e.g.,
acme-production)Regional endpoint: responses report the deployment serving the request; region is not an editable workspace placement policy
Backend Org ID: Links to the Classic API organization, bridging the two API surfaces
Workspace Resource
List Workspaces
List workspaces accessible to this API key. Requires Workspace.view permission.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
50Successful Response
Missing or invalid API key.
Insufficient permissions.
Validation Error
GET /v1/workspaces HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"items": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"slug": "text",
"name": "text",
"backend_org_id": "text",
"region": "text",
"connector_type": "text",
"timezone": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"provisioned_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}
],
"has_more": true,
"continuation_token": null
}Get a Workspace
Retrieve a workspace by ID. Requires Workspace.view permission.
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.
Insufficient permissions.
Workspace not found.
GET /v1/workspaces/{workspace_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"slug": "text",
"name": "text",
"backend_org_id": "text",
"region": "text",
"connector_type": "text",
"timezone": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"provisioned_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Update a Workspace
Update workspace fields. Requires Workspace.update permission.
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.
Insufficient permissions.
Workspace not found.
Invalid request body.
Revocation could not be queued; retry the request.
PATCH /v1/workspaces/{workspace_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 199
{
"name": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"timezone": "text",
"region": "us-east-1",
"connector_type": "epic"
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"slug": "text",
"name": "text",
"backend_org_id": "text",
"region": "text",
"connector_type": "text",
"timezone": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"provisioned_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Workspace Timezone
timezone is the workspace's IANA timezone, such as America/Chicago. Set it with the update operation above, or send null to clear it. Workspace reads return it.
The agent tells the caller's local time from one zone per session. A session opened with an entity_id uses the timezone of the patient's assigned clinic when one is recorded. Otherwise it uses the workspace timezone, then the deployment region's default zone, which the agent's instructions mark as a fallback. A caller matched only by phone number gets the workspace zone. An invalid stored value is skipped.
Provisioning
After creating a workspace, call the provision endpoint to seed default integrations and mark the workspace as provisioned. This is idempotent: safe to call multiple times. Requires Workspace.update permission.
Seed default integrations and mark workspace as provisioned. Idempotent. Requires Workspace.update permission.
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.
Insufficient permissions.
Workspace not found.
POST /v1/workspaces/{workspace_id}/provision HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"workspace": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"slug": "text",
"name": "text",
"backend_org_id": "text",
"region": "text",
"connector_type": "text",
"timezone": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"provisioned_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}
}Archive
Archive a workspace and remove it from active access flows while preserving underlying data. Requires owner access and slug confirmation.
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-]*[a-z0-9]$Successful Response
Missing or invalid API key.
Only owners can archive a workspace.
Workspace not found.
Workspace slug confirmation did not match.
POST /v1/workspaces/{workspace_id}/archive HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 15
{
"slug": "text"
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"slug": "text",
"name": "text",
"backend_org_id": "text",
"region": "text",
"connector_type": "text",
"timezone": "text",
"topic_modeling_enabled": true,
"delta_sharing_enabled": true,
"delta_sharing_mode": "open",
"delta_sharing_identifier": "text",
"provisioned_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Archiving removes a workspace from active access flows while preserving all underlying data. It requires the owner role and a slug confirmation in the request body to prevent accidental archival. Archived workspaces no longer appear in workspace listings and reject new API requests.
Invitations
Workspace invitations let you invite users by email before they have an account.
Create:
POST /workspaces/{workspace_id}/invitationssends an invitation with a specified role and 7-day expiry. Resending to the same email reactivates the existing invitation.Preview:
GET /workspaces/invitations/{invitation_id}/previewreturns a safe public view of the invitation (workspace name, role, expiry, status) without requiring authentication. Used to render invitation landing pages before sign-in.Accept or decline: the invited user can accept or decline from their pending invitations list.
Revoke: workspace admins can revoke pending invitations.
When a workspace admin creates or resends an invitation, an email notification is sent to the invited user with the workspace name, assigned role, and an accept link. Email delivery is asynchronous and fail-open - if delivery fails, the invitation is still created and returned to the admin for manual sharing.
Invited users who do not belong to an auto-provisioning domain can log in through Google OAuth. If pending invitations exist for their verified email, they receive a bootstrap token with no workspace scopes. The user must accept a specific invitation through the Developer Console before receiving a workspace-scoped token.
Access Audit Logging
All workspace membership and invitation operations emit audit events:
workspace.member_added
Member created or reactivated
workspace.member_removed
Member deactivated
workspace.member_role_updated
Member role changed
workspace.invitation_sent
Invitation created or resent
workspace.invitation_accepted
Invitation accepted
workspace.invitation_declined
Invitation declined
workspace.invitation_revoked
Invitation revoked by admin
Each event records the actor, target, role, and relevant metadata. These events are available through the audit log endpoints and the compliance export.
Environment Separation
The former environment-check and staging/production conversion routes have been removed. The current workspace update contract does not include an environment label. Use separately provisioned workspaces for development, testing, and production, with the appropriate access, integration, and retention policies.
The legacy region update field is accepted but ignored. Its presence in a request does not move data or change the serving deployment's reported region. See Regions and Endpoints.
Optional Data Exposure
Topic modeling and Delta Sharing are separate opt-in settings, disabled by default. Delta Sharing supports open sharing and a recipient identified by a sharing identifier. Use the embedded workspace update schema for the mode and identifier requirements.
Saving a setting and applying its data grants are separate steps. Enabling a capability can require asynchronous provisioning. Disabling exposure or changing an active recipient requests reconciliation; if it cannot be queued, the request reports failure after the setting has been saved. Retry and verify actual access rather than treating the stored setting alone as proof of revocation.
Voice Settings
Voice settings control the workspace-level voice pipeline, affecting all voice conversations.
Get Voice Settings
Get the voice experience settings for a workspace.
Returns voice identity, domain vocabulary, and post-call intelligence configuration. These settings shape how the AI agent sounds and what domain-specific terms it recognizes accurately.
Permissions
- Requires authenticated API key (any role).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Voice experience state — what the PM configured.
Rate limited
GET /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}Update Voice Settings
Update the voice experience settings for a workspace.
Only provided fields are updated; omitted fields retain their current
values. Set a field to null to reset it to default.
Voice Identity & Style
- voice_id: Voice identity UUID — determines the agent's voice persona
- tone: Emotional baseline (
calm,sympathetic,enthusiastic,content,curious,cheerful,serious,friendly). The system also adapts tone dynamically based on real-time caller emotion analysis; this setting provides the baseline when no strong emotional signal is detected. - speed: Speech rate multiplier (0.5-2.0)
- volume: Volume multiplier (0.0-1.0)
- language: BCP-47 language tag (default
en)
Speech Recognition Boost
- keyterms: Exact words the speech recognition engine should
prioritize. Use for specific names, drug names, and org jargon.
Example:
["Dr. Ramirez", "metformin", "HIPAA"]
Post-Call Intelligence
- post_call_analysis_enabled: Run automated quality scoring after
each call ends (default
true)
Permissions
- Requires admin or owner role.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Voice experience control plane — PM-facing, high-level controls.
Controls the caller experience without exposing engineering internals. Emotion detection, filler speech, model selection, and buffer tuning are always-on internals managed by engineering.
Successful Response
Voice experience state — what the PM configured.
Workspace not found
Validation error
Rate limited
PUT /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 410
{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}Voice Identity & Style
voice_id
string
Voice persona identifier (max 128 chars)
tone
string
Explicit TTS tone override. Typical values: calm, sympathetic, enthusiastic, content, curious, cheerful, serious, friendly
speed
float
Speech rate (0.5-2.0, default 1.0). Not applied on ElevenLabs eleven_v4_turbo
volume
float
Volume level (0.0-1.0)
language
string
BCP-47 language tag (default en)
Providers
stt_provider
string
Speech-to-text provider: deepgram, openai, or cartesia. OpenAI recognition uses gpt-transcribe
tts_provider
string
Text-to-speech provider: cartesia or elevenlabs
tts_config
object
Provider-specific TTS configuration; keys depend on tts_provider
language_providers
object
Per-language TTS provider map. Keys are BCP-47 language codes or multilingual
Speech Recognition
keyterms
list[string]
Exact words for STT boost, up to 200 entries: ["Dr. Ramirez", "metformin", "amlodipine"]
Keyterms are merged with service-level keyterms and deduplicated. They improve recognition of domain-specific vocabulary: drug names, doctor names, insurance carriers, medical abbreviations. Keyterms are the recommended way to improve transcription accuracy for domain-specific terms.
Pronunciation
pronunciation_dict_id
string
Pronunciation dictionary identifier for domain-specific term pronunciation
Links to a pronunciation dictionary for the voice engine. Use this when the TTS engine mispronounces domain-specific terms (drug names, medical procedures, proper nouns).
On Cartesia voices, the dictionary applies to every spoken message, including greetings and fillers. On the default Sonic 3.6 model, an entry matches any capitalization unless it sets case_sensitive.
Proactive Intelligence
sensitive_topics
list[string]
Topics that trigger preemptive tone softening, up to 50 entries: ["test results", "billing", "surgery"]
When the voice agent's current action matches a sensitive topic, the voice tone preemptively shifts to sympathetic, before the caller shows distress. Falls back to healthcare defaults when not configured.
Post-Call Intelligence
post_call_analysis_enabled
bool
Retained setting (default true); does not establish an active scoring job for each call. See Call Intelligence.
The former transcript_correction_enabled setting and post-call transcript-verification outputs are removed. See Voice Agent, Post-Call Intelligence for the current evidence boundaries.
How Settings Interact with Emotional Adaptation
Voice settings define workspace-level defaults and overrides. In the standard voice-context path, explicit tone wins over computed emotion tone, while other settings can still be adapted where noted:
tone
Explicit workspace TTS tone
Overrides acoustic, momentum, and sensitive-topic tone selection when set
speed
Base speech rate
Can be reduced by supported empathy pacing logic, subject to configured floors
volume
Base volume
Passed through when supported by the selected TTS provider
voice_id
Voice persona
Per-agent voice_config can override for specific agents
keyterms
Domain vocabulary
Merged with service-level keyterms and deduplicated
sensitive_topics
Proactive tone softening
Falls back to defaults when not set
Test Caller Numbers
Manage which phone numbers are authorized for test calls in the workspace. Useful for restricting test/playground calls to known numbers.
Calls from these numbers, and text turns from the test credentials below, are tagged as test traffic and run tools in simulation mode: every tool call returns a dry_run result instead of reaching an integration, a world write, or a platform function. Use the Playground when a test needs live tool results. See Write Isolation.
Get Test Caller Numbers
Get phone numbers configured as test callers for this workspace.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
GET /v1/workspaces/{workspace_id}/test-caller-numbers HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
Successful Response
{
"numbers": [
"text"
]
}Update Test Caller Numbers
Set phone numbers to be treated as test callers. Calls from these numbers are tagged source='test' and excluded from billing, scores, analytics, outbound EHR sync, and entity views.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Validation Error
PUT /v1/workspaces/{workspace_id}/test-caller-numbers HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 20
{
"numbers": [
"text"
]
}{
"numbers": [
"text"
]
}Test Credential IDs
Manage which credentials are authorized for workspace test flows.
Get Test Credential IDs
Get the credential IDs configured as test principals for this workspace's text channel.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
GET /v1/workspaces/{workspace_id}/test-credential-ids HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
Successful Response
{
"credential_ids": [
"123e4567-e89b-12d3-a456-426614174000"
]
}Update Test Credential IDs
Set credential IDs to be treated as test principals. Text turns from these credentials are tagged source='test' and excluded from billing, scores, analytics, outbound EHR sync, and entity views.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Validation Error
PUT /v1/workspaces/{workspace_id}/test-credential-ids HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 59
{
"credential_ids": [
"123e4567-e89b-12d3-a456-426614174000"
]
}{
"credential_ids": [
"123e4567-e89b-12d3-a456-426614174000"
]
}Last updated
Was this helpful?

