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

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"
}
]
}