CXone Personal Connection API: 403 Forbidden on outbound call trigger

We are attempting to automate outbound dialing via the CXone Personal Connection API to sync with our Terraform-managed campaign schedules. The goal is to trigger a call programmatically when a specific state change occurs in our IaC pipeline. We are using the POST /api/v2/outbound/contactlists/trigger endpoint. The request includes a valid OAuth bearer token with the outbound:call:make scope, yet the response consistently returns a 403 Forbidden error with the message “Insufficient permissions for resource type: Personal Connection”. The JSON payload is structured exactly as per the documentation, specifying the from and to numbers along with the personalConnectionId. We have verified that the service account has the necessary role assignments in the Admin UI, but the API call still fails. Interestingly, manual calls through the web client work without issue. We are wondering if there is a specific API key requirement or a hidden permission flag that needs to be set for Personal Connection resources specifically. The code snippet for the request is as follows: curl -X POST https://platform.nice.incontact.com/api/v2/outbound/contactlists/trigger -H 'Authorization: Bearer <token>' -d '{"personalConnectionId": "12345", "from": "+1234567890", "to": "+0987654321"}'. Any insights on this permission mismatch would be appreciated.

The scope outbound:call:make is definitely wrong for triggering a contact list. The docs say you need outbound:contactlist:write to hit /api/v2/outbound/contactlists/{contactListId}/trigger. Also, the endpoint you posted looks slightly off. It’s not just /trigger, it requires the specific contact list ID in the path.

Here is the correct C# snippet using the PureCloudPlatformClientV2 SDK. Make sure your app registration has outbound:contactlist:write added. The SDK handles the token refresh, so you don’t need to manage that manually unless you’re doing raw HTTP calls.

var outboundApi = new OutboundApi();
var contactListId = "your-actual-contact-list-id"; // Don't use the name, use the ID

try 
{
 // Trigger the contact list
 var result = await outboundApi.PostOutboundContactlistsTriggerAsync(contactListId);
 Console.WriteLine($"Triggered successfully. Status: {result.Status}");
}
catch (ApiException e)
{
 Console.WriteLine($"Exception when calling OutboundApi.PostOutboundContactlistsTriggerAsync: {e.Message}\n");
 Console.WriteLine(e.StackTrace);
}

If you are still getting 403, check the division ID. The token might be valid, but if the contact list is in a different division than the user context or the app’s default division, you’ll get forbidden. The API docs state: “The user must have the outbound:contactlist:write permission.”

Also, don’t expect immediate dialing. The trigger just marks the list for processing. It depends on your campaign settings and agent availability. We hit this same issue when moving from sandbox to production. The sandbox allows more broad access, but prod is strict.

Check your app scopes in the developer portal. Sometimes the UI says “Outbound Calls” but it doesn’t include the specific write permission for contact lists. You have to add it manually in the OAuth section.