Contents
Webhooks push real-time event notifications to your server when things happen in Inventory Pro — items received, orders created, stock levels changed. Instead of polling the API, register a URL and the system POSTs events to it.
| Method | Path | Description |
|---|---|---|
| GET | /Webhook | List your subscriptions |
| GET | /Webhook/{id} | Get a subscription |
| POST | /Webhook | Create a subscription |
| PUT | /Webhook/{id} | Update a subscription |
| DELETE | /Webhook/{id} | Delete a subscription |
| POST | /Webhook/{id}/test | Send a test event |
| GET | /Webhook/{id}/log | View delivery history |
All webhook endpoints require the Webhook Administration permission (SecurityID 370).
Each subscription belongs to the API client that created it. You can only see and manage your own subscriptions.
{
"value": [
{
"rec": 5,
"name": "ERP Sync",
"url": "https://erp.example.com/webhooks/inventory",
"events": "inventory.received,inventory.issued",
"payloadMode": 1,
"active": true,
"disableType": 0,
"failureCount": 0,
"failureDays": 0,
"lastSuccess": "2025-06-01T14:30:00Z",
"lastFailure": null,
"lastError": null,
"created": "2025-01-10T09:00:00Z",
"modified": "2025-06-01T14:30:00Z"
}
],
"totalCount": 3,
"page": 1,
"pageSize": 25,
"pageCount": 1,
"hasMore": false
}| Field | Type | Description |
|---|---|---|
rec | integer | Subscription ID |
name | string | Friendly name for this subscription |
url | string | Your endpoint URL (must be HTTPS) |
events | string | Comma-separated list of event types to subscribe to |
payloadMode | integer | 1 = full payload, 2 = ID-only (you fetch details separately) |
active | boolean | Whether the subscription is currently delivering |
disableType | integer | 0 = active, 1 = disabled by failures, 2 = disabled manually |
failureCount | integer | Consecutive delivery failures |
failureDays | integer | Days since last successful delivery |
lastSuccess | datetime | Last successful delivery timestamp |
lastFailure | datetime | Last failed delivery timestamp |
lastError | string | Error message from last failure |
created | datetime | When the subscription was created |
modified | datetime | Last modification timestamp |
POST /Webhook{
"name": "ERP Sync",
"url": "https://erp.example.com/webhooks/inventory",
"events": "inventory.received,inventory.issued,item.created",
"payloadMode": 1,
"active": true,
"headers": {
"X-Custom-Header": "my-value"
}
}| Field | Type | Description |
|---|---|---|
name | string | Display name for the subscription |
url | string | HTTPS endpoint to receive events |
events | string | Comma-separated event types |
payloadMode | integer | 1 (full) or 2 (ID-only) |
active | boolean | Start delivering immediately |
| Field | Type | Description |
|---|---|---|
secret | string | Signing secret (auto-generated if omitted) |
headers | object | Custom headers to include in deliveries |
{
"rec": 5,
"secret": "whsec_a1b2c3d4e5f6..."
}The signing secret is returned only on creation. Store it securely — you’ll need it to verify webhook signatures.
PUT /Webhook/5Same body format as create. Include all fields you want set — the entire subscription is replaced (except the secret, which is only updated if you provide a new value).
Returns 200 on success, 404 if the subscription doesn’t exist or isn’t yours.
DELETE /Webhook/5Permanently removes the subscription and its delivery history.
Returns 200 on success, 404 if not found.
POST /Webhook/5/testSends a test event to your endpoint. The subscription must be active.
{
"success": true,
"statusCode": 200,
"duration": 342.5,
"errorMessage": null,
"payload": "{\"event\":\"test\",\"data\":{...}}"
}| Field | Type | Description |
|---|---|---|
success | boolean | Whether your endpoint returned 2xx |
statusCode | integer | HTTP status code from your endpoint |
duration | float | Round-trip time in milliseconds |
errorMessage | string | Error details if delivery failed |
payload | string | The JSON payload that was sent |
GET /Webhook/5/log?page=1&pageSize=25View the delivery history for a subscription.
{
"value": [
{
"rec": 1042,
"event": "inventory.received",
"reference": "RecNo:15234",
"statusCode": 200,
"success": true,
"attempt": 1,
"duration": 285.3,
"errorMessage": null,
"payloadSize": 1842,
"created": "2025-06-01T14:30:00Z"
}
],
"totalCount": 156,
"page": 1,
"pageSize": 25,
"pageCount": 7,
"hasMore": true
}Every webhook delivery includes an HMAC-SHA256 signature in the X-Webhook-Signature header, computed from the raw request body using your subscription’s signing secret.
using System.Security.Cryptography;
using System.Text;
public bool VerifySignature(string body, string signature, string secret)
{
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
{
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(body));
var expected = "sha256=" + BitConverter.ToString(hash)
.Replace("-", "").ToLowerInvariant();
return signature == expected;
}
}function Test-WebhookSignature {
param([string]$Body, [string]$Signature, [string]$Secret)
$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($Secret)
$hash = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($Body))
$expected = "sha256=" + [BitConverter]::ToString($hash).Replace("-","").ToLower()
return $Signature -eq $expected
}Always verify signatures before processing webhook payloads to ensure the request came from Inventory Pro.
Failed deliveries (non-2xx response or timeout) are retried with exponential backoff. After repeated failures, the subscription is automatically disabled (disableType = 1). Re-enable it by updating the subscription with active: true after fixing your endpoint.
Events follow the pattern resource.action. Subscribe to specific events.
Available events vary by deployment. Common events:
| Event | Trigger |
|---|---|
inventory.received | Stock received into warehouse |
inventory.issued | Stock issued out |
inventory.moved | Stock relocated between bins or warehouses |
item.created | New item added to catalog |
item.updated | Item record modified |
order.created | Purchase or shipping order created |
order.completed | Order finalized |
Your instance’s Swagger documentation lists the full set of events available for subscription.
All webhook operations require the Webhook Administration permission (SecurityID 370).
On this page