Attach or detach a case's contact
Attaches the case to a specific existing Contact, or detaches it, via a direct contact_id write (VOIP-1253). Send a non-empty contact_id to attach; send an empty string to detach (mirrors bin-conference-manager's pre_flow_id/post_flow_id PUT convention at the HTTP-layer JSON-schema level -- see §5.5.1 for the precise conversion point; a literal empty string is only ever accepted at this outer HTTP layer, never at the internal RPC-layer uuid.UUID struct). The target contact_id must belong to the same customer as the case; a cross-tenant contact_id is rejected as not found. Every attach/detach is recorded as a case_contact_attributed/ case_contact_detached event, queryable via bin-timeline-manager's audit log (no separate resolution history endpoint needed).
Path parameters
Request body
Example request
{
"contact_id": "660e8400-e29b-41d4-a716-446655440001"
}Response
Example response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"customer_id": "7c4d2f3a-1b8e-4f5c-9a6d-3e2f1a0b4c5d",
"peer": {
"type": "tel",
"target": "+14155551234",
"target_name": "John Smith",
"name": "Main Office",
"detail": "Primary contact number"
},
"local": {
"type": "tel",
"target": "+14155551234",
"target_name": "John Smith",
"name": "Main Office",
"detail": "Primary contact number"
},
"reference_type": "call",
"reference_id": "1fe1356f-3f7f-4ff9-9d33-08136b38f506",
"contact_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"owner_type": "agent",
"owner_id": "2a2ec0ba-8004-11ec-aea5-439829c92a7c",
"status": "open",
"opened_at": "2026-06-01T09:30:00.000000Z",
"closed_at": "2026-06-02T09:30:00.000000Z",
"closed_reason": "agent_closed",
"closed_by_type": "agent",
"closed_by_id": "2a2ec0ba-8004-11ec-aea5-439829c92a7c",
"name": "Billing dispute follow-up",
"detail": "Customer disputes March invoice charges.",
"previous_case_id": "11111111-0000-0000-0000-000000000001",
"tm_create": "2026-06-01T09:30:00.000000Z",
"tm_update": "2026-06-01T09:30:00.000000Z"
}