Skip to main content

Webhooks

DSWMS sends webhook calls to client-configured URLs when specific WMS events happen.

Content-Type:

application/json

Security headers (included in every webhook):

HeaderTypeRequiredDescription
x-timestampstringYesUTC timestamp used to sign the payload
x-signaturestringYesBase64-encoded HMAC-SHA256 signature of payload + x-timestamp using client callback API key
x-wms-event-typestringYesWMS event type
AuthorizationstringNoOptional custom authorization header when configured for the webhook

x-wms-event-type header values:

  • CUSTOMER_ORDER_STATUS_CHANGE
  • PURCHASE_ORDER_STATUS_CHANGE
  • PURCHASE_ORDER_RECEIVE_FINISHED

The x-wms-event-type header uses the WMS event type enum name. The per-event sections below also show the internal Pub/Sub event type that triggers each webhook.

Signature verification:

  1. Read the raw JSON payload as a string.
  2. Concatenate payload + x-timestamp.
  3. Compute HMAC_SHA256 using callback API key as secret.
  4. Base64-encode the result.
  5. Compare with x-signature.

x-wms-event-type is not included in the signature input.


Customer Order Status Change​

Pub/Sub event type: wms.customer_order.events.status_change

Frequency:

Near real-time on customer order status updates.

Payload Fields​

NameTypeRequiredDescription
external_idstringYesCustomer order external identifier
order_typestringYesAlways CUSTOMER_ORDER
status_idintegerYesStatus ID: 1 - CREATED, 2 - IN_PICKING, 3 - DELIVERED
status_titlestringYesStatus name: CREATED, IN_PICKING, DELIVERED

Payload Example​

{
"external_id": "3000437294",
"order_type": "CUSTOMER_ORDER",
"status_id": 2,
"status_title": "IN_PICKING"
}

Purchase Order Status Change​

Pub/Sub event type: wms.purchase_order.events.status_change

Frequency:

Near real-time on purchase order status updates.

Payload Fields​

NameTypeRequiredDescription
external_idstringYesPurchase order external identifier
order_typestringYesAlways PURCHASE_ORDER
status_idintegerYesStatus ID: 1 - CREATED, 2 - IN_RECEIVING, 3 - RECEIVED
status_titlestringYesStatus name: CREATED, IN_RECEIVING, RECEIVED

Payload Example​

{
"external_id": "4500013377",
"order_type": "PURCHASE_ORDER",
"status_id": 3,
"status_title": "RECEIVED"
}

Purchase Order Receive Finished​

Pub/Sub event type: wms.purchase_order.events.receive_finished

Frequency:

On receive completion.

Payload Fields​

NameTypeRequiredDescription
purchase_order_idstringYesPurchase order external identifier
receive_document_idstringYesReceive document identifier
receive_datestringYesReceive completion date-time (ISO-8601)
detailsarrayYesArray of receive detail lines

The details array follows the same rules as the Purchase Order Receives interface, including split lines, empties and country of origin.

Detail object (inside details array):

NameTypeRequiredDescription
purchase_order_line_numberintegerYesPurchase order line number
source_purchase_order_line_numberintegerNoSource line number when available
article_idstringYesArticle external identifier
quantitynumberYesReceived quantity
quantity_unit_idstringYesQuantity unit identifier
shelf_lifestringNoShelf-life date (YYYY-MM-DD)
exciseobjectNoExcise information
local_excisestringNoLocal excise value
country_of_originstringNoCountry of origin

Excise object (inside excise):

NameTypeRequiredDescription
serialstringNoExcise serial
range_fromintegerNoExcise range start
range_tointegerNoExcise range end

Payload Example​

{
"purchase_order_id": "4500013377",
"receive_document_id": "1000042",
"receive_date": "2026-02-17T09:45:10Z",
"details": [
{
"purchase_order_line_number": 100,
"source_purchase_order_line_number": 100,
"article_id": "0001",
"quantity": 72,
"quantity_unit_id": "GAB",
"shelf_life": "2026-06-30",
"excise": {
"serial": "EXC-777",
"range_from": 1,
"range_to": 72
},
"local_excise": "LV-EXC-123",
"country_of_origin": "LV"
}
]
}