ControlUp · AsyncAPI Specification

Controlup Webhooks

Version

View Spec View on GitHub digital-employee-experienceendpoint-managementvdidaasvirtual-desktopobservabilitymonitoringsynthetic-monitoringdevice-managementcompliancevulnerability-managementworkflow-automationcitrixazure-virtual-desktopmcpagent-nativeAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-04'
method: searched
source: >-
  https://support.controlup.com/docs/webhooks-for-synthetic-monitoring,
  https://support.controlup.com/docs/using-webhooks-as-follow-up-action,
  https://support.controlup.com/docs/devices-alerts-servicenow-integration,
  https://support.controlup.com/docs/create-flows-and-integrations
spec_type: none
asyncapi_published: false
asyncapi_note: >-
  ControlUp publishes no AsyncAPI document and no event-schema registry. The event surface below is real and
  documented in prose, but it is not machine-readable — an agent cannot discover the channels, payload schemas or
  bindings without reading the knowledge base. Nothing has been fabricated to fill that gap.
webhooks:
  supported: true
  direction: outbound
  model: >-
    ControlUp does not operate a subscription-style webhook API. Webhooks are configured as NOTIFICATION METHODS
    and FOLLOW-UP ACTIONS attached to alert policies and triggers — the customer supplies the destination URL and
    the payload template, and ControlUp POSTs to it when the condition fires. There is no /webhooks resource in
    any of the twelve OpenAPI definitions and no endpoint for registering or listing webhook subscriptions
    programmatically.
  surfaces:
  - name: Synthetic Monitoring webhook notifications
    docs: https://support.controlup.com/docs/webhooks-for-synthetic-monitoring
    configured_on: A Scout's Alert Policy, under Notification Methods > Add webhook method
    transport: HTTP POST
    payload: >-
      JSON, fully customer-defined. "Custom Fields" are declared with dot-notation names (payload.summary) and
      values that mix literal text with ControlUp webhook variables, so the payload SHAPE is chosen by the
      consumer, not by ControlUp. There is no default/canonical event envelope.
    authentication: [None, Basic (username and password), API Token]
    custom_headers: true
    security_note: >-
      ControlUp's own documentation states that custom headers and custom fields are stored and sent as clear,
      unencrypted text.
    trigger_conditions:
    - A test fails
    - A threshold is breached
    - A recovery occurs after a failure
    variables:
      scout:
      - {name: '{scout.id}', description: The Scout's ID value}
      - {name: '{scout.name}', description: The Scout's name}
      - {name: '{scout.resource}', description: Name of the resource being tested (EUC Scouts)}
      - {name: '{scout.user}', description: Username configured for authenticating the Scout (EUC Scouts)}
      - {name: '{scout.address}', description: Address of the tested resource or gateway}
      - {name: '{scout.location}', description: Name of the cloud or custom hive where the Scout runs}
      test_common:
      - {name: '{test.status}', description: Status of the test (success/failure)}
      - {name: '{test.status_percents}', description: Success percentage of the test}
      - {name: '{test.start_time}', description: Start time of the test}
      - {name: '{test.state_count}', description: How many times in a row the trigger has fired}
      test_euc:
      - {name: '{test.ready_phase}', description: Duration to reach Session Ready on the published resource}
      - {name: '{test.server_name}', description: Server on which the Scout's session was opened}
      test_http:
      - {name: '{test.status_code}', description: HTTP status code}
      - {name: '{test.latency}', description: Total response time}
      - {name: '{test.ttfb}', description: Time to first byte}
      - {name: '{test.connect_time}', description: Connect duration}
      - {name: '{test.namelookup_time}', description: DNS lookup duration}
      - {name: '{test.tls_handshake_time}', description: TLS handshake duration}
      - {name: '{test.redirect_time}', description: Redirect duration}
      - {name: '{test.response_time}', description: Response duration}
      - {name: '{test.body_size}', description: Response body size}
      - {name: '{test.cert_exp_date}', description: Certificate expiration date}
      - {name: '{test.dest}', description: Destination address of the HTTP request}
      test_dns:
      - {name: '{test.query_type}', description: DNS query type}
      - {name: '{test.result}', description: Responded records of the DNS query}
      - {name: '{test.runtime}', description: Total duration of the DNS query}
      - {name: '{test.server}', description: DNS server used for the query}
      test_ping_traceroute:
      - {name: '{test.packets_sent}', description: Packets sent during the test}
      - {name: '{test.packets_received}', description: Packets received during the test}
      - {name: '{test.jitter}', description: Average jitter across sent packets}
      - {name: '{test.avg_rtt}', description: Average latency}
      - {name: '{test.min_rtt}', description: Lowest total latency}
      - {name: '{test.max_rtt}', description: Highest total latency}
      - {name: '{test.hops}', description: Number of hops the packets traversed}
    example_payload: |
      {
        "scoutName": "{scout.name}",
        "testStatus": "{test.status}",
        "failureReason": "{test.failure_reason}",
        "timestamp": "{test.time}"
      }
  - name: Trigger follow-up action ("Send a RESTful API request")
    docs: https://support.controlup.com/docs/using-webhooks-as-follow-up-action
    configured_on: A ControlUp Trigger (Trigger Packs), as a follow-up action
    transport: Customer-selected HTTP(S) method (POST in the documented example)
    payload: >-
      Defined by a Notification Template. Headers, body and even the URI can embed trigger variables using
      $(VariableName) syntax — the documented example uses $(TriggerName) and $(CompName).
    prerequisites:
    - At least one ControlUp Monitor installed, with outbound internet access to the destination endpoint.
    - A ControlUp licence with Automated Actions activated.
    programmatic_configuration: https://support.controlup.com/docs/powershell-cmdlets-for-triggers
    note: >-
      Configured through the Real-Time Console or the trigger PowerShell cmdlets, not through the public REST API.
      The VDI configuration/triggers OpenAPI (openapi/controlup-vdi-config-triggers-openapi.yml) covers trigger
      configuration but does not expose webhook subscription management.
  related_integrations:
  - {name: ServiceNow, docs: https://support.controlup.com/docs/devices-alerts-servicenow-integration}
  - {name: Microsoft Teams, docs: https://support.controlup.com/docs/integration-with-microsoft-teams}
  - {name: Workflow integrations, docs: https://support.controlup.com/docs/create-flows-and-integrations}
  - {name: Current integrations catalogue, docs: https://support.controlup.com/docs/current-integrations}
  discoverable_via_api:
    synthetic_monitoring: 'GET /synthetic-monitoring/v2/integrations — lists active external integrations available for alert notifications.'
    workflows: 'GET /workflows/v1/integrations and /workflows/v1/integrations/{integrationId}/actions — enumerates integrations and their action input/output schemas.'
gaps:
- No AsyncAPI 2.x or 3.x document.
- No canonical event envelope — the payload is entirely customer-templated, so two ControlUp tenants emit structurally different events for the same condition.
- No signing, HMAC or replay-protection mechanism documented for outbound webhooks; authentication is whatever the receiver requires (none/basic/token) and headers are stored in clear text.
- No delivery-retry, ordering or at-least-once guarantee documented.
- No API for registering, listing or deleting webhook endpoints — configuration is console/PowerShell only.