Outbound Campaign API 400 Bad Request on /api/v2/outbound/campaigns with Valid Contact List

The API returns a 400 Bad Request with the message: “Validation failed for field ‘contactListId’. The specified contact list does not exist or is not accessible.”

This is occurring while attempting to programmatically create a new outbound campaign via the Genesys Cloud REST API (POST /api/v2/outbound/campaigns). The integration is built as a Premium App using Node.js 18 and the @genesyscloud/api-client-node SDK v4.5.2. The authentication flow uses multi-tenant OAuth with a service account that has the outbound:campaign:write and outbound:contactlist:read permissions explicitly granted in the admin console.

The contactListId being passed is a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8, which is confirmed to exist and be active in the target organization. Manual verification via the Admin UI shows the list contains 1,200 contacts and has no active locks. Furthermore, a GET /api/v2/outbound/contactlists/{contactListId} call using the same bearer token returns a 200 OK with the full list details, confirming access rights are intact.

The request payload is structured as follows:

name: "Automated Survey Campaign - Batch 4"
contactListId: "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8"
campaignType: "PREDICTIVE"
rules:
 - id: "rule_01"
 condition: "callDispositionCode == 'SURVEY_COMPLETE'"
 action: "STOP"
predictiveCampaign:
 predictRate: 0.75
 targetAbandonPercent: 5
 maxCallsPerHour: 500
 dialingPattern: "SEQUENTIAL"
 wrapUpTime: 30

The error persists across multiple attempts with different contactListId values from the same org. Rate limiting is not the issue, as the requests are spaced 5 seconds apart and no 429 headers are present. The environment is mypurecloud.com (US East). Has anyone encountered a discrepancy where a valid, accessible contact list is rejected during campaign creation specifically for PREDICTIVE types? I suspect this might be related to a backend validation step that checks for predictive-specific metadata on the list, but the documentation does not specify additional requirements beyond the list ID.