Skip to content

Webhooks

Webhooks push an HTTP POST to a URL you control whenever something happens to a vulnerability report in your organization: created, updated, triaged, and so on. Use them to sync reports into your own tracker, notify a channel, or trigger automation.

In the app, open Webhooks and add one with:

  • a name,
  • the URL to deliver to, and
  • the events you want to receive (checkboxes).

You can subscribe to any of these vulnerability events:

EventFires when
Vuln::CreatedA report is created.
Vuln::UpdatedA report is updated.
Vuln::ReadA report is read.
Vuln::DestroyedA report is deleted.
Vuln::Inbox::ReceivedA report lands in the inbox.
Vuln::Inbox::StoredAn inbox report is stored.
Vuln::Processing::ClosedA report is closed.
Vuln::Processing::ReopenedA closed report is reopened.

Event types have stable ids you attach when subscribing. List them:

List subscribable events
curl https://api.disclosebot.io/v1/webhook_event_types \
-H "Authorization: Bearer disclosebot_svc_xxxxxxxx" \
-H "Accept: application/vnd.api+json"

Each item has a name (e.g. Events::Vuln::Created) and a short_name (Vuln::Created).

Webhooks are a full CRUD resource (GET/POST/PATCH/DELETE /v1/webhooks). Subscribe by attaching a trigger_event_types relationship, referencing ids from the discovery endpoint:

Create a webhook subscribed to two events
curl -X POST https://api.disclosebot.io/v1/webhooks \
-H "Authorization: Bearer disclosebot_svc_xxxxxxxx" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "webhook",
"attributes": { "name": "My integration", "url": "https://example.com/hooks", "enabled": true },
"relationships": {
"trigger_event_types": {
"data": [
{ "type": "trigger_event_type", "id": "<created-id>" },
{ "type": "trigger_event_type", "id": "<closed-id>" }
]
}
}
}
}'

See the Platform API reference for the full webhook and event-type schemas.

When a subscribed event fires, we POST a JSON body to your URL with headers Content-Type: application/json and User-Agent: disclosebot/1.0. The payload wraps the affected report:

Example Vuln::Created payload
{
"vuln": {
"id": "",
"shortcode": "",
"title": "",
"description": "",
"inbox_state": "",
"processing_state": "",
"organization_id": "",
"tags": [],
"assets": [{ "id": "", "kind": "domain", "value": "example.com" }],
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
}

A Vuln::Destroyed event sends a minimal { "vuln": { "id": "…", "destroyed": true } }.