openrtb.fields.mutually_exclusive
What it means
Two fields the specification defines as mutually exclusive are both present. The best-known case is site and app (and dooh) on the same request. The same code fires for wseat with bseat, wlang with wlangb, acat with bcat, keywords with kwarray, language with langb, and a 3.0 envelope carrying both a request and a response.
Why it matters
Each pair answers one question two contradictory ways: what inventory is this, which seats may bid, which categories are allowed. A bidder cannot resolve the contradiction, so many drop the request outright. The usual cause is a builder merging two config sources and keeping both branches.
How to fix it
Keep exactly one of the pair. For site vs app, pick the object matching the actual inventory. For allowlist vs blocklist pairs, decide which policy you enforce and send only that list.
Example that trips it
{ "site": { "domain": "example.com" }, "app": { "bundle": "com.example" } }One request claiming to be both web and app inventory.
Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI: the id is stable, wording is not.
Back to the full diagnostic code reference.