AI translation
This page was translated from German with AI. If in doubt, the German original applies.
Competent authority side (Authority)¶
This page describes the operations that a competent authority (CA) triggers on a notification or a movement: acknowledgment of receipt, request for additional information, precondition signals, decision, reply to a request for change, take-back order.
For most readers this is not a use case of its own
If you connect a company system, you build the company side — Notification (Company) and Movement (Company). The authority role requires an account that has a CA assigned to it; a company account cannot take on this role.
Still, this page is required reading when you build the company side: almost every state change of your notification is triggered by the authority side. You need to know which operations come from there, in which order they arrive, which of them are irreversible and which of them take away your write access to your own document. The section What reaches you summarizes exactly that.
Prerequisites for the authority role:
- An account that has an authority assigned to it.
- Vocabulary from Roles and Lifecycle — in particular the two-step sending procedure.
With the .NET SDK
The code for this guide is shown in Authority side with the SDK.
The authority API surface at a glance¶
The authority operations live on a separate API (AuthorityDocumentApi), apart from the company API. It has nine operations:
| Operation | Level | Payload | SDK method |
|---|---|---|---|
SubmitAcknowledgement |
Notification | AcknowledgementDocumentType |
AuthorityNotificationDocumentHandler.SubmitAcknowledgement |
SetRequestInformation |
Notification | RequestInformationDocumentType |
AuthorityNotificationDocumentHandler.SetRequestInformation |
SetDecision |
Notification | DecisionDocumentType |
AuthorityNotificationDocumentHandler.SetDecision |
ReplyToRequestForChangeAfterConsent |
Notification | ReplyToRequestForChangeAfterConsentDocumentType |
AuthorityNotificationDocumentHandler.ReplyToRequestForChangeAfterConsent |
SubmitNotificationSignal |
Notification | NotificationSignalDocumentType |
AuthorityNotificationDocumentHandler.SubmitNotificationSignal |
SetMovementTakeBack |
Movement | MovementTakeBackDocumentType |
AuthorityMovementDocumentHandler.SetMovementTakeBack |
SubmitMovementSignal |
Movement | MovementSignalDocumentType |
AuthorityMovementDocumentHandler.SubmitMovementSignal |
SetByIntent |
Notification, Annex VII | Retrieval document + DiwassIntents |
client.BxaApi.AuthorityDocumentApi.SetByIntent |
GetDocument |
all | — | not via the handlers; reading goes through Refresh() |
SetByIntent is a generic alternative for form-based user interfaces: instead of a typed operation, you send the complete retrieval document plus the intent, and the server extracts the matching section. Functionally equivalent to the typed operations. Movement documents are explicitly excluded — for them, only the typed path works.
Notification: the operations in detail¶
Acknowledgment of receipt (SubmitAcknowledgement)¶
The acknowledgment of receipt starts the time limit for the decision. For authorities that work directly in the EU central system, DIWASS generates it itself; via the API it is needed only when an authority acts on behalf of another authority.
| Precondition | Notification in status Submitted; no acknowledgment exists yet for the authority concerned |
| Required fields | UserCompetentAuthorityDomainId, NotificationId, Acknowledgement (with ReceiptDate and SentDate) |
| Effect | Receipt acknowledged. Not consent — the notifier may not ship yet |
Request for additional information (SetRequestInformation)¶
Only authorities can request additional information; only the notifier can reply. The window of an open request for additional information is the only opportunity to change anything in a submitted notification — see The change window.
| Precondition | Notification in status Submitted; the previous request for additional information from the same authority has been answered |
| Limit | At most three requests for additional information per authority and notification |
| Updatable | Yes, any number of times — as long as the request is unanswered and comes from the same authority |
| Required fields | Statement (with NotificationId, text and signature). AdditionalDaysToReply is optional |
| Effect | Time limit for the decision suspended; the notification becomes editable again for the notifier |
After ProperlyCarriedOut, the authority of dispatch may no longer request additional information
The order is a one-way street: as soon as the competent authority of dispatch has set its precondition signal, its right to request additional information is used up. The authorities of destination and transit can still request additional information afterward.
Precondition signals: ProperlyCarriedOut and ProperlyCompleted¶
Before the decision, the authorities establish that the notification is in order from their point of view. Both signals go through the same method SubmitNotificationSignal, distinguished solely by Statement.Signal.TypeCode.
The order is strict and has consequences for the company side:
- After submission, only the authority of dispatch can act on the document. All other authorities concerned can see it but cannot set anything.
- The authority of dispatch requests additional information if needed and then sets
ProperlyCarriedOutonce. - Only then can the authorities of destination and transit request additional information and each set
ProperlyCompletedonce. - When the last of them has set
ProperlyCompleted, the status changes — and only then are decisions permitted.
| Signal | Who | How often | Precondition |
|---|---|---|---|
ProperlyCarriedOut |
Authority of dispatch (WSRDISP) |
exactly once | Status Submitted |
ProperlyCompleted |
Authority of destination (WSRDEST), additionally the authorities of transit (WSRTRAN) |
once per authority | ProperlyCarriedOut is present |
Signals are irreversible
A signal that has been sent can neither be retracted nor changed in its parameters. This distinguishes signals from the decision, which is updatable. Put a confirmation prompt before sending in your user interface — there is no correction afterward.
A special case that a status display must account for: for authorities of transit, the implementing act allows a tacit ProperlyCompleted if the authority has not requested additional information within the time limit and the authority of destination has marked the notification as properly completed. The status can therefore move on without a signal you would have seen.
Decision (SetDecision)¶
| Precondition | All precondition signals are present (status Satisfied) |
| How often | One decision per authority. Each authority may update only its own, any number of times |
| Required fields | UserCompetentAuthorityDomainId, NotificationDocumentId, Decision (with DecisionDate, DecisionType_, DecisionJustification) |
| Initial decision | only CONSENT or OBJECTED. WITHDRAWN is allowed as an initial decision only for an authority of transit, and only if the notification has already been consented to and this authority has not yet decided |
| Update | all three types: CONSENT, OBJECTED, WITHDRAWN |
Additional information per type: via Decision.SpecificConditions, CONSENT can limit the consent to a smaller mass (ConsentValidMass), a smaller volume (ConsentValidVolume) or a lower number of shipments (ConsentValidShipmentCount), plus ValidFromDate/ValidToDate. OBJECTED carries the reasons in Decision.ObjectionDescription. A justification in DecisionJustification is always required, regardless of the type.
A capped consent is a consent with different numbers
If you ignore the SpecificConditions when reading, you plan shipments against the originally requested quantity instead of the approved one — and run into a rejection of the movement. On the intended number of shipments, see Field rules.
→ Implementation with the .NET SDK
DecisionType_ — the underscore is not a typo
The field DecisionType lives in the message DecisionType. In this case, the Protobuf generator appends an underscore to resolve the name collision. In C#, the field is therefore called DecisionType_.
For the same reason, the proto messages DecisionType and SignalStatementType collide with the SDK helper enums of the same name. In the example above, DiwassDecisionType and CompetentAuthorityDomain stand for aliases of Zedal.Sdk.Apis.Diwass.Enums.*; ToWire() comes from DiwassEnumExtensions, the short constructors Sf/DateUtc from Zedal.Sdk.Protobuf.ProtoFields.
What determines the status of the notification¶
The status is not the result of a single operation; it is recalculated from all decisions submitted — after every change.
| Transition | Trigger |
|---|---|
Submitted → Satisfied |
Authority of dispatch has set ProperlyCarriedOut, authorities of destination and transit have set ProperlyCompleted |
Satisfied → Consent |
all authorities concerned have decided, and all of them with CONSENT (tacit consent included) |
Satisfied → Objected |
the first decision of type OBJECTED is present |
Consent → Objected |
an authority changes its consent to OBJECTED |
Objected → Consent |
all OBJECTED decisions have been changed to CONSENT and all authorities have decided |
Objected → Satisfied |
all OBJECTED decisions have been changed to CONSENT, but decisions are still missing |
Consent → Withdrawn |
an authority withdraws its consent |
Withdrawn → Consent |
all withdrawn decisions are consents again |
Submitted → Invalid |
an authority sets NotificationInvalid |
Invalid → Submitted |
the same authority sets NotificationRevalidated |
Submitted/Consent/Objected → Cancelled |
the notifier cancels |
Where these status names actually appear
There is no status field in the mutations data model. In the retrieval view, however, there is: NotificationInformationType.notificationStatus is mandatory there and restricted in the schema to DRAFT, SUBMITTED, SATISFIED, CONSENT, INVALID, WITHDRAWN, OBJECTED, CANCELLED. Its counterpart on the movement is GetMovementTemplateType.movementStatus with DRAFT, ANNOUNCED, SUBMITTED, MOVING, RECEIVED, ACCEPTED, REJECTED, COMPLETED, CANCELLED, TAKE_BACK.
Both are strings with a schema-defined value set, not a C# enum. And they tell you where the process stands, not what you may do next. That is in handler.FollowupIntents — see Determining the state.
Authorities of transit do not have to decide
The consent of an authority of transit can occur tacitly: if 30 days have passed since Satisfied was reached and the authorities of dispatch and destination have consented, the notification changes to Consent, even if one or more authorities of transit have not submitted anything. This applies only if the authorities of transit concerned represent EU or EEA states.
For your application, this means: “consented” is not the same as “saw a consent decision from every authority”. If you derive consent from the presence of N decisions, you block shipments that would be permitted.
Reply to a request for change (ReplyToRequestForChangeAfterConsent)¶
After consent has been given, the notifier can request changes (Article 17). Every authority concerned replies to such a request.
| Precondition | Notification consented; a request for change is present |
| How often | Each authority replies to the same request exactly once. The reply is not changeable |
| Required fields | UserCompetentAuthorityDomainId, RequestForChangeAfterConsentId, AgreementChangeRouteRequest, Signature |
| Effect | The requested change takes effect only when all affected authorities have agreed |
Before sending, the SDK checks that RequestForChangeAfterConsentId is set and points to a known request; otherwise it throws ArgumentException or InvalidOperationException without sending.
UnansweredRequestForChangeAfterConsent is not a to-do list for all authorities
The property handler.UnansweredRequestForChangeAfterConsent lists requests for change to which no reply is linked yet. A request, however, expects several replies — typically from the authorities of dispatch and destination. As soon as the first authority has replied, the request drops out of this list, although the second may and must still reply.
Use the list as an indicator for “nothing has happened here at all”, not as a check whether it is still your authority’s turn.
Signals at notification level¶
All signals go through SubmitNotificationSignal. They are distinguished by Statement.Signal.TypeCode; the permitted values are available in the SDK as Zedal.Sdk.Apis.Diwass.Enums.SignalStatementType.
TypeCode |
Who | When permitted | Effect |
|---|---|---|---|
ProperlyCarriedOut |
Authority of dispatch | Status Submitted, once |
Precondition for the decisions |
ProperlyCompleted |
Authorities of destination and transit | after ProperlyCarriedOut, once each |
with the last signal, the status changes to Satisfied |
NotificationInvalid |
any authority concerned | Status Submitted |
Status Invalid; the document is read-only for everyone — except for the authority that invalidated it |
NotificationRevalidated |
the same authority that invalidated it | Status Invalid |
back to Submitted. Precondition signals that were already set are retained |
RejectPreConsentedFacility |
any authority concerned | Status Submitted, the notification was designed for pre-consented facilities |
the pre-consent indicator is set to false; afterward the operation is no longer available |
NoPreConsentedFacilityTimeline |
any authority concerned | as above | the time limit logic falls back to the normal procedure instead of the pre-consent procedure (Article 14(16)) |
NotificationCancelled |
the notifier, not the authority | Status Submitted, Consent or Objected |
Status Cancelled, permanently read-only, no way back |
NotificationWithdrawn |
the notifier | not specified | Withdrawal of the notification. The wire value was added in April 2026 — older generated stubs do not know it |
NotificationCompleted |
Authority | not specified | Completion of the notification (Article 27(1)) |
MovementCancelled, Annex7Cancelled |
see Movement | — | belong to the movement or Annex VII document, not to the notification |
The signal record always has the same structure: number of the affected document, TypeCode, optional free text (Statement.Description — required for some types), signature of the acting person, optional attachments.
Two operations in the signal enum belong to the notifier
NotificationCancelled and NotificationWithdrawn can be reached through the same SDK method but, according to the specification, are permitted only for the notifier. They are therefore also available on the company handler NotificationDocumentHandler.SubmitNotificationSignal — there without UserCompetentAuthorityDomainId, because the notifier is not an authority. If you build the company side, you will find this under Notification (Company).
Movement: the authority interventions¶
At movement level there is exactly one authority operation: the take-back order.
Take-back (SetMovementTakeBack)¶
| Who | any authority concerned — not only dispatch or destination |
| When | Movement in status Announced, Moving or Received |
| How often | one take-back per movement. The authority that submitted it may update it any number of times |
| Required fields | UserCompetentAuthorityDomainId, MovementIdentifier, MovementTakeBack (with Quantity, Reasons, TakeBackDate), CompetentAuthoritySignature |
| Effect | Status changes to Take back. The lifecycle ends there — no reception, no completion anymore |
SetMovementTakeBack also exists on the company handler — the order nevertheless remains an authority matter
The method exists both on AuthorityMovementDocumentHandler and on MovementDocumentHandler, and the SDK’s permission matrix allows the take-back intents (CreateMovementTakeBack, UpdateMovementTakeBack) for the role Notifier. According to the DIWASS specification, however, the take-back is an operation of the authorities concerned.
This shows in the payload: UserCompetentAuthorityDomainId is a required field in MovementTakeBackDocumentType, and so is CompetentAuthoritySignature. Without an authority context, the record cannot be filled. Do not rely on the permission matrix here; rely on handler.FollowupIntents — that is the server’s view.
SubmitMovementSignal is the notifier’s cancellation¶
The signal enum has exactly one value at movement level: MovementCancelled. According to the specification, only the notifier may set it, and only as long as the movement is not yet underway:
| Who | the notifier |
| When | Status Draft or Announced — no longer after Moving |
| Effect | Status Cancelled |
The method is available on both handlers. For the authority side, it is only relevant when an authority submits the signal on behalf of the notifier; UserCompetentAuthorityDomainId is therefore optional in MovementSignalDocumentType.
How an authority is identified¶
In DIWASS, authorities are not an operator party. They have no OperatorInternalId, do not appear in any of the party slots of the submission and therefore cannot be derived from a document either. For the SDK’s role inference, this means: Role.Authority must be passed explicitly.
An authority is identified on three different levels — telling them apart is the number one source of errors:
| Level | Field | Values |
|---|---|---|
| Role in the procedure | UserCompetentAuthorityDomainId on every authority document |
WSRDISP (dispatch), WSRTRAN (transit), WSRDEST (destination) — SDK: CompetentAuthorityDomain |
| Organization | CompetentAuthorityType with PartyUuid and CompetentAuthorityId |
business authority code, e.g. DE014 |
| Location in the process | CompetentAuthority within ExportState, ImportState and each TransitState of the submission |
exactly one authority per country concerned |
The third row is the reason why an authority without its own party slot can still be “concerned”: it is attached to the country, not to the list of parties. If you want to determine the authorities concerned for a notification, read them from the export, import and transit states.
The domain codes do not belong in the authority directory
WSRDISP/WSRTRAN/WSRDEST are values of the notification model. The authority directory has a different role field with its own code list. Value tables: Code lists → Authority domain.
You can search for authorities via the directory.
→ Implementation with the .NET SDK
The directory does not tell you who may act as an authority of transit
ListAuthorities and FindActivities return the WSR authorities of a country, but not which notification domain an authority covers. Which authority is permitted as an authority of transit is something you have to know from the business domain. AUTHORITY-ID-NOT-FOUND is therefore a statement about competence, not about existence — details under Field rules → Competence of the authority of transit.
Also note: in the document, the country code is three-digit numeric (056), whereas the directory lookup uses alpha-2 (BE). A numeric code returns zero hits there without an error message. See Code lists.
Acting “on behalf of” (OnBehalfOfCA)¶
Not every authority is connected to DIWASS, and not every party works in the EU system. For these cases, almost every authority document carries an optional OnBehalfOfCa (OnBehalfCAType):
| Field | Required | Content |
|---|---|---|
CompetentAuthorityId |
yes | Authority on whose behalf the action is taken |
CompetentAuthorityDomainId |
yes | WSRDISP, WSRTRAN or WSRDEST |
CountryId |
no | Country of the represented authority |
Available on AcknowledgementDocumentType, DecisionDocumentType, RequestInformationDocumentType, ReplyToRequestForChangeAfterConsentDocumentType, NotificationSignalDocumentType and MovementSignalDocumentType — not on MovementTakeBackDocumentType.
UserCompetentAuthorityDomainId remains the role of the acting authority; OnBehalfOfCa names the represented one. The more general type OnBehalfOfType additionally covers the representation of a country or an operator and allows exactly one of the three branches.
What reaches you¶
The value of this page for a company integration lies in this table: which authority operation changes what in your document.
| Authority operation | What you see | What changes for you |
|---|---|---|
| Acknowledgment of receipt | new version with an entry in acknowledgement |
nothing — an acknowledgment is not consent |
| Request for additional information | entry in requestInformation, new follow-up intents |
It is your turn. And: the notification is editable again |
ProperlyCarriedOut / ProperlyCompleted |
entry in signals, changed follow-up intents |
Once all are set and no request for additional information is open, the change window is closed |
| Decision | entry in decisions per authority |
Only when all are present (or apply tacitly) may you create movements. Observe SpecificConditions |
| Reply to a request for change | entry in replyRequestForChangeAfterConsent per authority |
The change takes effect only when all have agreed |
NotificationInvalid |
notificationStatus = INVALID |
Your notification is read-only until the same authority revalidates it |
| Take-back order | takeBack set on the movement |
The movement has ended. No reception, no completion anymore |
Two points that are regularly underestimated:
Changes made by others take time — and the inbox import
Between an authority’s push to DIWASS and its appearance in the ZEDAL data store, 100 to 150 seconds have been measured. Until then, reloading returns the original document without the authority block. The inbox import is the delivery path here, not mere cleanup — without it, the new version does not appear. See Calls and synchronization.
Do not derive the state from list lengths
Neither “as many decisions as authorities concerned” nor “requestInformation longer than replyRequestInformation” yields a reliable state: consents can occur tacitly, and replies to requests for additional information end up in the same list as the requests themselves. Evaluate handler.FollowupIntents — that list comes from the server. See Determining the state.
What’s next¶
- Lifecycle — complete stage order and the sending procedure
- Roles — permission matrix, role inference, distinction from the Nachweisverordnung (NachwV), the German ordinance on waste records
- Notification (Company) and Movement (Company) — the other side of the same data flow
- Error codes — what a rejection due to the wrong order means
- Calls and synchronization — required reading before going live