PATCH /api/v2/conversations/voice/{id}/participants/{id} 422 on external attribute update

Why does the voice API reject my attempt to push external attributes into a live participant object? I’m trying to sync some CRM data back to Genesys Cloud while the agent is on a call. The idea is simple. Agent connects. We query our backend for the customer’s tier. We want that tier visible in the participant attributes so our dashboard widgets can pick it up.

The call works for basic stuff like hold or mute. But when I try to add a custom attribute, it blows up. Here is the payload I’m sending to PATCH /api/v2/conversations/voice/abc-123/participants/def-456:

{
 "externalAttributes": {
 "customerTier": "platinum",
 "lastPurchaseDate": "2023-10-27"
 }
}

The response is a hard 422 Unprocessable Entity. The error body says something about the schema not matching. I’ve checked the docs for ParticipantConversationData. It clearly lists externalAttributes as a valid field of type map[string]string. I’m sending strings. The keys are valid. The conversation ID is definitely active. The participant ID is correct.

I’ve tried wrapping it in a partialUpdate object. No change. I’ve tried sending it as part of a larger update with wrapUpCode. Still 422. It feels like the API docs are lying or I’m missing a specific header. Is there a rate limit that’s masking the real error? Or is this endpoint just broken for external attributes on voice legs? I need this working by EOD Berlin time. The dashboard team is screaming. Help.