This feature is available through Early Access. Enable on the Administration > Early Access Features page to access it.
General webhook contract
The webhook contract defines how BloodHound Enterprise sends, signs, and retries alert events. The event-specific contract below defines the trigger and the contents of the event payload.Receive the request
BloodHound Enterprise sends a JSON request with the following headers:
Return a 2xx response after your receiver accepts the event. BloodHound Enterprise treats every other HTTP status, including redirects, as a failed delivery.
Event envelope
The envelope stays stable across event versions. Theversion field identifies the shape of the data object.
The following example shows the common envelope. The event_type, version, and data values depend on the event-specific contract:
UUID
required
Stable alert event identifier. It matches
X-Bloodhound-Event-ID and is used to deduplicate deliveries.string
required
Alert event type identifier. Use it to route the event.
integer
required
Payload data version. The event-specific contract defines the shape of the
data object for each version.RFC 3339 timestamp
required
Time BloodHound Enterprise created the alert event.
string
required
Human-readable summary.
object
required
Event-specific details.
Verify the signature
BloodHound Enterprise signs the exact raw request body with your alert webhook’s HMAC secret. The signature header uses the following format:Delivery behavior
BloodHound Enterprise treats a delivery as failed when the request times out, encounters a transport or TLS error, or returns a non-2xx response. Failed deliveries are retried according to the table and dead-lettered after the final failed attempt. Use the Event History page or the retry attempt API to requeue a failed delivery. A manual requeue gives it one additional send attempt.
Retries and manual requeues can deliver the same event more than once. Use
event_id to deduplicate events and make processing idempotent. Retries retain the event ID and payload timestamp but receive a new signature timestamp.
Delivery order is not guaranteed. Initial deliveries and retries run independently, so events can arrive out of order. Use the event timestamp for context, not the arrival time.
BloodHound Enterprise does not enforce a replay-timestamp tolerance. The examples reject signatures whose t value differs from the receiver’s clock by more than five minutes. Set and enforce an appropriate window in your receiver.
Return a 2xx response only after your receiver has accepted the event for processing. If your receiver cannot accept the event, return a non-2xx response so BloodHound Enterprise can record the failure and retry it when eligible.
Collector Offline event contract
BloodHound Enterprise evaluates collector status about every seven minutes. It suppresses another alert event for the same collector for seven days and does not issue a recovery event.
Payload version 1
The following example shows the general event envelope with the Collector Offlinedata object:
data object. Every property is always present, non-null, and never omitted.
An empty string or zero timestamp can appear when the corresponding database column has no value. These rules describe events generated by the current collector-offline producer.
UUID string
required
Stable collector identifier.
string
required
Collector name.
string
required
Collector host name.
string
required
Collector IP address.
string
required
Declared collector type:
azurehound, sharphound, or openhound.string
required
Collector software version.
RFC 3339 timestamp string
required
Collector’s last check-in time in RFC 3339 UTC format.
RFC 3339 timestamp string
required
Time the collector record was created.
RFC 3339 timestamp string
required
Time the collector record was last updated.
string
required
Declared collector authentication type:
bloodhound or windows.string
required
Collector issuer address.
string
required
Collector issuer address override. An empty string may indicate that no override is configured.