Webhook Integration
StepSecurity's Webhook Integration sends security events from your tenant to HTTP endpoints you control, so you can feed a SIEM, an incident response tool, or a custom pipeline in real time.
You can configure up to ten webhooks per customer. Each webhook has its own endpoint, its own connection settings, and its own event subscriptions, so you can route different kinds of events to different destinations. For example, you can send runtime detections to your SIEM while sending API audit logs to a separate compliance pipeline.
Prerequisites
Before setting up the Webhook Integration:
You must be an Admin in your StepSecurity organization.
You need at least one endpoint that accepts
POSTrequests over HTTPS and can parse JSON payloads.PUTandPATCHcan be selected instead if your receiver requires them.To subscribe a webhook to API Audit Logs, audit logging must be enabled for your tenant. See Audit Logs.
How webhooks are organized
The Webhook Integration page has one master Enable Webhook Integration toggle followed by a list of webhooks. The master toggle controls the integration as a whole. No webhook delivers events while it is off.
Each webhook is an independent configuration with its own:
Connection settings, including endpoint URL, HTTP method, headers, and message format
Event subscriptions, which decide what kinds of events this endpoint receives
Repository selection, which decides which repositories this endpoint receives repository-scoped events for
Name, used to tell webhooks apart once you have more than one
A single webhook subscribes to as many event types as you want, so splitting streams across endpoints is a choice rather than a requirement.
The page renders differently depending on how many webhooks you have:
With one webhook, the section is titled Webhook and its connection settings, event subscriptions, and repository selection appear directly on the page.
With more than one, each webhook becomes a collapsible card. Collapsed cards show the name, the endpoint URL, and a chip for each subscribed event type, so you can see the routing at a glance. A card with no endpoint set yet shows No URL configured.
Set up a webhook
Step 1: Navigate to your StepSecurity dashboard and Click "Admin console"

Step 2: Click "Integrations"

Step 3: Click "Enable Webhook Integration

Step 4: Fill in Connection Settings, then click Test Connection to check that your endpoint is reachable

Step 5: Under Events to Subscribe, turn on the event types this endpoint should receive.

Step 6: Under Repository Selection, choose the repositories to send repository-scoped events for.

Step 7: Click Save changes.
To add another destination, click + Add Webhook and repeat steps 4 through 6 for the new card. Give each card a Name that describes its destination, for example Splunk detections or Compliance audit pipeline, then save once for all of them.
Configuration reference
Connection Settings
Webhook URL
The HTTPS endpoint events are delivered to. The field is validated, and an invalid value is rejected with Please enter a valid URL.
HTTP Method
The HTTP method used for delivery. Choose POST, PUT, or PATCH. POST is the default and is what most receivers expect.
Headers
Key and value pairs sent with every request. Use these for authentication headers and for content-type. Click + Add Header to add a row, or the red X to remove one. Sensitive values such as an Authorization token are masked, with an eye icon to reveal them.
Message Format
Either Raw or Envelope. See below.
Message format
Raw sends the event payload as StepSecurity generates it, with no wrapping.
Envelope wraps the payload in a JSON structure you define in the Template field. Use this when your receiver expects a specific shape, for example a SIEM that requires particular top-level keys.
The default template is:
The following variables are available. You can combine them with static text.
{{.ID}}
Unique identifier for the webhook event (UUID)
{{.Name}}
Short event title, for example Multiple alerts for owner/repo (run 12345)
{{.Timestamp}}
Timestamp when the event was generated, in RFC 3339 format
{{.EventType}}
Type of event, for example insight, detection, or secure-registry-audit-log
{{.Customer}}
Customer identifier
{{.Owner}}
Repository owner or organization
{{.Repo}}
Repository name
{{.Repository}}
Full repository path (owner/repo)
{{.RunID}}
GitHub Actions run ID or GitLab pipeline ID
{{.Server}}
GitHub server name (GitHub Enterprise Server only)
{{.Data}}
The event payload itself, for example the insights, detections, or audit log array
{{.Data}} is required. A template without it delivers metadata with no event content.
You do not have to keep the default keys. Any of the variables can be dropped, renamed, or mixed with static text to match what your receiver expects. For example:
Events to Subscribe
Turn on the event types that this webhook should receive. Any combination is valid, so one endpoint can take insights and detections together while another takes audit logs only. A webhook with no event types selected does not deliver anything.
Insights
Code security insights findings
Insights Response
Detections
Runtime detections
Sample Detection Events
Secure Registry Audit Logs
Secure Registry package request audit logs
Secure Registry Audit Log Events
API Audit Logs
StepSecurity API audit logs, as they are recorded. Requires audit logging enabled for your tenant.
API Audit Log Events
Repository Selection
Repository Selection controls which repositories a webhook receives repository-scoped events for, which means Insights and Detections.
Pick an organization from the dropdown. The table below lists that organization's repositories, so switch organizations to reach the rest.
Use the search box to narrow long lists.
Select a repository's checkbox in the Configuration Applied column to include it.
Turn on Enable for all repositories to apply the configuration to all current and future repositories. New repositories are then covered automatically, with no change needed here.
Routing patterns
Because each webhook subscribes independently, you can separate event streams by destination:
Keep large insights payloads out of a detection alerting pipeline
One webhook subscribed to Detections only, a second subscribed to Insights only, each pointing at its own endpoint
Send compliance evidence to a different team than security alerts
One webhook subscribed to API Audit Logs pointing at the compliance pipeline, another subscribed to Detections for the SOC
Give each receiver the payload shape it expects
Set Message Format per webhook, using Envelope with a tailored template where the receiver is strict
Scope one destination to a subset of repositories
Set Repository Selection per webhook, rather than filtering downstream
Webhook Delivery
Once configured, StepSecurity sends events to your endpoint as HTTP requests containing JSON payloads, using the method selected for that webhook. The examples below assume the default, POST.
How delivery works
Each event is sent as a single HTTP request with
Content-Type: application/json.The entire JSON payload is contained within one HTTP request body.
For detections, each request represents one workflow run that triggered one or more detections. Multiple detections from the same workflow run are bundled together in a single payload inside the
dataarray.Every webhook subscribed to an event type receives its own copy of that event, delivered independently. A failure at one endpoint does not affect the others.
Payload structure
Each webhook payload follows a parent and child structure. The top-level object contains metadata about the event group, and the data array contains the individual event objects.
id
UUID
Unique identifier for this alert group (parent ID)
name
String
Human-readable summary of the alert group
alert_timestamp
ISO 8601
Timestamp when the alert was generated
event_type
String
Type of event, for example detection or secure-registry-audit-log
customer
String
Customer account identifier
owner
String
GitHub organization or owner name
repo
String
Repository name
repository
String
Full repository path (owner/repo)
run_id
String
GitHub Actions workflow run ID
data
Array
Array of individual event objects (see next section)
Example top-level payload:
For tenant-scoped event types, the repository fields are present but empty.
Parent and child correlation
Every webhook payload has a top-level id field that serves as the parent identifier. Each detection object within the data array includes a parent_id field that references this top-level id. This allows you to correlate all detections that originated from the same workflow run.
Detection object fields
Each object in the data array of a detection payload represents an individual detection. The following fields are common across all detection types:
id
String
Detection type identifier (e.g., "Reverse-Shell")
event_id
UUID
Unique ID for this specific detection event
parent_id
UUID
References the top-level alert group id
type
String
Detection type classification
name
String
Human-readable detection name
run_id
String
GitHub Actions run ID
job_id
String
GitHub Actions job ID
job
String
Job name within the workflow
timestamp
Unix epoch
Detection timestamp (seconds since epoch)
detection
String
Detection signature identifier
html_url
URL
Link to the detection in StepSecurity dashboard
is_resolved
Boolean
Whether the detection has been resolved
is_suppressed
Boolean
Whether the detection is suppressed
process_events
Array
Process-level details (varies by detection type)
Example detection object:
For complete payload examples for every event type, see Sample Detection Events.
SIEM Integration
If you are forwarding StepSecurity webhooks to a SIEM (for example Splunk, Microsoft Sentinel, or Elastic), follow these guidelines to ensure events are ingested correctly.
Separate endpoints by event type
Insights payloads are significantly larger than detection payloads and are more likely to exceed default SIEM receiver size limits. Rather than sending everything to one receiver, give each event type its own webhook and its own endpoint. Each receiver can then be tuned, indexed, and size-limited independently, and a size problem in one stream does not affect the others.
A common arrangement is one webhook for Detections into the alerting index, one for Insights into a lower-priority index, and one for API Audit Logs into a compliance index.
Understanding payload size
Because multiple detections from a single workflow run are bundled into one webhook request, payload sizes vary. A single payload may contain anywhere from one to many detection objects in the data array.
HTTP JSON receiver
Configure your SIEM to accept webhooks via an HTTP or HTTPS endpoint that can receive JSON POST requests, or set the webhook's HTTP method to whichever of PUT or PATCH your receiver expects. Ensure your receiver is configured to read the full HTTP request body as a single JSON message, rather than splitting on newlines or fixed byte boundaries.
Line breaking
Important: Do not configure line breaking or message splitting on the raw HTTP body. Each request is one complete, self-contained JSON document. If your SIEM splits on newlines, the pretty-printed JSON will be broken across multiple events.
Configure your HTTP input to treat each request as a single event.
Event flattening
If your SIEM requires one event per detection rather than one event per workflow run, use your SIEM's JSON parsing or transformation pipeline to iterate over the data array and create individual events.
When flattening, carry forward the following parent fields into each individual event to preserve context:
id(parent alert group ID)customerownerreporepositoryrun_id
Example: flattening logic (pseudocode)
Last updated
Was this helpful?