Surfaces
List surfaces with pagination and optional filters.
Permissions: viewer, member, admin, owner (surfaces:read)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
50Filter by entity ID
Filter by status
Filter by channel
Successful Response
Validation Error
Rate limited
GET /v1/{workspace_id}/surfaces HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"items": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"fields": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"resource_type": "text",
"context": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"expires_at": "text",
"created_at": "text",
"delivered_at": "text",
"opened_at": "text",
"submitted_at": "text",
"submitted_data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"delivery_metadata": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"review_notes": "text",
"reviewed_by": "123e4567-e89b-12d3-a456-426614174000",
"reviewed_at": "text",
"archived_at": "text",
"archive_reason": "text",
"url": "text"
}
],
"has_more": true,
"continuation_token": null
}Create a new data collection surface.
Stores the surface spec as a world.event with domain="surface". The entity_id is stored inside event data (not on the event row) to avoid entity state recomputation.
Returns a signed patient-facing token and URL if SURFACE_TOKEN_SECRET is configured.
Permissions: member, admin, owner (surfaces:write)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Request to create a new surface.
The agent generates a SurfaceSpec and sends it here.
Delivery channels for surfaces.
webPossible values: 168Successful Response
Lifecycle status of a surface.
Delivery channels for surfaces.
Validation error
Rate limited
POST /v1/{workspace_id}/surfaces HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 892
{
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"fields": [
{
"key": "text",
"label": "text",
"field_type": "text",
"required": true,
"options": [
"text"
],
"description": "text",
"placeholder": "text",
"prefill_value": null,
"validation": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"sensitive": false,
"condition": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"consent_text": "text"
}
],
"channel": "web",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"expires_in_hours": 168,
"context": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"resource_type": "text",
"branding": {
"logo_url": "text",
"primary_color": "text",
"background_color": "text",
"font_family": "text"
},
"sections": [
{
"title": "text",
"description": "text",
"field_keys": [
"text"
],
"condition": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
],
"completion_title": "text",
"completion_message": "text",
"completion_action_url": "text",
"submit_button_text": "text"
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"expires_at": "text",
"created_at": "text",
"token": "text",
"url": "text"
}List surfaces pending review.
Field engineers use this to approve or reject surfaces before delivery.
Permissions: operator, member, admin, owner (ReviewQueue:View)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
50Successful Response
Validation Error
Rate limited
GET /v1/{workspace_id}/surfaces/review HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"items": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"fields": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"resource_type": "text",
"context": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"expires_at": "text",
"created_at": "text",
"delivered_at": "text",
"opened_at": "text",
"submitted_at": "text",
"submitted_data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"delivery_metadata": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"review_notes": "text",
"reviewed_by": "123e4567-e89b-12d3-a456-426614174000",
"reviewed_at": "text",
"archived_at": "text",
"archive_reason": "text",
"url": "text"
}
],
"has_more": true,
"continuation_token": null
}Get a surface by ID.
Returns the surface spec and current lifecycle status. Also mints the patient-facing url so operators can copy/share the link from the read view (the token isn't stored, so it's re-minted on each read).
Permissions: viewer, member, admin, owner (surfaces:read)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Lifecycle status of a surface.
Delivery channels for surfaces.
Surface not found
Validation Error
Rate limited
GET /v1/{workspace_id}/surfaces/{surface_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"fields": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"resource_type": "text",
"context": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"expires_at": "text",
"created_at": "text",
"delivered_at": "text",
"opened_at": "text",
"submitted_at": "text",
"submitted_data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"delivery_metadata": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"review_notes": "text",
"reviewed_by": "123e4567-e89b-12d3-a456-426614174000",
"reviewed_at": "text",
"archived_at": "text",
"archive_reason": "text",
"url": "text"
}Archive (soft-delete) a surface.
Works for any non-terminal surface. Terminal surfaces (completed, expired, already archived) cannot be archived.
Permissions: member, admin, owner (Surface:Create)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Surface not found
Cannot archive terminal surface
Validation Error
Rate limited
DELETE /v1/{workspace_id}/surfaces/{surface_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"surface_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "text"
}Update an existing surface spec.
Only allowed while status is CREATED or DELIVERED. Writes a surface.updated event preserving the full audit trail.
Permissions: member, admin, owner (Surface:Create)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Partial update to an existing surface.
All fields are optional. Only provided fields are merged into the spec. Only allowed while status is CREATED or DELIVERED.
Delivery channels for surfaces.
Successful Response
Lifecycle status of a surface.
Delivery channels for surfaces.
Surface not found
Cannot update in current status
Validation error
Rate limited
PATCH /v1/{workspace_id}/surfaces/{surface_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 718
{
"title": "text",
"description": "text",
"fields": [
{
"key": "text",
"label": "text",
"field_type": "text",
"required": true,
"options": [
"text"
],
"description": "text",
"placeholder": "text",
"prefill_value": null,
"validation": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"sensitive": false,
"condition": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"consent_text": "text"
}
],
"branding": {
"logo_url": "text",
"primary_color": "text",
"background_color": "text",
"font_family": "text"
},
"sections": [
{
"title": "text",
"description": "text",
"field_keys": [
"text"
],
"condition": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
],
"completion_title": "text",
"completion_message": "text",
"completion_action_url": "text",
"submit_button_text": "text",
"channel": "email",
"resource_type": "text"
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"fields": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
],
"resource_type": "text",
"context": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"expires_at": "text",
"created_at": "text",
"delivered_at": "text",
"opened_at": "text",
"submitted_at": "text",
"submitted_data": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"delivery_metadata": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"review_notes": "text",
"reviewed_by": "123e4567-e89b-12d3-a456-426614174000",
"reviewed_at": "text",
"archived_at": "text",
"archive_reason": "text",
"url": "text"
}Approve a surface pending review.
The surface returns to CREATED status and can then be delivered.
Permissions: operator, member, admin, owner (ReviewQueue:Review)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Lifecycle status of a surface.
Surface not found
Surface is not pending review
Validation Error
Rate limited
POST /v1/{workspace_id}/surfaces/{surface_id}/approve HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"surface_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "created",
"action": "approved"
}Reject a surface pending review.
The surface is marked as expired and will not be delivered.
Permissions: operator, member, admin, owner (ReviewQueue:Review)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Lifecycle status of a surface.
Surface not found
Surface is not pending review
Validation Error
Rate limited
POST /v1/{workspace_id}/surfaces/{surface_id}/reject HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 17
{
"reason": "text"
}{
"surface_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "created",
"action": "approved"
}Get field-level completion status for a surface.
Returns which fields are filled vs empty, useful for abandonment intelligence and targeted re-engagement.
Permissions: viewer, member, admin, owner (surfaces:read)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Surface not found
Validation Error
Rate limited
GET /v1/{workspace_id}/surfaces/{surface_id}/progress HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"surface_id": "123e4567-e89b-12d3-a456-426614174000",
"total_fields": 1,
"filled_count": 1,
"empty_count": 1,
"filled_keys": [
"text"
],
"empty_keys": [
"text"
],
"required_empty_keys": [
"text"
]
}Create a new surface with only the unfilled fields from the original.
Used for re-engaging patients who abandoned a form. The new surface contains only the fields they haven't completed yet, reducing friction.
Permissions: member, admin, owner (surfaces:write)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Lifecycle status of a surface.
Delivery channels for surfaces.
Surface not found
All fields already filled
Validation Error
Rate limited
POST /v1/{workspace_id}/surfaces/{surface_id}/reshape HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "text",
"description": "text",
"status": "created",
"channel": "email",
"use_case_id": "123e4567-e89b-12d3-a456-426614174000",
"fields_count": 1,
"expires_at": "text",
"created_at": "text",
"token": "text",
"url": "text"
}Record a real delivery handoff for a surface.
Email targets are delivered through channel-manager's POST /v1/email/ (CM owns SES sender identity, IP pool, DKIM, suppression — keyed on the surface row's use_case_id). Phone-shaped addresses return 422 — SMS surface delivery was removed in PR #2783. Other targets record an external handoff that was completed outside platform-api.
Permissions: member, admin, owner (surfaces:write)
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Request to mark a surface as delivered.
Delivery address (phone number, email, etc.)
Successful Response
Delivery channels for surfaces.
Surface not found
Surface already delivered/completed/expired
Validation error
Rate limited
POST /v1/{workspace_id}/surfaces/{surface_id}/deliver HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 26
{
"channel_address": "text"
}{
"surface_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "delivered",
"channel": "email",
"url": "text",
"channel_address": "text",
"message_id": "text",
"from_number": "text",
"from_address": "text",
"delivery_provider": "text",
"delivered_at": "text"
}Last updated
Was this helpful?

