PUT /api/v2/conversations/{conversationId}/participants/{participantId} returning 400 on attribute update

We’re pushing custom metadata onto active voice calls so the queue analytics dashboard can segment them properly. The admin UI doesn’t support attribute capture at disposition, so the background script hits the Conversations API directly.

Endpoint: PUT /api/v2/conversations/{conversationId}/participants/{participantId}
Payload:
{
“actions”: [
{
“type”: “updateParticipantAttributes”,
“attributes”: {
“priority_tier”: “high_value”,
“campaign_id”: “Q4_RETENTION”
}
}
]
}

Response keeps coming back as 400 Bad Request with {“errors”: [{“message”: “Invalid action type for current participant state”}]}. Rotated the OAuth token and verified the participant ID matches the active leg. Tried stripping the type field and just sending raw attributes. Swapped to PATCH instead of PUT. Nothing changes the 400 response. The documentation mentions participant states lock certain actions, but the call sits in connected status according to the GET endpoint.

Does the updateParticipantAttributes action require a specific routing group context? The script runs under the same OAuth client that handles the queue config. Checking the audit logs now.