PATCH /conversations/voice/participants failing with 400 on custom attributes

Does anyone know why updating participant attributes via the Python SDK throws a 400 Bad Request? I am injecting external CRM data into a live voice leg using client.conversations_api.patch_conversations_voice_participant. The JSON payload includes standard attributes alongside my custom keys, but the API rejects it immediately. I have verified the token is valid and the conversation ID exists. Is there a strict schema constraint I am missing for dynamic keys?

patch = PatchParticipantRequest(attributes={"crm_id": "123", "tier": "gold"})
client.conversations_api.patch_conversations_voice_participant(conv_id, part_id, patch)