When a Security Delivery Agent finishes investigating an incident, ContraForce can send a signed webhook to an endpoint you control. Use it to escalate true-positive incidents into your SIEM, ticketing, or on-call tooling at the moment the agent reaches a verdict.Documentation Index
Fetch the complete documentation index at: https://docs.contraforce.com/llms.txt
Use this file to discover all available pages before exploring further.
This event is configured per classification on an Agent Configuration card, not as a broadcast subscription. It is delivered only to the webhook a classification card points to. Set it up under Configuring Security Delivery Agents by enabling Advanced mode and choosing a webhook as the custom action for a classification.
When It Fires
The event fires once per investigation, when the agent completes and reaches a classification, for any classification whose policy has a webhook custom action configured. The event type (schema) is:Request Headers
Every delivery includes these headers. Use them to verify authenticity before trusting the body.| Header | Value | Notes |
|---|---|---|
X-CF-Schema | agent.investigation.completed.v1 | The event type. |
X-CF-Event-Id | A unique event identifier (GUID) | Use it to deduplicate retries. |
X-CF-Timestamp | ISO 8601 timestamp | Reject if it is more than 5 minutes from your clock. |
X-CF-Signature | Base64-encoded HMAC-SHA256 signature | See verification below. |
X-CF-Test | true | Present only for test deliveries. |
Authorization | Bearer <token> or Basic <base64> | Present only if you configured authentication on the webhook. |
Verifying the Signature
The signature covers the timestamp and the exact raw request body:signing_key is the secret shown once when the webhook was created, unless you supplied your own signing token override when setting bearer-token credentials, in which case it is that token.
Read the raw body
Compute the signature over the unparsed request body bytes, before any JSON deserialization.
Recompute
Concatenate the
X-CF-Timestamp value, a literal ., and the raw body. HMAC-SHA256 it with your signing key and Base64-encode the result.Compare in constant time
Compare your value to
X-CF-Signature using a constant-time comparison. Reject on mismatch.Payload
The body is JSON with camelCase fields:Fields
| Field | Type | Description |
|---|---|---|
workspace.id / alias / name | string | The ContraForce workspace the incident belongs to. |
agent.id / name | string | The Security Delivery Agent that ran the investigation. |
incident.id | string | The source system’s incident identifier. |
incident.number | number | The incident number shown in the portal. |
incident.source | string | Detection source, for example Sentinel. |
incident.title | string | Incident title. |
incident.severity | string | Incident severity, for example High. |
incident.status | string | Incident status at completion. |
verdict.classificationBucket | string | The agent’s verdict. One of TruePositive, BenignPositive, FalsePositive, Undetermined. |
verdict.classificationReason | string | null | Reason code for the classification. |
verdict.classificationReasonComment | string | null | Free-text reason detail. |
verdict.comment | string | The agent’s investigation summary comment. |
gamebookRecommendation | object | null | Present only when the agent recommended gamebooks. |
gamebookRecommendation.playbooks[] | array | Recommended gamebooks, each with playbookId, affectedEntity, entityId, and sequence. |
Testing
Use the Send test action on the webhook in Developers to deliver a synthetic event. Test deliveries carryX-CF-Test: true and use sample data. They are signed identically to live events, so you can validate your verification code end to end.
Troubleshooting
| Symptom | Likely cause | Resolution |
|---|---|---|
| No events arrive | The classification card does not point to this webhook, or Advanced mode is off | Confirm the webhook is set as the custom action for the classification and that Advanced mode is enabled and saved |
| Events stop arriving | The webhook was deleted, paused, disabled, or unsubscribed | The classification card shows a binding warning. Fix the webhook in Developers. Skipped deliveries are recorded as Failed in the delivery log, not dropped silently |
| Signature check fails | Verifying a parsed body instead of the raw bytes, or using the wrong key | Sign the raw request body, and use the signing token override if one was set |
| Duplicate events | Normal retry behavior | Deduplicate on X-CF-Event-Id |
Questions about the agent investigation webhook? Contact us at support@contraforce.com.