API documentation

Set a webhook

Creates or updates the group’s webhook. The first create returns `201` with `signingSecret` — the secret is shown only in this response, store it. An update returns `200` and keeps the secret; omitted fields stay unchanged.

PUT/v1/webhooks/{groupId}
PUTSet a webhook
curl -X PUT "https://api.darkradar.com/api/public/v1/webhooks/64b1f0c2a9e4d21f8c3b9a10" \
  -H "x-api-key: $DARKRADAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://darkradar.com/darkradar-webhook","events":["leak.created","scan.failed"],"severities":["critical","high"]}'
Response

Success

{
  "success": true,
  "message": "OK",
  "data": {
    "webhook": {
      "groupId": "64b1f0c2a9e4d21f8c3b9a10",
      "url": "•••• https://darkradar.com/…hook",
      "events": [
        "leak.created",
        "scan.finished",
        "scan.failed"
      ],
      "severities": [
        "critical",
        "high"
      ],
      "isActive": true,
      "lastDelivery": {
        "at": "2026-09-19T15:33:20.772Z",
        "ok": true,
        "type": "scan.finished",
        "reason": null
      },
      "createdAt": "2026-09-19T15:33:20.631Z",
      "updatedAt": "2026-09-19T15:33:20.673Z"
    }
  }
}

Access

Scopewebhooks:write
Plan entitlementapi_access

Path parameters

FieldsValues
groupId · string · requiredProtection resource group id (24 hex chars) · Example: 64b1f0c2a9e4d21f8c3b9a10

Request body

FieldsValues
url · string · optionalDelivery address: https and publicly reachable (private networks, localhost and cloud metadata addresses are rejected). Required when creating.
events · string[] · optionalEvents to subscribe to. Defaults to leak.created on create; unchanged on update if omitted. · Values: leak.created, scan.finished, scan.failed, hunter.finding.created
severities · string[] · optionalSeverity filter for leak events. All severities on create if omitted; unchanged on update. · Values: critical, high, medium, low, info, unknown
isActive · boolean · optionalWhether delivery is on (no events are sent while off).

Responses

200Success
201Created
400Address not accepted (not https, private network / localhost / cloud metadata) or unknown event/severity
401Key missing, invalid, expired or revoked
403Insufficient scope, no API access in plan, or product not enabled
404Record not found or not owned by this key’s firm
408The request exceeded its maximum response time
429Rate limit exceeded; retry after a minute

Response limits

Rate limit500 requests per 15 min · per IP

Was this page helpful?