Triggering CXone Personal Connection outbound call via .NET Azure Function

Stuck on triggering a CXone outbound call using the Personal Connection API from an Azure Function. My pipeline consumes Genesys Cloud webhooks, processes them through Service Bus, and must initiate a CXone voice interaction when specific routing rules match.

Problem

The request returns a 400 status code. I retrieve the bearer token via managed identity and attach it correctly. Debugging the trace reveals nothing unusual. The token refreshes every ten minutes. Yet the gateway refuses the payload. The payload structure appears valid, yet the CXone gateway rejects the numbering schema. I suspect the channel or contact schema requires a nested object rather than flat strings.

Code

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var payload = new
{
 from = "+33123456789",
 to = "+33987654321",
 channel = "voice",
 contact = new { external_id = "AZ-TRIGGER-001" }
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.niceincontact.com/api/v2/outbound/connections/personal", content);

Error

The response body contains:

{
 "status": 400,
 "code": "BAD_REQUEST",
 "message": "Invalid contact structure for personal connection. Expected 'campaign' or 'user' context.",
 "errors": ["contact.external_id is not sufficient for direct outbound"]
}

Question

How should I structure the JSON payload to successfully route a direct outbound call through the Personal Connection endpoint? The CXone Personal Connection Docs mention a user_context field, but examples remain incomplete. Should I inject a campaign_id instead? Or wrap the numbers inside a call_legs array. I need the exact schema that passes validation without throwing a BAD_REQUEST.