Status code · History

BadAggregateNotSupported

BadPart 13 aggregates

BadAggregateNotSupported means the server does historical access but not the aggregate you asked for. Part 13 defines a long list; servers implement a subset. Browse Server, ServerCapabilities, AggregateFunctions to get the real list, or check ServerProfileArray for the AggregateHistorical2022 facet before requesting processed reads.

Defined behaviour: The requested aggregate function is not supported by the server. (our description of the condition this code reports)

What you actually see

Raw history reads work, TimeAverage works, and PercentGood or WorstQuality returns this code from the same server.

Why it happens

  • The server implements only part of Part 13Part 13 defines Interpolative, Average, TimeAverage, Minimum, Maximum, Count, Total, Delta, StandardDeviation, DurationGood, DurationBad, PercentGood, PercentBad and WorstQuality among others. Implementing all of them is optional. Most servers ship a handful and the quality-oriented ones are the usual omissions.
  • No aggregate support at allThe historical raw data facet and the historical aggregate facet are separate. A server certified for HistoricalRawData2022 and not AggregateHistorical2022 will answer raw reads and reject every processed read, which looks like a single broken aggregate until you test a second one.
  • Hardcoded aggregate NodeId that the server does not defineAggregates are identified by NodeId. Clients that hardcode standard aggregate identifiers rather than browsing the AggregateFunctions folder will name an aggregate this server has no node for, and the server has no choice but to reject it.
  • Aggregate supported globally but not for this nodeA node can expose its own AggregateFunctions folder or an AggregateConfiguration that narrows what is available for it. A server-level list is a superset; per-node support can be smaller, particularly for non-numeric nodes.
  • Gateway or aggregating server does not forward aggregatesAn aggregating server or protocol gateway in the path may implement raw pass-through and no aggregate computation of its own, so the downstream server's aggregates are invisible to you even though they exist.

How to fix it

In diagnostic order: work down, do not skip ahead.

  1. Browse the AggregateFunctions folderUnder Server, ServerCapabilities, AggregateFunctions the server lists every aggregate it actually implements, as nodes with BrowseNames you can read. Take your aggregate NodeIds from there at runtime and the problem disappears permanently.
  2. Check the aggregate facet in ServerProfileArrayLook for http://opcfoundation.org/UA-Profile/Server/AggregateHistorical2022. Its absence alongside a present HistoricalRawData2022 tells you the server does raw only, and you should not build a design that depends on server-side aggregation.
  3. Substitute an equivalent supported aggregateTimeAverage instead of Average for irregular analog data, Count or Delta instead of Total for counters, DurationGood instead of PercentGood where only one of the pair exists. Document the substitution, because the numbers differ.
  4. Check per-node support before batch requestsTest each aggregate once per node type during commissioning and cache the result. A request that mixes twelve nodes and one aggregate will fail wholesale on the one node that does not support it if you do not.
  5. Aggregate downstream when the server cannotIf the server offers no aggregates, pull raw values and compute in your own pipeline. Budget for the bandwidth: server-side aggregation over a shift window is dramatically cheaper than streaming every raw sample, which is the whole point of the aggregate facet.

Where it shows up, by tool and stack

Tool / stackWhat to do there
UaExpertThe History Trend View lets you select an aggregate from what the server advertises, which makes it the fastest way to see the real supported list without writing code.
asyncua (Python)Read the AggregateFunctions folder with a browse and map BrowseName to NodeId once at connect. Passing a hardcoded ObjectIds aggregate constant is the most common route to this code in Python clients.
UA-.NETStandard (C#)ReadProcessedDetails carries an aggregateType NodeId array. Populate it from a browse of the server's AggregateFunctions folder rather than from the ObjectIds class, which lists everything Part 13 defines regardless of support.
node-opcuaAggregate support in embedded and simulated servers is frequently absent. Verify against a server you know supports it before concluding your client is wrong.
KEPServerEXHistorical access and aggregates depend on which historian plugin or feature is licensed and configured, not on the driver. Confirm what the UA server actually advertises rather than what the product datasheet lists.

What it looks like in the log

HistoryRead processed aggregate=PercentGood -> BadAggregateNotSupported
server AggregateFunctions: Interpolative, Average, TimeAverage, Minimum, Maximum, Count, Total (7 of Part 13)

Confirm the fix

Request only aggregates whose NodeIds you browsed from the server's own AggregateFunctions folder, and confirm each returns values for a known-good window. Re-check after firmware or version upgrades, since the list can grow.

Stop it happening again

Never hardcode aggregate NodeIds. Discover them at connect, record the supported set per server in your asset inventory, and design reports so a missing aggregate degrades to a documented substitute rather than failing the whole batch.

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.

Free download
OPC UA Status Code Diagnostic Tree
A 15-page diagnostic reference grouping every normative status code by what actually went wrong: with the first action for each, and the four questions that resolve most faults before you read a single code.
Get the free diagnostic tree →
Free, no course, no login