Vidyard · AsyncAPI Specification

Vidyard Webhooks

Version

View Spec View on GitHub VideoVideo PlatformVideo AnalyticsVideo SharingSales VideoCRM IntegrationMarketingAI VideoWebhookAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: https://knowledge.vidyard.com/hc/en-us/articles/360009879654-How-to-use-the-analytics-subscription-webhook
spec_type: null
spec_note: >
  Vidyard publishes NO AsyncAPI document. /asyncapi.yaml and /asyncapi.json 404
  on every host and the GitHub org carries no event schema. What Vidyard does
  publish is a complete, well-specified webhook catalog with verbatim payload
  examples and a field glossary — captured here as a Webhooks surface rather
  than fabricating an AsyncAPI from it.

description: >
  Vidyard has two distinct event surfaces. The Analytics Webhook is a
  subscription-managed push of viewer engagement data (three event types),
  administered either from the Vidyard UI or through a small REST API on
  analytics-api.vidyard.com. Separately, individual videos and players accept a
  per-object webhook_url callback for asset-lifecycle notifications, and the
  Video Agent API accepts a webhook_url for generation-complete callbacks.

surfaces:

  - name: Analytics Webhook
    kind: subscription
    transport: HTTP POST
    content_type: application/json
    base_url: https://analytics-api.vidyard.com/v1
    docs: https://knowledge.vidyard.com/hc/en-us/articles/360009879654-How-to-use-the-analytics-subscription-webhook
    postman: https://vy-docs.s3.amazonaws.com/postman/VidyardAnalyticsWebhooks.postman_collection.json
    scoping: >
      A subscription is bound to the folder implied by the API token used to
      create it. Subfolders inherit the webhook from their immediate parent, so
      one subscription can cover a whole branch of the folder tree.
    permissions:
      ui: Edit Integrations
      api: Edit API Tokens
    verification:
      mechanism: shared secret
      field: security_key
      description: >
        A caller-supplied shared secret echoed on delivery so the receiver can
        confirm the request originated from Vidyard. NOTE — this is a plaintext
        echoed secret, not an HMAC request signature; there is no published
        signing algorithm, timestamp, or replay defense.
    source_ips:
      - 54.164.55.156
      - 54.165.206.34
      - 54.164.57.33
      - 52.206.52.245
      - 35.153.110.215
      - 50.17.20.255
    management_operations:
      - method: POST
        path: /v1/integrations/webhooks
        summary: Create a subscription
        request_fields: [url, security_key, event_subscriptions]
        response: '{ "webhook_id": 123456 }'
      - method: GET
        path: /v1/integrations/webhooks
        summary: List all subscriptions for the API token
        response_fields: [id, url, security_key, is_valid, event_subscriptions]
      - method: PUT
        path: /v1/integrations/webhooks/{webhook_id}
        summary: Update url, security_key or event_subscriptions
      - method: DELETE
        path: /v1/integrations/webhooks/{webhook_id}
        summary: Delete a subscription
    events:
      - type: view
        label: Percent watched
        description: >
          Percentage-milestone progress. Fires at 0, 25, 50, 75 and 100 — a full
          watch therefore delivers five separate payloads. Milestones are
          cumulative-amount based, not position based: watching the first 10%
          then skipping ahead to watch another 15% triggers the 0 and 25 events.
        cardinality: up to 5 per view
        fields:
          - {name: type, type: string}
          - {name: timestamp, type: string, format: iso8601}
          - {name: request_id, type: string}
          - {name: visitor_vidyard_uuid, type: string}
          - {name: organization_id, type: string, description: ID of the folder where the webhook is set up}
          - {name: organization_name, type: string}
          - {name: player_uuid, type: string}
          - {name: player_name, type: string}
          - {name: video_id, type: string}
          - {name: video_name, type: string}
          - {name: percent_watched, type: integer}
          - {name: player_load_id, type: string, description: Unique per player load; a change indicates a new session or page refresh}
          - {name: player_load_metadata, type: object, description: Custom data passed through via the vydata parameter}
          - {name: account_id, type: string, description: Unique ID of the top-level folder in the account}
          - {name: embed_url, type: string, description: Where the video was watched; UTM values preserved, other query strings stripped}
          - {name: player_organization_id, type: string, description: Folder where the video itself lives}
      - type: attention_span
        label: Attention span
        description: >
          How many times a unique viewer watched each second of a video on a
          given day. Delivered as an array of up to 200 buckets; videos longer
          than 200 seconds are divided into 200 equal segments instead.
        cardinality: one per viewer per day
        fields:
          - {name: type, type: string}
          - {name: attention_span, type: object, description: Map of segment index to watch count, up to 200 entries}
          - {name: day, type: string, format: iso8601, description: Date the attention_span set was calculated}
          - {name: timestamp, type: string, format: iso8601}
          - {name: request_id, type: string}
          - {name: visitor_vidyard_uuid, type: string}
          - {name: organization_id, type: string}
          - {name: organization_name, type: string}
          - {name: player_uuid, type: string}
          - {name: player_name, type: string}
          - {name: video_id, type: string}
          - {name: video_name, type: string}
          - {name: player_load_id, type: integer}
          - {name: player_load_metadata, type: object}
          - {name: account_id, type: string}
      - type: identified_view
        label: Identified view
        description: >
          A view resolved to a viewer email address. Queued when playback
          starts and delivered only after a wall-clock duration equal to the
          video length has elapsed, so percent_watched reflects the real
          proportion watched. Fires exactly once — it does not re-fire on
          resume or on later views within the same session.
        cardinality: once per identified view
        fields:
          - {name: type, type: string}
          - {name: timestamp, type: string, format: iso8601}
          - {name: request_id, type: string}
          - {name: visitor_vidyard_uuid, type: string}
          - {name: organization_id, type: string}
          - {name: organization_name, type: string}
          - {name: account_id, type: string}
          - {name: player_uuid, type: string}
          - {name: player_name, type: string}
          - {name: video_id, type: string}
          - {name: video_name, type: string}
          - {name: embed_url, type: string}
          - {name: percent_watched, type: number}
          - {name: player_load_id, type: string}
          - {name: player_load_metadata, type: object}
          - {name: player_organization_id, type: string}
          - {name: email, type: string, description: Resolved viewer email address}

  - name: Video Agent generation callback
    kind: per-request callback
    transport: HTTP POST
    docs: https://knowledge.vidyard.com/hc/en-us/articles/42909331296411-Using-the-Vidyard-Video-Agent-API
    trigger: >
      Supplied as the optional webhook_url field on a Video Agent API call;
      Vidyard POSTs to it once the personalized video has finished generating.
    payload_fields:
      - {name: lead_owner_email, type: string}
      - {name: email, type: string}
      - {name: campaign_id, type: string}
      - {name: approval_status, type: string, description: e.g. approved — present when the optional approval workflow is enabled}
      - {name: video_uuid, type: string}
      - {name: vy_custom_id, type: string, description: URL-encoded string echoed back from the request}
      - {name: thumbnail_url, type: string}
    note: >
      When the optional approval process is enabled (must be turned on by
      Vidyard Support/CSM), the callback is withheld until the avatar owner
      approves; a rejected video is deleted and nothing is ever delivered.

  - name: Asset webhooks (per-object)
    kind: per-object callback
    transport: HTTP POST
    docs: https://developer.vidyard.com/
    description: >
      The Dashboard API accepts a webhook_url attribute when creating a video,
      and exposes dedicated operations for registering analytics and player
      webhooks against an organization.
    operations:
      - method: POST
        path: "/dashboard/v1/organizations/:organization_id/webhooks/analytics"
        summary: Registers an analytics webhook
      - method: DELETE
        path: "/dashboard/v1/organizations/:organization_id/webhooks/analytics/:id"
        summary: Deletes an analytics webhook
      - method: POST
        path: "/dashboard/v1/organizations/:organization_id/webhooks/players"
        summary: Registers a webhook that listens to changes on players
      - method: DELETE
        path: "/dashboard/v1/organizations/:organization_id/webhooks/players/:id"
        summary: Delete a webhook that listens to changes on players
    operations_note: >
      Paths transcribed verbatim from the four api_webhooks entries in the
      Dashboard API reference at developer.vidyard.com. Vidyard uses Rails
      `:param` path syntax throughout its published reference.
      A per-video `webhook_url` attribute is additionally accepted on
      POST /dashboard/v1/videos.

summary:
  asyncapi_published: false
  webhook_surfaces: 3
  subscription_event_types: 3
  signed_payloads: false
  shared_secret: true
  retry_policy: undocumented
  delivery_guarantees: undocumented

gaps:
  - No AsyncAPI document, so the event surface is not machine-readable.
  - No HMAC request signing — verification relies on a plaintext echoed security_key.
  - No published retry policy, backoff schedule, or delivery-failure semantics.
  - is_valid appears on the subscription record but its failure semantics are not documented.