PATCH /api/v2/conversations/voice/{id}/participants failing to persist attributes via REST Proxy

I’ve got a script running on an inbound voice interaction. The goal is simple. Pull some data from our external CRM and attach it as a participant attribute on the current call so the agent can see it later.

The script uses a GetRESTProxy action to hit our internal endpoint. That part works. I get the JSON back. Then I use a Set Participant Attribute action to store the value locally in the script context.

Here is the issue. When I try to push that attribute to the live conversation using the REST Proxy action again, the API call returns a 200 OK. No error. But the attribute never shows up in Genesys Cloud.

I’m using the PATCH method on /api/v2/conversations/voice/{conversationId}/participants/{participantId}. The payload looks like this:

{
 "attributes": {
 "crm_customer_tier": "platinum"
 }
}

I verified the conversationId and participantId are correct by logging them. The token has conversation:write scope. I’ve checked the Genesys Cloud logs and the request hits the server. It just doesn’t stick.

I tried adding "replace" in the options but that didn’t help. I also tried using the Update Conversation Participant action directly in instead of REST Proxy, but I need to pass a dynamic value from the CRM call that the standard action doesn’t seem to handle easily without a lot of variable mapping.

Is there a specific format required for the attributes object? Or is there a race condition where the participant isn’t fully initialized when the script runs? The call is active, so the participant exists.

Here is the REST Proxy config screenshot logic: Method PATCH, URL constructed dynamically, Body is the JSON above. Headers include Content-Type: application/json.

Any ideas why the 200 OK is lying to me?

You’re likely running into a scope or permission issue with the REST Proxy, or perhaps the attribute key isn’t being formatted correctly for the API payload. The Set Participant Attribute action in Architect only updates the local context for that specific flow. It doesn’t automatically push changes to the Genesys Cloud API unless you explicitly make an API call.

If you’re using the REST Proxy to hit an external endpoint, that’s fine for fetching data, but you can’t use it to update Genesys participant attributes directly unless your external endpoint is configured to call back into Genesys. That’s a circular dependency and usually a bad idea. Instead, you should use the built-in Make API Call action in Architect, or handle it via the REST API directly if you’re doing this outside of Architect.

Here’s how you’d do it via the REST API using curl for testing, or you can replicate this in the Make API Call action:

curl -X PATCH "https://api.mypurecloud.com/api/v2/conversations/voice/{conversationId}/participants/{participantId}" \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
 "attributes": {
 "crmData": "value_from_crm"
 }
 }'

In Architect, you’d use the Make API Call action. Set the method to PATCH, the URL to /api/v2/conversations/voice/{conversation.id}/participants/{interaction.participantId}, and the body to a JSON object with the attributes you want to set. Make sure your OAuth token has the conversation:modify scope. If you’re still getting errors, check the response body for specific validation issues. Sometimes the attribute key needs to be a string, and the value can be a string, number, or boolean. Don’t overcomplicate it with external proxies if Genesys can handle it natively.