Announcing RUNWAY: The conference for teams securing what's nextRegister Now
RunReveal
SourcesSource Types

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 checkboxEvent typesWhat they mean
alertalert:created, alert:updated, alert:clearedAn organization alert (malware, a critical CVE, a typosquat, and so on) was raised, changed, or resolved.
pull-requestpull-request:scanSocket 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:

https://api.runreveal.com/sources/socket/webhook/<webhook-id>

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:

SELECT eventTime, eventName, severity, alertType, repository, package, alertTitle
FROM socket_logs
WHERE eventTime >= now() - INTERVAL 1 DAY
ORDER BY eventTime DESC
LIMIT 50

Pull request scans:

SELECT eventTime, repository, pullRequestNumber, branch, commitHash, scanReportURL
FROM socket_logs
WHERE eventName = 'pull-request:scan'
ORDER BY eventTime DESC
LIMIT 50

Field mapping

Socket's envelope maps onto RunReveal's normalized fields:

RunReveal fieldSocket field
eventNametype (for example alert:updated)
eventTimetimestamp
eventIDeventId. For alerts this is <alert id>@<version>, so each update of the same alert has its own ID.
serviceNamealways 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)
resourcesevery 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:

SELECT JSONExtractString(data, 'alert', 'fix', 'description') AS fix
FROM socket_logs
WHERE eventName LIKE 'alert:%'

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)

ColumnType
workspaceIDString
sourceIDString
sourceTypeString
sourceTTLUInt32
receivedAtDateTime
idString
eventTimeDateTime
eventNameString
eventIDString
srcIPString
srcASCountryCodeString
srcASNumberUInt32
srcASOrganizationString
srcCityString
srcConnectionTypeString
srcISPString
srcLatitudeFloat64
srcLongitudeFloat64
srcUserTypeString
dstIPString
dstASCountryCodeString
dstASNumberUInt32
dstASOrganizationString
dstCityString
dstConnectionTypeString
dstISPString
dstLatitudeFloat64
dstLongitudeFloat64
dstUserTypeString
actorMap(String, String)
tagsMap(String, String)
resourcesArray(String)
serviceNameString
enrichmentsArray(Tuple(data Map(String, String), name String, provider String, type String, value String))
readOnlyBool
rawLogString
ColumnType
socketEventIDString
schemaTypeString
eventTimestampString
organizationIDString
organizationSlugString
organizationNameString
repositoryString
branchString
ecosystemString
packageString
severityString
alertIDString
alertVersionInt64
alertKeyString
alertTypeString
alertCategoryString
alertStatusString
alertTitleString
alertDescriptionString
alertDashboardURLString
alertCreatedAtString
alertUpdatedAtString
alertClearedAtString
alertFixTypeString
cveIDString
cvssScoreFloat64
ghsaIDsArray(String)
isKevBool
alertLocationsString
scanIDString
commitHashString
pullRequestNumberString
scanReportURLString
scanCommittersArray(String)
pullRequestString
dataString

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.

On this page