Architect GetExternalContactAction returning empty contact object despite valid API response

I’ve been wrestling with an Architect flow for the past two days. The goal is straightforward: look up a customer record in our external CRM using their phone number when an inbound voice call arrives. I’m using the GetExternalContactAction data action.

The external API works fine when I test it in Postman. It returns a 200 OK with the JSON payload. But inside Genesys Cloud Architect, the contact object comes back empty. No errors, just null fields.

Here is the JSON configuration I’m using for the data action:

{
 "actionType": "external-contact",
 "settings": {
 "lookupKey": "phone",
 "lookupValue": "{{conversation.participants[0].channelProperties.phoneNumber}}",
 "endpoint": "https://api.ourcrm.com/v1/customers/lookup",
 "method": "GET",
 "headers": {
 "Authorization": "Bearer {{secureVariables.crmApiKey}}",
 "Content-Type": "application/json"
 },
 "responseMapping": {
 "customerId": "$.id",
 "firstName": "$.profile.firstName",
 "lastName": "$.profile.lastName",
 "accountId": "$.account.id"
 }
 }
}

The lookupValue resolves correctly to +15551234567 in the trace logs. I can see the outgoing request in the Architect trace.

The issue seems to be with how the responseMapping handles the JSON path. Our API returns the data like this:

{
 "success": true,
 "data": {
 "id": "12345",
 "profile": {
 "firstName": "John",
 "lastName": "Doe"
 },
 "account": {
 "id": "ACC-999"
 }
 }
}

I tried changing the mapping to $.data.id and $.data.profile.firstName. I also tried wrapping it in an object like { "contact": { "customerId": "$.data.id" } } but that didn’t help. The trace shows the HTTP 200 response body is received correctly by Genesys, but the variables set in the flow remain empty.

Is there a specific format required for the responseMapping object in GetExternalContactAction? The documentation is a bit sparse on the exact JSONPath syntax supported here. I’m running this in the US_EAST_1 region.

Any ideas why the mapping fails silently?