Java CXone outbound list payload returning 400 on deduplication rules

400 Bad Request

{ "error": "invalid_schema", "message": "Deduplication rule exceeds quota" }

What’s the right approach for structuring the list definition payload? The Java client doesn’t like the contact record arrays when I mix compliance suppression flags with the fuzzy matching logic. Token refresh handles the bearer part fine now, but the schema validation crashes on the streaming ingestion call. Chunking breaks after the first batch. Throughput just flatlines.

var dedupRules = new ArrayList<DeduplicationRule>();
dedupRules.add(new DeduplicationRule()
 .attribute("email")
 .matchType("fuzzy")
 .confidenceThreshold(0.85f));
var listDef = new CreateContactListRequest()
 .name("Campaign_Alpha_List")
 .deduplicationRules(dedupRules)
 .complianceFlags(List.of("do_not_call"));
outboundApi.postOutboundContactsLists(listDef);

Problem

You’re stuffing Compliance Flags directly into the Deduplication Rules array. The Admin UI handles this separation automatically, which is why I’d usually prefer the Admin UI for list setup anyway.

Error

That 400 invalid_schema crash happens because the Fuzzy Matching quota caps at ten rules per list. Mixing suppression logic into the rule array breaks the Schema Validation immediately. The Java client throws a hard stop when the Payload Shape doesn’t match the OpenAPI Spec.

Question

Keep the Compliance Flags at the root level and leave the Deduplication Rules alone. You’ll see the streaming ingestion call pass right through. Watch the Environment Limits closely.

Problem

Schema validation crashes when fuzzy matching hits the quota.

Code

var rule = new DeduplicationRule().attribute("email").matchType("exact");
outboundApi.postOutboundContactsLists(new CreateContactListRequest().deduplicationRules(List.of(rule)));

Error

That adjustment clears the 400 on my local mock. It doesn’t throw anymore.

Question

Checking rate limits on /api/v2/outbound/contacts/lists during terraform apply anyway.