Unable to send Webhook POST to Azure instance, now am I able to get any readable data from REST API

I am unable to send Webhook POST to Azure instance, now am I able to get any readable data from REST API.

I am trying to get device statuses from within XProtect to an external server, managed by a third party who want the data, by polling the REST API.

I have also tried sending the data via Webhook and while I can use Postman to send a test message to the Azure instance, XProtect can’t send a test message - I’m not even sure if it’s leaving the application.

In the following snippet are the responses I am getting when sending the Webhook to the Azure instance vs. a webhook testing website “webhook.cool”:

# This is what we get when using Milestone Rules and Webhook to sent to webhook.cool as a test:
 
{
  "Event": {
    "EventHeader": {
      "ID": "f76d54b0-a200-4f86-9ed8-fa4225f1e375",
      "Timestamp": "2025-09-30T08:06:28Z",
      "Type": "Access Control System Event",
      "Version": "1.0",
      "Name": "DRC-01-01 (01.PLT.068 ICT Riser).Device Disconnection Detected",
      "Message": "Device Disconnection Detected",
      "Source": {
        "Name": "DRC-01-01 (01.PLT.068 ICT Riser)",
        "FQID": {
          "ServerId": {
            "Type": "AC",
            "Hostname": "Access Control",
            "Id": "a42b35d4-e2fc-48cc-a7f9-d9c06edede55",
            "Scheme": "http"
          },
          "ParentId": "f3b0a519-ce2f-4292-b637-97f93d441859",
          "ObjectId": "eb10a742-7d2b-5074-86b2-68fa791af11c",
          "FolderType": 0,
          "Kind": "f3b0a519-ce2f-4292-b637-97f93d441859"
        }
      },
      "MessageId": "366cfe1b-4512-530d-8c9f-9bb89f2f7a90"
    },
    "AccessControlSystemEventId": "7445d40d-96fc-4cae-a103-5a78b0f0b87b",
    "AccessControlSystemId": "a42b35d4-e2fc-48cc-a7f9-d9c06edede55",
    "AccessControlEventTypeId": "366cfe1b-4512-530d-8c9f-9bb89f2f7a90",
    "AccessControlEventSourceTypeId": "024f8710-4a56-5e04-81c7-93ce279b7238",
    "AccessControlEventSourceId": "eb10a742-7d2b-5074-86b2-68fa791af11c",
    "RelatedAccessControlCredentialHolderIds": [],
    "RelatedAccessControlElementIds": [],
    "EventCategories": [
      "d8ddac09-44df-56ae-8304-a3e66523af67",
      "b46e40ba-9696-5174-9462-f79844f99cb7",
      "465df5de-16af-5d6f-bdc8-76ccea799b3a"
    ],
    "RelatedSurveillanceItems": [],
    "Properties": [
      {
        "Key": "logUid",
        "Value": "0"
      }
    ],
    "Reason": ""
  },
  "Site": {
    "ServerHostname": "win-9f2rf2o88lj",
    "AbsoluteUri": "https://win-9f2rf2o88lj/",
    "ServerType": "XPCO"
  }
}
 
 
 
 
# This is what the third party are getting via subscribbing to the Milestone API:
 
{
    "events": [
        {
            "specversion": "1.0",
            "type": "366cfe1b-4512-530d-8c9f-9bb89f2f7a90",
            "source": "accessControlUnits/eb10a742-7d2b-5074-86b2-68fa791af11c",
            "id": "f76d54b0-a200-4f86-9ed8-fa4225f1e375",
            "time": "2025-09-30T08:06:28Z",
            "data": {
                "system": "a42b35d4-e2fc-48cc-a7f9-d9c06edede55",
                "id": "7445d40d-96fc-4cae-a103-5a78b0f0b87b",
                "eventType": "366cfe1b-4512-530d-8c9f-9bb89f2f7a90",
                "source": "eb10a742-7d2b-5074-86b2-68fa791af11c",
                "sourceType": "024f8710-4a56-5e04-81c7-93ce279b7238",
                "credentialHolders": [
                ],
                "elements": [
                ],
                "categories": [
                    "d8ddac09-44df-56ae-8304-a3e66523af67",
                    "b46e40ba-9696-5174-9462-f79844f99cb7",
                    "465df5de-16af-5d6f-bdc8-76ccea799b3a"
                ],
                "surveillanceItems": [
                ],
                "reason": "",
                "properties": {
                    "logUid": "0"
                }
            }
        }
    ]
}

Ideally I want the third party to get the most important data in the following snippet:

"Timestamp": "2025-09-30T08:06:28Z",
"Type": "Access Control System Event",
"Name": "DRC-01-01 (01.PLT.068 ICT Riser).Device Disconnection Detected",
"Source": {
        "Name": "DRC-01-01 (01.PLT.068 ICT Riser)",
}

The third party are using the following call after consulting the API documentation, in the following snippet:

1. request token/login via api
 
2. use token and send via websocket
{ "command": "authenticate", "commandId": 1, "token": "token_from_api" }
 
3. start session
{ "command": "startSession", "commandId": 2, "sessionId": "", "eventId": "" }
 
4. subscribe to all events
{ "command": "addSubscription", "commandId": 3, "filters": [{ "modifier": "include", "resourceTypes": ["*"], "sourceIds": ["*"], "eventTypes": ["*"] }] }

If anyone has any insight on this that would be greatly appreciated!

Hi,

Just to be sure I understand the issue properly, I have a couple of clarifying questions:

1. When you send a webhook from XProtect to webhook.cool, you receive a reply, but when you send it to the client’s Azure instance it does not get through? Is that correctly understood?

2. What version of XProtect are you integrating with?

3. When subscribing to events via the Websockets API, you do receive data, correct? It is just that you need data that isn’t available in the response? Or am I misunderstanding the issue?

Best Regards,

Simon

Hi Simon,

Thanks for weighing in on this.

  1. Yes, webhook.cool is able to show me rich event data sent from XProtect, but the Azure instance doesn’t receive anything. Going the webhook route is not the preferred way as I will have to configure a rule for each status event that the client wants to receive - this is where the REST API event status subscription is more of an attractive solution.
  2. We are running v2025 R2.
  3. When the client subscribes to status events via the REST API they receive a response when I take a camera offline for example, but the response is as shown above - they only get GUID strings and nothing that they can decipher on their end.

I appreciate any guidance you can offer!

Many thanks,

Lewis

Hi again Lewis,

I can see why it’s annoying that the data isn’t human readable as-is, I believe it was designed this way for efficiency (to not send huge amounts of data with each event). What you can do to get human readable information is to look up event types (as well as devices and whatever else you need) on the REST API, such as

.../API/Rest/v1/EventTypes

I would recommend doing this once on initialization, and then cache the result, and only look up further entities if you run into something that isn’t in your cache.

I hope this helps.

Best regards,

Simon

Hi Simon,

Thanks for the suggestion!

The only worry is that while we can cache event types, when using the Suprema BioStar2 MIP integration, the event type is always going to read:

"Type": "Access Control System Event",

The data we need is contained within the device “Name” it seems:

"Name": "DRC-01-01 (01.PLT.068 ICT Riser).Device Disconnection Detected",

The section of the “Name” in this example, reading “Device Disconnection Detected” would be almost impossible to cache as we would have to cache every single device name (or door) with every permutation of event for that device type.

Is there not a way to tell Milestone to send as plain text and forget about data efficiency? - maybe something hidden within a config file somewhere?

Many thanks,

Lewis