Malwarebytes · AsyncAPI Specification

Malwarebytes Threatdown Webhooks

Version

View Spec View on GitHub CompanySecurityCybersecurityEndpoint SecurityAnti MalwareEndpoint Detection and ResponseThreat DetectionVulnerability ManagementPatch ManagementManaged Service ProvidersDNS FilteringWebhookAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-04'
method: derived
source: >-
  openapi/malwarebytes-threatdown-nebula-openapi.json — the "Webhooks" tag description,
  which is the provider's own webhook documentation, verbatim in substance
summary: >-
  ThreatDown publishes a real, well-specified webhook surface: 18 event types, an
  HMAC-SHA256 signature scheme, an explicit delivery envelope, and documented retry
  semantics. It does NOT publish an AsyncAPI document — the whole event contract lives
  in prose inside the OpenAPI tag description. This artifact captures that catalog so
  the event surface is machine-addressable; it is a Webhooks catalog, not a fabricated
  AsyncAPI.
asyncapi_published: false
webhooks:
  published: true
  transport: HTTP POST to a subscriber-supplied URL
  payload_format: application/json
  subscription_management: API-only
  subscription_note: >-
    "ThreatDown provides you with REST APIs for creating, retrieving, and deleting
    subscriptions. Currently, subscriptions can be registered only through APIs." There
    is no console UI for webhook subscriptions.
  multiple_handlers_per_event: true
subscription_operations:
- api: nebula
  operationId: api.v2.nebula.post.webhooks.subscriptions
  method: POST
  path: /nebula/v1/webhooks/subscriptions
  summary: Create subscription
  scope: write
  user_permission: notifications.createOwn
- api: nebula
  operationId: api.v2.nebula.webhooks.subscriptions.get
  method: GET
  path: /nebula/v1/webhooks/subscriptions
  summary: Get all subscriptions
  scope: read
  user_permission: notifications.viewOwn
- api: nebula
  operationId: api.v2.nebula.webhooks.subscriptions.get.id
  method: GET
  path: /nebula/v1/webhooks/subscriptions/{id}
  summary: Get a subscription
  scope: read
  user_permission: notifications.viewOwn
- api: nebula
  operationId: api.v2.nebula.post.webhooks.subscriptions.update
  method: PUT
  path: /nebula/v1/webhooks/subscriptions/{id}
  summary: Update a subscription
  scope: write
  user_permission: notifications.editOwn
- api: nebula
  operationId: api.v2.nebula.post.webhooks.subscriptions.delete
  method: DELETE
  path: /nebula/v1/webhooks/subscriptions/{id}
  summary: Delete subscription
  scope: write
  user_permission: notifications.deleteOwn
- api: oneview
  operationId: api.v2.rmm.post.webhooks.subscriptions
  method: POST
  path: /oneview/v1/accounts/{account_id}/webhooks/subscriptions
  summary: Create webhook subscription
  scope: write
  user_permission: notifications.createOwn
- api: oneview
  operationId: api.v2.rmm.webhooks.subscriptions.get
  method: GET
  path: /oneview/v1/accounts/{account_id}/webhooks/subscriptions
  summary: Get all webhook subscriptions
  scope: read
  user_permission: notifications.viewOwn
- api: oneview
  operationId: api.v2.rmm.webhooks.subscriptions.get.id
  method: GET
  path: /oneview/v1/accounts/{account_id}/webhooks/subscriptions/{id}
  summary: Get webhook subscription
  scope: read
  user_permission: notifications.viewOwn
- api: oneview
  operationId: api.v2.rmm.post.webhooks.subscriptions.update
  method: PUT
  path: /oneview/v1/accounts/{account_id}/webhooks/subscriptions/{id}
  summary: Update a subscription
  scope: write
  user_permission: notifications.editOwn
- api: oneview
  operationId: api.v2.rmm.post.webhooks.subscriptions.delete
  method: DELETE
  path: /oneview/v1/accounts/{account_id}/webhooks/subscriptions/{id}
  summary: Delete webhook subscription
  scope: write
  user_permission: notifications.deleteOwn
envelope:
  description: Every notification is wrapped in a common envelope carrying metadata.
  fields:
  - name: event
    type: string
    description: The event type — one of the supported events below.
  - name: subscription_id
    type: string
    description: Unique identifier of the subscription that matched this event.
  - name: account_id
    type: string
    description: Nebula account id (site) generating this event.
  - name: payload
    type: object
    description: Event-specific data; its model varies by the value of `event`.
  dispatch_note: >-
    Consumers switch processing on `event` and interpret `payload` accordingly.
events:
- name: job_status_change
  description: >-
    Sent when a job issued through the Jobs APIs changes status — the way to track scan,
    isolate, remediate and reboot completion without polling.
  payload_fields:
  - name: id
    type: string
    description: Unique identifier of the job
  - name: machine_id
    type: string
    description: Unique identifier of the endpoint
  - name: command
    type: string
    description: Type of command (see the Jobs API)
  - name: issued_by
    type: string
    description: User issuing the job
  - name: status
    type: string
    description: Job status, including PENDING, STARTED, TIMED_OUT and COMPLETED
- name: detection
  description: A threat detection was reported by the ThreatDown Endpoint Agent.
- name: machine_events
  description: Endpoint/machine lifecycle events.
- name: threat_events
  description: Threat-related events.
- name: agent_events
  description: ThreatDown Endpoint Agent events.
- name: quarantine_events
  description: Quarantine add/restore/delete events.
- name: edr_events
  description: Endpoint Detection and Response events.
- name: syslog_events
  description: Syslog forwarding events.
- name: exclusion_events
  description: Exclusion created, edited or deleted.
- name: scheduled_events
  description: Scheduled task events.
- name: policy_events
  description: Policy created, edited or deleted.
- name: user_events
  description: User administration events.
- name: drive_events
  description: Drive encryption events.
- name: cve_events
  description: Vulnerability (CVE) events, including vulnerability-resolved.
- name: dns_events
  description: DNS filtering events.
- name: license_events
  description: Licensing events.
- name: appblock_events
  description: Application block events.
- name: endpoint_events
  description: Endpoint events.
event_count: 18
subscription_payload:
  source: POST /nebula/v1/webhooks/subscriptions requestBody schema
  required: [url, enabled, events]
  fields:
  - name: url
    type: string
    constraint: 'must match ^https://.{4,}$ — HTTPS only'
  - name: enabled
    type: boolean
  - name: events
    type: array
    min_items: 1
    enum_note: >-
      The schema enum carries the 18 event names above PLUS the wildcard value "all",
      which subscribes to every event type in one subscription.
  - name: description
    type: string
  - name: custom_headers
    type: array
    description: Key/value headers ThreatDown will include on each delivery to your endpoint.
  - name: max_retries
    type: integer
    default: 10
    maximum: 10
    exclusive_minimum: 0
  - name: secret_token
    type: string
    description: The signing key used to compute the HMAC of the payload.
security:
  signature_header: X-MWB-Signature
  algorithm: HMAC-SHA256
  computation: HMAC_SHA256(secret_token, webhookPayload)
  secret: >-
    A `secret_token` parameter supplied by the subscriber when creating the subscription;
    used as the signing key.
  verification: >-
    Compute the HMAC over the raw request body and compare with X-MWB-Signature. A match
    establishes ThreatDown as the sender.
  quoted: >-
    "ThreatDown will sign the webhook events it sends to your server. We do so by
    including a signature in each event's `X-MWB-Signature` header."
delivery:
  acknowledgement: Return any 2xx HTTP status code.
  failure_definition: >-
    Any response outside 2xx — explicitly including 3xx — is treated as a failure.
  retry_strategy: exponential backoff
  default_max_retries: 5
  configurable: true
  configuration_param: max_retries
  discrepancy: >-
    The Webhooks prose states "The default maximum number of retries is `5`", but the
    request schema for POST /nebula/v1/webhooks/subscriptions declares max_retries with
    default 10, exclusiveMinimum 0 and maximum 10. The narrative and the machine-readable
    contract disagree on the default. Report upstream.
  give_up_behaviour: >-
    After the maximum attempts the notification is dropped. "You will be responsible for
    reconciling your data by querying our API endpoints for potentially missed events."
  at_least_once: true
  consumer_requirement: >-
    "We recommend you design idempotent event processing because you might receive the
    same event more than once."
positioning:
  provider_guidance: >-
    ThreatDown actively steers integrators off polling: "The alternative to registering
    webhooks is performing polling, but this is deeply discouraged: besides involving
    more complicated code on your side, you may exceed your quota." Webhooks are also
    listed first among the remedies for a 429.
gaps:
- >-
  No AsyncAPI document. The event contract is prose in an OpenAPI tag description, so no
  event-driven tooling can generate consumers or validate payloads.
- >-
  Only the job_status_change payload model is fully specified. The other 17 event types
  are named with a one-line description and no payload schema.
- >-
  No published event catalog page outside the API reference, and no event versioning or
  schema-evolution policy.
- No replay/redelivery API for events dropped after max retries — reconciliation is manual.
- No timestamp or delivery-id field documented in the envelope for ordering or dedup.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/malwarebytes-threatdown-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.