Socket.dev
The Socket.dev source ingests your Socket organization's webhooks. Socket only delivers event logs by webhook, so RunReveal gives you a URL, you register it in Socket, and Socket pushes each event as it happens.
Two event groups are available in Socket's webhook form:
| Socket checkbox | Event types | What they mean |
|---|---|---|
alert | alert:created, alert:updated, alert:cleared | An organization alert (malware, a critical CVE, a typosquat, and so on) was raised, changed, or resolved. |
pull-request | pull-request:scan | Socket finished scanning a pull request in a connected repository. |
Organizations with Socket's threat feed entitlement can also select threat-feed and campaign events. RunReveal accepts and stores those too, along with any event type Socket adds later.
Webhooks require a Socket Business or Enterprise plan, and only Socket owners and admins can create them.
Setup
You'll move between Socket and RunReveal once: Socket's form needs RunReveal's URL, and RunReveal needs Socket's signing key. Keep the Socket tab open while you work.
Start a webhook in Socket and copy the signing key
In the Socket dashboard, go to Settings, choose Webhooks under Integrations, and click Create webhook.
Fill in a Name (for example RunReveal). Next to Signing Key, click Generate, then click the eye icon and copy the key. It looks like whsec_h4fk4iWceEsgYw/JbT9Feg98sgSFYsAy. You can type your own key instead, as long as you paste exactly the same value into RunReveal.
Leave this form open. Don't save it yet.
Create the source in RunReveal
In RunReveal, go to Sources > Add Source > Socket.dev. Give the source a name, paste the key into Signing Key, and save.
The source's page now shows its Webhook URL, in this form:
Copy it.
Finish the webhook in Socket
Back in Socket's Create webhook form:
- URL: paste the RunReveal webhook URL.
- Events: tick alert and pull-request. Expand each one if you only want some of its event types.
- Filters (optional): limit the webhook to specific repositories. Leave it empty to receive events for every repository.
- Advanced settings: no custom headers are needed.
Click Save and Close.
Send a test payload
Reopen the webhook in Socket. Under Test webhook, pick a Test payload and click Send. A 200 response means RunReveal verified the signature and stored the event. A 400 response usually means the signing key in RunReveal doesn't match the one in Socket; see Troubleshooting.
How requests are verified
Every Socket delivery carries an x-webhook-signature header of the form t=<timestamp>,s=<signature>. The signature is a base64 HMAC-SHA256 of <timestamp>.<raw request body>, keyed with your signing key. RunReveal rejects a delivery with HTTP 400 if:
- the header is missing or malformed,
- the signature doesn't match the body under your signing key, or
- the timestamp is more than five minutes from RunReveal's clock (replay protection).
The signing key is required. A Socket.dev source without one rejects every request.
Verify it's working
After the test payload, or once real alerts start arriving, query the typed view:
Pull request scans:
Field mapping
Socket's envelope maps onto RunReveal's normalized fields:
| RunReveal field | Socket field |
|---|---|
eventName | type (for example alert:updated) |
eventTime | timestamp |
eventID | eventId. For alerts this is <alert id>@<version>, so each update of the same alert has its own ID. |
serviceName | always socket |
actor['username'] | first entry in data.scan.committers (pull request scans) |
tags['severity'] | data.alert.severity (low, medium, high, critical) |
tags['repository'] | repository of the first alert location, or the scanned repository |
tags['package'] | first alert location's package as name@version (@scope/name@version for scoped packages) |
resources | every affected repository and package, as {"type":"repository","name":...} and {"type":"package","name":...} |
Socket doesn't publish a schema for the contents of data. The alert and scan columns in socket_logs follow the field names Socket uses for the same objects in its REST API (the organization alerts list and full scan metadata). The complete payload is always kept in rawLog, and the data and pullRequest columns hold the raw JSON, so fields RunReveal doesn't extract are still queryable:
Schema
The following columns are exposed for this source. RunReveal applies schema normalization across all sources, ensuring uniform field names and data types for cross-source queries and reusable detection logic.
Table: socket_logs (72 columns)
socket_logs (72 columns)| Column | Type |
|---|---|
workspaceID | String |
sourceID | String |
sourceType | String |
sourceTTL | UInt32 |
receivedAt | DateTime |
id | String |
eventTime | DateTime |
eventName | String |
eventID | String |
srcIP | String |
srcASCountryCode | String |
srcASNumber | UInt32 |
srcASOrganization | String |
srcCity | String |
srcConnectionType | String |
srcISP | String |
srcLatitude | Float64 |
srcLongitude | Float64 |
srcUserType | String |
dstIP | String |
dstASCountryCode | String |
dstASNumber | UInt32 |
dstASOrganization | String |
dstCity | String |
dstConnectionType | String |
dstISP | String |
dstLatitude | Float64 |
dstLongitude | Float64 |
dstUserType | String |
actor | Map(String, String) |
tags | Map(String, String) |
resources | Array(String) |
serviceName | String |
enrichments | Array(Tuple(data Map(String, String), name String, provider String, type String, value String)) |
readOnly | Bool |
rawLog | String |
| Column | Type |
|---|---|
socketEventID | String |
schemaType | String |
eventTimestamp | String |
organizationID | String |
organizationSlug | String |
organizationName | String |
repository | String |
branch | String |
ecosystem | String |
package | String |
severity | String |
alertID | String |
alertVersion | Int64 |
alertKey | String |
alertType | String |
alertCategory | String |
alertStatus | String |
alertTitle | String |
alertDescription | String |
alertDashboardURL | String |
alertCreatedAt | String |
alertUpdatedAt | String |
alertClearedAt | String |
alertFixType | String |
cveID | String |
cvssScore | Float64 |
ghsaIDs | Array(String) |
isKev | Bool |
alertLocations | String |
scanID | String |
commitHash | String |
pullRequestNumber | String |
scanReportURL | String |
scanCommitters | Array(String) |
pullRequest | String |
data | String |
Troubleshooting
Socket's test returns 400. The signing key in RunReveal doesn't match Socket's. Copy the key from Socket again, open the source in RunReveal, paste it into Signing Key, and save. Leaving the field blank while editing keeps the current key.
Events stop after rotating the key in Socket. Update the key in RunReveal at the same time. Deliveries signed with the new key fail until RunReveal has it.
No pull request events. pull-request:scan comes from Socket's GitHub app. Check that the app is installed on the repository and that the repository isn't excluded by the webhook's Filters.
Socket Firewall's registry-mode "Webhook Events" (package allow/block decisions from a self-hosted firewall) are a separate feature with a different, unsigned format. This source handles the Socket dashboard webhooks described above, not firewall events.
Helpful links
- Socket webhooks: creating webhooks, payload envelope, and signature scheme
- Socket alert types: values you'll see in
alertType - Standard Webhooks: the envelope format Socket follows