The ZigBee protocol is made up of multiple layers, and the question about header needs to consider what is being sent at each layer given that there are many optional fields.
Below is an overview of the different headers - there are optional features and these may change the size significantly. For example, if long addresses are used, this will add an extra 8 bytes per address (source and destination).

The different layers in ZigBee are each documented separately.
The public ZCL (ZigBee Cluster Library) specification is here
The public ZigBee Specification containing APS and network layer information is
available here.
Note that these are the public versions - the most recent versions are only available to ZigBee Alliance members. Most changes are in the ZCL specification and other documents so should not impact the answer to this question relating to headers as these should not change.