BadNotSupported
BadProfiles / facets
BadNotSupported means the server understood the request and declines the specific option in it, rather than the whole service. It is usually a conformance gap, so read ServerProfileArray and the ServerCapabilities codes to see what the product claims before treating it as a bug.
What you actually see
A service that works with default parameters fails as soon as you set one particular option, filter, encoding or flag.
Why it happens
- An optional parameter the server does not implementDeadband filters, DataChangeTrigger settings, IndexRange on a write, TimestampsToReturn combinations and the more exotic browse result masks are all optional in practice. Servers implement the common paths and reject the rest, which is why the failure tracks the parameter and not the node.
- A data encoding the server does not offerAsking for a JSON or XML encoding of a value from a server that only publishes the binary encoding is not supported, and the same goes for requesting an encoding NodeId that exists in the type but is not implemented on this product.
- A companion-specification feature that is only partially implementedVendors implement the mandatory nodes of a model and leave the optional ones out. A method or an option defined in the companion spec can be present in the address space and still be unsupported by the running implementation.
- A transport or security option the endpoint does not carryRequesting a security policy, a message security mode or a transport profile the endpoint does not offer produces a support failure rather than a security failure. GetEndpoints is the authoritative list of what is on offer.
- The server claims a facet it does not fully implementWhere ServerProfileArray advertises more than the code does, a client that trusts the advertisement asks for something legitimate and gets refused. Only advertising facets that are genuinely implemented is the fix on the server side, and it is exactly what the Compliance Test Tool checks.
How to fix it
In diagnostic order: work down, do not skip ahead.
- Isolate the option that causes itStrip the request back to its simplest legal form and add one option at a time. The parameter that reintroduces the failure is the unsupported one, and that is the fact you need for both the workaround and the vendor conversation.
- Read ServerProfileArray and the capability codesCompare what you are asking for against the facets the server claims. If the facet that covers your option is not listed, stop debugging the client; the feature is not there.
- Take the supported path insteadDrop the deadband and filter downstream, read the whole array instead of an IndexRange, request Both timestamps, or use the binary encoding. Costlier on the wire, but it works today.
- Call GetEndpoints for security and transport optionsEnumerate the endpoints with security None first and inspect each EndpointDescription for its policy, mode and transport profile URI. Pick from that list rather than from what your client offers.
- Report it as a conformance gap with evidenceSend the vendor the request parameters, the returned code, and the ServerProfileArray content. A gap between the advertised facet and the behaviour is actionable in a way that a general complaint is not.
Where it shows up, by tool and stack
| Tool / stack | What to do there |
|---|---|
| UaExpert | Setting a deadband or a monitoring option in the monitored item configuration and seeing it rejected identifies the unsupported parameter immediately without any client code. |
| asyncua (Python) | The SDK exposes the full parameter surface of every service, so it is easy to construct a legal request the server does not implement. Compare with what UaExpert sends for the same operation. |
| node-opcua | Where you write the server, return this code from the unimplemented option rather than pretending to honour it. Silently ignoring a deadband is worse for the client than an honest refusal. |
| OPC Publisher | Its configuration exposes options such as deadbands, skip-first and heartbeat that not every server honours. When a published node behaves differently from its configuration, check for this code in the diagnostics before blaming the configuration. |
| KEPServerEX | Optional service parameters vary by driver and by edition. Confirm behaviour against the running instance rather than against the general product documentation. |
| Eclipse Milo (Java) | The public demo server is a useful control case: if the same option works there and not on your target, the option is legal and the gap is in the product. |
What it looks like in the log
CreateMonitoredItems: BadNotSupported for requested DataChangeFilter
Requested dataEncoding not supported for this node
Option rejected by server: not part of any implemented facet
Confirm the fix
Re-issue the request without the unsupported option and confirm the operation completes, then document the option as unavailable on this product and version.
Stop it happening again
Probe capability at connect time and adapt rather than assume: read ServerProfileArray, read the endpoint list, and fall back to the simple path automatically when an option is refused.
Stuck on more than one of these? The troubleshooting clinic works through broken configurations end to end, on camera.
Troubleshooting clinic →Last verified 7 September 2026 against OPC UA 1.05.07. OPC UA Connect is an educational resource and is not affiliated with the OPC Foundation.