400 INVALID_VALUE on POST /api/v2/analytics/outbound/contactlists - what's missing?

Stuck on a 400 error when trying to create a new outbound contact list via the NICE CXone API. The payload looks valid to me, but the server keeps rejecting it with an INVALID_VALUE error. Not getting much detail in the response body other than the generic error object.

Here’s the JSON payload I’m sending:

{
 "name": "Q3_Campaign_List",
 "description": "Contacts for the third quarter push",
 "contactSource": "CSV",
 "contactListType": "MANUAL",
 "contactFields": [
 {
 "name": "phone",
 "type": "STRING"
 }
 ],
 "contacts": [
 {
 "phone": "+15550199999"
 }
 ]
}

The endpoint is POST /api/v2/analytics/outbound/contactlists. I’ve verified the OAuth token is fresh and has the outbound:contactlist:create scope. I can read existing lists fine with GET requests.

I tried removing the contacts array to see if it was an issue with the data format, but the error persists. I also tried changing contactListType to IMPORT but that didn’t help. The docs say contactSource is optional, but I’m providing it just in case.

Is there a required field I’m missing? Or is the contactFields schema wrong? The name field seems fine since it’s just a string. Maybe the phone number format needs to be E.164 without the plus sign? I tried that too, same result.

Any ideas on what’s causing the INVALID_VALUE rejection? The error response doesn’t point to a specific field, just says the value is invalid. Pretty frustrating when the API doesn’t tell you what’s wrong. I’ve spent half the morning guessing.

Cause:
The API is likely choking on the contactSource field or missing the required fields definition. In the Genesys Cloud (and CXone) outbound APIs, you can’t just say “CSV” and walk away. You need to explicitly define the schema so the system knows how to map the incoming data to the contact attributes. Also, double-check that the contactSource value matches the enum exactly. It’s case-sensitive and sometimes tricky if you’re mixing docs from different regions.

Solution:
Here’s a payload that should clear up the ambiguity. Make sure the fields array matches the headers in your actual CSV file.

{
 "name": "Q3_Campaign_List",
 "description": "Contacts for the third quarter push",
 "contactSource": "CSV",
 "fields": [
 {
 "name": "name",
 "label": "Full Name"
 },
 {
 "name": "phone",
 "label": "Phone Number"
 }
 ]
}

If you’re still getting hit with a 400, check the request headers. You might be missing the Content-Type: application/json header, which sometimes defaults to text/plain in certain SDK wrappers. That usually throws a generic invalid value error too.