Webhooks
DSWMS sends webhook calls to client-configured URLs when specific WMS events happen.
Content-Type:
application/json
Security headers (included in every webhook):
| Header | Type | Required | Description |
|---|---|---|---|
| x-timestamp | string | Yes | UTC timestamp used to sign the payload |
| x-signature | string | Yes | Base64-encoded HMAC-SHA256 signature of payload + x-timestamp using client callback API key |
| x-wms-event-type | string | Yes | WMS event type |
| Authorization | string | No | Optional custom authorization header when configured for the webhook |
x-wms-event-type header values:
CUSTOMER_ORDER_STATUS_CHANGEPURCHASE_ORDER_STATUS_CHANGEPURCHASE_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:
- Read the raw JSON payload as a string.
- Concatenate
payload + x-timestamp. - Compute
HMAC_SHA256using callback API key as secret. - Base64-encode the result.
- 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
| Name | Type | Required | Description |
|---|---|---|---|
| external_id | string | Yes | Customer order external identifier |
| order_type | string | Yes | Always CUSTOMER_ORDER |
| status_id | integer | Yes | Status ID: 1 - CREATED, 2 - IN_PICKING, 3 - DELIVERED |
| status_title | string | Yes | Status 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
| Name | Type | Required | Description |
|---|---|---|---|
| external_id | string | Yes | Purchase order external identifier |
| order_type | string | Yes | Always PURCHASE_ORDER |
| status_id | integer | Yes | Status ID: 1 - CREATED, 2 - IN_RECEIVING, 3 - RECEIVED |
| status_title | string | Yes | Status 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
| Name | Type | Required | Description |
|---|---|---|---|
| purchase_order_id | string | Yes | Purchase order external identifier |
| receive_document_id | string | Yes | Receive document identifier |
| receive_date | string | Yes | Receive completion date-time (ISO-8601) |
| details | array | Yes | Array of receive detail lines |
Detail object (inside details array):
| Name | Type | Required | Description |
|---|---|---|---|
| purchase_order_line_number | integer | Yes | Purchase order line number |
| source_purchase_order_line_number | integer | No | Source line number when available |
| article_id | string | Yes | Article external identifier |
| quantity | number | Yes | Received quantity |
| quantity_unit_id | string | Yes | Quantity unit identifier |
| shelf_life | string | No | Shelf-life date (YYYY-MM-DD) |
| excise | object | No | Excise information |
| local_excise | string | No | Local excise value |
| country_of_origin | string | No | Country of origin |
Excise object (inside excise):
| Name | Type | Required | Description |
|---|---|---|---|
| serial | string | No | Excise serial |
| range_from | integer | No | Excise range start |
| range_to | integer | No | Excise 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"
}
]
}