Skip to content

AI translation

This page was translated from German with AI. If in doubt, the German original applies.

DIWASS code lists

This page is the lookup reference for all controlled value sets that a DIWASS transmission accepts: waste code lists, packaging types, R/D codes, attachment classifications, means of transport, event codes. For each list, it states which values are permitted, in which notation, in which field they go, and how an incorrect value manifests itself.

The source of the value sets is the EU specification “DiWaSS API specifications - for 3rd parties”, folder [Repositories] (workbooks DIWASS - lists waste codes.xlsx, Disposal and recovery codes (box 11).xlsx, Packaging type codes (box 7).xlsx, Physical characteristics codes (box 13).xlsx, Means of transport codes.xlsx, Event codes for sync.xlsx, Attachment types.docx), cross-checked against the DIWASS XSDs (codelists.xsd, basetypes.xsd) and against the ZEDAL protos.

Two validation levels — the error pattern depends on them

DIWASS checks code lists at two completely different levels. If you don’t keep them apart, you look for the error in the wrong place.

Validation level Where defined Affected Symptom for an invalid value
XML schema <xs:enumeration> or <xs:pattern> in the DIWASS XSDs Packaging type, physical characteristics, means of transport, R/D codes, attachment typeID, country code, all small value sets SOAP fault, HTTP 500, message from the schema validator (cvc-…). The business logic is never reached
Repository (server-side) maintained code list in DIWASS, not in the schema Waste codes and their listID Business error WASTE-CLASSIFICATION-INVALID-CODE / waste.error.classification.code

Verified with the country code: a CountryID with 56 instead of 056 produces cvc-pattern-valid: Value '56' is not facet-valid with respect to pattern '\d\d\d' for type 'CountryCodeType' as a SOAP fault (HTTP 500) — the value does not reach the DIWASS business logic.

Error codes come back with hyphens, the specification writes them with underscores

The EU list Validations-messages.xlsx lists the codes as WASTE_CLASSIFICATION_INVALID_CODE. DIWASS reports them in the response as WASTE-CLASSIFICATION-INVALID-CODE. A text match between runtime error and specification fails on the notation alone. For details on the error codes, see Error codes.

Notation pitfalls

The following six points cause the most rejections in practice. All of them are verified.

Waste codes need group spaces

DIWASS expects EU waste codes as 01 03 06, not as 010306. The German notation without spaces used under the Waste Catalogue Ordinance (Abfallverzeichnis-Verordnung, AVV) is not contained in the DIWASS code list and fails as WASTE-CLASSIFICATION-INVALID-CODE.

Verified by a contrasting pair: a push with 010306 and 010408 was reported back by DIWASS as 01 03 06 and 01 04 08; in the repository sheet, each of the 890 codes has spaces between the groups of two digits, and 010306 does not occur there in any form.

Hazardous waste carries the asterisk in the value

01 04 07* — the asterisk is part of the code, not a display convention. 442 of the 890 LoW entries carry it.

Country code: three-digit numeric in the document, alpha-2 in the directory

Context Format Example Belgium
CountryID in every document (model:CountryCodeType, pattern \d\d\d) ISO 3166-1 numeric, three digits with leading zero 056
Directory search FindActivities ISO 3166-1 alpha-2 BE

The numeric code in the directory lookup returns 0 hits — without error and without exception. Verified: FindActivities("BE", code: "BE01") returns one hit (OVAM, Afdeling Afvalstoffenbeheer, status VALID), FindActivities("056", …) and FindActivities("56", …) none. If you search numerically, you wrongly conclude “authority does not exist”.

Conversely, a two-digit value in the document never even reaches the business logic — it fails at the XSD pattern (see above).

HP codes belong in their own list, without EU suffix

Field 14 (viii) of the notification document (listID = h-code) carries Basel H codes exclusively. The EU hazardous properties HP1–HP15 belong in their own validated list hp_codes — in the DIWASS user interface under “Other Waste Identification” — and there without the EU suffix.

This deliberately deviates from the text of the Regulation: the WSR instructions for completing the forms (Annex IC, point (g) on subheading (viii)) provide for entering the HP code in field (viii) and appending EU (example in the text of the Regulation: HP14 EU). DIWASS implements separate lists without the suffix. An HP11 EU or an HP code under h-code is rejected as a classification code error.

Useful in practice: the two value sets do not overlap — no code is in both lists. A list mix-up can therefore never silently map to the wrong entry.

Packaging type: “Other” is 10, not 9

Compared with the classic notification list, the DIWASS packaging list has an additional type: 9 = Bale. “Other” thus moves to 10. Validation or UI logic that detects “Other” by numeric comparison is the first place you have to touch when switching between the classic document and the DIWASS document.

Upper/lower case of the listID

The specification sheet and the values actually accepted differ for four lists. Verified (push against DIWASS, 2026-08-03) are the values in the “verified” column:

Sheet column “Name in API” verified as accepted
Basel_A basel_a
Basel_B basel_b
OECD oecd
Other other
LoW LoW

Additionally observed: a document pair with listID="low" (lowercase) went through and came back that way. So both notations are individually confirmed — but never measured against each other. Whether DIWASS compares case-insensitively is not verified. Pick one notation and stick with it; when in doubt, the verified one.

Waste code lists (listID on WasteTypeCode)

All waste codes use the same structure: a WasteTypeCode element with the code as its value and the listID attribute naming the list. The pair (code, listID) identifies the entry. WasteClassification is maxOccurs="unbounded" — the same waste can be described simultaneously via Basel, LoW and a national code.

In the proto: WasteClassificationType.waste_type_code[] with code and list_id (WasteCodeType). Used in SubmissionType.WasteClassification (notification, box 14), in the Annex VII documents, in the receipt and completion certificates and in the Article 15 certificate.

listID is no longer an XSD enum

In the current schema, WasteClassificationSchemeIdentifierType is an empty restriction on xs:token — the schema lets any token through. The check only happens on the server side against the repository. The old XSD enumeration (BASEL, EWL, YCODE, NATEXP, UNNUM, ANNEX3A, …) is obsolete; bundled XML samples with listID="BASEL" are not evidence of the value valid today. An outdated list name surfaces as waste.error.classification.code — i.e. with the same message as an invalid code.

Strictly speaking, the field type is a union: WasteClassificationSchemeOrCountryIdentifierType combines the loose token with CountryCodeType (\d\d\d). For national waste lists, according to the schema annotation, a numeric ISO 3166-1 code is also intended as listID (example from the annotation: 233 for Estonia). This path has not been measured against DIWASS.

The code itself is of type Token64OrEmpty: an xs:token with a maximum of 64 characters. xs:token means that leading and trailing spaces are removed and internal sequences of two or more spaces are not permitted — the single group spaces of a waste code are not affected. The type explicitly also allows an empty value; the schema annotation gives as its purpose waste codes that are not in any mandatory catalog.

Overview

“validated” = DIWASS checks the code against a maintained repository and rejects unknown values. “not validated” = free text, only the format counts.

List listID (verified) Sheet notation validated Entries in the sheet
Basel list A basel_a Basel_A yes 67
Basel list B basel_b Basel_B yes 62
OECD oecd OECD yes 36
EU List of Waste (LoW) LoW LoW yes 890
Y codes y-code y-code yes 45
H codes h-code h-code yes 14
HP codes hp_codes hp_codes yes 15
UN class un_class un_class yes 11 distinct
WSR Annex III wsr_a3 wsr_a3 yes 1
WSR Annex IIIA wsr_a3a wsr_a3a yes 15
WSR Annex IIIB wsr_a3b wsr_a3b yes 2
WSR Annex IV wsr_a4 wsr_a4 yes 1
Customs codes (HS) customs_codes customs_codes yes Sheet empty
National code, export nat_exp nat_exp no —
National code, import nat_imp nat_imp no —
UN number un_no un_no no —
UN proper shipping name un_shipping un_shipping no —
Other other Other no —
Unlisted unlisted unlisted no —

Verification status: 18 of the 19 lists were confirmed on 2026-08-03 by individual push against a DIWASS environment using example codes from the specification. The only failure is customs_codes (see there). The confirmation applies to the notification; it does not automatically carry over to the Annex VII announcement, because the listID check takes place on the server side and not in the schema.

In the .NET SDK, the list names are typed as WasteCodeListId (namespace Zedal.Sdk.Apis.Diwass.Enums). ToWire() returns the wire string, TryFromWire() / FromWireOrUnknown() read it back (case-insensitive). Unknown values map to Unknown instead of throwing.

Basel list A — hazardous waste

listID = basel_a, validated. Sheet (Basel)A_codes, 67 entries — 63 A codes plus four Y entries that the sheet lists in the same column.

A1010  A1020  A1030  A1040  A1050  A1060  A1070  A1080  A1090  A1100
A1110  A1120  A1130  A1140  A1150  A1160  A1170  A1180  A1181  A1190
A2010  A2020  A2030  A2040  A2050  A2060
A3010  A3020  A3030  A3040  A3050  A3060  A3070  A3080  A3090  A3100
A3110  A3120  A3130  A3140  A3150  A3160  A3170  A3180  A3190  A3200
A3210
A4010  A4020  A4030  A4040  A4050  A4060  A4070  A4080  A4090  A4100
A4110  A4120  A4130  A4140  A4150  A4160
Y46    Y47    Y48    Y49

Note the outliers from the grid of tens: A1181, A3210. Y46–Y49 are in the sheet of the A codes, not in the sheet of the Y codes (which ends at Y45).

Basel list B — non-hazardous waste

listID = basel_b, validated. Sheet (Basel)B_codes, 62 entries.

B1010  B1020  B1030  B1031  B1040  B1050  B1060  B1070  B1080  B1090
B1100  B1110  B1115  B1120  B1130  B1140  B1150  B1160  B1170  B1180
B1190  B1200  B1210  B1220  B1230  B1240  B1250
B2010  B2020  B2030  B2040  B2050  B2060  B2070  B2080  B2090  B2100
B2110  B2120  B2130
B3010  B3011  B3020  B3026  B3027  B3030  B3035  B3040  B3050  B3060
B3065  B3070  B3080  B3090  B3100  B3110  B3120  B3130  B3140
B4010  B4020  B4030

Outliers: B1031, B1115, B3011, B3026, B3027, B3035, B3065.

OECD list

listID = oecd, validated. Sheet OECD, 36 entries.

GB040  GC010  GC020  GC030  GC050  GE020  GF010  GG030  GG040  GH013
GN010  GN020  GN030
AA010  AA060  AA190
AB030  AB070  AB120  AB130  AB150
AC060  AC070  AC080  AC150  AC160  AC170  AC250  AC260  AC270  AC300
AD090  AD100  AD120  AD150
RB020

For the AA/AB/AC/AD/RB entries, the sheet has an additional column with a hazard indication (EU/National HZ, Maybe EU/National HZ, EU/National NHZ). This column is an explanatory note in the sheet and has no field in the API.

EU List of Waste (LoW)

listID = LoW, validated. Sheet (EU list of waste)LoW, 890 entries. Too many to print here — and an abridged selection would be misleading. The sheet is authoritative.

Notation of the listID: LoW or low?

The EU code list overview lists the API name as LoW. The lowercase low was also measured and accepted by DIWASS. Whether the server ignores case is not established — both forms are individually confirmed, never tested against each other.

For you, this means: if you use the .NET SDK, take the value from WasteCodeListId.Low.ToWire() and don’t define your own constant — then a change in notation won’t affect you. For direct calls via REST or gRPC, the sheet name LoW applies.

Structure and notation:

  • Six digits in three groups of two, each separated by a normal space (U+0020) — form NN NN NN.
  • The first group of two runs from 01 to 20.
  • Hazardous waste carries an appended asterisk: 01 04 07*. 442 of the 890 entries.
  • Examples from the sheet: 01 01 01, 01 03 04*, 01 03 06, 20 03 01, 20 03 99.

Two artifacts in the sheet that a parser must catch

Validity period in square brackets. 58 rows carry an editorial addition in the code field — 20 01 44 [from 09.11.2026], 16 06 04 [until 08.12.2026]. The code is the part before it; the bracketed addition describes from or until when the entry applies. As a result, five codes occur twice (09 01 11*, 16 06 01*, 16 06 02*, 16 06 03*, 16 06 06*) — once per time window. One row contains a typo in the date ([until 08.112.2026]).

Non-breaking spaces. 48 rows use U+00A0 instead of U+0020 as the separator. They occur exclusively within the 58 rows with a bracketed addition, not a single one in the remaining 832. Normalize to U+0020 — in the observed DIWASS response, the codes had normal spaces.

Not verified: whether DIWASS expects codes within a transition window with or without the bracketed addition. No push with any of the 58 annotated codes was measured.

Y codes — waste categories of Basel Annex I

listID = y-code, validated. Sheet (Y codes)Y_codes, 45 entries: Y1 to Y45, without gaps.

Y46–Y49 do not belong in this list — they are in the sheet of the Basel A codes.

H codes — hazardous characteristics of Basel Annex III

listID = h-code, validated. Sheet H codes, 14 values — with dot notation and with gaps. There is no H2, H7, H9, H14, H15.

Code Characteristic Code Characteristic
H1 Explosive H6.1 Poisonous (acute)
H3 Flammable liquids H6.2 Infectious substances
H4.1 Flammable solids H8 Corrosives
H4.2 Liable to spontaneous combustion H10 Liberation of toxic gases in contact with air or water
H4.3 Emits flammable gases in contact with water H11 Toxic (delayed or chronic)
H5.1 Oxidizing H12 Ecotoxic
H5.2 Organic peroxides H13 Capable of yielding another material after disposal

Typed in the SDK as HCode (the dots become underscores in the C# names: H4_1).

HP codes — EU hazardous properties

listID = hp_codes, validated. Sheet HP codes, 15 values, HP1 to HP15, without gaps — unlike the H codes. The legal basis is Annex III of Directive 2008/98/EC as amended by Regulation (EU) No 1357/2014.

Code Property Code Property
HP1 Explosive HP9 Infectious
HP2 Oxidising HP10 Toxic for reproduction
HP3 Flammable HP11 Mutagenic
HP4 Irritant — skin irritation and eye damage HP12 Release of an acute toxic gas
HP5 Specific Target Organ Toxicity (STOT) / Aspiration Toxicity HP13 Sensitising
HP6 Acute Toxicity HP14 Ecotoxic
HP7 Carcinogenic HP15 Waste capable of exhibiting a hazardous property listed above not directly displayed by the original waste
HP8 Corrosive

Without the EU suffix and not in the H code field — see Notation pitfalls. Typed in the SDK as HpCode.

UN class

listID = un_class, validated. Sheet UN class codes — 14 rows, but only 11 distinct codes: class 9 appears four times, for four different characteristics.

Code Characteristic
1 Explosive
3 Flammable liquids
4.1 Flammable solids
4.2 Substances or wastes liable to spontaneous combustion
4.3 Substances or wastes which, in contact with water, emit flammable gases
5.1 Oxidizing
5.2 Organic peroxides
6.1 Poisonous (acute)
6.2 Infectious substances
8 Corrosives
9 Catch-all class — in the sheet for “liberation of toxic gases”, “toxic (delayed or chronic)”, “ecotoxic” and “capable of yielding another material after disposal”

The dot notation is the same as for the H codes, but without a letter prefix. This is not a short form of the H codes, even though the description texts in the sheet are identical — the mapping 9 covers four H codes at once.

WSR Annexes III, IIIA, IIIB, IV

All four validated. The legal basis is Regulation (EU) 2024/1157.

listID Annex Codes in the sheet
wsr_a3 Annex III (green-listed waste) EU3011
wsr_a3a Annex IIIA (mixtures of green-listed waste) IIIA.2.a IIIA.2.b IIIA.2.c IIIA.2.d IIIA.2.e IIIA.3.a IIIA.3.b IIIA.3.c IIIA.3.d IIIA.3.e IIIA.3.f IIIA.3.g IIIA.4.a IIIA.4.b IIIA.4.c
wsr_a3b Annex IIIB (additional green-listed waste) BEU04 BEU05
wsr_a4 Annex IV (waste subject to notification) EU48

wsr_a3 and wsr_a4 each list exactly one code in the sheet. The other rows of the sheet (WSR Annex III)A3 are continuation rows of the description of EU3011 (enumeration of the permitted polymers) and not separate codes.

Customs codes (HS)

listID = customs_codes. The sheet Lists of codes lists it as validated, but the detail sheet Customs code(s) (HS) is empty — it only contains the header row.

The specification does not tell you which values are permitted

A push with the plain four-digit HS heading 3915 (plastic waste) was rejected on 2026-08-03 with WASTE-CLASSIFICATION-INVALID-CODE — the only one of the 19 lists. So DIWASS checks customs_codes against a repository that does not contain the four-digit HS heading. Which codes it accepts is open. Ask the DIWASS operator instead of guessing.

Customs codes also have a dedicated field and don’t have to go through WasteTypeCode:

  • Notification: SubmissionType.CustomsCodes_HS (proto customs_codes_hs, type CustomsCodesType with commodity_codes[]), optional.
  • Annex VII: Annex7TransportAnnouncementType.commodityCode (proto commodity_code), optional.

Non-validated lists — free text

DIWASS does not check six lists against a repository. The value only has to meet the format (Token64OrEmpty, i.e. an xs:token of up to 64 characters).

listID Meaning Value used in the test
nat_exp National waste code of the country of dispatch 010304
nat_imp National waste code of the country of destination 010304
un_no UN number according to the UN Model Regulations 3082
un_shipping UN proper shipping name ENVIRONMENTALLY HAZARDOUS SUBSTANCE, LIQUID, N.O.S.
other Other code without a predefined vocabulary custom-code-1
unlisted Unlisted waste not-listed-1

Note: a code without spaces — such as the German AVV code 010304 — is accepted here because the list is not validated. The same value under LoW is invalid; the group spaces apply there.

Code lists from the schema

These value sets are defined as <xs:enumeration> in codelists.xsd. A value outside the set fails at schema validation, not in the business logic — the rejection comes as a SOAP fault, not as a validation error code.

Disposal and recovery operations (R/D codes)

XSD type RecoveryDisposalCodeType — R1–R13 and D1–D15, 28 values in total.

Recovery Description
R1 Use as a fuel (other than in direct incineration) or other means to generate energy (Basel/OECD) — use principally as a fuel or other means to generate energy (EU)
R2 Solvent reclamation/regeneration
R3 Recycling/reclamation of organic substances which are not used as solvents
R4 Recycling/reclamation of metals and metal compounds
R5 Recycling/reclamation of other inorganic materials
R6 Regeneration of acids or bases
R7 Recovery of components used for pollution abatement
R8 Recovery of components from catalysts
R9 Used oil re-refining or other reuses of previously used oil
R10 Land treatment resulting in benefit to agriculture or ecological improvement
R11 Uses of residual materials obtained from any of the operations numbered R1–R10
R12 Exchange of wastes for submission to any of the operations numbered R1–R11
R13 Accumulation of material intended for any operation in this list
Disposal Description
D1 Deposit into or on land (e.g. landfill)
D2 Land treatment (e.g. biodegradation of liquid or sludgy discards in soils)
D3 Deep injection (e.g. injection of pumpable discards into wells, salt domes or naturally occurring repositories)
D4 Surface impoundment (e.g. placement of liquid or sludge discards into pits, ponds or lagoons)
D5 Specially engineered landfill (placement into lined discrete cells which are capped and isolated from one another and the environment)
D6 Release into water body except seas/oceans
D7 Release into seas/oceans including sea-bed insertion
D8 Biological treatment not specified elsewhere in this list which results in final compounds or mixtures which are discarded by means of any of the operations in this list
D9 Physico-chemical treatment not specified elsewhere in this list which results in final compounds or mixtures which are discarded by means of any of the operations in this list (e.g. evaporation, drying, calcination)
D10 Incineration on land
D11 Incineration at sea
D12 Permanent storage (e.g. emplacement of containers in a mine)
D13 Blending or mixing prior to submission to any of the operations in this list
D14 Repackaging prior to submission to any of the operations in this list
D15 Storage pending any of the operations numbered in this list

There is no D16 and no R14.

L1 exists in only one place. The XSD type LaboratoryCodeType knows exactly the value L1; it is permitted via the union RecoveryDisposalLaboratoryCodeType (= RecoveryDisposalCodeType + L1) exclusively in RecoveryDisposalLaboratoryFacilityType.RecoveryDisposalLaboratoryTypeCode. In all other R/D fields, L1 is invalid.

Usage:

Field Value set
SubmissionType.DisposalRecoveryOperations.RecoveryDisposalTypeCode (box 11) R1–R13, D1–D15
CertificateOfWasteReceiptType.RecoveryDisposalTypeCode R1–R13, D1–D15
Annex7TransportAnnouncementType.recoveryDisposalTypeCode R1–R13, D1–D15
QuantityArticle15Type.recoveryDisposalTypeCode (Article 15 certificate) R1–R13, D1–D15
RecoveryDisposalLaboratoryFacilityType.RecoveryDisposalLaboratoryTypeCode R1–R13, D1–D15, L1

In the SDK: RecoveryDisposalCode or RecoveryDisposalLaboratoryCode.

Packaging type (box 7)

XSD type PackageCodeType — values 1 to 10.

Code Meaning Code Meaning
1 Drum 6 Composite packaging
2 Wooden barrel 7 Pressure receptacle
3 Jerrican 8 Bulk
4 Box 9 Bale
5 Bag 10 Other

Used in SubmissionType.Packaging.PackageTypeCode (notification, type PackagingType) and in MovementPackagingType (transport announcement, base PackagingTypeBase, where PackageQuantity is additionally a mandatory field). Both structures carry PackageTypeCode as a mandatory field with maxOccurs="unbounded" and an optional PackageDescription (free text). The Boolean SpecialHandlingRequirementIndicator is mandatory in PackagingType and optional in PackagingTypeBase — that is the only difference between the two types.

For the risk of confusion with the classic list, see Notation pitfalls. In the SDK: PackageTypeCode.

Physical characteristics (box 13)

XSD type PhysicalCharacteristicCodeType — values 1 to 6.

Code Meaning
1 Powdery / powder
2 Solid
3 Viscous / paste
4 Sludgy
5 Liquid
6 Gaseous

The specification sheet names a 7, the schema does not know it

Physical characteristics codes (box 13).xlsx additionally lists 7 = Other (specify). PhysicalCharacteristicCodeType in codelists.xsd enumerates only 1–6. A 7 fails schema validation.

SubmissionType.PhysicalCharacteristicTypeCode is mandatory and maxOccurs="unbounded". The accompanying PhysicalCharacteristicDescription is optional in the schema — but the DIWASS validation list includes a code PHYSICAL_CHARACTERISTICS_DESCRIPTION_REQUIRED. The pattern “optional in the schema, still required by DIWASS” occurs in several places; don’t rely on minOccurs="0".

In the SDK: PhysicalCharacteristicCode.

Means of transport

XSD type MeansOfTransportCodeType — five letters.

Code Meaning
R Road
T Train / Rail
S Sea
A Air
W Inland waterways

Used in CarrierType.meansOfTransportCode (attribute) and TransportType.MeansOfTransportCode. Both are mandatory. In the SDK: MeansOfTransportCode.

Attachment classification (typeID)

XSD type BinaryAttachmentClassificationCodeType, attribute typeID on model:AttachmentBinaryObject, mandatory. 27 values.

typeID Label in the user interface
AuditReport Audit report
BrokerRegistration Broker / Dealer Registration
CarrierRegistration Carrier Registration
ContractNotifierProducer Contract (between waste producer and notifier)
StandardContract Contract (standard)
Decision Decision
DeclarationOfNotifier Declaration of notifier
InformationOnMeetingConditions Information on meeting conditions of Art. 11(1)(a) WSR
InformationOnIllegalActivities Information concerning illegal activities related to this file or operator
FacilityPermit Facility Permit
FinancialGuarantee Financial Guarantee
HandlingRequirements Handling Requirements
IntendedRoute Intended Route and Alternative Route
InterimFacilitiesInfo Interim treatment facilities – additional information
LiabilityInsurance Liability Insurance (notifier)
OtherAnnex Other Annex
PowerOfAttorney Power of attorney
PreConsent Pre-consent decision
TakebackInformation Take-back information
TechnologyEmployed Technology Employed
TreatmentCertificate Treatment certificate
TreatmentCertificateInfo Treatment certificate – additional information
TreatmentProcess Treatment Process
WasteAnalysis Waste Analysis
WasteComposition Waste Composition
WasteProductionProcess Waste Production Process
WasteTreatmentInformation Waste Treatment Information

The document Attachment types.docx lists two further user interface labels — Carrier Insurance and Financial Guarantee Calculation — without an API code; the “API code” column is empty there. Neither has a counterpart in BinaryAttachmentClassificationCodeType, and neither can be addressed via the API.

In the SDK: AttachmentTypeId.

mimeCode is not a controlled field

Besides typeID, AttachmentBinaryObject carries the mimeCode attribute — type Token64, i.e. a free string with a maximum of 64 characters, required, without enumeration and without pattern. There is no MIME allowlist, neither in the schema nor in ZEDAL. The image/png in the schema documentation is an example, not a restriction. The controlled list in the attachment context is typeID — that is the business classification, not a file format.

Further mandatory attributes: filename (NameType, max. 256 characters) and containsPersonalData (Boolean).

Facility type

Two different value sets that are easily confused.

XSD type Values Usage
FacilityTypeCode R (Recovery), D (Disposal) SubmissionType.DestinedForRecoveryDisposal, RecoveryDisposalFacilityType.facilityTypeCode, CertificateOfWasteReceiptType.FacilityTypeCode, CertificateOfCompletionType.FacilityTypeCode
Annex7FacilityTypeCode R (Recovery), L (Laboratory) RecoveryLaboratoryFacilityType.facilityLaboratoryTypeCode, Annex7CertificateOfWasteReceiptType.FacilityTypeCode, Annex7CertificateOfCompletionType.facilityTypeCode

In the notification world, D is permitted and L is not; in the Annex VII world, it is the other way around. In the SDK: FacilityTypeCode and Annex7FacilityTypeCode.

Authority domain

Field userCompetentAuthorityDomainID (type notification:AuthorityDomainBodyIdentifier).

Code Meaning
WSRDISP Competent authority of dispatch
WSRTRAN Competent authority of transit
WSRDEST Competent authority of destination

Mandatory in MovementTakeBackDocumentType and WasteAnnex7TakeBackType, optional in MovementSignalDocumentType and WasteAnnex7DocumentType. In the SDK: CompetentAuthorityDomain (WsrDispatch, WsrTransit, WsrDestination).

Related, but a different list: AuthorityDomainDocumentType.AccessRights with R / RW.

Identification schemes for parties

XSD type Values
PartyIdentificationSchemeIdentifierType VAT, NTR, GLN
TracesPartyIdentificationSchemeIdentifierType EORI
SiteIdentificationSchemeIdentifierType GLN

PartyIdentificationSchemeOrCountryIdentifierType is the union of both party types and CountryCodeType — so a numeric country code is also intended as a scheme identifier.

In the @type attribute of the operator search, the type is a free xs:token without restriction. In the specification samples, the values are consistently lowercase (eori, vat); in practice, only eori and vat have been confirmed so far. The SDK enum OperatorIdentifierType writes eori/vat/ntr/gln and reads back case-insensitively.

Country code

XSD type CountryCodeType: <xs:pattern value="\d\d\d"/> — ISO 3166-1 numeric, exactly three digits, leading zero mandatory. No enumeration; the valid values come from the ISO code list, the schema only checks the form.

Used in AddressType.CountryID, ConcernedCountryType.CountryID, Annex7ConcernedCountryType.countryID, OnBehalfCAType.CountryID and others.

A formally valid but unknown code is only rejected by the business logic — then with DISPATCH_COUNTRY_NOT_FOUND, TRANSIT_COUNTRY_NOT_FOUND, DESTINATION_COUNTRY_NOT_FOUND, COUNTRY_NOT_FOUND or CA_CODE_COUNTRY_NOT_FOUND, depending on where it occurs.

For the format difference compared with the directory lookup, see Notation pitfalls.

Other small value sets

XSD type Values Meaning
CountryRoleIDType E, I, T Role of the country: export/dispatch, import/destination, transit
RejectionIndicatorType A, R A = fully accepted, R = fully rejected
DecisionTypeEnum CONSENT, OBJECTED, WITHDRAWN Authority decision
MessageCategoryCodeType inform, request inform = for information only, request = response expected
StatementTypeCodeType RequestForNotificationInformation, PreConsentInformation Type of a statement message
PriorityCodeType 1, 2, 3 1 = Immediate, 2 = Urgent, 3 = Normal (UN/CEFACT code list 4037)
GenderCodeType 1, 2 ISO 5218: 1 = male, 2 = female
AuthorityStatusType VALID, DELETED Status of an authority in the directory
AuthorityActivityStatusType VALID, SUSPENDED, DELETED Status of an authority activity
OperatorActivityStatusBaseType NEW, VALID, SUSPENDED, DELETED Status of an operator activity
OperatorNameQueryMatchModeBaseType / AuthorityNameQueryMatchModeType PHRASE, FULL_TEXT Search mode in the directory, default PHRASE
OperatorAuthorityActivityQueryCodeBaseType ACTIVITY_CODE, UNLOCODE Type of code in the activity search, default ACTIVITY_CODE
OperatorSortingPredicateBaseType UPDATE, CREATE, NAME Sorting of the result list

SDK enums exist for DecisionType, PriorityCode and SignalStatementType. The value set of SignalStatementType: ProperlyCarriedOut, ProperlyCompleted, NotificationInvalid, NotificationRevalidated, NotificationCancelled, NotificationCompleted, NoPreConsentedFacilityTimeline, RejectPreConsentedFacility, MovementCancelled, Annex7Cancelled, NotificationWithdrawn.

Event codes

XSD type waste:ModificationEventCode, 52 values. Used in WasteEventType.code (event list of a document) and SyncNotificationEventType.code (detail of a sync event).

Notification

SUBMIT_NOTIFICATION              UPDATE_NOTIFICATION
NEW_ACKNOWLEDGE                  NEW_DECISION                 UPDATE_DECISION
NEW_REQUEST_INFORMATION          UPDATE_REQUEST_INFORMATION
NEW_REPLY_TO_REQUEST_INFORMATION
NEW_REQUEST_CHANGE               NEW_REPLY_TO_REQUEST_CHANGE
NEW_ARTICLE15                    UPDATE_ARTICLE15

Movement

ANNOUNCE_MOVEMENT                     UPDATE_MOVEMENT
NEW_MOVEMENT_CARRIER_TRANSPORT        UPDATE_MOVEMENT_CARRIER_TRANSPORT
NEW_MOVEMENT_CONSIGNEE_RECEIPT        UPDATE_MOVEMENT_CONSIGNEE_RECEIPT
NEW_MOVEMENT_FACILITY_RECEIPT         UPDATE_MOVEMENT_FACILITY_RECEIPT
NEW_MOVEMENT_FACILITY_COMPLETION      UPDATE_MOVEMENT_FACILITY_COMPLETION
NEW_MOVEMENT_TAKEBACK                 UPDATE_MOVEMENT_TAKEBACK

Signals

SIGNAL_PROPERLY_CARRIED_OUT           SIGNAL_PROPERLY_COMPLETED
SIGNAL_COMPLETE_NOTIFICATION          SIGNAL_CANCEL_NOTIFICATION
SIGNAL_NOTIFICATION_INVALID           SIGNAL_NOTIFICATION_REVALIDATED
SIGNAL_CANCEL_MOVEMENT
SIGNAL_REJECT_PRE_CONSENTED_FACILITY  SIGNAL_NO_PRE_CONSENTED_FACILITY_TIMELINE

Annex VII (prefix GLW_ for green-listed waste)

GLW_ANNOUNCE                GLW_UPDATE                  GLW_CANCEL
GLW_NEW_CARRIER_TRANSPORT   GLW_UPDATE_CARRIER_TRANSPORT
GLW_NEW_CONSIGNEE_RECEIPT   GLW_UPDATE_CONSIGNEE_RECEIPT
GLW_NEW_FACILITY_RECEIPT    GLW_UPDATE_FACILITY_RECEIPT
GLW_NEW_FACILITY_COMPLETION GLW_UPDATE_FACILITY_COMPLETION
GLW_NEW_CA_TAKE_BACK        GLW_UPDATE_CA_TAKE_BACK

Status changes, pre-consent, confidentiality

UPDATE_NOTIFICATION_STATUS  UPDATE_MOVEMENT_STATUS  UPDATE_GLW_STATUS
NEW_PRE_CONSENT_FACILITY    UPDATE_PRE_CONSENT_FACILITY
UPDATE_FACILITY_CONFIDENTIALITY

The sheet gets the status change for Annex VII wrong

Event codes for sync.xlsx lists UPDATE_ANNEX7_STATUS. In the schema, the value is called UPDATE_GLW_STATUS — matching the GLW_ prefix of the other Annex VII events. A match against the sheet value never finds a hit. All other 51 values match between sheet and schema.

For 19 events, the sheet additionally has a short code (NEWSUB, UPDSUB, NEWACK, NEWREQ, NEWDEC, …) before the long name. The code field contains only the long name — ModificationEventCode enumerates only these. One of the short codes is also misspelled in the sheet (NEWMOVEMENT_CONIGNEE_RECEIPT).

The six values from the block “Status changes, pre-consent, confidentiality” are annotated in the ZEDAL protos only on SyncNotificationEventType.code, not on WasteEventType.code — the other 46 are there. The XSD type is the same for both fields.

Error pattern by list

Trigger Error
Unknown code in a validated waste code list WASTE-CLASSIFICATION-INVALID-CODE / waste.error.classification.code
Outdated or misspelled listID the same message — the error does not distinguish between “wrong code” and “wrong list”
Waste code without group spaces the same message
HP code under h-code, or HP code with EU suffix the same message
WasteClassification missing entirely WASTE_CLASSIFICATION_REQUIRED / waste.notification.waste.classification.required
Value outside an XSD enumeration (packaging, physical characteristics, transport, R/D, typeID) SOAP fault, HTTP 500, cvc-… message from the schema validator
Country code not three digits SOAP fault, HTTP 500, cvc-pattern-valid … pattern '\d\d\d' for type 'CountryCodeType'
Country code formally valid, country unknown DISPATCH_COUNTRY_NOT_FOUND / TRANSIT_COUNTRY_NOT_FOUND / DESTINATION_COUNTRY_NOT_FOUND / COUNTRY_NOT_FOUND
Packaging codes missing PACKAGING_TYPE_CODES_REQUIRED
Physical characteristics missing PHYSICAL_CHARACTERISTICS_CODES_REQUIRED
Attachment without typeID ATTACHMENT_TYPE_EMPTY / waste.error.invalid.attachment.type

The complete error code reference is at Error codes.

The EU error code list is not exhaustive

Validations-messages.xlsx lists 188 codes, but does not fully cover the ones that actually occur — codes actually reported back, such as REJECTED-QUANTITY-EMPTY and REJECTION-DESCRIPTION-EMPTY, are not there in any notation. Treat unknown error codes at runtime as expected and log them instead of matching against a fixed list.

Known gaps

These points cannot be answered from the specification:

  • customs_codes: not a single valid example code is known. The detail sheet is empty, the four-digit HS heading is rejected.
  • Upper/lower case of the listID: whether DIWASS checks case-insensitively is not established.
  • LoW codes in a transition window: none of the 58 codes with [from …] / [until …] was measured against DIWASS.
  • Numeric listID for national lists: permitted according to the schema annotation (WasteClassificationSchemeOrCountryIdentifierType), not measured.
  • Code list verification on the Annex VII path: the 18-of-19 confirmation was carried out via a notification. The listID check runs on the server side, not in the schema — so the result does not automatically carry over to the Annex VII announcement.

Further reading