Sonarly · AsyncAPI Specification

Sonarly Webhooks

Version 2026-04-30

Sonarly delivers signed outbound webhooks on bug and incident lifecycle events. Register a receiver via POST /api/setup/webhook-endpoint (the URL is SSRF-checked; a whsec_ signing secret is returned once). Each event is a signed JSON envelope; verify the Sonarly-Signature HMAC-SHA256, reject if the timestamp is older than 300s, and dedupe on Sonarly-Event-Id.

View Spec View on GitHub CompanyReliabilityObservabilityMonitoringBug DetectionIncident ManagementRoot Cause AnalysisAI AgentsDeveloper ToolsDevOpsAsyncAPIWebhooksEvents

Channels

events
The subscriber's registered receiver endpoint; Sonarly POSTs event envelopes here.

Messages

BugEvent
Bug lifecycle event
IncidentEvent
Incident lifecycle event

Servers

https
sonarly
Sonarly delivers events to the subscriber's registered receiver URL.

AsyncAPI Specification

Raw ↑
asyncapi: 3.0.0
x-apievangelist:
  generated: '2026-07-21'
  method: searched
  source: https://sonarly.com/llms.txt
  note: >-
    Authored from Sonarly's published webhook documentation (event list,
    envelope, headers, and HMAC signature scheme) in the agent onboarding guide.
    Sonarly ships signed outbound webhooks but no first-party AsyncAPI; this is
    the API Evangelist capture of the documented event surface.
info:
  title: Sonarly Webhooks
  version: '2026-04-30'
  description: >-
    Sonarly delivers signed outbound webhooks on bug and incident lifecycle
    events. Register a receiver via POST /api/setup/webhook-endpoint (the URL is
    SSRF-checked; a whsec_ signing secret is returned once). Each event is a
    signed JSON envelope; verify the Sonarly-Signature HMAC-SHA256, reject if
    the timestamp is older than 300s, and dedupe on Sonarly-Event-Id.
defaultContentType: application/json
servers:
  sonarly:
    host: sonarly.com
    protocol: https
    description: Sonarly delivers events to the subscriber's registered receiver URL.
channels:
  events:
    address: /webhooks/sonarly
    description: The subscriber's registered receiver endpoint; Sonarly POSTs event envelopes here.
    messages:
      bugCreated: { $ref: '#/components/messages/BugEvent' }
      bugAnalyzed: { $ref: '#/components/messages/BugEvent' }
      bugDeduped: { $ref: '#/components/messages/BugEvent' }
      bugReappeared: { $ref: '#/components/messages/BugEvent' }
      bugResolved: { $ref: '#/components/messages/BugEvent' }
      bugPrCreated: { $ref: '#/components/messages/BugEvent' }
      bugPrMerged: { $ref: '#/components/messages/BugEvent' }
      incidentCreated: { $ref: '#/components/messages/IncidentEvent' }
      incidentAnalyzed: { $ref: '#/components/messages/IncidentEvent' }
      incidentResolved: { $ref: '#/components/messages/IncidentEvent' }
operations:
  receiveEvent:
    action: receive
    channel: { $ref: '#/channels/events' }
    summary: Receive a Sonarly event envelope.
components:
  messages:
    BugEvent:
      name: bugEvent
      title: Bug lifecycle event
      contentType: application/json
      headers: { $ref: '#/components/schemas/EventHeaders' }
      payload: { $ref: '#/components/schemas/Envelope' }
    IncidentEvent:
      name: incidentEvent
      title: Incident lifecycle event
      contentType: application/json
      headers: { $ref: '#/components/schemas/EventHeaders' }
      payload: { $ref: '#/components/schemas/Envelope' }
  schemas:
    EventHeaders:
      type: object
      properties:
        Sonarly-Signature:
          type: string
          description: 't=<unix>,v1=<hmac_sha256_hex over "{t}.{rawBody}"> using the whsec_ secret.'
        Sonarly-Event-Id: { type: string, description: Stable event id (= envelope id); dedupe on this. }
        Sonarly-Event-Type: { type: string }
        Sonarly-Delivery-Id: { type: string }
    Envelope:
      type: object
      properties:
        id: { type: string, example: evt_123 }
        type:
          type: string
          enum:
          - bug.created
          - bug.analyzed
          - bug.deduped
          - bug.reappeared
          - bug.resolved
          - bug.pr_created
          - bug.pr_merged
          - incident.created
          - incident.analyzed
          - incident.resolved
        api_version: { type: string, example: '2026-04-30' }
        created: { type: integer, description: unix seconds }
        tenant_id: { type: integer }
        data:
          type: object
          properties:
            object: { type: object, description: The full Bug or Incident object. }
            previous_attributes: { type: [object, 'null'] }
x-delivery:
  retry: up to 8 attempts
  ack_window_seconds: 10
  disable_after_days: 3
  replay_tolerance_seconds: 300

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/sonarly-events-asyncapi"
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.